input_internal.h 6.92 KB
Newer Older
1
/*****************************************************************************
2
 * input_internal.h: Internal input structures
3
 *****************************************************************************
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
4
 * Copyright (C) 1998-2006 VLC authors and VideoLAN
Antoine Cellerier's avatar
Antoine Cellerier committed
5
 * $Id$
6 7 8
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
 *
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
9 10 11
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
12 13 14 15
 * (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
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
16 17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
18
 *
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
19 20 21
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 23
 *****************************************************************************/

24 25
#ifndef LIBVLC_INPUT_INTERNAL_H
#define LIBVLC_INPUT_INTERNAL_H 1
26

27 28 29
#include <vlc_access.h>
#include <vlc_demux.h>
#include <vlc_input.h>
30
#include <libvlc.h>
31
#include "input_interface.h"
32 33 34 35

/*****************************************************************************
 *  Private input fields
 *****************************************************************************/
36 37 38

#define INPUT_CONTROL_FIFO_SIZE    100

39 40 41 42 43 44 45 46 47
/* 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
48
    bool         b_title_demux; /* Titles/Seekpoints provided by demux */
49 50 51 52 53 54 55 56 57 58 59 60
    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 */
61 62 63
    bool b_can_pause;
    bool b_can_pace_control;
    bool b_can_rate_control;
64
    bool b_can_stream_record;
65
    bool b_rescale_ts;
66

67 68 69
    /* */
    int64_t i_pts_delay;

Antoine Cellerier's avatar
Antoine Cellerier committed
70
    bool       b_eof;   /* eof of demuxer */
71 72 73

} input_source_t;

Laurent Aimar's avatar
Laurent Aimar committed
74 75 76 77 78 79
typedef struct
{
    int         i_type;
    vlc_value_t val;
} input_control_t;

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

90
    /* Current state */
91
    bool        b_recording;
92
    int         i_rate;
93

94
    /* Playtime configuration and state */
95 96
    int64_t     i_start;    /* :start-time,0 by default */
    int64_t     i_stop;     /* :stop-time, 0 if none */
97
    int64_t     i_run;      /* :run-time, 0 if none */
98
    int64_t     i_time;     /* Current time */
99
    bool        b_fast_seek;/* :input-fast-seek */
100

101 102 103 104 105 106
    /* Output */
    bool            b_out_pace_control; /* XXX Move it ot es_sout ? */
    sout_instance_t *p_sout;            /* Idem ? */
    es_out_t        *p_es_out;
    es_out_t        *p_es_out_display;

107 108 109 110 111 112 113 114
    /* 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 */
115
    seekpoint_t bookmark;
116
    int         i_bookmark;
117
    seekpoint_t **pp_bookmark;
118

119 120 121 122
    /* Input attachment */
    int i_attachment;
    input_attachment_t **attachment;

123
    /* Main input properties */
124

125 126
    /* Input item */
    input_item_t   *p_item;
127

128
    /* Main source */
129
    input_source_t input;
130
    /* Slave sources (subs, and others) */
131 132 133
    int            i_slave;
    input_source_t **slave;

134
    /* Resources */
135
    input_resource_t *p_resource;
136
    input_resource_t *p_resource_private;
137

138 139 140 141 142 143 144
    /* 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;
145 146
        counter_t *p_demux_corrupted;
        counter_t *p_demux_discontinuity;
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
        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;
162
    vlc_cond_t  wait_control;
163
    int i_control;
Laurent Aimar's avatar
Laurent Aimar committed
164 165
    input_control_t control[INPUT_CONTROL_FIFO_SIZE];

166
    bool b_abort;
167 168
    bool is_running;
    vlc_thread_t thread;
169 170 171 172 173
};

/***************************************************************************
 * Internal control helpers
 ***************************************************************************/
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_POSITION,

    INPUT_CONTROL_SET_TIME,

    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 215 216 217

/* XXX for string value you have to allocate it before calling
 * input_ControlPush
 */
Laurent Aimar's avatar
Laurent Aimar committed
218
void input_ControlPush( input_thread_t *, int i_type, vlc_value_t * );
219

220 221 222
/* Bound pts_delay */
#define INPUT_PTS_DELAY_MAX INT64_C(60000000)

223 224 225
/**********************************************************************
 * Item metadata
 **********************************************************************/
226 227
/* input_ExtractAttachmentAndCacheArt:
 *  Becarefull; p_item lock HAS to be taken */
228 229
void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input );

230 231 232 233
/***************************************************************************
 * Internal prototypes
 ***************************************************************************/

234 235
/* var.c */
void input_ControlVarInit ( input_thread_t * );
236
void input_ControlVarStop( input_thread_t * );
237 238 239 240 241 242
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
243
char **subtitles_Detect( input_thread_t *, char* path, const char *fname );
244 245
int subtitles_Filter( const char *);

246
/* input.c */
247 248
void input_SplitMRL( const char **, const char **, const char **,
                     const char **, char * );
249

250
#endif