diff options
author | xbmc <fernetmenta@online.de> | 2013-03-04 08:30:47 +0100 |
---|---|---|
committer | xbmc <fernetmenta@online.de> | 2013-03-04 08:36:12 +0100 |
commit | 3d1005fdd34e72f81aff9034f8d30a0d33a780a8 (patch) | |
tree | 34d5323e5d40dd568fe688240fadac8fe9181949 | |
parent | 87047e93e02375851505e9d6c420dd1225996bdb (diff) |
Always copy overlays from file parser - Fixes stuck hw resources on render
6 files changed, 72 insertions, 1 deletions
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlay.h b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlay.h index 8c87bc4faa..da8de1feb9 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlay.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlay.h @@ -103,6 +103,12 @@ public: bool IsOverlayType(DVDOverlayType type) { return (m_type == type); } + /** + * return a copy to DVDPlayerSubtitle in order to have hw resources cleared + * after rendering + */ + virtual CDVDOverlay* Clone() { return Acquire(); } + double iPTSStartTime; double iPTSStopTime; bool bForced; // display, no matter what diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h index bc90d68ceb..e1cdf595fd 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h @@ -20,6 +20,7 @@ * */ +#include "PlatformDefs.h" #include "DVDOverlay.h" #include <string.h> #include <stdlib.h> @@ -117,6 +118,11 @@ public: if(palette) free(palette); } + virtual CDVDOverlayImage* Clone() + { + return new CDVDOverlayImage(*this); + } + BYTE* data_at(int sub_x, int sub_y) const { int bpp; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h index 31deba1bc3..f42c571322 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h @@ -37,10 +37,21 @@ public: libass->Acquire(); } + CDVDOverlaySSA(CDVDOverlaySSA& src) + : CDVDOverlay(src) + , m_libass(src.m_libass) + { + m_libass->Acquire(); + } + ~CDVDOverlaySSA() { if(m_libass) SAFE_RELEASE(m_libass); } + virtual CDVDOverlaySSA* Clone() + { + return new CDVDOverlaySSA(*this); + } }; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h index 849a6e3299..54e3bfac66 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h @@ -46,6 +46,12 @@ public: m_type = type; } + CElement(CElement& src) + { + pNext = NULL; + m_type = src.m_type; + } + virtual ~CElement() { } @@ -71,6 +77,12 @@ public: } } + CElementText(CElementText& src) + : CElement(src) + { + m_text = strdup(src.m_text); + } + virtual ~CElementText() { if (m_text) free(m_text); @@ -81,12 +93,20 @@ public: class CElementProperty : public CElement { + public: CElementProperty() : CElement(ELEMENT_TYPE_PROPERTY) { bItalic = false; bBold = false; } + CElementProperty(CElementProperty& src) + : CElement(src) + { + bItalic = src.bItalic; + bBold = src.bBold; + } + public: bool bItalic; bool bBold; @@ -99,6 +119,22 @@ public: m_pEnd = NULL; } + CDVDOverlayText(CDVDOverlayText& src) + : CDVDOverlay(src) + { + m_pHead = NULL; + m_pEnd = NULL; + for(CElement* e = src.m_pHead; e; e = e->pNext) + { + if(e->IsElementType(ELEMENT_TYPE_TEXT)) + AddElement(new CElementText(*static_cast<CElementText*>(e))); + else if(e->IsElementType(ELEMENT_TYPE_PROPERTY)) + AddElement(new CElementProperty(*static_cast<CElementProperty*>(e))); + else + AddElement(new CElement(*static_cast<CElement*>(e))); + } + } + virtual ~CDVDOverlayText() { CElement* pTemp; @@ -110,6 +146,11 @@ public: } } + virtual CDVDOverlayText* Clone() + { + return new CDVDOverlayText(*this); + } + void AddElement(CDVDOverlayText::CElement* pElement) { pElement->pNext = NULL; diff --git a/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp b/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp index 29c8d57bdf..540d8906a6 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp @@ -222,6 +222,7 @@ void CDVDPlayerSubtitle::Process(double pts) while(pOverlay) { m_pOverlayContainer->Add(pOverlay); + pOverlay->Release(); pOverlay = m_pSubtitleFileParser->Parse(pts); } diff --git a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParser.h b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParser.h index 944bf06bc3..3cd1e9502a 100644 --- a/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParser.h +++ b/xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParser.h @@ -47,7 +47,13 @@ public: m_filename = strFile; } virtual ~CDVDSubtitleParserCollection() { } - virtual CDVDOverlay* Parse(double iPts) { return m_collection.Get(iPts); } + virtual CDVDOverlay* Parse(double iPts) + { + CDVDOverlay* o = m_collection.Get(iPts); + if(o == NULL) + return o; + return o->Clone(); + } virtual void Reset() { m_collection.Reset(); } virtual void Dispose() { m_collection.Clear(); } |