VLC
2.1.0-git
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
vlc_demux.h
Go to the documentation of this file.
1
/*****************************************************************************
2
* vlc_demux.h: Demuxer descriptor, queries and methods
3
*****************************************************************************
4
* Copyright (C) 1999-2005 VLC authors and VideoLAN
5
* $Id: c0cea070a3cccc4e7f61082bfa70d3ac30ae4323 $
6
*
7
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
8
*
9
* This program is free software; you can redistribute it and/or modify it
10
* under the terms of the GNU Lesser General Public License as published by
11
* the Free Software Foundation; either version 2.1 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU Lesser General Public License for more details.
18
*
19
* You should have received a copy of the GNU Lesser General Public License
20
* along with this program; if not, write to the Free Software Foundation,
21
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22
*****************************************************************************/
23
24
#ifndef VLC_DEMUX_H
25
#define VLC_DEMUX_H 1
26
27
/**
28
* \file
29
* This files defines functions and structures used by demux objects in vlc
30
*/
31
32
#include <
vlc_es.h
>
33
#include <
vlc_stream.h
>
34
#include <
vlc_es_out.h
>
35
36
/**
37
* \defgroup demux Demux
38
* @{
39
*/
40
41
struct
demux_t
42
{
43
VLC_COMMON_MEMBERS
44
45
/* Module properties */
46
module_t
*
p_module
;
47
48
/* eg informative but needed (we can have access+demux) */
49
char
*
psz_access
;
50
char
*
psz_demux
;
51
char
*
psz_location
;
52
char
*
psz_file
;
53
54
/* input stream */
55
stream_t
*
s
;
/* NULL in case of a access+demux in one */
56
57
/* es output */
58
es_out_t
*
out
;
/* our p_es_out */
59
60
/* set by demuxer */
61
int (*
pf_demux
) (
demux_t
* );
/* demux one frame only */
62
int (*
pf_control
)(
demux_t
*,
int
i_query, va_list args);
63
64
/* Demux has to maintain them uptodate
65
* when it is responsible of seekpoint/title */
66
struct
67
{
68
unsigned
int
i_update
;
/* Demux sets them on change,
69
Input removes them once take into account*/
70
/* Seekpoint/Title at demux level */
71
int
i_title
;
/* idem, start from 0 (could be menu) */
72
int
i_seekpoint
;
/* idem, start from 0 */
73
}
info
;
74
demux_sys_t
*
p_sys
;
75
76
/* Weak link to parent input */
77
input_thread_t
*
p_input
;
78
};
79
80
81
/* demux_meta_t is returned by "meta reader" module to the demuxer */
82
typedef
struct
demux_meta_t
83
{
84
VLC_COMMON_MEMBERS
85
demux_t
*
p_demux
;
/** FIXME: use stream_t instead? */
86
input_item_t
*
p_item
;
/***< the input item that is being read */
87
88
vlc_meta_t
*
p_meta
;
/**< meta data */
89
90
int
i_attachments
;
/**< number of attachments */
91
input_attachment_t
**
attachments
;
/**< array of attachments */
92
}
demux_meta_t
;
93
94
enum
demux_query_e
95
{
96
/* I. Common queries to access_demux and demux */
97
/* POSITION double between 0.0 and 1.0 */
98
DEMUX_GET_POSITION
,
/* arg1= double * res= */
99
DEMUX_SET_POSITION
,
/* arg1= double arg2= bool b_precise res=can fail */
100
101
/* LENGTH/TIME in microsecond, 0 if unknown */
102
DEMUX_GET_LENGTH
,
/* arg1= int64_t * res= */
103
DEMUX_GET_TIME
,
/* arg1= int64_t * res= */
104
DEMUX_SET_TIME
,
/* arg1= int64_t arg2= bool b_precise res=can fail */
105
106
/* TITLE_INFO only if more than 1 title or 1 chapter */
107
DEMUX_GET_TITLE_INFO
,
/* arg1=input_title_t*** arg2=int*
108
arg3=int*pi_title_offset(0), arg4=int*pi_seekpoint_offset(0) can fail */
109
/* TITLE/SEEKPOINT, only when TITLE_INFO succeed */
110
DEMUX_SET_TITLE
,
/* arg1= int can fail */
111
DEMUX_SET_SEEKPOINT
,
/* arg1= int can fail */
112
113
/* DEMUX_SET_GROUP only a hint for demuxer (mainly DVB) to allow not
114
* reading everything (you should not use this to call es_out_Control)
115
* if you don't know what to do with it, just IGNORE it, it is safe(r)
116
* -1 means all group, 0 default group (first es added) */
117
DEMUX_SET_GROUP
,
/* arg1= int, arg2=const vlc_list_t * can fail */
118
119
/* Ask the demux to demux until the given date at the next pf_demux call
120
* but not more (and not less, at the precision available of course).
121
* XXX: not mandatory (except for subtitle demux) but will help a lot
122
* for multi-input
123
*/
124
DEMUX_SET_NEXT_DEMUX_TIME
,
/* arg1= int64_t can fail */
125
/* FPS for correct subtitles handling */
126
DEMUX_GET_FPS
,
/* arg1= double * res=can fail */
127
128
/* Meta data */
129
DEMUX_GET_META
,
/* arg1= vlc_meta_t ** res=can fail */
130
DEMUX_HAS_UNSUPPORTED_META
,
/* arg1= bool * res can fail */
131
132
/* Attachments */
133
DEMUX_GET_ATTACHMENTS
,
/* arg1=input_attachment_t***, int* res=can fail */
134
135
/* RECORD you are ensured that it is never called twice with the same state
136
* you should accept it only if the stream can be recorded without
137
* any modification or header addition. */
138
DEMUX_CAN_RECORD
,
/* arg1=bool* res=can fail(assume false) */
139
DEMUX_SET_RECORD_STATE
,
/* arg1=bool res=can fail */
140
141
142
/* II. Specific access_demux queries */
143
/* PAUSE you are ensured that it is never called twice with the same state */
144
DEMUX_CAN_PAUSE
= 0x1000,
/* arg1= bool* can fail (assume false)*/
145
DEMUX_SET_PAUSE_STATE
,
/* arg1= bool can fail */
146
147
DEMUX_GET_PTS_DELAY
,
/* arg1= int64_t* cannot fail */
148
149
/* DEMUX_CAN_CONTROL_PACE returns true (*pb_pace) if we can read the
150
* data at our pace */
151
DEMUX_CAN_CONTROL_PACE
,
/* arg1= bool*pb_pace can fail (assume false) */
152
153
/* DEMUX_CAN_CONTROL_RATE is called only if DEMUX_CAN_CONTROL_PACE has returned false.
154
* *pb_rate should be true when the rate can be changed (using DEMUX_SET_RATE)
155
* *pb_ts_rescale should be true when the timestamps (pts/dts/pcr) have to be rescaled */
156
DEMUX_CAN_CONTROL_RATE
,
/* arg1= bool*pb_rate arg2= bool*pb_ts_rescale can fail(assume false) */
157
/* DEMUX_SET_RATE is called only if DEMUX_CAN_CONTROL_RATE has returned true.
158
* It should return the value really used in *pi_rate */
159
DEMUX_SET_RATE
,
/* arg1= int*pi_rate can fail */
160
161
DEMUX_CAN_SEEK
,
/* arg1= bool* can fail (assume false)*/
162
163
DEMUX_GET_SIGNAL
,
/* arg1= double * arg2= double * can fail */
164
165
/* Navigation */
166
DEMUX_NAV_ACTIVATE
,
/* res=can fail */
167
DEMUX_NAV_UP
,
/* res=can fail */
168
DEMUX_NAV_DOWN
,
/* res=can fail */
169
DEMUX_NAV_LEFT
,
/* res=can fail */
170
DEMUX_NAV_RIGHT
,
/* res=can fail */
171
};
172
173
VLC_API
int
demux_vaControlHelper
(
stream_t
*, int64_t i_start, int64_t i_end, int64_t i_bitrate,
int
i_align,
int
i_query, va_list args );
174
175
/*************************************************************************
176
* Miscellaneous helpers for demuxers
177
*************************************************************************/
178
179
VLC_USED
180
static
inline
bool
demux_IsPathExtension
(
demux_t
*p_demux,
const
char
*psz_extension )
181
{
182
if
( !p_demux->
psz_file
)
183
return
false
;
184
185
const
char
*
psz_ext
= strrchr ( p_demux->
psz_file
,
'.'
);
186
if
( !psz_ext ||
strcasecmp
( psz_ext, psz_extension ) )
187
return
false
;
188
return
true
;
189
}
190
191
VLC_USED
192
static
inline
bool
demux_IsForced
(
demux_t
*p_demux,
const
char
*
psz_name
)
193
{
194
if
( !p_demux->
psz_demux
|| strcmp( p_demux->
psz_demux
, psz_name ) )
195
return
false
;
196
return
true
;
197
}
198
199
/**
200
* This function will create a packetizer suitable for a demuxer that parses
201
* elementary stream.
202
*
203
* The provided es_format_t will be cleaned on error or by
204
* demux_PacketizerDestroy.
205
*/
206
VLC_API
decoder_t
*
demux_PacketizerNew
(
demux_t
*p_demux,
es_format_t
*p_fmt,
const
char
*psz_msg )
VLC_USED
;
207
208
/**
209
* This function will destroy a packetizer create by demux_PacketizerNew.
210
*/
211
VLC_API
void
demux_PacketizerDestroy
(
decoder_t
*p_packetizer );
212
213
/**
214
* This function will return the parent input of this demux.
215
* It is retained. Can return NULL.
216
*/
217
VLC_API
input_thread_t
*
demux_GetParentInput
(
demux_t
*p_demux )
VLC_USED
;
218
219
/* */
220
#define DEMUX_INIT_COMMON() do { \
221
p_demux->pf_control = Control; \
222
p_demux->pf_demux = Demux; \
223
p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \
224
if( !p_demux->p_sys ) return VLC_ENOMEM;\
225
} while(0)
226
227
/**
228
* @}
229
*/
230
231
#endif
Generated by
1.8.1.2