[FFmpeg-cvslog] dxva: move d3d11 locking/unlocking to functions

wm4 git at videolan.org
Wed Nov 1 23:50:25 EET 2017


ffmpeg | branch: master | wm4 <nfxjfg at googlemail.com> | Tue Jun  6 18:51:10 2017 +0200| [831cfe10b40414915fe7b6088158421fe02e2b2d] | committer: Diego Biurrun

dxva: move d3d11 locking/unlocking to functions

I want to make it non-mandatory to set a mutex in the D3D11 device
context, and replacing it with user callbacks seems like the best
solution. This is preparation for it. Also makes the code slightly more
readable.

Signed-off-by: Diego Biurrun <diego at biurrun.de>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=831cfe10b40414915fe7b6088158421fe02e2b2d
---

 libavcodec/dxva2.c | 46 ++++++++++++++++++++++++++++------------------
 1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index fe6dbbc030..5bc9b30653 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -29,6 +29,28 @@
 #include "avcodec.h"
 #include "dxva2_internal.h"
 
+static void ff_dxva2_lock(AVCodecContext *avctx)
+{
+#if CONFIG_D3D11VA
+    if (ff_dxva2_is_d3d11(avctx)) {
+        AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
+        if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
+            WaitForSingleObjectEx(D3D11VA_CONTEXT(ctx)->context_mutex, INFINITE, FALSE);
+    }
+#endif
+}
+
+static void ff_dxva2_unlock(AVCodecContext *avctx)
+{
+#if CONFIG_D3D11VA
+    if (ff_dxva2_is_d3d11(avctx)) {
+        AVDXVAContext *ctx = DXVA_CONTEXT(avctx);
+        if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
+            ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex);
+    }
+#endif
+}
+
 static void *get_surface(const AVFrame *frame)
 {
     return frame->data[3];
@@ -153,14 +175,12 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
     unsigned type;
 
     do {
+        ff_dxva2_lock(avctx);
 #if CONFIG_D3D11VA
-        if (ff_dxva2_is_d3d11(avctx)) {
-            if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
-                WaitForSingleObjectEx(D3D11VA_CONTEXT(ctx)->context_mutex, INFINITE, FALSE);
+        if (ff_dxva2_is_d3d11(avctx))
             hr = ID3D11VideoContext_DecoderBeginFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder,
                                                       get_surface(frame),
                                                       0, NULL);
-        }
 #endif
 #if CONFIG_DXVA2
         if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD)
@@ -170,21 +190,13 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
 #endif
         if (hr != E_PENDING || ++runs > 50)
             break;
-#if CONFIG_D3D11VA
-        if (ff_dxva2_is_d3d11(avctx))
-            if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
-                ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex);
-#endif
+        ff_dxva2_unlock(avctx);
         av_usleep(2000);
     } while(1);
 
     if (FAILED(hr)) {
         av_log(avctx, AV_LOG_ERROR, "Failed to begin frame: 0x%x\n", hr);
-#if CONFIG_D3D11VA
-        if (ff_dxva2_is_d3d11(avctx))
-            if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
-                ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex);
-#endif
+        ff_dxva2_unlock(avctx);
         return -1;
     }
 
@@ -284,16 +296,14 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
 
 end:
 #if CONFIG_D3D11VA
-    if (ff_dxva2_is_d3d11(avctx)) {
+    if (ff_dxva2_is_d3d11(avctx))
         hr = ID3D11VideoContext_DecoderEndFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder);
-        if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
-            ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex);
-    }
 #endif
 #if CONFIG_DXVA2
     if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD)
         hr = IDirectXVideoDecoder_EndFrame(DXVA2_CONTEXT(ctx)->decoder, NULL);
 #endif
+    ff_dxva2_unlock(avctx);
     if (FAILED(hr)) {
         av_log(avctx, AV_LOG_ERROR, "Failed to end frame: 0x%x\n", hr);
         result = -1;



More information about the ffmpeg-cvslog mailing list