00001 #include "bdringbuffer.h"
00002 #include "mythbdplayer.h"
00003 #include "avformatdecoderbd.h"
00004
00005 #define LOC QString("AFD_BD: ")
00006
00007 AvFormatDecoderBD::AvFormatDecoderBD(
00008 MythPlayer *parent, const ProgramInfo &pginfo, PlayerFlags flags)
00009 : AvFormatDecoder(parent, pginfo, flags)
00010 {
00011 }
00012
00013 void AvFormatDecoderBD::Reset(bool reset_video_data, bool seek_reset, bool reset_file)
00014 {
00015 AvFormatDecoder::Reset(reset_video_data, seek_reset, reset_file);
00016 SyncPositionMap();
00017 }
00018
00019 void AvFormatDecoderBD::UpdateFramesPlayed(void)
00020 {
00021 if (!ringBuffer->IsBD())
00022 return;
00023
00024 long long currentpos = (long long)(ringBuffer->BD()->GetCurrentTime() * fps);
00025 framesPlayed = framesRead = currentpos ;
00026 m_parent->SetFramesPlayed(currentpos + 1);
00027 }
00028
00029 bool AvFormatDecoderBD::DoRewindSeek(long long desiredFrame)
00030 {
00031 if (!ringBuffer->IsBD())
00032 return false;
00033
00034 ringBuffer->Seek(BDFindPosition(desiredFrame), SEEK_SET);
00035 framesPlayed = framesRead = lastKey = desiredFrame + 1;
00036 return true;
00037 }
00038
00039 void AvFormatDecoderBD::DoFastForwardSeek(long long desiredFrame, bool &needflush)
00040 {
00041 if (!ringBuffer->IsBD())
00042 return;
00043
00044 ringBuffer->Seek(BDFindPosition(desiredFrame), SEEK_SET);
00045 needflush = true;
00046 framesPlayed = framesRead = lastKey = desiredFrame + 1;
00047 }
00048
00049 void AvFormatDecoderBD::StreamChangeCheck(void)
00050 {
00051 if (!ringBuffer->IsBD())
00052 return;
00053
00054 if (m_parent->AtNormalSpeed() && ringBuffer->BD()->TitleChanged())
00055 {
00056 ResetPosMap();
00057 SyncPositionMap();
00058 UpdateFramesPlayed();
00059 }
00060 }
00061
00062 int AvFormatDecoderBD::GetSubtitleLanguage(uint subtitle_index,
00063 uint stream_index)
00064 {
00065 (void)stream_index;
00066 if (ringBuffer && ringBuffer->IsBD())
00067 return ringBuffer->BD()->GetSubtitleLanguage(subtitle_index);
00068 return iso639_str3_to_key("und");
00069 }
00070
00071 int AvFormatDecoderBD::GetAudioLanguage(uint audio_index, uint stream_index)
00072 {
00073 (void)stream_index;
00074 if (ringBuffer && ringBuffer->IsBD())
00075 return ringBuffer->BD()->GetAudioLanguage(audio_index);
00076 return iso639_str3_to_key("und");
00077 }
00078
00079 long long AvFormatDecoderBD::BDFindPosition(long long desiredFrame)
00080 {
00081 if (!ringBuffer->IsBD())
00082 return 0;
00083
00084 int diffTime = 0;
00085 long long desiredTimePos;
00086 int ffrewSkip = 1;
00087 int current_speed = 0;
00088 if (m_parent)
00089 {
00090 ffrewSkip = m_parent->GetFFRewSkip();
00091 current_speed = (int)m_parent->GetNextPlaySpeed();
00092 }
00093
00094 if (ffrewSkip == 1 || ffrewSkip == 0)
00095 {
00096 diffTime = (int)ceil((desiredFrame - framesPlayed) / fps);
00097 desiredTimePos = ringBuffer->BD()->GetCurrentTime() +
00098 diffTime;
00099 if (diffTime <= 0)
00100 desiredTimePos--;
00101 else
00102 desiredTimePos++;
00103
00104 if (desiredTimePos < 0)
00105 desiredTimePos = 0;
00106 return (desiredFrame * 90000LL / fps);
00107 }
00108 return current_speed;
00109 }