Merge pull request #4569 from koying/fixamcreleasebuffer
authorTrent Nelson <trent.a.b.nelson@gmail.com>
Wed, 16 Apr 2014 21:41:52 +0000 (15:41 -0600)
committerTrent Nelson <trent.a.b.nelson@gmail.com>
Wed, 16 Apr 2014 22:07:11 +0000 (16:07 -0600)
FIX: [mediacodec] properly release output buffer if AddProcessor is not called

xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h

index 41ebb3c..589683f 100644 (file)
@@ -162,6 +162,7 @@ CDVDMediaCodecInfo::CDVDMediaCodecInfo(
 )
 : m_refs(1)
 , m_valid(true)
+, m_isReleased(true)
 , m_index(index)
 , m_texture(texture)
 , m_timestamp(0)
@@ -185,6 +186,7 @@ CDVDMediaCodecInfo::~CDVDMediaCodecInfo()
 CDVDMediaCodecInfo* CDVDMediaCodecInfo::Retain()
 {
   AtomicIncrement(&m_refs);
+  m_isReleased = false;
 
   return this;
 }
@@ -192,11 +194,10 @@ CDVDMediaCodecInfo* CDVDMediaCodecInfo::Retain()
 long CDVDMediaCodecInfo::Release()
 {
   long count = AtomicDecrement(&m_refs);
-  if (count == 0)
-  {
+  if (count == 1)
     ReleaseOutputBuffer(false);
+  if (count == 0)
     delete this;
-  }
 
   return count;
 }
@@ -212,7 +213,7 @@ void CDVDMediaCodecInfo::ReleaseOutputBuffer(bool render)
 {
   CSingleLock lock(m_section);
 
-  if (!m_valid)
+  if (!m_valid || m_isReleased)
     return;
 
   // release OutputBuffer and render if indicated
@@ -222,6 +223,7 @@ void CDVDMediaCodecInfo::ReleaseOutputBuffer(bool render)
     m_frameready->Reset();
 
   m_codec->releaseOutputBuffer(m_index, render);
+  m_isReleased = true;
 
   if (xbmc_jnienv()->ExceptionOccurred())
   {
index 50dacae..d93dd0a 100644 (file)
@@ -73,6 +73,7 @@ private:
 
   long                m_refs;
   bool                m_valid;
+  bool                m_isReleased;
   int                 m_index;
   unsigned int        m_texture;
   int64_t             m_timestamp;