| 1 | skip any audio before first vpts for smoother play start
|
|---|
| 2 |
|
|---|
| 3 | From: Mark Spieth <mspieth@digivation.com.au>
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 | ---
|
|---|
| 7 | mythtv/libs/libmythtv/avformatdecoder.cpp | 23 +++++++++++++++++++++++
|
|---|
| 8 | mythtv/libs/libmythtv/avformatdecoder.h | 2 ++
|
|---|
| 9 | 2 files changed, 25 insertions(+), 0 deletions(-)
|
|---|
| 10 |
|
|---|
| 11 | diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
|
|---|
| 12 | index ae4a017..676c999 100644
|
|---|
| 13 | --- a/mythtv/libs/libmythtv/avformatdecoder.cpp
|
|---|
| 14 | +++ b/mythtv/libs/libmythtv/avformatdecoder.cpp
|
|---|
| 15 | @@ -262,6 +262,7 @@ AvFormatDecoder::AvFormatDecoder(MythPlayer *parent,
|
|---|
| 16 | start_code_state(0xffffffff),
|
|---|
| 17 | lastvpts(0), lastapts(0),
|
|---|
| 18 | lastccptsu(0),
|
|---|
| 19 | + firstvpts(0), firstvptsinuse(false),
|
|---|
| 20 | faulty_pts(0), faulty_dts(0),
|
|---|
| 21 | last_pts_for_fault_detection(0),
|
|---|
| 22 | last_dts_for_fault_detection(0),
|
|---|
| 23 | @@ -716,6 +717,12 @@ void AvFormatDecoder::SeekReset(long long newKey, uint skipFrames,
|
|---|
| 24 | if (decoded_video_frame)
|
|---|
| 25 | m_parent->DiscardVideoFrame(decoded_video_frame);
|
|---|
| 26 | }
|
|---|
| 27 | +
|
|---|
| 28 | + if (doflush)
|
|---|
| 29 | + {
|
|---|
| 30 | + firstvpts = 0;
|
|---|
| 31 | + firstvptsinuse = true;
|
|---|
| 32 | + }
|
|---|
| 33 | }
|
|---|
| 34 |
|
|---|
| 35 | void AvFormatDecoder::Reset(bool reset_video_data, bool seek_reset)
|
|---|
| 36 | @@ -2765,7 +2772,9 @@ void AvFormatDecoder::MpegPreProcessPkt(AVStream *stream, AVPacket *pkt)
|
|---|
| 37 |
|
|---|
| 38 | gopset = false;
|
|---|
| 39 | prevgoppos = 0;
|
|---|
| 40 | + firstvpts =
|
|---|
| 41 | lastapts = lastvpts = lastccptsu = 0;
|
|---|
| 42 | + firstvptsinuse = true;
|
|---|
| 43 | faulty_pts = faulty_dts = 0;
|
|---|
| 44 | last_pts_for_fault_detection = 0;
|
|---|
| 45 | last_dts_for_fault_detection = 0;
|
|---|
| 46 | @@ -2871,7 +2880,9 @@ bool AvFormatDecoder::H264PreProcessPkt(AVStream *stream, AVPacket *pkt)
|
|---|
| 47 |
|
|---|
| 48 | gopset = false;
|
|---|
| 49 | prevgoppos = 0;
|
|---|
| 50 | + firstvpts =
|
|---|
| 51 | lastapts = lastvpts = lastccptsu = 0;
|
|---|
| 52 | + firstvptsinuse = true;
|
|---|
| 53 | faulty_pts = faulty_dts = 0;
|
|---|
| 54 | last_pts_for_fault_detection = 0;
|
|---|
| 55 | last_dts_for_fault_detection = 0;
|
|---|
| 56 | @@ -3141,6 +3152,8 @@ bool AvFormatDecoder::ProcessVideoPacket(AVStream *curstream, AVPacket *pkt)
|
|---|
| 57 | framesPlayed++;
|
|---|
| 58 |
|
|---|
| 59 | lastvpts = temppts;
|
|---|
| 60 | + if (!firstvpts && firstvptsinuse)
|
|---|
| 61 | + firstvpts = temppts;
|
|---|
| 62 |
|
|---|
| 63 | return true;
|
|---|
| 64 | }
|
|---|
| 65 | @@ -4020,6 +4033,16 @@ bool AvFormatDecoder::ProcessAudioPacket(AVStream *curstream, AVPacket *pkt,
|
|---|
| 66 | skipaudio = false;
|
|---|
| 67 | }
|
|---|
| 68 |
|
|---|
| 69 | + // skip any audio frames preceding first video frame
|
|---|
| 70 | + if (firstvptsinuse && firstvpts && (lastapts < firstvpts))
|
|---|
| 71 | + {
|
|---|
| 72 | + VERBOSE(VB_PLAYBACK+VB_TIMESTAMP,
|
|---|
| 73 | + LOC + QString("discarding early audio timecode %1 %2 %3")
|
|---|
| 74 | + .arg(pkt->pts).arg(pkt->dts).arg(lastapts));
|
|---|
| 75 | + break;
|
|---|
| 76 | + }
|
|---|
| 77 | + firstvptsinuse = false;
|
|---|
| 78 | +
|
|---|
| 79 | avcodeclock->lock();
|
|---|
| 80 | data_size = 0;
|
|---|
| 81 |
|
|---|
| 82 | diff --git a/mythtv/libs/libmythtv/avformatdecoder.h b/mythtv/libs/libmythtv/avformatdecoder.h
|
|---|
| 83 | index d3947e5..55ae68a 100644
|
|---|
| 84 | --- a/mythtv/libs/libmythtv/avformatdecoder.h
|
|---|
| 85 | +++ b/mythtv/libs/libmythtv/avformatdecoder.h
|
|---|
| 86 | @@ -276,6 +276,8 @@ class AvFormatDecoder : public DecoderBase
|
|---|
| 87 | long long lastvpts;
|
|---|
| 88 | long long lastapts;
|
|---|
| 89 | long long lastccptsu;
|
|---|
| 90 | + long long firstvpts;
|
|---|
| 91 | + bool firstvptsinuse;
|
|---|
| 92 |
|
|---|
| 93 | int64_t faulty_pts;
|
|---|
| 94 | int64_t faulty_dts;
|
|---|