Ticket #7521: avseek_fixes_rev2.diff
File avseek_fixes_rev2.diff, 3.3 KB (added by , 14 years ago) |
---|
-
libs/libmythtv/avformatdecoder.h
220 220 221 221 bool no_dts_hack; 222 222 223 bool dorewind; 224 223 225 bool gopset; 224 226 /// A flag to indicate that we've seen a GOP frame. Used in junction with seq_count. 225 227 bool seen_gop; -
libs/libmythtv/avformatdecoder.cpp
570 570 if (recordingHasPositionMap || livetv) 571 571 return DecoderBase::DoRewind(desiredFrame, discardFrames); 572 572 573 dorewind = true; 574 573 575 // avformat-based seeking 574 576 return DoFastForward(desiredFrame, discardFrames); 575 577 } … … 587 589 bool oldrawstate = getrawframes; 588 590 getrawframes = false; 589 591 592 bool needflush = true; 593 590 594 AVStream *st = NULL; 591 595 for (uint i = 0; i < ic->nb_streams; i++) 592 596 { … … 600 604 if (!st) 601 605 return false; 602 606 607 int seekDelta = desiredFrame - framesPlayed; 608 609 // avoid using av_frame_seek if we want to advance forward < 1 second 610 if (seekDelta >= 0 && seekDelta < (int)(fps + 1.0f)) 611 { 612 SeekReset(framesPlayed, seekDelta, false, true); 613 GetNVP()->SetFramesPlayed(framesPlayed + 1); 614 GetNVP()->getVideoOutput()->SetFramesPlayed(framesPlayed + 1); 615 616 return true; 617 } 618 603 619 int64_t frameseekadjust = 0; 604 620 AVCodecContext *context = st->codec; 605 621 … … 614 630 long double diff = (max(desiredFrame - frameseekadjust, 0LL)) * AV_TIME_BASE / fps; 615 631 ts += (long long)diff; 616 632 617 if (av_seek_frame(ic, -1, ts, AVSEEK_FLAG_BACKWARD) < 0) 633 bool exactseeks = DecoderBase::getExactSeeks(); 634 635 int flags = 0; 636 637 if (dorewind || exactseeks) 638 flags |= AVSEEK_FLAG_BACKWARD; 639 640 if (av_seek_frame(ic, -1, ts, flags) < 0) 618 641 { 619 642 VERBOSE(VB_IMPORTANT, LOC_ERR 620 643 <<"av_seek_frame(ic, -1, "<<ts<<", 0) -- error"); … … 653 676 framesPlayed = lastKey; 654 677 framesRead = lastKey; 655 678 656 normalframes = desiredFrame - framesPlayed;679 normalframes = (exactseeks) ? desiredFrame - framesPlayed : 0; 657 680 normalframes = max(normalframes, 0); 658 681 no_dts_hack = false; 659 682 } … … 666 689 normalframes = 0; 667 690 } 668 691 669 SeekReset(lastKey, normalframes, discardFrames, discardFrames);692 SeekReset(lastKey, normalframes, needflush, discardFrames); 670 693 671 694 if (discardFrames) 672 695 { … … 674 697 GetNVP()->getVideoOutput()->SetFramesPlayed(framesPlayed + 1); 675 698 } 676 699 700 dorewind = false; 701 677 702 getrawframes = oldrawstate; 678 703 679 704 return true; -
libs/libmythtv/decoderbase.h
62 62 int testbufsize = kDecoderProbeBufferSize) = 0; 63 63 64 64 void setExactSeeks(bool exact) { exactseeks = exact; } 65 bool getExactSeeks(void) { return exactseeks; } 65 66 void setLiveTVMode(bool live) { livetv = live; } 66 67 67 68 // Must be done while player is paused.