input_internal.h 6.73 KB
Newer Older
1
/*****************************************************************************
2
 * input_internal.h: Internal input structures
3
 *****************************************************************************
4
 * Copyright (C) 1998-2006 the VideoLAN team
Antoine Cellerier's avatar
Antoine Cellerier committed
5
 * $Id$
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
Antoine Cellerier's avatar
Antoine Cellerier committed
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 23
 *****************************************************************************/

24 25 26 27
#if defined(__PLUGIN__) || defined(__BUILTIN__) || !defined(__LIBVLC__)
# error This header file can only be included from LibVLC.
#endif

28 29 30
#ifndef _INPUT_INTERNAL_H
#define _INPUT_INTERNAL_H 1

31 32 33
#include <vlc_access.h>
#include <vlc_demux.h>
#include <vlc_input.h>
34
#include <libvlc.h>
35
#include "input_interface.h"
36 37 38 39

/*****************************************************************************
 *  Private input fields
 *****************************************************************************/
40 41 42

#define INPUT_CONTROL_FIFO_SIZE    100

43 44 45 46 47 48 49 50 51
/* input_source_t: gathers all information per input source */
typedef struct
{
    /* Access/Stream/Demux plugins */
    access_t *p_access;
    stream_t *p_stream;
    demux_t  *p_demux;

    /* Title infos for that input */
Antoine Cellerier's avatar
Antoine Cellerier committed
52
    bool         b_title_demux; /* Titles/Seekpoints provided by demux */
53 54 55 56 57 58 59 60 61 62 63 64
    int          i_title;
    input_title_t **title;

    int i_title_offset;
    int i_seekpoint_offset;

    int i_title_start;
    int i_title_end;
    int i_seekpoint_start;
    int i_seekpoint_end;

    /* Properties */
65 66 67
    bool b_can_pause;
    bool b_can_pace_control;
    bool b_can_rate_control;
68
    bool b_can_stream_record;
69
    bool b_rescale_ts;
70

71 72 73
    /* */
    int64_t i_pts_delay;

Antoine Cellerier's avatar
Antoine Cellerier committed
74
    bool       b_eof;   /* eof of demuxer */
75 76 77 78 79 80 81

} input_source_t;

/** Private input fields */
struct input_thread_private_t
{
    /* Global properties */
Antoine Cellerier's avatar
Antoine Cellerier committed
82 83
    bool        b_can_pause;
    bool        b_can_rate_control;
84
    bool        b_can_pace_control;
85
    double      f_fps;
86
    int         i_state;
87

88
    /* Current state */
89
    int         i_rate;
90
    bool        b_recording;
91

92
    /* Playtime configuration and state */
93 94
    int64_t     i_start;    /* :start-time,0 by default */
    int64_t     i_stop;     /* :stop-time, 0 if none */
95
    int64_t     i_run;      /* :run-time, 0 if none */
96
    int64_t     i_time;     /* Current time */
97 98 99 100 101 102 103 104 105

    /* Title infos FIXME multi-input (not easy) ? */
    int          i_title;
    input_title_t **title;

    int i_title_offset;
    int i_seekpoint_offset;

    /* User bookmarks FIXME won't be easy with multiples input */
106
    seekpoint_t bookmark;
107
    int         i_bookmark;
108
    seekpoint_t **pp_bookmark;
109

110 111 112 113
    /* Input attachment */
    int i_attachment;
    input_attachment_t **attachment;

114
    /* Output */
Antoine Cellerier's avatar
Antoine Cellerier committed
115
    es_out_t        *p_es_out;
116
    es_out_t        *p_es_out_display;
117
    sout_instance_t *p_sout;            /* XXX Move it to es_out ? */
Antoine Cellerier's avatar
Antoine Cellerier committed
118
    bool            b_out_pace_control; /*     idem ? */
119 120

