From 97b319226ebe6acec252ba05acf40d49cb8223f1 Mon Sep 17 00:00:00 2001 From: epoke Date: Mon, 16 Jun 2014 12:03:54 +0900 Subject: [PATCH] Collect the subtitles at the same time to prevent overlap. (collect_subtitles #4885) --- .../DVDCodecs/Overlay/DVDOverlayText.h | 13 +++++ .../DVDSubtitleLineCollection.cpp | 47 ++++++++++++++++--- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h index e85c26217bc2a..67d502534df0f 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h @@ -164,6 +164,19 @@ class CDVDOverlayText : public CDVDOverlay } } + void AddElement(CDVDOverlayText *pOverlay) + { + for (CElement* e = pOverlay->m_pHead; e; e = e->pNext) + { + if (e->IsElementType(ELEMENT_TYPE_TEXT)) + AddElement(new CElementText(*static_cast(e))); + else if (e->IsElementType(ELEMENT_TYPE_PROPERTY)) + AddElement(new CElementProperty(*static_cast(e))); + else + AddElement(new CElement(*static_cast(e))); + } + } + CElement* m_pHead; CElement* m_pEnd; }; diff --git a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleLineCollection.cpp b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleLineCollection.cpp index c28cb165419fd..a7620d664e647 100644 --- a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleLineCollection.cpp +++ b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleLineCollection.cpp @@ -20,6 +20,7 @@ #include "DVDSubtitleLineCollection.h" #include "DVDClock.h" +#include "DVDCodecs/Overlay/DVDOverlayText.h" CDVDSubtitleLineCollection::CDVDSubtitleLineCollection() @@ -81,19 +82,51 @@ CDVDOverlay* CDVDSubtitleLineCollection::Get(double iPts) if (m_pCurrent) { - while (m_pCurrent && m_pCurrent->pOverlay->iPTSStopTime < iPts) + if (m_pCurrent->pOverlay->IsOverlayType(DVDOVERLAY_TYPE_TEXT)) { - m_pCurrent = m_pCurrent->pNext; - } + static double iPrevPts = 0.0; + + if (iPts == iPrevPts) + return NULL; - if (m_pCurrent) + CDVDOverlayText* pOverlayText = NULL; + + for (ListElement* p1 = m_pHead; p1->pNext->pNext != NULL; p1 = p1->pNext) + { + if (p1->pOverlay->iPTSStartTime <= iPts + && (p1->pOverlay->iPTSStopTime >= iPts || p1->pOverlay->iPTSStopTime == 0LL)) + { + if (!pOverlayText) + { + pOverlayText = new CDVDOverlayText(static_cast(*p1->pOverlay)); + } + else + { + pOverlayText->AddElement(static_cast(p1->pOverlay)); + } + } + } + + iPrevPts = iPts; + pOverlay = static_cast (pOverlayText); + } + else { - pOverlay = m_pCurrent->pOverlay; + while (m_pCurrent && m_pCurrent->pOverlay->iPTSStopTime < iPts) + { + m_pCurrent = m_pCurrent->pNext; + } + + if (m_pCurrent) + { + pOverlay = m_pCurrent->pOverlay; - // advance to the next overlay - m_pCurrent = m_pCurrent->pNext; + // advance to the next overlay + m_pCurrent = m_pCurrent->pNext; + } } } + return pOverlay; }