MythTV  0.26-pre
avformatdecoderbd.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends