aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Cobley <popcornmix@gmail.com>2023-09-01 19:17:23 +0100
committerDom Cobley <popcornmix@gmail.com>2023-09-01 19:43:38 +0100
commitb4eb710878bc16e3ec967a3b15e635b498d0fb82 (patch)
tree5a1349202d4bf52c0e7999e8744d92b4de72f130
parentb6cbc52add16022213152b3fac522d8953a64855 (diff)
downloadxbmc-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.cpp16
-rw-r--r--xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.h1
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);