comparison libmpdemux/demuxer.c @ 26437:2735c113ed62

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