aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxbmc <fernetmenta@online.de>2013-03-04 08:30:47 +0100
committerxbmc <fernetmenta@online.de>2013-03-04 08:36:12 +0100
commit3d1005fdd34e72f81aff9034f8d30a0d33a780a8 (patch)
tree34d5323e5d40dd568fe688240fadac8fe9181949
parent87047e93e02375851505e9d6c420dd1225996bdb (diff)
Always copy overlays from file parser - Fixes stuck hw resources on render
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlay.h6
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayImage.h6
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlaySSA.h11
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayText.h41
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayerSubtitle.cpp1
-rw-r--r--xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitleParser.h8
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(); }