droid:
authordavilla <davilla@4pi.com>
Tue, 15 Oct 2013 18:20:41 +0000 (14:20 -0400)
committerdavilla <davilla@4pi.com>
Thu, 17 Oct 2013 23:22:14 +0000 (19:22 -0400)
 1) mediacodec, changed to dequeue and release in the same thread
 2) add more debug logging.
 3) silence some log spew.

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

index 4727ccb..505f194 100644 (file)
@@ -17,6 +17,7 @@
  *  <http://www.gnu.org/licenses/>.
  *
  */
+
 //#define DEBUG_VERBOSE 1
 
 #include "system.h"
@@ -858,7 +859,7 @@ void CLinuxRendererGLES::ReleaseBuffer(int idx)
 #if defined(TARGET_ANDROID)
   YUVBUFFER &buf = m_buffers[idx];
 
-  SAFE_RELEASE(m_buffers[idx].mediacodec);
+  SAFE_RELEASE(buf.mediacodec);
 #endif
 }
 
@@ -919,7 +920,7 @@ void CLinuxRendererGLES::Render(DWORD flags, int index)
   }
   else if (m_renderMethod & RENDER_MEDIACODEC)
   {
-    RenderMediaCodec(index, m_currentField);
+    RenderSurfaceTexture(index, m_currentField);
   }
   else
   {
@@ -1410,7 +1411,7 @@ void CLinuxRendererGLES::RenderEglImage(int index, int field)
 #endif
 }
 
-void CLinuxRendererGLES::RenderMediaCodec(int index, int field)
+void CLinuxRendererGLES::RenderSurfaceTexture(int index, int field)
 {
 #if defined(TARGET_ANDROID)
   #ifdef DEBUG_VERBOSE
@@ -2128,15 +2129,25 @@ bool CLinuxRendererGLES::CreateEGLIMGTexture(int index)
 void CLinuxRendererGLES::UploadSurfaceTexture(int index)
 {
 #if defined(TARGET_ANDROID)
-  if (m_buffers[index].mediacodec)
+#ifdef DEBUG_VERBOSE
+  unsigned int time = XbmcThreads::SystemClockMillis();
+#endif
+
+  int mindex = -1;
+  YUVBUFFER &buf = m_buffers[index];
+
+  if (buf.mediacodec)
   {
-    m_buffers[index].fields[0][0].id = m_buffers[index].mediacodec->GetTextureID();
-    m_buffers[index].mediacodec->ReleaseOutputBuffer(true);
-    m_buffers[index].mediacodec->UpdateTexImage();
-    m_buffers[index].mediacodec->GetTransformMatrix(m_textureMatrix);
-    SAFE_RELEASE(m_buffers[index].mediacodec);
+    mindex = buf.mediacodec->GetIndex();
+    buf.fields[0][0].id = buf.mediacodec->GetTextureID();
+    buf.mediacodec->UpdateTexImage();
+    buf.mediacodec->GetTransformMatrix(m_textureMatrix);
+    SAFE_RELEASE(buf.mediacodec);
   }
 
+#ifdef DEBUG_VERBOSE
+  CLog::Log(LOGDEBUG, "UploadSurfaceTexture %d: img: %d tm:%d", index, mindex, XbmcThreads::SystemClockMillis() - time);
+#endif
 #endif
 }
 void CLinuxRendererGLES::DeleteSurfaceTexture(int index)
@@ -2388,12 +2399,20 @@ void CLinuxRendererGLES::AddProcessor(CDVDMediaCodecInfo *mediacodec, int index)
   unsigned int time = XbmcThreads::SystemClockMillis();
 #endif
 
+  int mindex = -1;
   YUVBUFFER &buf = m_buffers[index];
   if (mediacodec)
+  {
     buf.mediacodec = mediacodec->Retain();
+    mindex = buf.mediacodec->GetIndex();
+    // releaseOutputBuffer must be in same thread as
+    // dequeueOutputBuffer. We are in DVDPlayerVideo
+    // thread here, so we are safe.
+    buf.mediacodec->ReleaseOutputBuffer(true);
+  }
 
 #ifdef DEBUG_VERBOSE
-  CLog::Log(LOGDEBUG, "AddProcessor %d: img:%d: tm:%d\n", index, buf.mediacodec->GetTexture(), XbmcThreads::SystemClockMillis() - time);
+  CLog::Log(LOGDEBUG, "AddProcessor %d: img:%d tm:%d", index, mindex, XbmcThreads::SystemClockMillis() - time);
 #endif
 }
 #endif
