From ffad7a1c08dbb7de3114ac7e149ce440871ab33a Mon Sep 17 00:00:00 2001 From: Miguel Borges de Freitas <92enen@gmail.com> Date: Mon, 3 Apr 2023 21:57:33 +0100 Subject: [subtitles] Fix mkv subtitles without duration --- .../DVDCodecs/Overlay/DVDOverlayCodecText.cpp | 27 +++++++++++++++++++++- .../DVDCodecs/Overlay/DVDOverlayCodecText.h | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.cpp index db9379c2a7..0c4d81719f 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.cpp @@ -18,6 +18,15 @@ #include +namespace +{ +// Subtitle packets reaching the decoder may not have the stop PTS value, +// the stop value can be taken from the start PTS of the next subtitle. +// Otherwise we fallback to a default of 20 secs duration. This is only +// applied if the subtitle packets have 0 duration (stop > start). +constexpr double DEFAULT_DURATION = 20.0 * static_cast(DVD_TIME_BASE); +} // namespace + CDVDOverlayCodecText::CDVDOverlayCodecText() : CDVDOverlayCodec("Text Subtitle Decoder") { m_pOverlay = nullptr; @@ -83,7 +92,23 @@ OverlayMessage CDVDOverlayCodecText::Decode(DemuxPacket* pPacket) { TagConv.ConvertLine(text); TagConv.CloseTag(text); - AddSubtitle(text, PTSStartTime, PTSStopTime); + + // similar to CC text, if the subtitle duration is invalid (stop > start) + // we might want to assume the stop time will be set by the next received + // packet + if (PTSStopTime < PTSStartTime) + { + if (m_changePrevStopTime) + { + ChangeSubtitleStopTime(m_prevSubId, PTSStartTime); + m_changePrevStopTime = false; + } + + PTSStopTime = PTSStartTime + DEFAULT_DURATION; + m_changePrevStopTime = true; + } + + m_prevSubId = AddSubtitle(text, PTSStartTime, PTSStopTime); } else CLog::Log(LOGERROR, "{} - Failed to initialize tag converter", __FUNCTION__); diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.h b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.h index 98db5cbc3c..5a5c3bfec6 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.h +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Overlay/DVDOverlayCodecText.h @@ -37,5 +37,7 @@ private: void Dispose() override; CDVDOverlay* m_pOverlay; CDVDStreamInfo m_hints; + int m_prevSubId{-1}; + bool m_changePrevStopTime{false}; AVCodecID m_codecId{AV_CODEC_ID_NONE}; }; -- cgit v1.2.3