comparison libmpdemux/demux_mpg.c @ 14426:3faa873334d7

fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
author nicodvb
date Sat, 08 Jan 2005 10:05:44 +0000
parents 39004f891def
children 8769fa370f83
comparison
equal deleted inserted replaced
14425:97a7bb77adfc 14426:3faa873334d7
408 demux_stream_t *d_video=demuxer->video; 408 demux_stream_t *d_video=demuxer->video;
409 sh_audio_t *sh_audio=d_audio->sh; 409 sh_audio_t *sh_audio=d_audio->sh;
410 sh_video_t *sh_video=d_video->sh; 410 sh_video_t *sh_video=d_video->sh;
411 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv; 411 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv;
412 int precision = 1; 412 int precision = 1;
413 float oldpts = mpg_d->last_pts; 413 float oldpts = 0;
414 off_t oldpos = demuxer->filepos; 414 off_t oldpos = demuxer->filepos;
415 float newpts = (flags & 1) ? 0.0 : oldpts; 415 float newpts = 0;
416 off_t newpos = (flags & 1) ? demuxer->movi_start : oldpos; 416 off_t newpos = (flags & 1) ? demuxer->movi_start : oldpos;
417 417
418 if(mpg_d)
419 oldpts = mpg_d->last_pts;
420 newpts = (flags & 1) ? 0.0 : oldpts;
418 //================= seek in MPEG ========================== 421 //================= seek in MPEG ==========================
419 //calculate the pts to seek to 422 //calculate the pts to seek to
420 if(flags & 2) { 423 if(flags & 2) {
421 if (mpg_d->final_pts > 0.0) 424 if (mpg_d && mpg_d->final_pts > 0.0)
422 newpts += mpg_d->final_pts * rel_seek_secs; 425 newpts += mpg_d->final_pts * rel_seek_secs;
423 else 426 else
424 newpts += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * oldpts / oldpos; 427 newpts += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * oldpts / oldpos;
425 } else 428 } else
426 newpts += rel_seek_secs; 429 newpts += rel_seek_secs;
473 skip_audio_frame(sh_audio); // sync audio 476 skip_audio_frame(sh_audio); // sync audio
474 continue; 477 continue;
475 } 478 }
476 } 479 }
477 i=sync_video_packet(d_video); 480 i=sync_video_packet(d_video);
478 if(i==0x1B3 || i==0x1B8) break; // found it! 481 if(sh_video->format == 0x10000004) { //mpeg4
482 if(i==0x1B6) break; //vop (frame) startcode
483 } else if(sh_video->format == 0x10000005){ //h264
484 if((i & ~0x60) == 0x101 || (i & ~0x60) == 0x102 || (i & ~0x60) == 0x105) break;
485 } else { //default mpeg1/2
486 if(i==0x1B3 || i==0x1B8) break; // found it!
487 }
479 if(!i || !skip_video_packet(d_video)) break; // EOF? 488 if(!i || !skip_video_packet(d_video)) break; // EOF?
480 } 489 }
490 if(!mpg_d)
491 break;
481 if (!precision || abs(newpts - mpg_d->last_pts) < 0.5 || (mpg_d->last_pts == oldpts)) break; 492 if (!precision || abs(newpts - mpg_d->last_pts) < 0.5 || (mpg_d->last_pts == oldpts)) break;
482 if ((newpos - oldpos) * (mpg_d->last_pts - oldpts) < 0) { // invalid timestamps 493 if ((newpos - oldpos) * (mpg_d->last_pts - oldpts) < 0) { // invalid timestamps
483 mpg_d->has_valid_timestamps = 0; 494 mpg_d->has_valid_timestamps = 0;
484 break; 495 break;
485 } 496 }
486 precision--; 497 precision--;
487 //prepare another seek because we are off by more than 0.5s 498 //prepare another seek because we are off by more than 0.5s
499 if(mpg_d) {
488 newpos += (newpts - mpg_d->last_pts) * (newpos - oldpos) / (mpg_d->last_pts - oldpts); 500 newpos += (newpts - mpg_d->last_pts) * (newpos - oldpos) / (mpg_d->last_pts - oldpts);
489 ds_free_packs(d_audio); 501 ds_free_packs(d_audio);
490 ds_free_packs(d_video); 502 ds_free_packs(d_video);
491 demuxer->stream->eof=0; // clear eof flag 503 demuxer->stream->eof=0; // clear eof flag
492 d_video->eof=0; 504 d_video->eof=0;
493 d_audio->eof=0; 505 d_audio->eof=0;
506 }
494 } 507 }
495 } 508 }
496 509
497 int demux_mpg_control(demuxer_t *demuxer,int cmd, void *arg){ 510 int demux_mpg_control(demuxer_t *demuxer,int cmd, void *arg){
498 /* demux_stream_t *d_audio=demuxer->audio;*/ 511 /* demux_stream_t *d_audio=demuxer->audio;*/