Mercurial > mplayer.hg
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;*/ |