Skip to content

Commit

Permalink
Decoder: Move more DVD/BD specific code into the sub-classes.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Kendall committed Nov 9, 2011
1 parent a0fcc62 commit aa81900
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 105 deletions.
11 changes: 11 additions & 0 deletions mythtv/libs/libmythtv/avformatdecoder.cpp
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions mythtv/libs/libmythtv/avformatdecoder.h
Expand Up @@ -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);
Expand Down
56 changes: 56 additions & 0 deletions mythtv/libs/libmythtv/avformatdecoderbd.cpp
Expand Up @@ -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())
Expand Down Expand Up @@ -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;
}
4 changes: 4 additions & 0 deletions mythtv/libs/libmythtv/avformatdecoderbd.h
Expand Up @@ -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
56 changes: 56 additions & 0 deletions mythtv/libs/libmythtv/avformatdecoderdvd.cpp
Expand Up @@ -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())
Expand Down Expand Up @@ -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;
}
6 changes: 5 additions & 1 deletion mythtv/libs/libmythtv/avformatdecoderdvd.h
Expand Up @@ -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,
Expand All @@ -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
98 changes: 0 additions & 98 deletions mythtv/libs/libmythtv/decoderbase.cpp
Expand Up @@ -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())
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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())
Expand Down
9 changes: 3 additions & 6 deletions mythtv/libs/libmythtv/decoderbase.h
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit aa81900

Please sign in to comment.