    /* Main input properties */
121

122 123
    /* Input item */
    input_item_t   *p_item;
124

125
    /* Main source */
126
    input_source_t input;
127
    /* Slave sources (subs, and others) */
128 129 130
    int            i_slave;
    input_source_t **slave;

131 132 133
    /* Ressources */
    input_ressource_t *p_ressource;

134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
    /* Stats counters */
    struct {
        counter_t *p_read_packets;
        counter_t *p_read_bytes;
        counter_t *p_input_bitrate;
        counter_t *p_demux_read;
        counter_t *p_demux_bitrate;
        counter_t *p_decoded_audio;
        counter_t *p_decoded_video;
        counter_t *p_decoded_sub;
        counter_t *p_sout_sent_packets;
        counter_t *p_sout_sent_bytes;
        counter_t *p_sout_send_bitrate;
        counter_t *p_played_abuffers;
        counter_t *p_lost_abuffers;
        counter_t *p_displayed_pictures;
        counter_t *p_lost_pictures;
        vlc_mutex_t counters_lock;
    } counters;

    /* Buffer of pending actions */
    vlc_mutex_t lock_control;
156
    vlc_cond_t  wait_control;
157 158 159
    int i_control;
    struct
    {
160 161
        /* XXX for string value you have to allocate it before calling
         * input_ControlPush */
162 163 164 165 166 167 168 169
        int         i_type;
        vlc_value_t val;
    } control[INPUT_CONTROL_FIFO_SIZE];
};

/***************************************************************************
 * Internal control helpers
 ***************************************************************************/
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
enum input_control_e
{
    INPUT_CONTROL_SET_DIE,

    INPUT_CONTROL_SET_STATE,

    INPUT_CONTROL_SET_RATE,
    INPUT_CONTROL_SET_RATE_SLOWER,
    INPUT_CONTROL_SET_RATE_FASTER,

    INPUT_CONTROL_SET_POSITION,
    INPUT_CONTROL_SET_POSITION_OFFSET,

    INPUT_CONTROL_SET_TIME,
    INPUT_CONTROL_SET_TIME_OFFSET,

    INPUT_CONTROL_SET_PROGRAM,

    INPUT_CONTROL_SET_TITLE,
    INPUT_CONTROL_SET_TITLE_NEXT,
    INPUT_CONTROL_SET_TITLE_PREV,

    INPUT_CONTROL_SET_SEEKPOINT,
    INPUT_CONTROL_SET_SEEKPOINT_NEXT,
    INPUT_CONTROL_SET_SEEKPOINT_PREV,

    INPUT_CONTROL_SET_BOOKMARK,

    INPUT_CONTROL_SET_ES,
199
    INPUT_CONTROL_RESTART_ES,
200 201 202

    INPUT_CONTROL_SET_AUDIO_DELAY,
    INPUT_CONTROL_SET_SPU_DELAY,
203 204

    INPUT_CONTROL_ADD_SLAVE,
205

206 207
    INPUT_CONTROL_ADD_SUBTITLE,

208
    INPUT_CONTROL_SET_RECORD_STATE,
209 210

    INPUT_CONTROL_SET_FRAME_NEXT,
211 212 213
};

/* Internal helpers */
Laurent Aimar's avatar
Laurent Aimar committed
214
void input_ControlPush( input_thread_t *, int i_type, vlc_value_t * );
215

216 217 218
/**********************************************************************
 * Item metadata
 **********************************************************************/
219 220
/* input_ExtractAttachmentAndCacheArt:
 *  Becarefull; p_item lock HAS to be taken */
221 222
void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input );

223 224 225 226
/***************************************************************************
 * Internal prototypes
 ***************************************************************************/

227 228
/* var.c */
void input_ControlVarInit ( input_thread_t * );
229
void input_ControlVarStop( input_thread_t * );
230 231 232 233 234 235
void input_ControlVarNavigation( input_thread_t * );
void input_ControlVarTitle( input_thread_t *, int i_title );

void input_ConfigVarInit ( input_thread_t * );

/* Subtitles */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
236
char **subtitles_Detect( input_thread_t *, char* path, const char *fname );
237 238
int subtitles_Filter( const char *);

239
#endif