diff options
author | Dom Cobley <popcornmix@gmail.com> | 2023-09-01 19:17:23 +0100 |
---|---|---|
committer | Dom Cobley <popcornmix@gmail.com> | 2023-09-01 19:43:38 +0100 |
commit | b4eb710878bc16e3ec967a3b15e635b498d0fb82 (patch) | |
tree | 5a1349202d4bf52c0e7999e8744d92b4de72f130 | |
parent | b6cbc52add16022213152b3fac522d8953a64855 (diff) | |
download | xbmc-b4eb710878bc16e3ec967a3b15e635b498d0fb82.tar.xz |
CDVDDemuxFFmpeg: After seek avoid discarding packet when waiting for valid timestamp
Otherwise we are likely to lose the I frame and stall video
until the next one.
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 16 | ||||
-rw-r--r-- | xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.h | 1 |
2 files changed, 13 insertions, 4 deletions
diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp index 03388f761b..4d64c2540a 100644 --- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -1026,7 +1026,7 @@ double CDVDDemuxFFmpeg::ConvertTimestamp(int64_t pts, int den, int num) return timestamp * DVD_TIME_BASE; } -DemuxPacket* CDVDDemuxFFmpeg::Read() +DemuxPacket* CDVDDemuxFFmpeg::ReadInternal(bool keep) { DemuxPacket* pPacket = NULL; // on some cases where the received packet is invalid we will need to return an empty packet (0 length) otherwise the main loop (in CVideoPlayer) @@ -1182,8 +1182,11 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() // the stream might not have been created yet pPacket->iStreamId = m_pkt.pkt.stream_index; } - m_pkt.result = -1; - av_packet_unref(&m_pkt.pkt); + if (!keep) + { + m_pkt.result = -1; + av_packet_unref(&m_pkt.pkt); + } } } } // end of lock scope @@ -1243,6 +1246,11 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() return pPacket; } +DemuxPacket* CDVDDemuxFFmpeg::Read() +{ + return ReadInternal(false); +} + bool CDVDDemuxFFmpeg::SeekTime(double time, bool backwards, double* startpts) { bool hitEnd = false; @@ -1358,7 +1366,7 @@ bool CDVDDemuxFFmpeg::SeekTime(double time, bool backwards, double* startpts) m_pkt.result = -1; av_packet_unref(&m_pkt.pkt); - DemuxPacket* pkt = Read(); + DemuxPacket* pkt = ReadInternal(true); if (!pkt) { KODI::TIME::Sleep(10ms); diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.h index 2cf4707e6f..03fb98552c 100644 --- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.h +++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.h @@ -92,6 +92,7 @@ public: std::string GetFileName() override; DemuxPacket* Read() override; + DemuxPacket* ReadInternal(bool keep); bool SeekTime(double time, bool backwards = false, double* startpts = NULL) override; bool SeekByte(int64_t pos); |