Skip to content

Commit

Permalink
Simplify timestamp selection code which fixes AV-sync for AVI video.
Browse files Browse the repository at this point in the history
  • Loading branch information
tralph committed Feb 16, 2011
1 parent 83143c0 commit eb3c98c
Showing 1 changed file with 8 additions and 11 deletions.
19 changes: 8 additions & 11 deletions mythtv/libs/libmythtv/avformatdecoder.cpp
Expand Up @@ -64,8 +64,6 @@ extern void ff_read_frame_flush(AVFormatContext *s);

#define MAX_AC3_FRAME_SIZE 6144

static const bool force_reordered_opaque = false;

static const float eps = 1E-5;

static const int max_video_queue_size = 180;
Expand Down Expand Up @@ -652,6 +650,7 @@ void AvFormatDecoder::SeekReset(long long newKey, uint skipFrames,
last_pts_for_fault_detection = 0;
last_dts_for_fault_detection = 0;
pts_detected = false;
reordered_pts_detected = false;

ff_read_frame_flush(ic);

Expand Down Expand Up @@ -2586,6 +2585,7 @@ void AvFormatDecoder::MpegPreProcessPkt(AVStream *stream, AVPacket *pkt)
last_pts_for_fault_detection = 0;
last_dts_for_fault_detection = 0;
pts_detected = false;
reordered_pts_detected = false;

// fps debugging info
float avFPS = normalized_fps(stream, context);
Expand Down Expand Up @@ -2692,6 +2692,7 @@ bool AvFormatDecoder::H264PreProcessPkt(AVStream *stream, AVPacket *pkt)
last_pts_for_fault_detection = 0;
last_dts_for_fault_detection = 0;
pts_detected = false;
reordered_pts_detected = false;

// fps debugging info
float avFPS = normalized_fps(stream, context);
Expand Down Expand Up @@ -2775,9 +2776,7 @@ bool AvFormatDecoder::ProcessVideoPacket(AVStream *curstream, AVPacket *pkt)
avcodeclock->lock();
if (private_dec)
{
if (QString(ic->iformat->name).contains("avi"))
pkt->pts = pkt->dts;
if (!pts_detected)
if (QString(ic->iformat->name).contains("avi") || !pts_detected)
pkt->pts = pkt->dts;
// TODO disallow private decoders for dvd playback
// N.B. we do not reparse the frame as it breaks playback for
Expand Down Expand Up @@ -2834,14 +2833,12 @@ bool AvFormatDecoder::ProcessVideoPacket(AVStream *curstream, AVPacket *pkt)
{
pts = mpa_pic.reordered_opaque;
}
else if ((force_reordered_opaque || faulty_pts <= faulty_dts ||
pkt->dts == (int64_t)AV_NOPTS_VALUE) &&
mpa_pic.reordered_opaque != (int64_t)AV_NOPTS_VALUE)
else if (faulty_pts <= faulty_dts && reordered_pts_detected)
{
pts = mpa_pic.reordered_opaque;
if (mpa_pic.reordered_opaque != (int64_t)AV_NOPTS_VALUE)
pts = mpa_pic.reordered_opaque;
}
else if ((faulty_dts < faulty_pts || !reordered_pts_detected) &&
pkt->dts != (int64_t)AV_NOPTS_VALUE)
else if (pkt->dts != (int64_t)AV_NOPTS_VALUE)
{
pts = pkt->dts;
}
Expand Down

0 comments on commit eb3c98c

Please sign in to comment.