comparison libmpdemux/demuxer.c @ 26379:fa8997230d4e

Reformat demuxer.c Indent with "indent -kr -l79 -nut" and fix various suboptimal results by hand. Also remove some commented-out cruft and one unnecessary case of parentheses as in "return (r)".
author uau
date Sat, 12 Apr 2008 15:51:08 +0000
parents 2dc23fc4724a
children 2735c113ed62
comparison
equal deleted inserted replaced
26378:2dc23fc4724a 26379:fa8997230d4e
76 76
77 /* Please do not add any new demuxers here. If you want to implement a new 77 /* Please do not add any new demuxers here. If you want to implement a new
78 * demuxer, add it to libavformat, except for wrappers around external 78 * demuxer, add it to libavformat, except for wrappers around external
79 * libraries and demuxers requiring binary support. */ 79 * libraries and demuxers requiring binary support. */
80 80
81 const demuxer_desc_t* const demuxer_list[] = { 81 const demuxer_desc_t *const demuxer_list[] = {
82 &demuxer_desc_rawaudio, 82 &demuxer_desc_rawaudio,
83 &demuxer_desc_rawvideo, 83 &demuxer_desc_rawvideo,
84 #ifdef USE_TV 84 #ifdef USE_TV
85 &demuxer_desc_tv, 85 &demuxer_desc_tv,
86 #endif 86 #endif
87 &demuxer_desc_mf, 87 &demuxer_desc_mf,
88 #ifdef USE_LIBAVFORMAT 88 #ifdef USE_LIBAVFORMAT
89 &demuxer_desc_lavf_preferred, 89 &demuxer_desc_lavf_preferred,
90 #endif 90 #endif
91 &demuxer_desc_avi, 91 &demuxer_desc_avi,
92 &demuxer_desc_y4m, 92 &demuxer_desc_y4m,
93 &demuxer_desc_asf, 93 &demuxer_desc_asf,
94 &demuxer_desc_nsv, 94 &demuxer_desc_nsv,
95 &demuxer_desc_nuv, 95 &demuxer_desc_nuv,
96 &demuxer_desc_real, 96 &demuxer_desc_real,
97 &demuxer_desc_smjpeg, 97 &demuxer_desc_smjpeg,
98 &demuxer_desc_matroska, 98 &demuxer_desc_matroska,
99 &demuxer_desc_realaudio, 99 &demuxer_desc_realaudio,
100 &demuxer_desc_vqf, 100 &demuxer_desc_vqf,
101 &demuxer_desc_mov, 101 &demuxer_desc_mov,
102 &demuxer_desc_vivo, 102 &demuxer_desc_vivo,
103 &demuxer_desc_fli, 103 &demuxer_desc_fli,
104 &demuxer_desc_film, 104 &demuxer_desc_film,
105 &demuxer_desc_roq, 105 &demuxer_desc_roq,
106 #ifdef HAVE_GIF 106 #ifdef HAVE_GIF
107 &demuxer_desc_gif, 107 &demuxer_desc_gif,
108 #endif 108 #endif
109 #ifdef HAVE_OGGVORBIS 109 #ifdef HAVE_OGGVORBIS
110 &demuxer_desc_ogg, 110 &demuxer_desc_ogg,
111 #endif 111 #endif
112 #ifdef USE_WIN32DLL 112 #ifdef USE_WIN32DLL
113 &demuxer_desc_avs, 113 &demuxer_desc_avs,
114 #endif 114 #endif
115 &demuxer_desc_pva, 115 &demuxer_desc_pva,
116 &demuxer_desc_mpeg_ts, 116 &demuxer_desc_mpeg_ts,
117 &demuxer_desc_lmlm4, 117 &demuxer_desc_lmlm4,
118 &demuxer_desc_mpeg_ps, 118 &demuxer_desc_mpeg_ps,
119 &demuxer_desc_mpeg_pes, 119 &demuxer_desc_mpeg_pes,
120 &demuxer_desc_mpeg_es, 120 &demuxer_desc_mpeg_es,
121 &demuxer_desc_mpeg_gxf, 121 &demuxer_desc_mpeg_gxf,
122 &demuxer_desc_mpeg4_es, 122 &demuxer_desc_mpeg4_es,
123 &demuxer_desc_h264_es, 123 &demuxer_desc_h264_es,
124 #ifdef MUSEPACK 124 #ifdef MUSEPACK
125 &demuxer_desc_mpc, 125 &demuxer_desc_mpc,
126 #endif 126 #endif
127 &demuxer_desc_audio, 127 &demuxer_desc_audio,
128 &demuxer_desc_mpeg_ty, 128 &demuxer_desc_mpeg_ty,
129 #ifdef STREAMING_LIVE555 129 #ifdef STREAMING_LIVE555
130 &demuxer_desc_rtp, 130 &demuxer_desc_rtp,
131 #endif 131 #endif
132 #ifdef LIBNEMESI 132 #ifdef LIBNEMESI
133 &demuxer_desc_rtp_nemesi, 133 &demuxer_desc_rtp_nemesi,
134 #endif 134 #endif
135 #ifdef USE_LIBAVFORMAT 135 #ifdef USE_LIBAVFORMAT
136 &demuxer_desc_lavf, 136 &demuxer_desc_lavf,
137 #endif 137 #endif
138 #ifdef HAVE_LIBDV095 138 #ifdef HAVE_LIBDV095
139 &demuxer_desc_rawdv, 139 &demuxer_desc_rawdv,
140 #endif 140 #endif
141 &demuxer_desc_aac, 141 &demuxer_desc_aac,
142 #ifdef HAVE_LIBNUT 142 #ifdef HAVE_LIBNUT
143 &demuxer_desc_nut, 143 &demuxer_desc_nut,
144 #endif 144 #endif
145 #ifdef HAVE_XMMS 145 #ifdef HAVE_XMMS
146 &demuxer_desc_xmms, 146 &demuxer_desc_xmms,
147 #endif 147 #endif
148 /* Please do not add any new demuxers here. If you want to implement a new 148 /* Please do not add any new demuxers here. If you want to implement a new
149 * demuxer, add it to libavformat, except for wrappers around external 149 * demuxer, add it to libavformat, except for wrappers around external
150 * libraries and demuxers requiring binary support. */ 150 * libraries and demuxers requiring binary support. */
151 NULL 151 NULL
152 }; 152 };
153 153
154 void free_demuxer_stream(demux_stream_t *ds){ 154 void free_demuxer_stream(demux_stream_t *ds)
155 {
155 ds_free_packs(ds); 156 ds_free_packs(ds);
156 free(ds); 157 free(ds);
157 } 158 }
158 159
159 demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){ 160 demux_stream_t *new_demuxer_stream(struct demuxer_st *demuxer, int id)
160 demux_stream_t* ds=malloc(sizeof(demux_stream_t)); 161 {
161 ds->buffer_pos=ds->buffer_size=0; 162 demux_stream_t *ds = malloc(sizeof(demux_stream_t));
162 ds->buffer=NULL; 163 ds->buffer_pos = ds->buffer_size = 0;
163 ds->pts=0; 164 ds->buffer = NULL;
164 ds->pts_bytes=0; 165 ds->pts = 0;
165 ds->eof=0; 166 ds->pts_bytes = 0;
166 ds->pos=0; 167 ds->eof = 0;
167 ds->dpos=0; 168 ds->pos = 0;
168 ds->pack_no=0; 169 ds->dpos = 0;
169 //--------------- 170 ds->pack_no = 0;
170 ds->packs=0; 171
171 ds->bytes=0; 172 ds->packs = 0;
172 ds->first=ds->last=ds->current=NULL; 173 ds->bytes = 0;
173 ds->id=id; 174 ds->first = ds->last = ds->current = NULL;
174 ds->demuxer=demuxer; 175 ds->id = id;
175 //---------------- 176 ds->demuxer = demuxer;
176 ds->asf_seq=-1; 177
177 ds->asf_packet=NULL; 178 ds->asf_seq = -1;
178 //---------------- 179 ds->asf_packet = NULL;
179 ds->ss_mul=ds->ss_div=0; 180
180 //---------------- 181 ds->ss_mul = ds->ss_div = 0;
181 ds->sh=NULL; 182
182 return ds; 183 ds->sh = NULL;
184 return ds;
183 } 185 }
184 186
185 187
186 /** 188 /**
187 * Get demuxer description structure for a given demuxer type 189 * Get demuxer description structure for a given demuxer type
188 * 190 *
189 * @param file_format type of the demuxer 191 * @param file_format type of the demuxer
190 * @return structure for the demuxer, NULL if not found 192 * @return structure for the demuxer, NULL if not found
191 */ 193 */
192 static const demuxer_desc_t* get_demuxer_desc_from_type(int file_format) 194 static const demuxer_desc_t *get_demuxer_desc_from_type(int file_format)
193 { 195 {
194 int i; 196 int i;
195 197
196 for (i = 0; demuxer_list[i]; i++) 198 for (i = 0; demuxer_list[i]; i++)
197 if (file_format == demuxer_list[i]->type) 199 if (file_format == demuxer_list[i]->type)
198 return demuxer_list[i]; 200 return demuxer_list[i];
199 201
200 return NULL; 202 return NULL;
201 } 203 }
202 204
203 205
204 demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename){ 206 demuxer_t *new_demuxer(stream_t *stream, int type, int a_id, int v_id,
205 demuxer_t *d=malloc(sizeof(demuxer_t)); 207 int s_id, char *filename)
206 memset(d,0,sizeof(demuxer_t)); 208 {
207 d->stream=stream; 209 demuxer_t *d = malloc(sizeof(demuxer_t));
208 d->stream_pts = MP_NOPTS_VALUE; 210 memset(d, 0, sizeof(demuxer_t));
209 d->reference_clock = MP_NOPTS_VALUE; 211 d->stream = stream;
210 d->movi_start=stream->start_pos; 212 d->stream_pts = MP_NOPTS_VALUE;
211 d->movi_end=stream->end_pos; 213 d->reference_clock = MP_NOPTS_VALUE;
212 d->seekable=1; 214 d->movi_start = stream->start_pos;
213 d->synced=0; 215 d->movi_end = stream->end_pos;
214 d->filepos=0; 216 d->seekable = 1;
215 d->audio=new_demuxer_stream(d,a_id); 217 d->synced = 0;
216 d->video=new_demuxer_stream(d,v_id); 218 d->filepos = 0;
217 d->sub=new_demuxer_stream(d,s_id); 219 d->audio = new_demuxer_stream(d, a_id);
218 d->type=type; 220 d->video = new_demuxer_stream(d, v_id);
219 if(type) 221 d->sub = new_demuxer_stream(d, s_id);
220 if (!(d->desc = get_demuxer_desc_from_type(type))) 222 d->type = type;
221 mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead."); 223 if (type)
222 if(filename) // Filename hack for avs_check_file 224 if (!(d->desc = get_demuxer_desc_from_type(type)))
223 d->filename=strdup(filename); 225 mp_msg(MSGT_DEMUXER, MSGL_ERR,
224 stream_reset(stream); 226 "BUG! Invalid demuxer type in new_demuxer(), "
225 stream_seek(stream,stream->start_pos); 227 "big troubles ahead.");
226 return d; 228 if (filename) // Filename hack for avs_check_file
229 d->filename = strdup(filename);
230 stream_reset(stream);
231 stream_seek(stream, stream->start_pos);
232 return d;
227 } 233 }
228 234
229 extern int dvdsub_id; 235 extern int dvdsub_id;
230 236
231 sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) { 237 sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid)
232 if (id > MAX_S_STREAMS - 1 || id < 0) { 238 {
233 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested sub stream id overflow (%d > %d)\n", 239 if (id > MAX_S_STREAMS - 1 || id < 0) {
234 id, MAX_S_STREAMS); 240 mp_msg(MSGT_DEMUXER, MSGL_WARN,
235 return NULL; 241 "Requested sub stream id overflow (%d > %d)\n", id,
236 } 242 MAX_S_STREAMS);
237 if (demuxer->s_streams[id]) 243 return NULL;
238 mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id); 244 }
239 else { 245 if (demuxer->s_streams[id])
240 sh_sub_t *sh = calloc(1, sizeof(sh_sub_t)); 246 mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id);
241 demuxer->s_streams[id] = sh; 247 else {
242 sh->sid = sid; 248 sh_sub_t *sh = calloc(1, sizeof(sh_sub_t));
243 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); 249 demuxer->s_streams[id] = sh;
244 } 250 sh->sid = sid;
245 return demuxer->s_streams[id]; 251 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
246 } 252 }
247 253 return demuxer->s_streams[id];
248 void free_sh_sub(sh_sub_t *sh) { 254 }
255
256 void free_sh_sub(sh_sub_t *sh)
257 {
249 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh); 258 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh);
250 free(sh->extradata); 259 free(sh->extradata);
251 #ifdef USE_ASS 260 #ifdef USE_ASS
252 if (sh->ass_track) ass_free_track(sh->ass_track); 261 if (sh->ass_track)
262 ass_free_track(sh->ass_track);
253 #endif 263 #endif
254 free(sh->lang); 264 free(sh->lang);
255 free(sh); 265 free(sh);
256 } 266 }
257 267
258 sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){ 268 sh_audio_t *new_sh_audio_aid(demuxer_t *demuxer, int id, int aid)
259 if(id > MAX_A_STREAMS-1 || id < 0) 269 {
260 { 270 if (id > MAX_A_STREAMS - 1 || id < 0) {
261 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested audio stream id overflow (%d > %d)\n", 271 mp_msg(MSGT_DEMUXER, MSGL_WARN,
262 id, MAX_A_STREAMS); 272 "Requested audio stream id overflow (%d > %d)\n", id,
263 return NULL; 273 MAX_A_STREAMS);
264 } 274 return NULL;
265 if(demuxer->a_streams[id]){ 275 }
266 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_AudioStreamRedefined,id); 276 if (demuxer->a_streams[id]) {
277 mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_AudioStreamRedefined, id);
267 } else { 278 } else {
268 sh_audio_t *sh; 279 sh_audio_t *sh;
269 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id); 280 mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundAudioStream, id);
270 demuxer->a_streams[id]=calloc(1, sizeof(sh_audio_t)); 281 demuxer->a_streams[id] = calloc(1, sizeof(sh_audio_t));
271 sh = demuxer->a_streams[id]; 282 sh = demuxer->a_streams[id];
272 // set some defaults 283 // set some defaults
273 sh->samplesize=2; 284 sh->samplesize = 2;
274 sh->sample_format=AF_FORMAT_S16_NE; 285 sh->sample_format = AF_FORMAT_S16_NE;
275 sh->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ 286 sh->audio_out_minsize = 8192; /* default size, maybe not enough for Win32/ACM */
276 sh->pts=MP_NOPTS_VALUE; 287 sh->pts = MP_NOPTS_VALUE;
277 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid); 288 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid);
278 } 289 }
279 ((sh_audio_t *)demuxer->a_streams[id])->aid = aid; 290 ((sh_audio_t *) demuxer->a_streams[id])->aid = aid;
280 return demuxer->a_streams[id]; 291 return demuxer->a_streams[id];
281 } 292 }
282 293
283 void free_sh_audio(demuxer_t *demuxer, int id) { 294 void free_sh_audio(demuxer_t *demuxer, int id)
295 {
284 sh_audio_t *sh = demuxer->a_streams[id]; 296 sh_audio_t *sh = demuxer->a_streams[id];
285 demuxer->a_streams[id] = NULL; 297 demuxer->a_streams[id] = NULL;
286 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh); 298 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_audio at %p\n", sh);
287 free(sh->wf); 299 free(sh->wf);
288 free(sh->codecdata); 300 free(sh->codecdata);
289 free(sh->lang); 301 free(sh->lang);
290 free(sh); 302 free(sh);
291 } 303 }
292 304
293 sh_video_t* new_sh_video_vid(demuxer_t *demuxer,int id,int vid){ 305 sh_video_t *new_sh_video_vid(demuxer_t *demuxer, int id, int vid)
294 if(id > MAX_V_STREAMS-1 || id < 0) 306 {
295 { 307 if (id > MAX_V_STREAMS - 1 || id < 0) {
296 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested video stream id overflow (%d > %d)\n", 308 mp_msg(MSGT_DEMUXER, MSGL_WARN,
297 id, MAX_V_STREAMS); 309 "Requested video stream id overflow (%d > %d)\n", id,
298 return NULL; 310 MAX_V_STREAMS);
299 } 311 return NULL;
300 if(demuxer->v_streams[id]){ 312 }
301 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_VideoStreamRedefined,id); 313 if (demuxer->v_streams[id])
302 } else { 314 mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_VideoStreamRedefined, id);
303 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id); 315 else {
304 demuxer->v_streams[id]=calloc(1, sizeof(sh_video_t)); 316 mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundVideoStream, id);
305 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid); 317 demuxer->v_streams[id] = calloc(1, sizeof(sh_video_t));
306 } 318 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid);
307 ((sh_video_t *)demuxer->v_streams[id])->vid = vid; 319 }
320 ((sh_video_t *) demuxer->v_streams[id])->vid = vid;
308 return demuxer->v_streams[id]; 321 return demuxer->v_streams[id];
309 } 322 }
310 323
311 void free_sh_video(sh_video_t* sh){ 324 void free_sh_video(sh_video_t *sh)
312 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh); 325 {
326 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_video at %p\n", sh);
313 free(sh->bih); 327 free(sh->bih);
314 free(sh); 328 free(sh);
315 } 329 }
316 330
317 void free_demuxer(demuxer_t *demuxer){ 331 void free_demuxer(demuxer_t *demuxer)
332 {
318 int i; 333 int i;
319 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer); 334 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing demuxer at %p\n",
320 if(demuxer->desc->close) 335 demuxer);
321 demuxer->desc->close(demuxer); 336 if (demuxer->desc->close)
337 demuxer->desc->close(demuxer);
322 // Very ugly hack to make it behave like old implementation 338 // Very ugly hack to make it behave like old implementation
323 if (demuxer->desc->type == DEMUXER_TYPE_DEMUXERS) 339 if (demuxer->desc->type == DEMUXER_TYPE_DEMUXERS)
324 goto skip_streamfree; 340 goto skip_streamfree;
325 // free streams: 341 // free streams:
326 for(i = 0; i < MAX_A_STREAMS; i++) 342 for (i = 0; i < MAX_A_STREAMS; i++)
327 if(demuxer->a_streams[i]) free_sh_audio(demuxer, i); 343 if (demuxer->a_streams[i])
328 for(i = 0; i < MAX_V_STREAMS; i++) 344 free_sh_audio(demuxer, i);
329 if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]); 345 for (i = 0; i < MAX_V_STREAMS; i++)
330 for(i = 0; i < MAX_S_STREAMS; i++) 346 if (demuxer->v_streams[i])
331 if(demuxer->s_streams[i]) free_sh_sub(demuxer->s_streams[i]); 347 free_sh_video(demuxer->v_streams[i]);
348 for (i = 0; i < MAX_S_STREAMS; i++)
349 if (demuxer->s_streams[i])
350 free_sh_sub(demuxer->s_streams[i]);
332 // free demuxers: 351 // free demuxers:
333 free_demuxer_stream(demuxer->audio); 352 free_demuxer_stream(demuxer->audio);
334 free_demuxer_stream(demuxer->video); 353 free_demuxer_stream(demuxer->video);
335 free_demuxer_stream(demuxer->sub); 354 free_demuxer_stream(demuxer->sub);
336 skip_streamfree: 355 skip_streamfree:
337 if(demuxer->info) { 356 if (demuxer->info) {
338 for(i=0;demuxer->info[i] != NULL; i++) 357 for (i = 0; demuxer->info[i] != NULL; i++)
339 free(demuxer->info[i]); 358 free(demuxer->info[i]);
340 free(demuxer->info); 359 free(demuxer->info);
341 } 360 }
342 free(demuxer->filename); 361 free(demuxer->filename);
343 if (demuxer->chapters) { 362 if (demuxer->chapters) {
344 for (i=0; i<demuxer->num_chapters; i++) 363 for (i = 0; i < demuxer->num_chapters; i++)
345 free(demuxer->chapters[i].name); 364 free(demuxer->chapters[i].name);
346 free(demuxer->chapters); 365 free(demuxer->chapters);
347 } 366 }
348 if (demuxer->attachments) { 367 if (demuxer->attachments) {
349 for (i=0; i<demuxer->num_attachments; i++) { 368 for (i = 0; i < demuxer->num_attachments; i++) {
350 free(demuxer->attachments[i].name); 369 free(demuxer->attachments[i].name);
351 free(demuxer->attachments[i].type); 370 free(demuxer->attachments[i].type);
352 free(demuxer->attachments[i].data); 371 free(demuxer->attachments[i].data);
353 } 372 }
354 free(demuxer->attachments); 373 free(demuxer->attachments);
355 } 374 }
356 free(demuxer); 375 free(demuxer);
357 } 376 }
358 377
359 378
360 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){ 379 void ds_add_packet(demux_stream_t *ds, demux_packet_t *dp)
361 // demux_packet_t* dp=new_demux_packet(len); 380 {
362 // stream_read(stream,dp->buffer,len);
363 // dp->pts=pts; //(float)pts/90000.0f;
364 // dp->pos=pos;
365 // append packet to DS stream: 381 // append packet to DS stream:
366 ++ds->packs; 382 ++ds->packs;
367 ds->bytes+=dp->len; 383 ds->bytes += dp->len;
368 if(ds->last){ 384 if (ds->last) {
369 // next packet in stream 385 // next packet in stream
370 ds->last->next=dp; 386 ds->last->next = dp;
371 ds->last=dp; 387 ds->last = dp;
372 } else { 388 } else {
373 // first packet in stream 389 // first packet in stream
374 ds->first=ds->last=dp; 390 ds->first = ds->last = dp;
375 } 391 }
376 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%u [packs: A=%d V=%d]\n", 392 mp_dbg(MSGT_DEMUXER, MSGL_DBG2,
377 (ds==ds->demuxer->audio)?"d_audio":"d_video", 393 "DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%u [packs: A=%d V=%d]\n",
378 dp->len,dp->pts,(unsigned int)dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs); 394 (ds == ds->demuxer->audio) ? "d_audio" : "d_video", dp->len,
379 } 395 dp->pts, (unsigned int) dp->pos, ds->demuxer->audio->packs,
380 396 ds->demuxer->video->packs);
381 void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len, double pts, off_t pos, int flags) { 397 }
382 demux_packet_t* dp=new_demux_packet(len); 398
383 len = stream_read(stream,dp->buffer,len); 399 void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len,
400 double pts, off_t pos, int flags)
401 {
402 demux_packet_t *dp = new_demux_packet(len);
403 len = stream_read(stream, dp->buffer, len);
384 resize_demux_packet(dp, len); 404 resize_demux_packet(dp, len);
385 dp->pts=pts; //(float)pts/90000.0f; 405 dp->pts = pts;
386 dp->pos=pos; 406 dp->pos = pos;
387 dp->flags=flags; 407 dp->flags = flags;
388 // append packet to DS stream: 408 // append packet to DS stream:
389 ds_add_packet(ds,dp); 409 ds_add_packet(ds, dp);
390 } 410 }
391 411
392 // return value: 412 // return value:
393 // 0 = EOF or no stream found or invalid type 413 // 0 = EOF or no stream found or invalid type
394 // 1 = successfully read a packet 414 // 1 = successfully read a packet
395 415
396 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ 416 int demux_fill_buffer(demuxer_t *demux, demux_stream_t *ds)
397 // Note: parameter 'ds' can be NULL! 417 {
398 // printf("demux->type=%d\n",demux->type); 418 // Note: parameter 'ds' can be NULL!
399 return demux->desc->fill_buffer(demux, ds); 419 return demux->desc->fill_buffer(demux, ds);
400 } 420 }
401 421
402 // return value: 422 // return value:
403 // 0 = EOF 423 // 0 = EOF
404 // 1 = successful 424 // 1 = successful
405 #define MAX_ACUMULATED_PACKETS 64 425 #define MAX_ACUMULATED_PACKETS 64
406 int ds_fill_buffer(demux_stream_t *ds){ 426 int ds_fill_buffer(demux_stream_t *ds)
407 demuxer_t *demux=ds->demuxer; 427 {
408 if(ds->current) free_demux_packet(ds->current); 428 demuxer_t *demux = ds->demuxer;
409 ds->current=NULL; 429 if (ds->current)
410 if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){ 430 free_demux_packet(ds->current);
411 if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else 431 ds->current = NULL;
412 if(ds==demux->video) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_video) called\n");else 432 if (mp_msg_test(MSGT_DEMUXER, MSGL_DBG3)) {
413 if(ds==demux->sub) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_sub) called\n");else 433 if (ds == demux->audio)
414 mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds); 434 mp_dbg(MSGT_DEMUXER, MSGL_DBG3,
415 } 435 "ds_fill_buffer(d_audio) called\n");
416 while(1){ 436 else if (ds == demux->video)
417 if(ds->packs){ 437 mp_dbg(MSGT_DEMUXER, MSGL_DBG3,
418 demux_packet_t *p=ds->first; 438 "ds_fill_buffer(d_video) called\n");
439 else if (ds == demux->sub)
440 mp_dbg(MSGT_DEMUXER, MSGL_DBG3, "ds_fill_buffer(d_sub) called\n");
441 else
442 mp_dbg(MSGT_DEMUXER, MSGL_DBG3,
443 "ds_fill_buffer(unknown 0x%X) called\n", (unsigned int) ds);
444 }
445 while (1) {
446 if (ds->packs) {
447 demux_packet_t *p = ds->first;
419 #if 0 448 #if 0
420 if(demux->reference_clock != MP_NOPTS_VALUE) { 449 if (demux->reference_clock != MP_NOPTS_VALUE) {
421 if((p->pts != MP_NOPTS_VALUE) && (p->pts > demux->reference_clock) 450 if ((p->pts != MP_NOPTS_VALUE)
422 && (ds->packs < MAX_ACUMULATED_PACKETS)) { 451 && (p->pts > demux->reference_clock)
423 if(demux_fill_buffer(demux,ds)) 452 && (ds->packs < MAX_ACUMULATED_PACKETS)) {
424 continue; 453 if (demux_fill_buffer(demux, ds))
425 } 454 continue;
426 } 455 }
456 }
427 #endif 457 #endif
428 // copy useful data: 458 // copy useful data:
429 ds->buffer=p->buffer; 459 ds->buffer = p->buffer;
430 ds->buffer_pos=0; 460 ds->buffer_pos = 0;
431 ds->buffer_size=p->len; 461 ds->buffer_size = p->len;
432 ds->pos=p->pos; 462 ds->pos = p->pos;
433 ds->dpos+=p->len; // !!! 463 ds->dpos += p->len; // !!!
434 ++ds->pack_no; 464 ++ds->pack_no;
435 if (p->pts != MP_NOPTS_VALUE) { 465 if (p->pts != MP_NOPTS_VALUE) {
436 ds->pts=p->pts; 466 ds->pts = p->pts;
437 ds->pts_bytes=0; 467 ds->pts_bytes = 0;
438 } 468 }
439 ds->pts_bytes+=p->len; // !!! 469 ds->pts_bytes += p->len; // !!!
440 if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p->stream_pts; 470 if (p->stream_pts != MP_NOPTS_VALUE)
441 ds->flags=p->flags; 471 demux->stream_pts = p->stream_pts;
442 // unlink packet: 472 ds->flags = p->flags;
443 ds->bytes-=p->len; 473 // unlink packet:
444 ds->current=p; 474 ds->bytes -= p->len;
445 ds->first=p->next; 475 ds->current = p;
446 if(!ds->first) ds->last=NULL; 476 ds->first = p->next;
447 --ds->packs; 477 if (!ds->first)
448 return 1; //ds->buffer_size; 478 ds->last = NULL;
449 } 479 --ds->packs;
450 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){ 480 return 1;
451 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes); 481 }
452 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); 482 if (demux->audio->packs >= MAX_PACKS
453 break; 483 || demux->audio->bytes >= MAX_PACK_BYTES) {
454 } 484 mp_msg(MSGT_DEMUXER, MSGL_ERR, MSGTR_TooManyAudioInBuffer,
455 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){ 485 demux->audio->packs, demux->audio->bytes);
456 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes); 486 mp_msg(MSGT_DEMUXER, MSGL_HINT, MSGTR_MaybeNI);
457 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); 487 break;
458 break; 488 }
459 } 489 if (demux->video->packs >= MAX_PACKS
460 if(!demux_fill_buffer(demux,ds)){ 490 || demux->video->bytes >= MAX_PACK_BYTES) {
461 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"ds_fill_buffer()->demux_fill_buffer() failed\n"); 491 mp_msg(MSGT_DEMUXER, MSGL_ERR, MSGTR_TooManyVideoInBuffer,
462 break; // EOF 492 demux->video->packs, demux->video->bytes);
463 } 493 mp_msg(MSGT_DEMUXER, MSGL_HINT, MSGTR_MaybeNI);
464 } 494 break;
465 ds->buffer_pos=ds->buffer_size=0; 495 }
466 ds->buffer=NULL; 496 if (!demux_fill_buffer(demux, ds)) {
467 mp_msg(MSGT_DEMUXER,MSGL_V,"ds_fill_buffer: EOF reached (stream: %s) \n",ds==demux->audio?"audio":"video"); 497 mp_dbg(MSGT_DEMUXER, MSGL_DBG2,
468 ds->eof=1; 498 "ds_fill_buffer()->demux_fill_buffer() failed\n");
469 return 0; 499 break; // EOF
470 } 500 }
471 501 }
472 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){ 502 ds->buffer_pos = ds->buffer_size = 0;
473 int x; 503 ds->buffer = NULL;
474 int bytes=0; 504 mp_msg(MSGT_DEMUXER, MSGL_V,
475 while(len>0){ 505 "ds_fill_buffer: EOF reached (stream: %s) \n",
476 x=ds->buffer_size-ds->buffer_pos; 506 ds == demux->audio ? "audio" : "video");
477 if(x==0){ 507 ds->eof = 1;
478 if(!ds_fill_buffer(ds)) return bytes; 508 return 0;
479 } else { 509 }
480 if(x>len) x=len; 510
481 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); 511 int demux_read_data(demux_stream_t *ds, unsigned char *mem, int len)
482 bytes+=x;len-=x;ds->buffer_pos+=x; 512 {
483 } 513 int x;
484 } 514 int bytes = 0;
485 return bytes; 515 while (len > 0) {
516 x = ds->buffer_size - ds->buffer_pos;
517 if (x == 0) {
518 if (!ds_fill_buffer(ds))
519 return bytes;
520 } else {
521 if (x > len)
522 x = len;
523 if (mem)
524 fast_memcpy(mem + bytes, &ds->buffer[ds->buffer_pos], x);
525 bytes += x;
526 len -= x;
527 ds->buffer_pos += x;
528 }
529 }
530 return bytes;
486 } 531 }
487 532
488 /** 533 /**
489 * \brief read data until the given 3-byte pattern is encountered, up to maxlen 534 * \brief read data until the given 3-byte pattern is encountered, up to maxlen
490 * \param mem memory to read data into, may be NULL to discard data 535 * \param mem memory to read data into, may be NULL to discard data
492 * \param read number of bytes actually read 537 * \param read number of bytes actually read
493 * \param pattern pattern to search for (lowest 8 bits are ignored) 538 * \param pattern pattern to search for (lowest 8 bits are ignored)
494 * \return whether pattern was found 539 * \return whether pattern was found
495 */ 540 */
496 int demux_pattern_3(demux_stream_t *ds, unsigned char *mem, int maxlen, 541 int demux_pattern_3(demux_stream_t *ds, unsigned char *mem, int maxlen,
497 int *read, uint32_t pattern) { 542 int *read, uint32_t pattern)
498 register uint32_t head = 0xffffff00; 543 {
499 register uint32_t pat = pattern & 0xffffff00; 544 register uint32_t head = 0xffffff00;
500 int total_len = 0; 545 register uint32_t pat = pattern & 0xffffff00;
501 do { 546 int total_len = 0;
502 register unsigned char *ds_buf = &ds->buffer[ds->buffer_size];
503 int len = ds->buffer_size - ds->buffer_pos;
504 register long pos = -len;
505 if (unlikely(pos >= 0)) { // buffer is empty
506 ds_fill_buffer(ds);
507 continue;
508 }
509 do { 547 do {
510 head |= ds_buf[pos]; 548 register unsigned char *ds_buf = &ds->buffer[ds->buffer_size];
511 head <<= 8; 549 int len = ds->buffer_size - ds->buffer_pos;
512 } while (++pos && head != pat); 550 register long pos = -len;
513 len += pos; 551 if (unlikely(pos >= 0)) { // buffer is empty
514 if (total_len + len > maxlen) 552 ds_fill_buffer(ds);
515 len = maxlen - total_len; 553 continue;
516 len = demux_read_data(ds, mem ? &mem[total_len] : NULL, len); 554 }
517 total_len += len; 555 do {
518 } while ((head != pat || total_len < 3) && total_len < maxlen && !ds->eof); 556 head |= ds_buf[pos];
519 if (read) 557 head <<= 8;
520 *read = total_len; 558 } while (++pos && head != pat);
521 return total_len >= 3 && head == pat; 559 len += pos;
522 } 560 if (total_len + len > maxlen)
523 561 len = maxlen - total_len;
524 void ds_free_packs(demux_stream_t *ds){ 562 len = demux_read_data(ds, mem ? &mem[total_len] : NULL, len);
525 demux_packet_t *dp=ds->first; 563 total_len += len;
526 while(dp){ 564 } while ((head != pat || total_len < 3) && total_len < maxlen && !ds->eof);
527 demux_packet_t *dn=dp->next; 565 if (read)
528 free_demux_packet(dp); 566 *read = total_len;
529 dp=dn; 567 return total_len >= 3 && head == pat;
530 } 568 }
531 if(ds->asf_packet){ 569
532 // free unfinished .asf fragments: 570 void ds_free_packs(demux_stream_t *ds)
533 free(ds->asf_packet->buffer); 571 {
534 free(ds->asf_packet); 572 demux_packet_t *dp = ds->first;
535 ds->asf_packet=NULL; 573 while (dp) {
536 } 574 demux_packet_t *dn = dp->next;
537 ds->first=ds->last=NULL; 575 free_demux_packet(dp);
538 ds->packs=0; // !!!!! 576 dp = dn;
539 ds->bytes=0; 577 }
540 if(ds->current) free_demux_packet(ds->current); 578 if (ds->asf_packet) {
541 ds->current=NULL; 579 // free unfinished .asf fragments:
542 ds->buffer=NULL; 580 free(ds->asf_packet->buffer);
543 ds->buffer_pos=ds->buffer_size; 581 free(ds->asf_packet);
544 ds->pts=0; ds->pts_bytes=0; 582 ds->asf_packet = NULL;
545 } 583 }
546 584 ds->first = ds->last = NULL;
547 int ds_get_packet(demux_stream_t *ds,unsigned char **start){ 585 ds->packs = 0; // !!!!!
586 ds->bytes = 0;
587 if (ds->current)
588 free_demux_packet(ds->current);
589 ds->current = NULL;
590 ds->buffer = NULL;
591 ds->buffer_pos = ds->buffer_size;
592 ds->pts = 0;
593 ds->pts_bytes = 0;
594 }
595
596 int ds_get_packet(demux_stream_t *ds, unsigned char **start)
597 {
548 int len; 598 int len;
549 if(ds->buffer_pos>=ds->buffer_size){ 599 if (ds->buffer_pos >= ds->buffer_size) {
550 if(!ds_fill_buffer(ds)){ 600 if (!ds_fill_buffer(ds)) {
551 // EOF 601 // EOF
552 *start = NULL; 602 *start = NULL;
553 return -1; 603 return -1;
554 } 604 }
555 } 605 }
556 len=ds->buffer_size-ds->buffer_pos; 606 len = ds->buffer_size - ds->buffer_pos;
557 *start = &ds->buffer[ds->buffer_pos]; 607 *start = &ds->buffer[ds->buffer_pos];
558 ds->buffer_pos+=len; 608 ds->buffer_pos += len;
559 return len; 609 return len;
560 } 610 }
561 611
562 int ds_get_packet_pts(demux_stream_t *ds,unsigned char **start, double *pts) 612 int ds_get_packet_pts(demux_stream_t *ds, unsigned char **start, double *pts)
563 { 613 {
564 int len; 614 int len;
565 *pts = MP_NOPTS_VALUE; 615 *pts = MP_NOPTS_VALUE;
566 if(ds->buffer_pos>=ds->buffer_size){ 616 if (ds->buffer_pos >= ds->buffer_size) {
567 if (!ds_fill_buffer(ds)) { 617 if (!ds_fill_buffer(ds)) {
568 // EOF 618 // EOF
569 *start = NULL; 619 *start = NULL;
570 return -1; 620 return -1;
571 } 621 }
572 } 622 }
573 // Return pts unless this read starts from the middle of a packet 623 // Return pts unless this read starts from the middle of a packet
574 if (!ds->buffer_pos) 624 if (!ds->buffer_pos)
575 *pts = ds->current->pts; 625 *pts = ds->current->pts;
576 len=ds->buffer_size-ds->buffer_pos; 626 len = ds->buffer_size - ds->buffer_pos;
577 *start = &ds->buffer[ds->buffer_pos]; 627 *start = &ds->buffer[ds->buffer_pos];
578 ds->buffer_pos+=len; 628 ds->buffer_pos += len;
579 return len; 629 return len;
580 } 630 }
581 631
582 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){ 632 int ds_get_packet_sub(demux_stream_t *ds, unsigned char **start)
633 {
583 int len; 634 int len;
584 if(ds->buffer_pos>=ds->buffer_size){ 635 if (ds->buffer_pos >= ds->buffer_size) {
585 *start = NULL; 636 *start = NULL;
586 if(!ds->packs) return -1; // no sub 637 if (!ds->packs)
587 if(!ds_fill_buffer(ds)) return -1; // EOF 638 return -1; // no sub
588 } 639 if (!ds_fill_buffer(ds))
589 len=ds->buffer_size-ds->buffer_pos; 640 return -1; // EOF
641 }
642 len = ds->buffer_size - ds->buffer_pos;
590 *start = &ds->buffer[ds->buffer_pos]; 643 *start = &ds->buffer[ds->buffer_pos];
591 ds->buffer_pos+=len; 644 ds->buffer_pos += len;
592 return len; 645 return len;
593 } 646 }
594 647
595 double ds_get_next_pts(demux_stream_t *ds) 648 double ds_get_next_pts(demux_stream_t *ds)
596 { 649 {
597 demuxer_t* demux = ds->demuxer; 650 demuxer_t *demux = ds->demuxer;
598 while(!ds->first) { 651 while (!ds->first) {
599 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){ 652 if (demux->audio->packs >= MAX_PACKS
600 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes); 653 || demux->audio->bytes >= MAX_PACK_BYTES) {
601 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); 654 mp_msg(MSGT_DEMUXER, MSGL_ERR, MSGTR_TooManyAudioInBuffer,
602 return MP_NOPTS_VALUE; 655 demux->audio->packs, demux->audio->bytes);
603 } 656 mp_msg(MSGT_DEMUXER, MSGL_HINT, MSGTR_MaybeNI);
604 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){ 657 return MP_NOPTS_VALUE;
605 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes); 658 }
606 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); 659 if (demux->video->packs >= MAX_PACKS
607 return MP_NOPTS_VALUE; 660 || demux->video->bytes >= MAX_PACK_BYTES) {
608 } 661 mp_msg(MSGT_DEMUXER, MSGL_ERR, MSGTR_TooManyVideoInBuffer,
609 if(!demux_fill_buffer(demux,ds)) 662 demux->video->packs, demux->video->bytes);
610 return MP_NOPTS_VALUE; 663 mp_msg(MSGT_DEMUXER, MSGL_HINT, MSGTR_MaybeNI);
611 } 664 return MP_NOPTS_VALUE;
612 return ds->first->pts; 665 }
666 if (!demux_fill_buffer(demux, ds))
667 return MP_NOPTS_VALUE;
668 }
669 return ds->first->pts;
613 } 670 }
614 671
615 // ==================================================================== 672 // ====================================================================
616 673
617 void demuxer_help(void) 674 void demuxer_help(void)
618 { 675 {
619 int i; 676 int i;
620 677
621 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n"); 678 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n");
622 mp_msg(MSGT_DEMUXER, MSGL_INFO, " demuxer: type info: (comment)\n"); 679 mp_msg(MSGT_DEMUXER, MSGL_INFO, " demuxer: type info: (comment)\n");
623 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n"); 680 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n");
624 for (i = 0; demuxer_list[i]; i++) { 681 for (i = 0; demuxer_list[i]; i++) {
625 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers 682 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers
626 continue; 683 continue;
627 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment)) 684 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment))
628 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n", 685 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n",
629 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment); 686 demuxer_list[i]->name, demuxer_list[i]->type,
630 else 687 demuxer_list[i]->info, demuxer_list[i]->comment);
631 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n", 688 else
632 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info); 689 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n",
633 } 690 demuxer_list[i]->name, demuxer_list[i]->type,
691 demuxer_list[i]->info);
692 }
634 } 693 }
635 694
636 695
637 /** 696 /**
638 * Get demuxer type for a given demuxer name 697 * Get demuxer type for a given demuxer name
642 * May be NULL. 701 * May be NULL.
643 * @return DEMUXER_TYPE_xxx, -1 if error or not found 702 * @return DEMUXER_TYPE_xxx, -1 if error or not found
644 */ 703 */
645 int get_demuxer_type_from_name(char *demuxer_name, int *force) 704 int get_demuxer_type_from_name(char *demuxer_name, int *force)
646 { 705 {
647 int i; 706 int i;
648 long type_int; 707 long type_int;
649 char *endptr; 708 char *endptr;
650 709
651 if (!demuxer_name || !demuxer_name[0]) 710 if (!demuxer_name || !demuxer_name[0])
652 return DEMUXER_TYPE_UNKNOWN; 711 return DEMUXER_TYPE_UNKNOWN;
653 if (force) *force = demuxer_name[0] == '+'; 712 if (force)
654 if (demuxer_name[0] == '+') 713 *force = demuxer_name[0] == '+';
655 demuxer_name = &demuxer_name[1]; 714 if (demuxer_name[0] == '+')
656 for (i = 0; demuxer_list[i]; i++) { 715 demuxer_name = &demuxer_name[1];
657 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline 716 for (i = 0; demuxer_list[i]; i++) {
658 continue; 717 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline
659 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0) 718 continue;
660 return demuxer_list[i]->type; 719 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0)
661 } 720 return demuxer_list[i]->type;
662 721 }
663 // No match found, try to parse name as an integer (demuxer number) 722
664 type_int = strtol(demuxer_name, &endptr, 0); 723 // No match found, try to parse name as an integer (demuxer number)
665 if (*endptr) // Conversion failed 724 type_int = strtol(demuxer_name, &endptr, 0);
725 if (*endptr) // Conversion failed
726 return -1;
727 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX))
728 return (int) type_int;
729
666 return -1; 730 return -1;
667 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX)) 731 }
668 return (int)type_int; 732
669 733 int extension_parsing = 1; // 0=off 1=mixed (used only for unstable formats)
670 return -1; 734
671 } 735 int correct_pts = 0;
672 736 int user_correct_pts = -1;
673 int extension_parsing=1; // 0=off 1=mixed (used only for unstable formats)
674
675 int correct_pts=0;
676 int user_correct_pts=-1;
677 737
678 /* 738 /*
679 NOTE : Several demuxers may be opened at the same time so 739 NOTE : Several demuxers may be opened at the same time so
680 demuxers should NEVER rely on an external var to enable them 740 demuxers should NEVER rely on an external var to enable them
681 self. If a demuxer can't do any auto-detection it should only use 741 self. If a demuxer can't do any auto-detection it should only use
686 Also the stream can override the file_format so a demuxer which rely 746 Also the stream can override the file_format so a demuxer which rely
687 on a special stream type can set file_format at the stream level 747 on a special stream type can set file_format at the stream level
688 (ex: tv,mf). 748 (ex: tv,mf).
689 */ 749 */
690 750
691 static demuxer_t* demux_open_stream(stream_t *stream, int file_format, 751 static demuxer_t *demux_open_stream(stream_t *stream, int file_format,
692 int force, int audio_id, int video_id, int dvdsub_id, 752 int force, int audio_id, int video_id,
693 char* filename) { 753 int dvdsub_id, char *filename)
694 754 {
695 //int file_format=(*file_format_ptr); 755 demuxer_t *demuxer = NULL;
696 756
697 demuxer_t *demuxer=NULL; 757 sh_video_t *sh_video = NULL;
698 758
699 sh_video_t *sh_video=NULL; 759 const demuxer_desc_t *demuxer_desc;
700 760 int fformat = 0;
701 const demuxer_desc_t *demuxer_desc; 761 int i;
702 int fformat = 0; 762
703 int i; 763 // If somebody requested a demuxer check it
704 764 if (file_format) {
705 //printf("demux_open(%p,%d,%d,%d,%d) \n",stream,file_format,audio_id,video_id,dvdsub_id); 765 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) {
706 766 demuxer =
707 // If somebody requested a demuxer check it 767 new_demuxer(stream, demuxer_desc->type, audio_id, video_id,
708 if (file_format) { 768 dvdsub_id, filename);
709 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) { 769 if (demuxer_desc->check_file)
710 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); 770 fformat = demuxer_desc->check_file(demuxer);
711 if (demuxer_desc->check_file) 771 if (force || !demuxer_desc->check_file)
712 fformat = demuxer_desc->check_file(demuxer); 772 fformat = demuxer_desc->type;
713 if (force || !demuxer_desc->check_file) 773 if (fformat != 0) {
714 fformat = demuxer_desc->type; 774 if (fformat == demuxer_desc->type) {
715 if (fformat != 0) { 775 demuxer_t *demux2 = demuxer;
716 if (fformat == demuxer_desc->type) { 776 // Move messages to demuxer detection code?
717 demuxer_t *demux2 = demuxer; 777 mp_msg(MSGT_DEMUXER, MSGL_INFO,
718 // Move messages to demuxer detection code? 778 MSGTR_Detected_XXX_FileFormat,
719 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); 779 demuxer_desc->shortdesc);
720 file_format = fformat; 780 file_format = fformat;
721 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { 781 if (!demuxer->desc->open
722 demuxer = demux2; 782 || (demux2 = demuxer->desc->open(demuxer))) {
723 goto dmx_open; 783 demuxer = demux2;
724 } 784 goto dmx_open;
725 } else { 785 }
726 // Format changed after check, recurse 786 } else {
727 free_demuxer(demuxer); 787 // Format changed after check, recurse
728 return demux_open_stream(stream, fformat, force, 788 free_demuxer(demuxer);
729 audio_id, video_id, dvdsub_id, filename); 789 return demux_open_stream(stream, fformat, force, audio_id,
730 } 790 video_id, dvdsub_id, filename);
731 } 791 }
732 // Check failed for forced demuxer, quit 792 }
733 free_demuxer(demuxer); 793 // Check failed for forced demuxer, quit
794 free_demuxer(demuxer);
795 return NULL;
796 }
797 }
798 // Test demuxers with safe file checks
799 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
800 if (demuxer_desc->safe_check) {
801 demuxer =
802 new_demuxer(stream, demuxer_desc->type, audio_id, video_id,
803 dvdsub_id, filename);
804 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
805 if (fformat == demuxer_desc->type) {
806 demuxer_t *demux2 = demuxer;
807 mp_msg(MSGT_DEMUXER, MSGL_INFO,
808 MSGTR_Detected_XXX_FileFormat,
809 demuxer_desc->shortdesc);
810 file_format = fformat;
811 if (!demuxer->desc->open
812 || (demux2 = demuxer->desc->open(demuxer))) {
813 demuxer = demux2;
814 goto dmx_open;
815 }
816 } else {
817 if (fformat == DEMUXER_TYPE_PLAYLIST)
818 return demuxer; // handled in mplayer.c
819 // Format changed after check, recurse
820 free_demuxer(demuxer);
821 demuxer =
822 demux_open_stream(stream, fformat, force, audio_id,
823 video_id, dvdsub_id, filename);
824 if (demuxer)
825 return demuxer; // done!
826 file_format = DEMUXER_TYPE_UNKNOWN;
827 }
828 }
829 free_demuxer(demuxer);
830 demuxer = NULL;
831 }
832 }
833
834 // If no forced demuxer perform file extension based detection
835 // Ok. We're over the stable detectable fileformats, the next ones are
836 // a bit fuzzy. So by default (extension_parsing==1) try extension-based
837 // detection first:
838 if (file_format == DEMUXER_TYPE_UNKNOWN && filename
839 && extension_parsing == 1) {
840 file_format = demuxer_type_by_filename(filename);
841 if (file_format != DEMUXER_TYPE_UNKNOWN) {
842 // we like recursion :)
843 demuxer = demux_open_stream(stream, file_format, force, audio_id,
844 video_id, dvdsub_id, filename);
845 if (demuxer)
846 return demuxer; // done!
847 file_format = DEMUXER_TYPE_UNKNOWN; // continue fuzzy guessing...
848 mp_msg(MSGT_DEMUXER, MSGL_V,
849 "demuxer: continue fuzzy content-based format guessing...\n");
850 }
851 }
852 // Try detection for all other demuxers
853 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
854 if (!demuxer_desc->safe_check && demuxer_desc->check_file) {
855 demuxer =
856 new_demuxer(stream, demuxer_desc->type, audio_id, video_id,
857 dvdsub_id, filename);
858 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
859 if (fformat == demuxer_desc->type) {
860 demuxer_t *demux2 = demuxer;
861 mp_msg(MSGT_DEMUXER, MSGL_INFO,
862 MSGTR_Detected_XXX_FileFormat,
863 demuxer_desc->shortdesc);
864 file_format = fformat;
865 if (!demuxer->desc->open
866 || (demux2 = demuxer->desc->open(demuxer))) {
867 demuxer = demux2;
868 goto dmx_open;
869 }
870 } else {
871 if (fformat == DEMUXER_TYPE_PLAYLIST)
872 return demuxer; // handled in mplayer.c
873 // Format changed after check, recurse
874 free_demuxer(demuxer);
875 demuxer =
876 demux_open_stream(stream, fformat, force, audio_id,
877 video_id, dvdsub_id, filename);
878 if (demuxer)
879 return demuxer; // done!
880 file_format = DEMUXER_TYPE_UNKNOWN;
881 }
882 }
883 free_demuxer(demuxer);
884 demuxer = NULL;
885 }
886 }
887
734 return NULL; 888 return NULL;
735 } 889 //====== File format recognized, set up these for compatibility: =========
736 } 890 dmx_open:
737 891
738 // Test demuxers with safe file checks 892 demuxer->file_format = file_format;
739 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { 893
740 if (demuxer_desc->safe_check) { 894 if ((sh_video = demuxer->video->sh) && sh_video->bih) {
741 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); 895 int biComp = le2me_32(sh_video->bih->biCompression);
742 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { 896 mp_msg(MSGT_DEMUX, MSGL_INFO,
743 if (fformat == demuxer_desc->type) { 897 "VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n",
744 demuxer_t *demux2 = demuxer; 898 (char *) &biComp, sh_video->bih->biWidth,
745 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); 899 sh_video->bih->biHeight, sh_video->bih->biBitCount,
746 file_format = fformat; 900 sh_video->fps, sh_video->i_bps * 0.008f,
747 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { 901 sh_video->i_bps / 1024.0f);
748 demuxer = demux2; 902 }
749 goto dmx_open;
750 }
751 } else {
752 if (fformat == DEMUXER_TYPE_PLAYLIST)
753 return demuxer; // handled in mplayer.c
754 // Format changed after check, recurse
755 free_demuxer(demuxer);
756 demuxer=demux_open_stream(stream, fformat, force,
757 audio_id, video_id, dvdsub_id, filename);
758 if(demuxer) return demuxer; // done!
759 file_format = DEMUXER_TYPE_UNKNOWN;
760 }
761 }
762 free_demuxer(demuxer);
763 demuxer = NULL;
764 }
765 }
766
767 // If no forced demuxer perform file extension based detection
768 // Ok. We're over the stable detectable fileformats, the next ones are a bit
769 // fuzzy. So by default (extension_parsing==1) try extension-based detection
770 // first:
771 if(file_format==DEMUXER_TYPE_UNKNOWN && filename && extension_parsing==1){
772 file_format=demuxer_type_by_filename(filename);
773 if(file_format!=DEMUXER_TYPE_UNKNOWN){
774 // we like recursion :)
775 demuxer=demux_open_stream(stream, file_format, force,
776 audio_id, video_id, dvdsub_id, filename);
777 if(demuxer) return demuxer; // done!
778 file_format=DEMUXER_TYPE_UNKNOWN; // continue fuzzy guessing...
779 mp_msg(MSGT_DEMUXER,MSGL_V,"demuxer: continue fuzzy content-based format guessing...\n");
780 }
781 }
782
783 // Try detection for all other demuxers
784 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
785 if (!demuxer_desc->safe_check && demuxer_desc->check_file) {
786 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
787 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
788 if (fformat == demuxer_desc->type) {
789 demuxer_t *demux2 = demuxer;
790 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
791 file_format = fformat;
792 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
793 demuxer = demux2;
794 goto dmx_open;
795 }
796 } else {
797 if (fformat == DEMUXER_TYPE_PLAYLIST)
798 return demuxer; // handled in mplayer.c
799 // Format changed after check, recurse
800 free_demuxer(demuxer);
801 demuxer=demux_open_stream(stream, fformat, force,
802 audio_id, video_id, dvdsub_id, filename);
803 if(demuxer) return demuxer; // done!
804 file_format = DEMUXER_TYPE_UNKNOWN;
805 }
806 }
807 free_demuxer(demuxer);
808 demuxer = NULL;
809 }
810 }
811
812 return NULL;
813 //====== File format recognized, set up these for compatibility: =========
814 dmx_open:
815
816 demuxer->file_format=file_format;
817
818 if ((sh_video=demuxer->video->sh) && sh_video->bih){
819 int biComp=le2me_32(sh_video->bih->biCompression);
820 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n",
821 (char *)&biComp,
822 sh_video->bih->biWidth,
823 sh_video->bih->biHeight,
824 sh_video->bih->biBitCount,
825 sh_video->fps,
826 sh_video->i_bps*0.008f,
827 sh_video->i_bps/1024.0f );
828 }
829 #ifdef USE_ASS 903 #ifdef USE_ASS
830 if (ass_enabled && ass_library) { 904 if (ass_enabled && ass_library) {
831 for (i = 0; i < MAX_S_STREAMS; ++i) { 905 for (i = 0; i < MAX_S_STREAMS; ++i) {
832 sh_sub_t* sh = demuxer->s_streams[i]; 906 sh_sub_t *sh = demuxer->s_streams[i];
833 if (sh && sh->type == 'a') { 907 if (sh && sh->type == 'a') {
834 sh->ass_track = ass_new_track(ass_library); 908 sh->ass_track = ass_new_track(ass_library);
835 if (sh->ass_track && sh->extradata) 909 if (sh->ass_track && sh->extradata)
836 ass_process_codec_private(sh->ass_track, sh->extradata, sh->extradata_len); 910 ass_process_codec_private(sh->ass_track, sh->extradata,
837 } else if (sh && sh->type != 'v') 911 sh->extradata_len);
838 sh->ass_track = ass_default_track(ass_library); 912 } else if (sh && sh->type != 'v')
839 } 913 sh->ass_track = ass_default_track(ass_library);
840 } 914 }
915 }
841 #endif 916 #endif
842 return demuxer; 917 return demuxer;
843 } 918 }
844 919
845 char* audio_stream = NULL; 920 char *audio_stream = NULL;
846 char* sub_stream = NULL; 921 char *sub_stream = NULL;
847 int audio_stream_cache = 0; 922 int audio_stream_cache = 0;
848 923
849 char *demuxer_name = NULL; // parameter from -demuxer 924 char *demuxer_name = NULL; // parameter from -demuxer
850 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer 925 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer
851 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer 926 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer
852 927
853 extern int hr_mp3_seek; 928 extern int hr_mp3_seek;
854 929
855 extern float stream_cache_min_percent; 930 extern float stream_cache_min_percent;
856 extern float stream_cache_seek_min_percent; 931 extern float stream_cache_seek_min_percent;
857 932
858 demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){ 933 demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id,
859 stream_t *as = NULL,*ss = NULL; 934 int video_id, int dvdsub_id, char *filename)
860 demuxer_t *vd,*ad = NULL,*sd = NULL; 935 {
861 demuxer_t *res; 936 stream_t *as = NULL, *ss = NULL;
862 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ; 937 demuxer_t *vd, *ad = NULL, *sd = NULL;
863 int demuxer_type; 938 demuxer_t *res;
864 int audio_demuxer_type = 0, sub_demuxer_type = 0; 939 int afmt = DEMUXER_TYPE_UNKNOWN, sfmt = DEMUXER_TYPE_UNKNOWN;
865 int demuxer_force = 0, audio_demuxer_force = 0, 940 int demuxer_type;
866 sub_demuxer_force = 0; 941 int audio_demuxer_type = 0, sub_demuxer_type = 0;
867 942 int demuxer_force = 0, audio_demuxer_force = 0, sub_demuxer_force = 0;
868 if ((demuxer_type = get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) { 943
869 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name); 944 if ((demuxer_type =
870 } 945 get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) {
871 if ((audio_demuxer_type = get_demuxer_type_from_name(audio_demuxer_name, &audio_demuxer_force)) < 0) { 946 mp_msg(MSGT_DEMUXER, MSGL_ERR, "-demuxer %s does not exist.\n",
872 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name); 947 demuxer_name);
873 } 948 }
874 if ((sub_demuxer_type = get_demuxer_type_from_name(sub_demuxer_name, &sub_demuxer_force)) < 0) { 949 if ((audio_demuxer_type =
875 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name); 950 get_demuxer_type_from_name(audio_demuxer_name,
876 } 951 &audio_demuxer_force)) < 0) {
877 952 mp_msg(MSGT_DEMUXER, MSGL_ERR, "-audio-demuxer %s does not exist.\n",
878 if(audio_stream) { 953 audio_demuxer_name);
879 as = open_stream(audio_stream,0,&afmt); 954 }
880 if(!as) { 955 if ((sub_demuxer_type =
881 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenAudioStream,audio_stream); 956 get_demuxer_type_from_name(sub_demuxer_name,
882 return NULL; 957 &sub_demuxer_force)) < 0) {
883 } 958 mp_msg(MSGT_DEMUXER, MSGL_ERR, "-sub-demuxer %s does not exist.\n",
884 if(audio_stream_cache) { 959 sub_demuxer_name);
885 if(!stream_enable_cache(as,audio_stream_cache*1024,audio_stream_cache*1024*(stream_cache_min_percent / 100.0), 960 }
886 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) { 961
887 free_stream(as); 962 if (audio_stream) {
888 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n"); 963 as = open_stream(audio_stream, 0, &afmt);
889 return NULL; 964 if (!as) {
890 } 965 mp_msg(MSGT_DEMUXER, MSGL_ERR, MSGTR_CannotOpenAudioStream,
891 } 966 audio_stream);
892 } 967 return NULL;
893 if(sub_stream) { 968 }
894 ss = open_stream(sub_stream,0,&sfmt); 969 if (audio_stream_cache) {
895 if(!ss) { 970 if (!stream_enable_cache
896 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenSubtitlesStream,sub_stream); 971 (as, audio_stream_cache * 1024,
897 return NULL; 972 audio_stream_cache * 1024 * (stream_cache_min_percent /
898 } 973 100.0),
899 } 974 audio_stream_cache * 1024 * (stream_cache_seek_min_percent /
900 975 100.0))) {
901 vd = demux_open_stream(vs, demuxer_type ? demuxer_type : file_format, 976 free_stream(as);
902 demuxer_force, audio_stream ? -2 : audio_id, video_id, 977 mp_msg(MSGT_DEMUXER, MSGL_ERR,
903 sub_stream ? -2 : dvdsub_id, filename); 978 "Can't enable audio stream cache\n");
904 if(!vd) { 979 return NULL;
905 if(as) free_stream(as); 980 }
906 if(ss) free_stream(ss); 981 }
907 return NULL; 982 }
908 } 983 if (sub_stream) {
909 if(as) { 984 ss = open_stream(sub_stream, 0, &sfmt);
910 ad = demux_open_stream(as, audio_demuxer_type ? audio_demuxer_type : afmt, 985 if (!ss) {
911 audio_demuxer_force, audio_id, -2, -2, audio_stream); 986 mp_msg(MSGT_DEMUXER, MSGL_ERR, MSGTR_CannotOpenSubtitlesStream,
912 if(!ad) { 987 sub_stream);
913 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream); 988 return NULL;
914 free_stream(as); 989 }
915 } 990 }
916 else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3 991
917 hr_mp3_seek=1; // Enable high res seeking 992 vd = demux_open_stream(vs, demuxer_type ? demuxer_type : file_format,
918 } 993 demuxer_force, audio_stream ? -2 : audio_id,
919 if(ss) { 994 video_id, sub_stream ? -2 : dvdsub_id, filename);
920 sd = demux_open_stream(ss, sub_demuxer_type ? sub_demuxer_type : sfmt, 995 if (!vd) {
921 sub_demuxer_force, -2, -2, dvdsub_id, sub_stream); 996 if (as)
922 if(!sd) { 997 free_stream(as);
923 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream); 998 if (ss)
924 free_stream(ss); 999 free_stream(ss);
925 } 1000 return NULL;
926 } 1001 }
927 1002 if (as) {
928 if(ad && sd) 1003 ad = demux_open_stream(as,
929 res = new_demuxers_demuxer(vd,ad,sd); 1004 audio_demuxer_type ? audio_demuxer_type : afmt,
930 else if(ad) 1005 audio_demuxer_force, audio_id, -2, -2,
931 res = new_demuxers_demuxer(vd,ad,vd); 1006 audio_stream);
932 else if(sd) 1007 if (!ad) {
933 res = new_demuxers_demuxer(vd,vd,sd); 1008 mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_OpeningAudioDemuxerFailed,
934 else 1009 audio_stream);
935 res = vd; 1010 free_stream(as);
936 1011 } else if (ad->audio->sh
937 correct_pts = user_correct_pts; 1012 && ((sh_audio_t *) ad->audio->sh)->format == 0x55) // MP3
938 if (correct_pts < 0) 1013 hr_mp3_seek = 1; // Enable high res seeking
939 correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL) == DEMUXER_CTRL_OK; 1014 }
940 return res; 1015 if (ss) {
941 } 1016 sd = demux_open_stream(ss, sub_demuxer_type ? sub_demuxer_type : sfmt,
942 1017 sub_demuxer_force, -2, -2, dvdsub_id,
943 1018 sub_stream);
944 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ 1019 if (!sd) {
945 demux_stream_t *d_audio=demuxer->audio; 1020 mp_msg(MSGT_DEMUXER, MSGL_WARN,
946 demux_stream_t *d_video=demuxer->video; 1021 MSGTR_OpeningSubtitlesDemuxerFailed, sub_stream);
947 sh_audio_t *sh_audio=d_audio->sh; 1022 free_stream(ss);
948 sh_video_t *sh_video=d_video->sh; 1023 }
1024 }
1025
1026 if (ad && sd)
1027 res = new_demuxers_demuxer(vd, ad, sd);
1028 else if (ad)
1029 res = new_demuxers_demuxer(vd, ad, vd);
1030 else if (sd)
1031 res = new_demuxers_demuxer(vd, vd, sd);
1032 else
1033 res = vd;
1034
1035 correct_pts = user_correct_pts;
1036 if (correct_pts < 0)
1037 correct_pts =
1038 demux_control(res, DEMUXER_CTRL_CORRECT_PTS,
1039 NULL) == DEMUXER_CTRL_OK;
1040 return res;
1041 }
1042
1043
1044 int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
1045 int flags)
1046 {
1047 demux_stream_t *d_audio = demuxer->audio;
1048 demux_stream_t *d_video = demuxer->video;
1049 sh_audio_t *sh_audio = d_audio->sh;
1050 sh_video_t *sh_video = d_video->sh;
949 double tmp = 0; 1051 double tmp = 0;
950 double pts; 1052 double pts;
951 1053
952 if(!demuxer->seekable){ 1054 if (!demuxer->seekable) {
953 if(demuxer->file_format==DEMUXER_TYPE_AVI) 1055 if (demuxer->file_format == DEMUXER_TYPE_AVI)
954 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI); 1056 mp_msg(MSGT_SEEK, MSGL_WARN, MSGTR_CantSeekRawAVI);
955 #ifdef USE_TV 1057 #ifdef USE_TV
956 else if (demuxer->file_format==DEMUXER_TYPE_TV) 1058 else if (demuxer->file_format == DEMUXER_TYPE_TV)
957 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable); 1059 mp_msg(MSGT_SEEK, MSGL_WARN, MSGTR_TVInputNotSeekable);
958 #endif 1060 #endif
959 else 1061 else
960 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile); 1062 mp_msg(MSGT_SEEK, MSGL_WARN, MSGTR_CantSeekFile);
961 return 0; 1063 return 0;
962 } 1064 }
963
964 // clear demux buffers: 1065 // clear demux buffers:
965 if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} 1066 if (sh_audio) {
1067 ds_free_packs(d_audio);
1068 sh_audio->a_buffer_len = 0;
1069 }
966 ds_free_packs(d_video); 1070 ds_free_packs(d_video);
967 ds_free_packs(demuxer->sub); 1071 ds_free_packs(demuxer->sub);
968 1072
969 demuxer->stream->eof=0; // clear eof flag 1073 demuxer->stream->eof = 0;
970 demuxer->video->eof=0; 1074 demuxer->video->eof = 0;
971 demuxer->audio->eof=0; 1075 demuxer->audio->eof = 0;
972 1076
973 #if 0 1077 if (sh_video)
974 if(sh_audio) sh_audio->timer=sh_video->timer; 1078 sh_video->timer = 0; // !!!!!!
975 #else 1079
976 if(sh_video) sh_video->timer=0; // !!!!!! 1080 if (flags & SEEK_ABSOLUTE)
977 #endif 1081 pts = 0.0f;
978
979 if(flags & SEEK_ABSOLUTE)
980 pts = 0.0f;
981 else { 1082 else {
982 if(demuxer->stream_pts == MP_NOPTS_VALUE) 1083 if (demuxer->stream_pts == MP_NOPTS_VALUE)
983 goto dmx_seek; 1084 goto dmx_seek;
984 pts = demuxer->stream_pts; 1085 pts = demuxer->stream_pts;
985 } 1086 }
986 1087
987 if(flags & SEEK_FACTOR) { 1088 if (flags & SEEK_FACTOR) {
988 if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, &tmp) == STREAM_UNSUPPORTED) 1089 if (stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, &tmp)
989 goto dmx_seek; 1090 == STREAM_UNSUPPORTED)
990 pts += tmp * rel_seek_secs; 1091 goto dmx_seek;
1092 pts += tmp * rel_seek_secs;
991 } else 1093 } else
992 pts += rel_seek_secs; 1094 pts += rel_seek_secs;
993 1095
994 if(stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != STREAM_UNSUPPORTED) { 1096 if (stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) !=
995 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); 1097 STREAM_UNSUPPORTED) {
996 return 1; 1098 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
997 } 1099 return 1;
998 1100 }
999 dmx_seek: 1101
1000 if (demuxer->desc->seek) 1102 dmx_seek:
1001 demuxer->desc->seek(demuxer,rel_seek_secs,audio_delay,flags); 1103 if (demuxer->desc->seek)
1002 1104 demuxer->desc->seek(demuxer, rel_seek_secs, audio_delay, flags);
1003 if (sh_audio) resync_audio_stream(sh_audio); 1105
1004 1106 if (sh_audio)
1005 return 1; 1107 resync_audio_stream(sh_audio);
1108
1109 return 1;
1006 } 1110 }
1007 1111
1008 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param) 1112 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param)
1009 { 1113 {
1010 char **info = demuxer->info; 1114 char **info = demuxer->info;
1011 int n = 0; 1115 int n = 0;
1012 1116
1013 1117
1014 for(n = 0; info && info[2*n] != NULL; n++) 1118 for (n = 0; info && info[2 * n] != NULL; n++) {
1015 { 1119 if (!strcasecmp(opt, info[2 * n])) {
1016 if(!strcasecmp(opt,info[2*n])) 1120 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_DemuxerInfoChanged, opt,
1017 { 1121 param);
1018 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_DemuxerInfoChanged,opt,param); 1122 free(info[2 * n + 1]);
1019 free(info[2*n+1]); 1123 info[2 * n + 1] = strdup(param);
1020 info[2*n+1] = strdup(param); 1124 return 0;
1021 return 0; 1125 }
1022 } 1126 }
1023 } 1127
1024 1128 info = demuxer->info =
1025 info = demuxer->info = (char**)realloc(info,(2*(n+2))*sizeof(char*)); 1129 (char **) realloc(info, (2 * (n + 2)) * sizeof(char *));
1026 info[2*n] = strdup(opt); 1130 info[2 * n] = strdup(opt);
1027 info[2*n+1] = strdup(param); 1131 info[2 * n + 1] = strdup(param);
1028 memset(&info[2*(n+1)],0,2*sizeof(char*)); 1132 memset(&info[2 * (n + 1)], 0, 2 * sizeof(char *));
1029 1133
1030 return 1; 1134 return 1;
1031 } 1135 }
1032 1136
1033 int demux_info_print(demuxer_t *demuxer) 1137 int demux_info_print(demuxer_t *demuxer)
1034 { 1138 {
1035 char **info = demuxer->info; 1139 char **info = demuxer->info;
1036 int n; 1140 int n;
1037 1141
1038 if(!info) 1142 if (!info)
1039 return 0; 1143 return 0;
1040 1144
1041 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo); 1145 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_ClipInfo);
1042 for(n = 0; info[2*n] != NULL ; n++) 1146 for (n = 0; info[2 * n] != NULL; n++) {
1043 { 1147 mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n", info[2 * n],
1044 mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]); 1148 info[2 * n + 1]);
1045 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_NAME%d=%s\n", n, info[2*n]); 1149 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_NAME%d=%s\n", n,
1046 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_VALUE%d=%s\n", n, info[2*n+1]); 1150 info[2 * n]);
1151 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_VALUE%d=%s\n", n,
1152 info[2 * n + 1]);
1047 } 1153 }
1048 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_N=%d\n", n); 1154 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_N=%d\n", n);
1049 1155
1050 return 0; 1156 return 0;
1051 } 1157 }
1052 1158
1053 char* demux_info_get(demuxer_t *demuxer, const char *opt) { 1159 char *demux_info_get(demuxer_t *demuxer, const char *opt)
1054 int i; 1160 {
1055 char **info = demuxer->info; 1161 int i;
1056 1162 char **info = demuxer->info;
1057 for(i = 0; info && info[2*i] != NULL; i++) { 1163
1058 if(!strcasecmp(opt,info[2*i])) 1164 for (i = 0; info && info[2 * i] != NULL; i++) {
1059 return info[2*i+1]; 1165 if (!strcasecmp(opt, info[2 * i]))
1060 } 1166 return info[2 * i + 1];
1061 1167 }
1062 return NULL; 1168
1063 } 1169 return NULL;
1064 1170 }
1065 int demux_control(demuxer_t *demuxer, int cmd, void *arg) { 1171
1172 int demux_control(demuxer_t *demuxer, int cmd, void *arg)
1173 {
1066 1174
1067 if (demuxer->desc->control) 1175 if (demuxer->desc->control)
1068 return demuxer->desc->control(demuxer,cmd,arg); 1176 return demuxer->desc->control(demuxer, cmd, arg);
1069 1177
1070 return DEMUXER_CTRL_NOTIMPL; 1178 return DEMUXER_CTRL_NOTIMPL;
1071 } 1179 }
1072 1180
1073 1181
1074 1182
1075 double demuxer_get_time_length(demuxer_t *demuxer){ 1183 double demuxer_get_time_length(demuxer_t *demuxer)
1184 {
1076 double get_time_ans; 1185 double get_time_ans;
1077 sh_video_t *sh_video = demuxer->video->sh; 1186 sh_video_t *sh_video = demuxer->video->sh;
1078 sh_audio_t *sh_audio = demuxer->audio->sh; 1187 sh_audio_t *sh_audio = demuxer->audio->sh;
1079 // <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW 1188 // <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW
1080 if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,(void *)&get_time_ans)<=0) { 1189 if (demux_control
1081 if (sh_video && sh_video->i_bps && sh_audio && sh_audio->i_bps) 1190 (demuxer, DEMUXER_CTRL_GET_TIME_LENGTH, (void *) &get_time_ans) <= 0) {
1082 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/(sh_video->i_bps+sh_audio->i_bps); 1191 if (sh_video && sh_video->i_bps && sh_audio && sh_audio->i_bps)
1083 else if (sh_video && sh_video->i_bps) 1192 get_time_ans =
1084 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps; 1193 (double) (demuxer->movi_end -
1085 else if (sh_audio && sh_audio->i_bps) 1194 demuxer->movi_start) / (sh_video->i_bps +
1086 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_audio->i_bps; 1195 sh_audio->i_bps);
1087 else 1196 else if (sh_video && sh_video->i_bps)
1088 get_time_ans=0; 1197 get_time_ans =
1198 (double) (demuxer->movi_end -
1199 demuxer->movi_start) / sh_video->i_bps;
1200 else if (sh_audio && sh_audio->i_bps)
1201 get_time_ans =
1202 (double) (demuxer->movi_end -
1203 demuxer->movi_start) / sh_audio->i_bps;
1204 else
1205 get_time_ans = 0;
1089 } 1206 }
1090 return get_time_ans; 1207 return get_time_ans;
1091 } 1208 }
1092 1209
1093 /** 1210 /**
1095 * either when the stream reader satisfies STREAM_CTRL_GET_CURRENT_TIME (e.g. dvd) 1212 * either when the stream reader satisfies STREAM_CTRL_GET_CURRENT_TIME (e.g. dvd)
1096 * or using sh_video->pts when the former method fails 1213 * or using sh_video->pts when the former method fails
1097 * 0 otherwise 1214 * 0 otherwise
1098 * \return the current play time 1215 * \return the current play time
1099 */ 1216 */
1100 int demuxer_get_current_time(demuxer_t *demuxer){ 1217 int demuxer_get_current_time(demuxer_t *demuxer)
1218 {
1101 double get_time_ans = 0; 1219 double get_time_ans = 0;
1102 sh_video_t *sh_video = demuxer->video->sh; 1220 sh_video_t *sh_video = demuxer->video->sh;
1103 if(demuxer->stream_pts != MP_NOPTS_VALUE) 1221 if (demuxer->stream_pts != MP_NOPTS_VALUE)
1104 get_time_ans = demuxer->stream_pts; 1222 get_time_ans = demuxer->stream_pts;
1105 else if(sh_video) get_time_ans = sh_video->pts; 1223 else if (sh_video)
1224 get_time_ans = sh_video->pts;
1106 return (int) get_time_ans; 1225 return (int) get_time_ans;
1107 } 1226 }
1108 1227
1109 int demuxer_get_percent_pos(demuxer_t *demuxer){ 1228 int demuxer_get_percent_pos(demuxer_t *demuxer)
1229 {
1110 int ans = 0; 1230 int ans = 0;
1111 int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans); 1231 int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans);
1112 int len = (demuxer->movi_end - demuxer->movi_start) / 100; 1232 int len = (demuxer->movi_end - demuxer->movi_start) / 100;
1113 if (res <= 0) { 1233 if (res <= 0) {
1114 if (len > 0) 1234 if (len > 0)
1115 ans = (demuxer->filepos - demuxer->movi_start) / len; 1235 ans = (demuxer->filepos - demuxer->movi_start) / len;
1116 else 1236 else
1117 ans = 0; 1237 ans = 0;
1118 } 1238 }
1119 if (ans < 0) ans = 0; 1239 if (ans < 0)
1120 if (ans > 100) ans = 100; 1240 ans = 0;
1241 if (ans > 100)
1242 ans = 100;
1121 return ans; 1243 return ans;
1122 } 1244 }
1123 1245
1124 int demuxer_switch_audio(demuxer_t *demuxer, int index){ 1246 int demuxer_switch_audio(demuxer_t *demuxer, int index)
1247 {
1125 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_AUDIO, &index); 1248 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_AUDIO, &index);
1126 if (res == DEMUXER_CTRL_NOTIMPL) 1249 if (res == DEMUXER_CTRL_NOTIMPL)
1127 index = demuxer->audio->id; 1250 index = demuxer->audio->id;
1128 if (demuxer->audio->id >= 0) 1251 if (demuxer->audio->id >= 0)
1129 demuxer->audio->sh = demuxer->a_streams[demuxer->audio->id]; 1252 demuxer->audio->sh = demuxer->a_streams[demuxer->audio->id];
1130 else 1253 else
1131 demuxer->audio->sh = NULL; 1254 demuxer->audio->sh = NULL;
1132 return index; 1255 return index;
1133 } 1256 }
1134 1257
1135 int demuxer_switch_video(demuxer_t *demuxer, int index){ 1258 int demuxer_switch_video(demuxer_t *demuxer, int index)
1259 {
1136 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index); 1260 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index);
1137 if (res == DEMUXER_CTRL_NOTIMPL) 1261 if (res == DEMUXER_CTRL_NOTIMPL)
1138 index = demuxer->video->id; 1262 index = demuxer->video->id;
1139 if (demuxer->video->id >= 0) 1263 if (demuxer->video->id >= 0)
1140 demuxer->video->sh = demuxer->v_streams[demuxer->video->id]; 1264 demuxer->video->sh = demuxer->v_streams[demuxer->video->id];
1141 else 1265 else
1142 demuxer->video->sh = NULL; 1266 demuxer->video->sh = NULL;
1143 return index; 1267 return index;
1144 } 1268 }
1145 1269
1146 int demuxer_add_attachment(demuxer_t* demuxer, const char* name, 1270 int demuxer_add_attachment(demuxer_t *demuxer, const char *name,
1147 const char* type, const void* data, size_t size) { 1271 const char *type, const void *data, size_t size)
1272 {
1148 if (!(demuxer->num_attachments & 31)) 1273 if (!(demuxer->num_attachments & 31))
1149 demuxer->attachments = realloc(demuxer->attachments, (demuxer->num_attachments + 32) * sizeof(demux_attachment_t)); 1274 demuxer->attachments = realloc(demuxer->attachments,
1275 (demuxer->num_attachments + 32) * sizeof(demux_attachment_t));
1150 1276
1151 demuxer->attachments[demuxer->num_attachments].name = strdup(name); 1277 demuxer->attachments[demuxer->num_attachments].name = strdup(name);
1152 demuxer->attachments[demuxer->num_attachments].type = strdup(type); 1278 demuxer->attachments[demuxer->num_attachments].type = strdup(type);
1153 demuxer->attachments[demuxer->num_attachments].data = malloc(size); 1279 demuxer->attachments[demuxer->num_attachments].data = malloc(size);
1154 memcpy(demuxer->attachments[demuxer->num_attachments].data, data, size); 1280 memcpy(demuxer->attachments[demuxer->num_attachments].data, data, size);
1155 demuxer->attachments[demuxer->num_attachments].data_size = size; 1281 demuxer->attachments[demuxer->num_attachments].data_size = size;
1156 1282
1157 return demuxer->num_attachments ++; 1283 return demuxer->num_attachments++;
1158 } 1284 }
1159 1285
1160 int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end){ 1286 int demuxer_add_chapter(demuxer_t *demuxer, const char *name, uint64_t start,
1287 uint64_t end)
1288 {
1161 if (demuxer->chapters == NULL) 1289 if (demuxer->chapters == NULL)
1162 demuxer->chapters = malloc (32*sizeof(*demuxer->chapters)); 1290 demuxer->chapters = malloc(32 * sizeof(*demuxer->chapters));
1163 else if (!(demuxer->num_chapters % 32)) 1291 else if (!(demuxer->num_chapters % 32))
1164 demuxer->chapters = realloc (demuxer->chapters, (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters)); 1292 demuxer->chapters = realloc(demuxer->chapters,
1293 (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters));
1165 1294
1166 demuxer->chapters[demuxer->num_chapters].start = start; 1295 demuxer->chapters[demuxer->num_chapters].start = start;
1167 demuxer->chapters[demuxer->num_chapters].end = end; 1296 demuxer->chapters[demuxer->num_chapters].end = end;
1168 demuxer->chapters[demuxer->num_chapters].name = strdup(name); 1297 demuxer->chapters[demuxer->num_chapters].name = strdup(name);
1169 1298
1170 return demuxer->num_chapters ++; 1299 return demuxer->num_chapters++;
1171 } 1300 }
1172 1301
1173 /** 1302 /**
1174 * \brief demuxer_seek_chapter() seeks to a chapter in two possible ways: 1303 * \brief demuxer_seek_chapter() seeks to a chapter in two possible ways:
1175 * either using the demuxer->chapters structure set by the demuxer 1304 * either using the demuxer->chapters structure set by the demuxer
1176 * or asking help to the stream layer (e.g. dvd) 1305 * or asking help to the stream layer (e.g. dvd)
1177 * \param chapter - chapter number wished - 0-based 1306 * \param chapter - chapter number wished - 0-based
1178 * \param mode 0: relative to current main pts, 1: absolute 1307 * \param mode 0: relative to current main pts, 1: absolute
1179 * \param seek_pts set by the function to the pts to seek to (if demuxer->chapters is set) 1308 * \param seek_pts set by the function to the pts to seek to (if demuxer->chapters is set)
1180 * \param num_chapters number of chapters present (set by this function is param is not null) 1309 * \param num_chapters number of chapters present (set by this function is param is not null)
1181 * \param chapter_name name of chapter found (set by this function is param is not null) 1310 * \param chapter_name name of chapter found (set by this function is param is not null)
1182 * \return -1 on error, current chapter if successful 1311 * \return -1 on error, current chapter if successful
1183 */ 1312 */
1184 1313
1185 int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, float *seek_pts, int *num_chapters, char **chapter_name) { 1314 int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode,
1315 float *seek_pts, int *num_chapters,
1316 char **chapter_name)
1317 {
1186 int ris; 1318 int ris;
1187 int current, total; 1319 int current, total;
1188 sh_video_t *sh_video = demuxer->video->sh; 1320 sh_video_t *sh_video = demuxer->video->sh;
1189 sh_audio_t *sh_audio = demuxer->audio->sh; 1321 sh_audio_t *sh_audio = demuxer->audio->sh;
1190 1322
1191 if (!demuxer->num_chapters || !demuxer->chapters) { 1323 if (!demuxer->num_chapters || !demuxer->chapters) {
1192 if(!mode) { 1324 if (!mode) {
1193 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, &current); 1325 ris = stream_control(demuxer->stream,
1194 if(ris == STREAM_UNSUPPORTED) return -1; 1326 STREAM_CTRL_GET_CURRENT_CHAPTER, &current);
1327 if (ris == STREAM_UNSUPPORTED)
1328 return -1;
1195 chapter += current; 1329 chapter += current;
1196 } 1330 }
1197 1331
1198 if(demuxer->video->sh) 1332 if (demuxer->video->sh)
1199 ds_free_packs(demuxer->video); 1333 ds_free_packs(demuxer->video);
1200 1334
1201 if(demuxer->audio->sh) 1335 if (demuxer->audio->sh)
1202 ds_free_packs(demuxer->audio); 1336 ds_free_packs(demuxer->audio);
1203 1337
1204 if(demuxer->sub->id >= 0) 1338 if (demuxer->sub->id >= 0)
1205 ds_free_packs(demuxer->sub); 1339 ds_free_packs(demuxer->sub);
1206 1340
1207 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter); 1341 ris =
1208 if(ris != STREAM_UNSUPPORTED) 1342 stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER,
1343 &chapter);
1344 if (ris != STREAM_UNSUPPORTED)
1209 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); 1345 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
1210 if(sh_video) { 1346 if (sh_video) {
1211 ds_fill_buffer(demuxer->video); 1347 ds_fill_buffer(demuxer->video);
1212 resync_video_stream(sh_video); 1348 resync_video_stream(sh_video);
1213 } 1349 }
1214 1350
1215 if(sh_audio) { 1351 if (sh_audio) {
1216 ds_fill_buffer(demuxer->audio); 1352 ds_fill_buffer(demuxer->audio);
1217 resync_audio_stream(sh_audio); 1353 resync_audio_stream(sh_audio);
1218 } 1354 }
1219 1355 //exit status may be ok, but main() doesn't have to seek itself
1220 //exit status may be ok, but main() doesn't have to seek itself (because e.g. dvds depend on sectors, not on pts) 1356 // (because e.g. dvds depend on sectors, not on pts)
1221 *seek_pts = -1.0; 1357 *seek_pts = -1.0;
1222 1358
1223 if(num_chapters) { 1359 if (num_chapters) {
1224 if(stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS, num_chapters) == STREAM_UNSUPPORTED) 1360 if (stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS,
1361 num_chapters) == STREAM_UNSUPPORTED)
1225 *num_chapters = 0; 1362 *num_chapters = 0;
1226 } 1363 }
1227 1364
1228 if(chapter_name) { 1365 if (chapter_name) {
1229 *chapter_name = NULL; 1366 *chapter_name = NULL;
1230 if (num_chapters && *num_chapters) { 1367 if (num_chapters && *num_chapters) {
1231 char *tmp = malloc(16); 1368 char *tmp = malloc(16);
1232 if (tmp) { 1369 if (tmp) {
1233 sprintf(tmp, " of %3d", *num_chapters); 1370 sprintf(tmp, " of %3d", *num_chapters);
1234 *chapter_name = tmp; 1371 *chapter_name = tmp;
1235 } 1372 }
1236 } 1373 }
1237 } 1374 }
1238 1375
1239 return (ris != STREAM_UNSUPPORTED ? chapter : -1); 1376 return ris != STREAM_UNSUPPORTED ? chapter : -1;
1240 } else { //chapters structure is set in the demuxer 1377 } else { // chapters structure is set in the demuxer
1241 total = demuxer->num_chapters; 1378 total = demuxer->num_chapters;
1242 1379
1243 if (mode==1) { //absolute seeking 1380 if (mode == 1) //absolute seeking
1244 current = chapter; 1381 current = chapter;
1245 } else { //relative seeking 1382 else { //relative seeking
1246 uint64_t now; 1383 uint64_t now;
1247 now = (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0.)) * 1000 + .5; 1384 now =
1385 (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0.)) *
1386 1000 + .5;
1248 1387
1249 for (current = total - 1; current >= 0; --current) { 1388 for (current = total - 1; current >= 0; --current) {
1250 demux_chapter_t* chapter = demuxer->chapters + current; 1389 demux_chapter_t *chapter = demuxer->chapters + current;
1251 if (chapter->start <= now) 1390 if (chapter->start <= now)
1252 break; 1391 break;
1253 } 1392 }
1254 current += chapter; 1393 current += chapter;
1255 } 1394 }
1256 1395
1257 if (current >= total) 1396 if (current >= total)
1258 return -1; 1397 return -1;
1259 if (current < 0) current = 0; 1398 if (current < 0)
1399 current = 0;
1260 1400
1261 *seek_pts = demuxer->chapters[current].start / 1000.0; 1401 *seek_pts = demuxer->chapters[current].start / 1000.0;
1262 1402
1263 if(num_chapters) 1403 if (num_chapters)
1264 *num_chapters = demuxer->num_chapters; 1404 *num_chapters = demuxer->num_chapters;
1265 1405
1266 if(chapter_name) { 1406 if (chapter_name) {
1267 if(demuxer->chapters[current].name) 1407 if (demuxer->chapters[current].name)
1268 *chapter_name = strdup(demuxer->chapters[current].name); 1408 *chapter_name = strdup(demuxer->chapters[current].name);
1269 else *chapter_name = NULL; 1409 else
1410 *chapter_name = NULL;
1270 } 1411 }
1271 1412
1272 return current; 1413 return current;
1273 } 1414 }
1274 } 1415 }
1275 1416
1276 int demuxer_get_current_chapter(demuxer_t *demuxer) { 1417 int demuxer_get_current_chapter(demuxer_t *demuxer)
1418 {
1277 int chapter = -1; 1419 int chapter = -1;
1278 if (!demuxer->num_chapters || !demuxer->chapters) { 1420 if (!demuxer->num_chapters || !demuxer->chapters) {
1279 if (stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, 1421 if (stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER,
1280 &chapter) == STREAM_UNSUPPORTED) 1422 &chapter) == STREAM_UNSUPPORTED)
1281 chapter = -1; 1423 chapter = -1;
1282 } 1424 } else {
1283 else {
1284 sh_video_t *sh_video = demuxer->video->sh; 1425 sh_video_t *sh_video = demuxer->video->sh;
1285 sh_audio_t *sh_audio = demuxer->audio->sh; 1426 sh_audio_t *sh_audio = demuxer->audio->sh;
1286 uint64_t now; 1427 uint64_t now;
1287 now = (sh_video ? sh_video->pts : (sh_audio?sh_audio->pts:0))*1000+0.5; 1428 now =
1429 (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0)) *
1430 1000 + 0.5;
1288 for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) { 1431 for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
1289 if (demuxer->chapters[chapter].start <= now) 1432 if (demuxer->chapters[chapter].start <= now)
1290 break; 1433 break;
1291 } 1434 }
1292 } 1435 }
1293 return chapter; 1436 return chapter;
1294 } 1437 }
1295 1438
1296 char *demuxer_chapter_name(demuxer_t *demuxer, int chapter) { 1439 char *demuxer_chapter_name(demuxer_t *demuxer, int chapter)
1440 {
1297 if (demuxer->num_chapters && demuxer->chapters) { 1441 if (demuxer->num_chapters && demuxer->chapters) {
1298 if (chapter >=0 && chapter < demuxer->num_chapters && 1442 if (chapter >= 0 && chapter < demuxer->num_chapters
1299 demuxer->chapters[chapter].name) 1443 && demuxer->chapters[chapter].name)
1300 return strdup(demuxer->chapters[chapter].name); 1444 return strdup(demuxer->chapters[chapter].name);
1301 } 1445 }
1302 return NULL; 1446 return NULL;
1303 } 1447 }
1304 1448
1305 char *demuxer_chapter_display_name(demuxer_t *demuxer, int chapter) { 1449 char *demuxer_chapter_display_name(demuxer_t *demuxer, int chapter)
1450 {
1306 char *chapter_name = demuxer_chapter_name(demuxer, chapter); 1451 char *chapter_name = demuxer_chapter_name(demuxer, chapter);
1307 if (chapter_name) { 1452 if (chapter_name) {
1308 char *tmp = malloc(strlen(chapter_name) + 14); 1453 char *tmp = malloc(strlen(chapter_name) + 14);
1309 snprintf(tmp, 63, "(%d) %s", chapter + 1, chapter_name); 1454 snprintf(tmp, 63, "(%d) %s", chapter + 1, chapter_name);
1310 free(chapter_name); 1455 free(chapter_name);
1311 return tmp; 1456 return tmp;
1312 } 1457 } else {
1313 else {
1314 int chapter_num = demuxer_chapter_count(demuxer); 1458 int chapter_num = demuxer_chapter_count(demuxer);
1315 char tmp[30]; 1459 char tmp[30];
1316 if (chapter_num <= 0) 1460 if (chapter_num <= 0)
1317 sprintf(tmp, "(%d)", chapter + 1); 1461 sprintf(tmp, "(%d)", chapter + 1);
1318 else 1462 else
1319 sprintf(tmp, "(%d) of %d", chapter + 1, chapter_num); 1463 sprintf(tmp, "(%d) of %d", chapter + 1, chapter_num);
1320 return strdup(tmp); 1464 return strdup(tmp);
1321 } 1465 }
1322 } 1466 }
1323 1467
1324 float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end) { 1468 float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end)
1469 {
1325 if (demuxer->num_chapters && demuxer->chapters && chapter >= 0 1470 if (demuxer->num_chapters && demuxer->chapters && chapter >= 0
1326 && chapter < demuxer->num_chapters) { 1471 && chapter < demuxer->num_chapters) {
1327 if (end) 1472 if (end)
1328 *end = demuxer->chapters[chapter].end / 1000.0; 1473 *end = demuxer->chapters[chapter].end / 1000.0;
1329 return demuxer->chapters[chapter].start / 1000.0; 1474 return demuxer->chapters[chapter].start / 1000.0;
1330 } 1475 }
1331 return -1.0; 1476 return -1.0;
1332 } 1477 }
1333 1478
1334 int demuxer_chapter_count(demuxer_t *demuxer) { 1479 int demuxer_chapter_count(demuxer_t *demuxer)
1480 {
1335 if (!demuxer->num_chapters || !demuxer->chapters) { 1481 if (!demuxer->num_chapters || !demuxer->chapters) {
1336 int num_chapters = 0; 1482 int num_chapters = 0;
1337 if (stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS, 1483 if (stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS,
1338 &num_chapters) == STREAM_UNSUPPORTED) 1484 &num_chapters) == STREAM_UNSUPPORTED)
1339 num_chapters = 0; 1485 num_chapters = 0;
1340 return num_chapters; 1486 return num_chapters;
1341 } 1487 } else
1342 else
1343 return demuxer->num_chapters; 1488 return demuxer->num_chapters;
1344 } 1489 }
1345 1490
1346 int demuxer_angles_count(demuxer_t *demuxer) { 1491 int demuxer_angles_count(demuxer_t *demuxer)
1347 int ris, angles=-1; 1492 {
1493 int ris, angles = -1;
1348 1494
1349 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_ANGLES, &angles); 1495 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_ANGLES, &angles);
1350 if(ris == STREAM_UNSUPPORTED) return -1; 1496 if (ris == STREAM_UNSUPPORTED)
1497 return -1;
1351 return angles; 1498 return angles;
1352 } 1499 }
1353 1500
1354 int demuxer_get_current_angle(demuxer_t *demuxer) { 1501 int demuxer_get_current_angle(demuxer_t *demuxer)
1355 int ris, curr_angle=-1; 1502 {
1503 int ris, curr_angle = -1;
1356 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_ANGLE, &curr_angle); 1504 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_ANGLE, &curr_angle);
1357 if(ris == STREAM_UNSUPPORTED) return -1; 1505 if (ris == STREAM_UNSUPPORTED)
1506 return -1;
1358 return curr_angle; 1507 return curr_angle;
1359 } 1508 }
1360 1509
1361 1510
1362 int demuxer_set_angle(demuxer_t *demuxer, int angle) { 1511 int demuxer_set_angle(demuxer_t *demuxer, int angle)
1363 int ris, angles=-1; 1512 {
1513 int ris, angles = -1;
1364 sh_video_t *sh_video = demuxer->video->sh; 1514 sh_video_t *sh_video = demuxer->video->sh;
1365 sh_audio_t *sh_audio = demuxer->audio->sh; 1515 sh_audio_t *sh_audio = demuxer->audio->sh;
1366 1516
1367 angles = demuxer_angles_count(demuxer); 1517 angles = demuxer_angles_count(demuxer);
1368 if((angles < 1) || (angle > angles)) return -1; 1518 if ((angles < 1) || (angle > angles))
1369 1519 return -1;
1370 if(demuxer->video->sh) 1520
1521 if (demuxer->video->sh)
1371 ds_free_packs(demuxer->video); 1522 ds_free_packs(demuxer->video);
1372 1523
1373 if(demuxer->audio->sh) 1524 if (demuxer->audio->sh)
1374 ds_free_packs(demuxer->audio); 1525 ds_free_packs(demuxer->audio);
1375 1526
1376 if(demuxer->sub->id >= 0) 1527 if (demuxer->sub->id >= 0)
1377 ds_free_packs(demuxer->sub); 1528 ds_free_packs(demuxer->sub);
1378 1529
1379 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle); 1530 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle);
1380 if(ris == STREAM_UNSUPPORTED) return -1; 1531 if (ris == STREAM_UNSUPPORTED)
1532 return -1;
1381 1533
1382 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); 1534 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
1383 if(sh_video) { 1535 if (sh_video) {
1384 ds_fill_buffer(demuxer->video); 1536 ds_fill_buffer(demuxer->video);
1385 resync_video_stream(sh_video); 1537 resync_video_stream(sh_video);
1386 } 1538 }
1387 1539
1388 if(sh_audio) { 1540 if (sh_audio) {
1389 ds_fill_buffer(demuxer->audio); 1541 ds_fill_buffer(demuxer->audio);
1390 resync_audio_stream(sh_audio); 1542 resync_audio_stream(sh_audio);
1391 } 1543 }
1392 1544
1393 return angle; 1545 return angle;
1394 } 1546 }
1395 1547
1396 int demuxer_audio_track_by_lang(demuxer_t* d, char* lang) 1548 int demuxer_audio_track_by_lang(demuxer_t *d, char *lang)
1397 { 1549 {
1398 int i, len; 1550 int i, len;
1399 lang += strspn(lang, ","); 1551 lang += strspn(lang, ",");
1400 while((len = strcspn(lang, ",")) > 0) { 1552 while ((len = strcspn(lang, ",")) > 0) {
1401 for (i=0; i < MAX_A_STREAMS; ++i) { 1553 for (i = 0; i < MAX_A_STREAMS; ++i) {
1402 sh_audio_t* sh = d->a_streams[i]; 1554 sh_audio_t *sh = d->a_streams[i];
1403 if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0) 1555 if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0)
1404 return sh->aid; 1556 return sh->aid;
1405 } 1557 }
1406 lang += len; 1558 lang += len;
1407 lang += strspn(lang, ","); 1559 lang += strspn(lang, ",");
1408 } 1560 }
1409 return -1; 1561 return -1;
1410 } 1562 }
1411 1563
1412 int demuxer_sub_track_by_lang(demuxer_t* d, char* lang) 1564 int demuxer_sub_track_by_lang(demuxer_t *d, char *lang)
1413 { 1565 {
1414 int i, len; 1566 int i, len;
1415 lang += strspn(lang, ","); 1567 lang += strspn(lang, ",");
1416 while((len = strcspn(lang, ",")) > 0) { 1568 while ((len = strcspn(lang, ",")) > 0) {
1417 for (i=0; i < MAX_S_STREAMS; ++i) { 1569 for (i = 0; i < MAX_S_STREAMS; ++i) {
1418 sh_sub_t* sh = d->s_streams[i]; 1570 sh_sub_t *sh = d->s_streams[i];
1419 if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0) 1571 if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0)
1420 return sh->sid; 1572 return sh->sid;
1421 } 1573 }
1422 lang += len; 1574 lang += len;
1423 lang += strspn(lang, ","); 1575 lang += strspn(lang, ",");
1424 } 1576 }
1425 return -1; 1577 return -1;
1426 } 1578 }
1427 1579
1428 int demuxer_default_audio_track(demuxer_t* d) 1580 int demuxer_default_audio_track(demuxer_t *d)
1429 { 1581 {
1430 int i; 1582 int i;
1431 for (i=0; i < MAX_A_STREAMS; ++i) { 1583 for (i = 0; i < MAX_A_STREAMS; ++i) {
1432 sh_audio_t* sh = d->a_streams[i]; 1584 sh_audio_t *sh = d->a_streams[i];
1433 if (sh && sh->default_track) 1585 if (sh && sh->default_track)
1434 return sh->aid; 1586 return sh->aid;
1435 } 1587 }
1436 for (i=0; i < MAX_A_STREAMS; ++i) { 1588 for (i = 0; i < MAX_A_STREAMS; ++i) {
1437 sh_audio_t* sh = d->a_streams[i]; 1589 sh_audio_t *sh = d->a_streams[i];
1438 if (sh) 1590 if (sh)
1439 return sh->aid; 1591 return sh->aid;
1440 } 1592 }
1441 return -1; 1593 return -1;
1442 } 1594 }
1443 1595
1444 int demuxer_default_sub_track(demuxer_t* d) 1596 int demuxer_default_sub_track(demuxer_t *d)
1445 { 1597 {
1446 int i; 1598 int i;
1447 for (i=0; i < MAX_S_STREAMS; ++i) { 1599 for (i = 0; i < MAX_S_STREAMS; ++i) {
1448 sh_sub_t* sh = d->s_streams[i]; 1600 sh_sub_t *sh = d->s_streams[i];
1449 if (sh && sh->default_track) 1601 if (sh && sh->default_track)
1450 return sh->sid; 1602 return sh->sid;
1451 } 1603 }
1452 return -1; 1604 return -1;
1453 } 1605 }
1454