vdpau: make sure buffers a full before returning a picture
authorRainer Hochecker <fernetmenta@online.de>
Mon, 30 Sep 2013 16:52:31 +0000 (18:52 +0200)
committerRainer Hochecker <fernetmenta@online.de>
Sat, 5 Oct 2013 12:31:30 +0000 (14:31 +0200)
xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp

index 150c1c7..28f069d 100644 (file)
@@ -1106,7 +1106,14 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame)
   uint64_t startTime = CurrentHostCounter();
   while (!retval)
   {
-    if (m_vdpauOutput.m_dataPort.ReceiveInMessage(&msg))
+    // first fill the buffers to keep vdpau busy
+    // mixer will run with decoded >= 2. output is limited by number of output surfaces
+    // In case mixer is bypassed we limit by looking at processed
+    if (decoded < 3 && processed < 3)
+    {
+      retval |= VC_BUFFER;
+    }
+    else if (m_vdpauOutput.m_dataPort.ReceiveInMessage(&msg))
     {
       if (msg->signal == COutputDataProtocol::PICTURE)
       {
@@ -1140,20 +1147,9 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame)
       msg->Release();
     }
 
-    // TODO
-    if (1) //(m_codecControl & DVP_FLAG_DRAIN))
+    if (decoded < 3 && processed < 3)
     {
-      if (decoded + processed + render < 4)
-      {
-        retval |= VC_BUFFER;
-      }
-    }
-    else
-    {
-      if (decoded < 4 && (processed + render) < 3)
-      {
-        retval |= VC_BUFFER;
-      }
+      retval |= VC_BUFFER;
     }
 
     if (!retval && !m_inMsgEvent.WaitMSec(2000))