diff options
author | wm4 <nfxjfg@googlemail.com> | 2017-06-06 18:51:10 +0200 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2017-06-08 20:55:57 +0200 |
commit | 831cfe10b40414915fe7b6088158421fe02e2b2d (patch) | |
tree | c794bb8f78e620b9467033a5778c45d5387003e4 /libavcodec | |
parent | 4dec101acc393fbfe9a8ce0237b9efbae3f20139 (diff) | |
download | ffmpeg-831cfe10b40414915fe7b6088158421fe02e2b2d.tar.gz |
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@biurrun.de>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/dxva2.c | 46 |
1 files 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; |