diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp index 771047957a8..5542aa96b47 100644 --- a/mythtv/libs/libmythtv/avformatdecoder.cpp +++ b/mythtv/libs/libmythtv/avformatdecoder.cpp @@ -2200,6 +2200,17 @@ int AvFormatDecoder::ScanStreams(bool novideo) return scanerror; } +bool AvFormatDecoder::DoRewindSeek(long long desiredFrame) +{ + return DecoderBase::DoRewindSeek(desiredFrame); +} + +void AvFormatDecoder::DoFastForwardSeek(long long desiredFrame, bool &needflush) +{ + DecoderBase::DoFastForwardSeek(desiredFrame, needflush); + return; +} + int AvFormatDecoder::GetSubtitleLanguage(uint subtitle_index, uint stream_index) { (void)subtitle_index; diff --git a/mythtv/libs/libmythtv/avformatdecoder.h b/mythtv/libs/libmythtv/avformatdecoder.h index ed9921804d5..d38f1cabfda 100644 --- a/mythtv/libs/libmythtv/avformatdecoder.h +++ b/mythtv/libs/libmythtv/avformatdecoder.h @@ -245,6 +245,8 @@ class AvFormatDecoder : public DecoderBase float normalized_fps(AVStream *stream, AVCodecContext *enc); void av_update_stream_timings_video(AVFormatContext *ic); + virtual bool DoRewindSeek(long long desiredFrame); + virtual void DoFastForwardSeek(long long desiredFrame, bool &needflush); virtual void StreamChangeCheck(void) { } virtual void PostProcessTracks(void) { } virtual int GetSubtitleLanguage(uint subtitle_index, uint stream_index); diff --git a/mythtv/libs/libmythtv/avformatdecoderbd.cpp b/mythtv/libs/libmythtv/avformatdecoderbd.cpp index f2a5cf58d85..66bcca5c418 100644 --- a/mythtv/libs/libmythtv/avformatdecoderbd.cpp +++ b/mythtv/libs/libmythtv/avformatdecoderbd.cpp @@ -19,6 +19,30 @@ void AvFormatDecoderBD::Reset(bool reset_video_data, bool seek_reset, bool reset SyncPositionMap(); } +bool AvFormatDecoderBD::DoRewindSeek(long long desiredFrame) +{ + if (!ringBuffer->IsBD()) + return false; + + long long pos = BDFindPosition(desiredFrame); + ringBuffer->Seek(pos, SEEK_SET); + lastKey = desiredFrame + 1; + return true; +} + +void AvFormatDecoderBD::DoFastForwardSeek(long long desiredFrame, bool &needflush) +{ + if (!ringBuffer->IsBD()) + return; + + long long pos = BDFindPosition(desiredFrame); + ringBuffer->Seek(pos,SEEK_SET); + needflush = true; + lastKey = desiredFrame+1; + framesPlayed = lastKey; + framesRead = lastKey; +} + void AvFormatDecoderBD::StreamChangeCheck(void) { if (!ringBuffer->IsBD()) @@ -48,3 +72,35 @@ int AvFormatDecoderBD::GetAudioLanguage(uint audio_index, uint stream_index) return ringBuffer->BD()->GetAudioLanguage(audio_index); return iso639_str3_to_key("und"); } + +long long AvFormatDecoderBD::BDFindPosition(long long desiredFrame) +{ + if (!ringBuffer->IsBD()) + return 0; + + int diffTime = 0; + long long desiredTimePos; + int ffrewSkip = 1; + int current_speed = 0; + if (m_parent) + { + ffrewSkip = m_parent->GetFFRewSkip(); + current_speed = (int)m_parent->GetNextPlaySpeed(); + } + + if (ffrewSkip == 1) + { + diffTime = (int)ceil((desiredFrame - framesPlayed) / fps); + desiredTimePos = ringBuffer->BD()->GetCurrentTime() + + diffTime; + if (diffTime <= 0) + desiredTimePos--; + else + desiredTimePos++; + + if (desiredTimePos < 0) + desiredTimePos = 0; + return (desiredFrame * 90000LL / fps); + } + return current_speed; +} diff --git a/mythtv/libs/libmythtv/avformatdecoderbd.h b/mythtv/libs/libmythtv/avformatdecoderbd.h index 704ea1e49dc..4a22745ab83 100644 --- a/mythtv/libs/libmythtv/avformatdecoderbd.h +++ b/mythtv/libs/libmythtv/avformatdecoderbd.h @@ -14,9 +14,13 @@ class AvFormatDecoderBD : public AvFormatDecoder virtual void Reset(bool reset_video_data, bool seek_reset, bool reset_file); private: + virtual bool DoRewindSeek(long long desiredFrame); + virtual void DoFastForwardSeek(long long desiredFrame, bool &needflush); virtual void StreamChangeCheck(void); virtual int GetSubtitleLanguage(uint subtitle_index, uint stream_index); virtual int GetAudioLanguage(uint audio_index, uint stream_index); + + long long BDFindPosition(long long desiredFrame); }; #endif // AVFORMATDECODERBD_H diff --git a/mythtv/libs/libmythtv/avformatdecoderdvd.cpp b/mythtv/libs/libmythtv/avformatdecoderdvd.cpp index 99a0263b690..f202f503b2f 100644 --- a/mythtv/libs/libmythtv/avformatdecoderdvd.cpp +++ b/mythtv/libs/libmythtv/avformatdecoderdvd.cpp @@ -74,6 +74,30 @@ void AvFormatDecoderDVD::PostProcessTracks(void) } } +bool AvFormatDecoderDVD::DoRewindSeek(long long desiredFrame) +{ + if (!ringBuffer->IsDVD()) + return false; + + long long pos = DVDFindPosition(desiredFrame); + ringBuffer->Seek(pos, SEEK_SET); + lastKey = desiredFrame + 1; + return true; +} + +void AvFormatDecoderDVD::DoFastForwardSeek(long long desiredFrame, bool &needflush) +{ + if (!ringBuffer->IsDVD()) + return; + + long long pos = DVDFindPosition(desiredFrame); + ringBuffer->Seek(pos,SEEK_SET); + needflush = true; + lastKey = desiredFrame+1; + framesPlayed = lastKey; + framesRead = lastKey; +} + void AvFormatDecoderDVD::StreamChangeCheck(void) { if (!ringBuffer->IsDVD()) @@ -107,3 +131,35 @@ int AvFormatDecoderDVD::GetAudioLanguage(uint audio_index, uint stream_index) } return iso639_str3_to_key("und"); } + +long long AvFormatDecoderDVD::DVDFindPosition(long long desiredFrame) +{ + if (!ringBuffer->IsDVD()) + return 0; + + int diffTime = 0; + long long desiredTimePos; + int ffrewSkip = 1; + int current_speed = 0; + if (m_parent) + { + ffrewSkip = m_parent->GetFFRewSkip(); + current_speed = (int)m_parent->GetNextPlaySpeed(); + } + + if (ffrewSkip == 1) + { + diffTime = (int)ceil((desiredFrame - framesPlayed) / fps); + desiredTimePos = ringBuffer->DVD()->GetCurrentTime() + + diffTime; + if (diffTime <= 0) + desiredTimePos--; + else + desiredTimePos++; + + if (desiredTimePos < 0) + desiredTimePos = 0; + return (desiredTimePos * 90000LL); + } + return current_speed; +} diff --git a/mythtv/libs/libmythtv/avformatdecoderdvd.h b/mythtv/libs/libmythtv/avformatdecoderdvd.h index c1f6a9c2ed8..16828141eaa 100644 --- a/mythtv/libs/libmythtv/avformatdecoderdvd.h +++ b/mythtv/libs/libmythtv/avformatdecoderdvd.h @@ -5,7 +5,7 @@ class AvFormatDecoderDVD : public AvFormatDecoder { -public: + public: AvFormatDecoderDVD(MythPlayer *parent, const ProgramInfo &pginfo, bool use_null_video_out, bool allow_private_decode = true, @@ -14,9 +14,13 @@ class AvFormatDecoderDVD : public AvFormatDecoder virtual void Reset(bool reset_video_data, bool seek_reset, bool reset_file); private: + virtual bool DoRewindSeek(long long desiredFrame); + virtual void DoFastForwardSeek(long long desiredFrame, bool &needflush); virtual void StreamChangeCheck(void); virtual void PostProcessTracks(void); virtual int GetAudioLanguage(uint audio_index, uint stream_index); + + long long DVDFindPosition(long long desiredFrame); }; #endif // AVFORMATDECODERDVD_H diff --git a/mythtv/libs/libmythtv/decoderbase.cpp b/mythtv/libs/libmythtv/decoderbase.cpp index a718f90c78d..5e640f9a9fa 100644 --- a/mythtv/libs/libmythtv/decoderbase.cpp +++ b/mythtv/libs/libmythtv/decoderbase.cpp @@ -540,21 +540,6 @@ long long DecoderBase::GetKey(const PosMapEntry &e) const bool DecoderBase::DoRewindSeek(long long desiredFrame) { - if (ringBuffer->IsDVD()) - { - long long pos = DVDFindPosition(desiredFrame); - ringBuffer->Seek(pos, SEEK_SET); - lastKey = desiredFrame + 1; - return true; - } - else if (ringBuffer->IsBD()) - { - long long pos = BDFindPosition(desiredFrame); - ringBuffer->Seek(pos, SEEK_SET); - lastKey = desiredFrame + 1; - return true; - } - ConditionallyUpdatePosMap(desiredFrame); if (!GetPositionMapSize()) @@ -766,27 +751,6 @@ bool DecoderBase::DoFastForward(long long desiredFrame, bool discardFrames) */ void DecoderBase::DoFastForwardSeek(long long desiredFrame, bool &needflush) { - if (ringBuffer->IsDVD()) - { - long long pos = DVDFindPosition(desiredFrame); - ringBuffer->Seek(pos,SEEK_SET); - needflush = true; - lastKey = desiredFrame+1; - framesPlayed = lastKey; - framesRead = lastKey; - return; - } - else if (ringBuffer->IsBD()) - { - long long pos = BDFindPosition(desiredFrame); - ringBuffer->Seek(pos,SEEK_SET); - needflush = true; - lastKey = desiredFrame+1; - framesPlayed = lastKey; - framesRead = lastKey; - return; - } - int pre_idx, post_idx; FindPosition(desiredFrame, hasKeyFrameAdjustTable, pre_idx, post_idx); @@ -842,68 +806,6 @@ bool DecoderBase::GetWaitForChange(void) const return waitingForChange; } -long long DecoderBase::DVDFindPosition(long long desiredFrame) -{ - if (!ringBuffer->IsDVD()) - return 0; - int diffTime = 0; - long long desiredTimePos; - int ffrewSkip = 1; - int current_speed = 0; - if (m_parent) - { - ffrewSkip = m_parent->GetFFRewSkip(); - current_speed = (int)m_parent->GetNextPlaySpeed(); - } - - if (ffrewSkip == 1) - { - diffTime = (int)ceil((desiredFrame - framesPlayed) / fps); - desiredTimePos = ringBuffer->DVD()->GetCurrentTime() + - diffTime; - if (diffTime <= 0) - desiredTimePos--; - else - desiredTimePos++; - - if (desiredTimePos < 0) - desiredTimePos = 0; - return (desiredTimePos * 90000LL); - } - return current_speed; -} - -long long DecoderBase::BDFindPosition(long long desiredFrame) -{ - if (!ringBuffer->IsBD()) - return 0; - int diffTime = 0; - long long desiredTimePos; - int ffrewSkip = 1; - int current_speed = 0; - if (m_parent) - { - ffrewSkip = m_parent->GetFFRewSkip(); - current_speed = (int)m_parent->GetNextPlaySpeed(); - } - - if (ffrewSkip == 1) - { - diffTime = (int)ceil((desiredFrame - framesPlayed) / fps); - desiredTimePos = ringBuffer->BD()->GetCurrentTime() + - diffTime; - if (diffTime <= 0) - desiredTimePos--; - else - desiredTimePos++; - - if (desiredTimePos < 0) - desiredTimePos = 0; - return (desiredFrame * 90000LL / fps); - } - return current_speed; -} - void DecoderBase::UpdateDVDFramesPlayed(void) { if (!ringBuffer->IsDVD()) diff --git a/mythtv/libs/libmythtv/decoderbase.h b/mythtv/libs/libmythtv/decoderbase.h index 1f7af0b1f01..ba0880ec655 100644 --- a/mythtv/libs/libmythtv/decoderbase.h +++ b/mythtv/libs/libmythtv/decoderbase.h @@ -170,11 +170,8 @@ class DecoderBase bool GetWaitForChange(void) const; void SetReadAdjust(long long adjust); - // DVD public stuff - long long DVDFindPosition(long long desiredFrame); + // DVD/BD public stuff void UpdateDVDFramesPlayed(void); - - long long BDFindPosition(long long desiredFrame); void UpdateBDFramesPlayed(void); // Audio/Subtitle/EIA-608/EIA-708 stream selection @@ -216,8 +213,8 @@ class DecoderBase void FileChanged(void); - bool DoRewindSeek(long long desiredFrame); - void DoFastForwardSeek(long long desiredFrame, bool &needflush); + virtual bool DoRewindSeek(long long desiredFrame); + virtual void DoFastForwardSeek(long long desiredFrame, bool &needflush); long long ConditionallyUpdatePosMap(long long desiredFrame); long long GetLastFrameInPosMap(void) const;