lib: deprecate the old track API
[vlc.git] / include / vlc_demux.h
blob5d67813fc0ed6a5a332e0cf73c2a7e062e67b590
1 /*****************************************************************************
2 * vlc_demux.h: Demuxer descriptor, queries and methods
3 *****************************************************************************
4 * Copyright (C) 1999-2005 VLC authors and VideoLAN
6 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
23 #ifndef VLC_DEMUX_H
24 #define VLC_DEMUX_H 1
26 #include <stdlib.h>
27 #include <string.h>
29 #include <vlc_es.h>
30 #include <vlc_stream.h>
31 #include <vlc_es_out.h>
33 /**
34 * \defgroup demux Demultiplexer
35 * \ingroup input
36 * Demultiplexers (file format parsers)
37 * @{
38 * \file
39 * Demultiplexer modules interface
42 /* pf_demux return values */
43 #define VLC_DEMUXER_EOF 0
44 #define VLC_DEMUXER_EGENERIC -1
45 #define VLC_DEMUXER_SUCCESS 1
47 /* DEMUX_TEST_AND_CLEAR flags */
48 #define INPUT_UPDATE_TITLE 0x0010
49 #define INPUT_UPDATE_SEEKPOINT 0x0020
50 #define INPUT_UPDATE_META 0x0040
51 #define INPUT_UPDATE_TITLE_LIST 0x0100
53 /* demux_meta_t is returned by "meta reader" module to the demuxer */
54 typedef struct demux_meta_t
56 struct vlc_object_t obj;
57 input_item_t *p_item; /***< the input item that is being read */
59 vlc_meta_t *p_meta; /**< meta data */
61 int i_attachments; /**< number of attachments */
62 input_attachment_t **attachments; /**< array of attachments */
63 } demux_meta_t;
65 /**
66 * Control query identifiers for use with demux_t.pf_control
68 * In the individual identifier description, the input stream refers to
69 * demux_t.s if non-NULL, and the output refers to demux_t.out.
71 * A demuxer is synchronous if it only accesses its input stream and the
72 * output from within its demux_t callbacks, i.e. demux.pf_demux and
73 * demux_t.pf_control.
75 * A demuxer is threaded if it accesses either or both input and output
76 * asynchronously.
78 * An access-demuxer is a demuxer without input, i.e. demux_t.s == NULL).
80 enum demux_query_e
82 /** Checks whether the stream supports seeking.
83 * Can fail if seeking is not supported (same as returning false).
84 * \bug Failing should not be allowed.
86 * arg1 = bool * */
87 DEMUX_CAN_SEEK,
89 /** Checks whether (long) pause then stream resumption is supported.
90 * Can fail only if synchronous and <b>not</b> an access-demuxer. The
91 * underlying input stream then determines if pause is supported.
92 * \bug Failing should not be allowed.
94 * arg1= bool * */
95 DEMUX_CAN_PAUSE = 0x002,
97 /** Whether the stream can be read at an arbitrary pace.
98 * Cannot fail.
100 * arg1= bool * */
101 DEMUX_CAN_CONTROL_PACE,
103 /** Retrieves the PTS delay (roughly the default buffer duration).
104 * Can fail only if synchronous and <b>not</b> an access-demuxer. The
105 * underlying input stream then determines the PTS delay.
107 * arg1= vlc_tick_t * */
108 DEMUX_GET_PTS_DELAY = 0x101,
110 /** Retrieves stream meta-data.
111 * Should fail if no meta-data were retrieved.
113 * arg1= vlc_meta_t * */
114 DEMUX_GET_META = 0x105,
116 /** Retrieves an estimate of signal quality and strength.
117 * Can fail.
119 * arg1=double *quality, arg2=double *strength */
120 DEMUX_GET_SIGNAL = 0x107,
122 /** Sets the paused or playing/resumed state.
124 * Streams are initially in playing state. The control always specifies a
125 * change from paused to playing (false) or from playing to paused (true)
126 * and streams are initially playing; a no-op cannot be requested.
128 * The control is never used if DEMUX_CAN_PAUSE fails.
129 * Can fail.
131 * arg1= bool */
132 DEMUX_SET_PAUSE_STATE = 0x200,
134 /** Seeks to the beginning of a title.
136 * The control is never used if DEMUX_GET_TITLE_INFO fails.
137 * Can fail.
139 * arg1= int */
140 DEMUX_SET_TITLE,
142 /** Seeks to the beginning of a chapter of the current title.
144 * The control is never used if DEMUX_GET_TITLE_INFO fails.
145 * Can fail.
147 * arg1= int */
148 DEMUX_SET_SEEKPOINT, /* arg1= int can fail */
150 /** Check which INPUT_UPDATE_XXX flag is set and reset the ones set.
152 * The unsigned* argument is set with the flags needed to be checked,
153 * on return it contains the values that were reset during the call
155 * arg1= unsigned * */
156 DEMUX_TEST_AND_CLEAR_FLAGS, /* arg1= unsigned* can fail */
158 /** Read the title number currently playing
160 * Can fail.
162 * arg1= int * */
163 DEMUX_GET_TITLE, /* arg1= int* can fail */
165 /* Read the seekpoint/chapter currently playing
167 * Can fail.
169 * arg1= int * */
170 DEMUX_GET_SEEKPOINT, /* arg1= int* can fail */
172 /* I. Common queries to access_demux and demux */
173 /* POSITION double between 0.0 and 1.0 */
174 DEMUX_GET_POSITION = 0x300, /* arg1= double * res= */
175 DEMUX_SET_POSITION, /* arg1= double arg2= bool b_precise res=can fail */
177 /* LENGTH/TIME in microsecond, 0 if unknown */
178 DEMUX_GET_LENGTH, /* arg1= vlc_tick_t * res= */
179 DEMUX_GET_TIME, /* arg1= vlc_tick_t * res= */
180 DEMUX_SET_TIME, /* arg1= vlc_tick_t arg2= bool b_precise res=can fail */
181 /* Normal or original time, used mainly by the ts module */
182 DEMUX_GET_NORMAL_TIME, /* arg1= vlc_tick_t * res= can fail, in that case VLC_TICK_0 will be used as NORMAL_TIME */
185 * \todo Document
187 * \warning The prototype is different from STREAM_GET_TITLE_INFO
189 * Can fail, meaning there is only one title and one chapter.
191 * arg1= input_title_t ***, arg2=int *, arg3=int *pi_title_offset(0),
192 * arg4= int *pi_seekpoint_offset(0) */
193 DEMUX_GET_TITLE_INFO,
195 /* DEMUX_SET_GROUP_* / DEMUX_SET_ES is only a hint for demuxer (mainly DVB)
196 * to avoid parsing everything (you should not use this to call
197 * es_out_Control()).
198 * If you don't know what to do with it, just IGNORE it: it is safe(r). */
199 DEMUX_SET_GROUP_DEFAULT,
200 DEMUX_SET_GROUP_ALL,
201 DEMUX_SET_GROUP_LIST, /* arg1= size_t, arg2= const int *, can fail */
202 DEMUX_SET_ES, /* arg1= int can fail */
203 DEMUX_SET_ES_LIST, /* arg1= size_t, arg2= const int * (can be NULL) can fail */
205 /* Ask the demux to demux until the given date at the next pf_demux call
206 * but not more (and not less, at the precision available of course).
207 * XXX: not mandatory (except for subtitle demux) but will help a lot
208 * for multi-input
210 DEMUX_SET_NEXT_DEMUX_TIME, /* arg1= vlc_tick_t can fail */
211 /* FPS for correct subtitles handling */
212 DEMUX_GET_FPS, /* arg1= double * res=can fail */
214 /* Meta data */
215 DEMUX_HAS_UNSUPPORTED_META, /* arg1= bool * res can fail */
217 /* Attachments */
218 DEMUX_GET_ATTACHMENTS, /* arg1=input_attachment_t***, int* res=can fail */
220 /* RECORD you are ensured that it is never called twice with the same state
221 * you should accept it only if the stream can be recorded without
222 * any modification or header addition. */
223 DEMUX_CAN_RECORD, /* arg1=bool* res=can fail(assume false) */
225 * \todo Document
227 * \warning The prototype is different from STREAM_SET_RECORD_STATE
229 * The control is never used if DEMUX_CAN_RECORD fails or returns false.
230 * Can fail.
232 * arg1= bool */
233 DEMUX_SET_RECORD_STATE,
235 /* II. Specific access_demux queries */
237 /* DEMUX_CAN_CONTROL_RATE is called only if DEMUX_CAN_CONTROL_PACE has
238 * returned false. *pb_rate should be true when the rate can be changed
239 * (using DEMUX_SET_RATE). */
240 DEMUX_CAN_CONTROL_RATE, /* arg1= bool*pb_rate */
241 /* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true.
242 * It should return the value really used in *p_rate */
243 DEMUX_SET_RATE, /* arg1= float*p_rate res=can fail */
245 /** Checks whether the stream is actually a playlist, rather than a real
246 * stream.
248 * Can fail if the stream is not a playlist (same as returning false).
250 * arg1= bool * */
251 DEMUX_IS_PLAYLIST,
253 /* Menu (VCD/DVD/BD) Navigation */
254 /** Activate the navigation item selected. Can fail */
255 DEMUX_NAV_ACTIVATE,
256 /** Use the up arrow to select a navigation item above. Can fail */
257 DEMUX_NAV_UP,
258 /** Use the down arrow to select a navigation item under. Can fail */
259 DEMUX_NAV_DOWN,
260 /** Use the left arrow to select a navigation item on the left. Can fail */
261 DEMUX_NAV_LEFT,
262 /** Use the right arrow to select a navigation item on the right. Can fail */
263 DEMUX_NAV_RIGHT,
264 /** Activate the popup Menu (for BD). Can fail */
265 DEMUX_NAV_POPUP,
266 /** Activate disc Root Menu. Can fail */
267 DEMUX_NAV_MENU, /* res=can fail */
268 /** Enable/Disable a demux filter
269 * \warning This has limited support, and is likely to break if more than
270 * a single demux_filter is present in the chain. This is not guaranteed to
271 * work in future VLC versions, nor with all demux filters
273 DEMUX_FILTER_ENABLE,
274 DEMUX_FILTER_DISABLE
277 /*************************************************************************
278 * Main Demux
279 *************************************************************************/
281 VLC_API demux_t *demux_New( vlc_object_t *p_obj, const char *psz_name,
282 stream_t *s, es_out_t *out );
284 static inline void demux_Delete(demux_t *demux)
286 vlc_stream_Delete(demux);
289 VLC_API int demux_vaControlHelper( stream_t *, int64_t i_start, int64_t i_end,
290 int64_t i_bitrate, int i_align, int i_query, va_list args );
292 VLC_USED static inline int demux_Demux( demux_t *p_demux )
294 if( !p_demux->pf_demux )
295 return VLC_DEMUXER_SUCCESS;
297 return p_demux->pf_demux( p_demux );
300 VLC_API int demux_vaControl( demux_t *p_demux, int i_query, va_list args );
302 static inline int demux_Control( demux_t *p_demux, int i_query, ... )
304 va_list args;
305 int i_result;
307 va_start( args, i_query );
308 i_result = demux_vaControl( p_demux, i_query, args );
309 va_end( args );
310 return i_result;
313 /*************************************************************************
314 * Miscellaneous helpers for demuxers
315 *************************************************************************/
317 #ifndef __cplusplus
318 static inline void demux_UpdateTitleFromStream( demux_t *demux,
319 int *restrict titlep, int *restrict seekpointp,
320 unsigned *restrict updatep )
322 stream_t *s = demux->s;
323 unsigned title, seekpoint;
325 if( vlc_stream_Control( s, STREAM_GET_TITLE, &title ) == VLC_SUCCESS
326 && title != (unsigned)*titlep )
328 *titlep = title;
329 *updatep |= INPUT_UPDATE_TITLE;
332 if( vlc_stream_Control( s, STREAM_GET_SEEKPOINT,
333 &seekpoint ) == VLC_SUCCESS
334 && seekpoint != (unsigned)*seekpointp )
336 *seekpointp = seekpoint;
337 *updatep |= INPUT_UPDATE_SEEKPOINT;
340 # define demux_UpdateTitleFromStream(demux) \
341 demux_UpdateTitleFromStream(demux, \
342 &((demux_sys_t *)((demux)->p_sys))->current_title, \
343 &((demux_sys_t *)((demux)->p_sys))->current_seekpoint, \
344 &((demux_sys_t *)((demux)->p_sys))->updates)
345 #endif
347 VLC_USED
348 static inline bool demux_IsPathExtension( demux_t *p_demux, const char *psz_extension )
350 const char *name = (p_demux->psz_filepath != NULL) ? p_demux->psz_filepath
351 : p_demux->psz_location;
352 const char *psz_ext = strrchr ( name, '.' );
353 if( !psz_ext || strcasecmp( psz_ext, psz_extension ) )
354 return false;
355 return true;
358 VLC_USED
359 static inline bool demux_IsContentType(demux_t *demux, const char *type)
361 return stream_IsMimeType(demux->s, type);
364 VLC_USED
365 static inline bool demux_IsForced( demux_t *p_demux, const char *psz_name )
367 if( p_demux->psz_name == NULL || strcmp( p_demux->psz_name, psz_name ) )
368 return false;
369 return true;
372 static inline int demux_SetPosition( demux_t *p_demux, double pos, bool precise,
373 bool absolute)
375 if( !absolute )
377 double current_pos;
378 int ret = demux_Control( p_demux, DEMUX_GET_POSITION, &current_pos );
379 if( ret != VLC_SUCCESS )
380 return ret;
381 pos += current_pos;
384 if( pos < 0.f )
385 pos = 0.f;
386 else if( pos > 1.f )
387 pos = 1.f;
388 return demux_Control( p_demux, DEMUX_SET_POSITION, pos, precise );
391 static inline int demux_SetTime( demux_t *p_demux, vlc_tick_t time, bool precise,
392 bool absolute )
394 if( !absolute )
396 vlc_tick_t current_time;
397 int ret = demux_Control( p_demux, DEMUX_GET_TIME, &current_time );
398 if( ret != VLC_SUCCESS )
399 return ret;
400 time += current_time;
403 if( time < 0 )
404 time = 0;
405 return demux_Control( p_demux, DEMUX_SET_TIME, time, precise );
409 * This function will create a packetizer suitable for a demuxer that parses
410 * elementary stream.
412 * The provided es_format_t will be cleaned on error or by
413 * demux_PacketizerDestroy.
415 VLC_API decoder_t * demux_PacketizerNew( demux_t *p_demux, es_format_t *p_fmt, const char *psz_msg ) VLC_USED;
418 * This function will destroy a packetizer create by demux_PacketizerNew.
420 VLC_API void demux_PacketizerDestroy( decoder_t *p_packetizer );
422 /* */
423 #define DEMUX_INIT_COMMON() do { \
424 p_demux->pf_control = Control; \
425 p_demux->pf_demux = Demux; \
426 p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \
427 if( !p_demux->p_sys ) return VLC_ENOMEM;\
428 } while(0)
431 * \defgroup chained_demux Chained demultiplexer
432 * Demultiplexers wrapped by another demultiplexer
433 * @{
436 typedef struct vlc_demux_chained_t vlc_demux_chained_t;
439 * Creates a chained demuxer.
441 * This creates a thread running a demuxer whose input stream is generated
442 * directly by the caller. This typically handles some sort of stream within a
443 * stream, e.g. MPEG-TS within something else.
445 * \note There are a number of limitations to this approach. The chained
446 * demuxer is run asynchronously in a separate thread. Most demuxer controls
447 * are synchronous and therefore unavailable in this case. Also the input
448 * stream is a simple FIFO, so the chained demuxer cannot perform seeks.
449 * Lastly, most errors cannot be detected.
451 * \param parent parent VLC object
452 * \param name chained demux module name (e.g. "ts")
453 * \param out elementary stream output for the chained demux
454 * \return a non-NULL pointer on success, NULL on failure.
456 VLC_API vlc_demux_chained_t *vlc_demux_chained_New(vlc_object_t *parent,
457 const char *name,
458 es_out_t *out);
461 * Destroys a chained demuxer.
463 * Sends an end-of-stream to the chained demuxer, and releases all underlying
464 * allocated resources.
466 VLC_API void vlc_demux_chained_Delete(vlc_demux_chained_t *);
469 * Sends data to a chained demuxer.
471 * This queues data for a chained demuxer to consume.
473 * \param block data block to queue
475 VLC_API void vlc_demux_chained_Send(vlc_demux_chained_t *, block_t *block);
478 * Controls a chained demuxer.
480 * This performs a <b>demux</b> (i.e. DEMUX_...) control request on a chained
481 * demux.
483 * \note In most cases, vlc_demux_chained_Control() should be used instead.
484 * \warning As per vlc_demux_chained_New(), most demux controls are not, and
485 * cannot be, supported; VLC_EGENERIC is returned.
487 * \param query demux control (see \ref demux_query_e)
488 * \param args variable arguments (depending on the query)
490 VLC_API int vlc_demux_chained_ControlVa(vlc_demux_chained_t *, int query,
491 va_list args);
493 static inline int vlc_demux_chained_Control(vlc_demux_chained_t *dc, int query,
494 ...)
496 va_list ap;
497 int ret;
499 va_start(ap, query);
500 ret = vlc_demux_chained_ControlVa(dc, query, ap);
501 va_end(ap);
502 return ret;
506 * @}
510 * @}
513 #endif