|
MythTV
0.26-pre
|
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 }
1.7.6.1