[vlc-devel] [PATCH] DxVA2: improve the algorithm to look for the oldest buffer

Steve Lhomme robux4 at videolabs.io
Thu Apr 2 16:23:47 CEST 2015


--
Before it was using the oldest of the buffers already used. With this algo we use all the buffers and reuse them as later as possible.
---
 modules/codec/avcodec/dxva2.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 76a1ebb..f87c325 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -475,25 +475,23 @@ static int Get(vlc_va_t *va, void **opaque, uint8_t **data)
 
     /* Grab an unused surface, in case none are, try the oldest
      * XXX using the oldest is a workaround in case a problem happens with libavcodec */
-    unsigned i, old;
-    for (i = 0, old = 0; i < sys->surface_count; i++) {
+    unsigned i;
+    vlc_va_surface_t *oldest = NULL;
+    for (i = 0; i < sys->surface_count; i++) {
         vlc_va_surface_t *surface = &sys->surface[i];
 
-        if (!surface->refcount)
-            break;
-
-        if (surface->order < sys->surface[old].order)
-            old = i;
+        if (!surface->refcount && (!oldest || surface->order < oldest->order))
+            oldest = surface;
+    }
+    if ( oldest == NULL )
+    {
+        msg_Warn(va, "no free d3d surface found" );
+        oldest = &sys->surface[0];
     }
-    if (i >= sys->surface_count)
-        i = old;
-
-    vlc_va_surface_t *surface = &sys->surface[i];
 
-    surface->refcount = 1;
-    surface->order = sys->surface_order++;
-    *data = (void *)surface->d3d;
-    *opaque = surface;
+    oldest->refcount = 1;
+    *data = (void *)oldest->d3d;
+    *opaque = oldest;
 
     vlc_mutex_unlock( &sys->surface_lock );
 
@@ -507,6 +505,7 @@ static void Release(void *opaque, uint8_t *data)
     vlc_mutex_lock( &surface->sys->surface_lock );
 
     surface->refcount--;
+    surface->order = surface->sys->surface_order++;
     (void) data;
 
     vlc_mutex_unlock( &surface->sys->surface_lock );
@@ -941,9 +940,10 @@ static int DxCreateVideoDecoder(vlc_va_t *va,
         vlc_va_surface_t *surface = &sys->surface[i];
         surface->d3d = sys->hw_surface[i];
         surface->refcount = 0;
-        surface->order = 0;
+        surface->order = i;
         surface->sys = sys;
     }
+    sys->surface_order = sys->surface_count;
     msg_Dbg(va, "IDirectXVideoAccelerationService_CreateSurface succeed with %d surfaces (%dx%d)",
             sys->surface_count, fmt->i_width, fmt->i_height);
 
-- 
2.3.0




More information about the vlc-devel mailing list