Ticket #7521: t7521_avseek_fixes_rev3.diff
File t7521_avseek_fixes_rev3.diff, 3.1 KB (added by , 15 years ago) |
---|
-
libs/libmythtv/decoderbase.h
91 91 int testbufsize = kDecoderProbeBufferSize) = 0; 92 92 93 93 void setExactSeeks(bool exact) { exactseeks = exact; } 94 bool getExactSeeks(void) { return exactseeks; } 94 95 void setLiveTVMode(bool live) { livetv = live; } 95 96 96 97 // Must be done while player is paused. -
libs/libmythtv/avformatdecoder.cpp
589 589 if (recordingHasPositionMap || livetv) 590 590 return DecoderBase::DoRewind(desiredFrame, discardFrames); 591 591 592 dorewind = true; 593 592 594 // avformat-based seeking 593 595 return DoFastForward(desiredFrame, discardFrames); 594 596 } … … 619 621 if (!st) 620 622 return false; 621 623 624 int seekDelta = desiredFrame - framesPlayed; 625 626 // avoid using av_frame_seek if we want to advance forward < 1 second 627 if (seekDelta >= 0 && seekDelta < (int)(fps + 1.0f) && !dorewind) 628 { 629 SeekReset(framesPlayed, seekDelta, false, true); 630 GetNVP()->SetFramesPlayed(framesPlayed + 1); 631 GetNVP()->getVideoOutput()->SetFramesPlayed(framesPlayed + 1); 632 633 return true; 634 } 635 622 636 int64_t frameseekadjust = 0; 623 637 AVCodecContext *context = st->codec; 624 638 … … 633 647 long double diff = (max(desiredFrame - frameseekadjust, 0LL)) * AV_TIME_BASE / fps; 634 648 ts += (long long)diff; 635 649 636 if (av_seek_frame(ic, -1, ts, AVSEEK_FLAG_BACKWARD) < 0) 650 bool exactseeks = DecoderBase::getExactSeeks(); 651 652 int flags = 0; 653 if (dorewind || exactseeks) 654 flags |= AVSEEK_FLAG_BACKWARD; 655 656 if (av_seek_frame(ic, -1, ts, flags) < 0) 637 657 { 638 658 VERBOSE(VB_IMPORTANT, LOC_ERR 639 659 <<"av_seek_frame(ic, -1, "<<ts<<", 0) -- error"); … … 672 692 framesPlayed = lastKey; 673 693 framesRead = lastKey; 674 694 675 normalframes = desiredFrame - framesPlayed;695 normalframes = (exactseeks) ? desiredFrame - framesPlayed : 0; 676 696 normalframes = max(normalframes, 0); 677 697 no_dts_hack = false; 678 698 } … … 685 705 normalframes = 0; 686 706 } 687 707 688 SeekReset(lastKey, normalframes, discardFrames, discardFrames);708 SeekReset(lastKey, normalframes, true, discardFrames); 689 709 690 710 if (discardFrames) 691 711 { … … 693 713 GetNVP()->getVideoOutput()->SetFramesPlayed(framesPlayed + 1); 694 714 } 695 715 716 dorewind = false; 717 696 718 getrawframes = oldrawstate; 697 719 698 720 return true; -
libs/libmythtv/avformatdecoder.h
220 220 bool drawband; 221 221 222 222 bool no_dts_hack; 223 bool dorewind; 223 224 224 225 bool gopset; 225 226 /// A flag to indicate that we've seen a GOP frame. Used in junction with seq_count.