index 2c72e15..7742145 100644 (file)
@@ -217,7 +217,7 @@ protected:
   void RenderOpenMax(int index, int field);       // OpenMAX rgb texture
   void RenderEglImage(int index, int field);       // Android OES texture
   void RenderCoreVideoRef(int index, int field);  // CoreVideo reference
-  void RenderMediaCodec(int index, int field);    // MediaCodec reference
+  void RenderSurfaceTexture(int index, int field);// MediaCodec rendering using SurfaceTexture
 
   CFrameBufferObject m_fbo;
 
index 271d2c1..c9047e4 100644 (file)
@@ -158,6 +158,7 @@ void CDVDMediaCodecInfo::ReleaseOutputBuffer(bool render)
     m_frameready->Reset();
 
   m_codec->releaseOutputBuffer(m_index, render);
+
   if (xbmc_jnienv()->ExceptionOccurred())
   {
     CLog::Log(LOGERROR, "CDVDMediaCodecInfo::ReleaseOutputBuffer "
@@ -165,16 +166,13 @@ void CDVDMediaCodecInfo::ReleaseOutputBuffer(bool render)
     xbmc_jnienv()->ExceptionDescribe();
     xbmc_jnienv()->ExceptionClear();
   }
+}
 
-  // this is key, after calling releaseOutputBuffer, we must
-  // wait a little for MediaCodec to render to the surface.
-  // Then we can updateTexImage without delay. If we do not
-  // wait, then video playback gets jerky. To optomize this,
-  // we hook the SurfaceTexture OnFrameAvailable callback
-  // using CJNISurfaceTextureOnFrameAvailableListener and wait
-  // on a CEvent to fire. 20ms seems to be a good max fallback.
-  if (render)
-    m_frameready->WaitMSec(20);
+int CDVDMediaCodecInfo::GetIndex() const
+{
+  CSingleLock lock(m_section);
+
+  return m_index;
 }
 
 int CDVDMediaCodecInfo::GetTextureID() const
@@ -201,6 +199,19 @@ void CDVDMediaCodecInfo::UpdateTexImage()
   if (!m_valid)
     return;
 
+  // updateTexImage will check and spew any prior gl errors,
+  // clear them before we call updateTexImage.
+  glGetError();
+
+  // this is key, after calling releaseOutputBuffer, we must
+  // wait a little for MediaCodec to render to the surface.
+  // Then we can updateTexImage without delay. If we do not
+  // wait, then video playback gets jerky. To optomize this,
+  // we hook the SurfaceTexture OnFrameAvailable callback
+  // using CJNISurfaceTextureOnFrameAvailableListener and wait
+  // on a CEvent to fire. 20ms seems to be a good max fallback.
+  m_frameready->WaitMSec(20);
+
   m_surfacetexture->updateTexImage();
   if (xbmc_jnienv()->ExceptionOccurred())
   {
index 7e2c069..5cdf0a1 100644 (file)
@@ -61,6 +61,7 @@ public:
   // MediaCodec related
   void                ReleaseOutputBuffer(bool render);
   // SurfaceTexture released
+  int                 GetIndex() const;
   int                 GetTextureID() const;
   void                GetTransformMatrix(float *textureMatrix);
   void                UpdateTexImage();