[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