From: Steve Lhomme <rob...@gmail.com> --- libavcodec/d3d11va.h | 5 +++++ libavcodec/dxva2.c | 15 +++++++++++++-- libavcodec/version.h | 4 ++-- 3 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/libavcodec/d3d11va.h b/libavcodec/d3d11va.h index f5777c2..1316d47 100644 --- a/libavcodec/d3d11va.h +++ b/libavcodec/d3d11va.h @@ -89,6 +89,11 @@ struct AVD3D11VAContext { * Private to the Libav AVHWAccel implementation */ unsigned report_id; + + /** + * Mutex to access video_context + */ + HANDLE context_mutex; }; /** diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c index d4ac98d..ca22de0 100644 --- a/libavcodec/dxva2.c +++ b/libavcodec/dxva2.c @@ -145,10 +145,13 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, do { #if CONFIG_D3D11VA - if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) { + if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE) + WaitForSingleObjectEx(D3D11VA_CONTEXT(ctx)->context_mutex, INFINITE, FALSE); hr = ID3D11VideoContext_DecoderBeginFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder, ff_dxva2_get_surface(frame), 0, NULL); + } #endif #if CONFIG_DXVA2 if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) @@ -162,6 +165,11 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, if (FAILED(hr)) { av_log(avctx, AV_LOG_ERROR, "Failed to begin frame: 0x%lx\n", hr); +#if CONFIG_D3D11VA + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) + if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE) + ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex); +#endif return -1; } @@ -261,8 +269,11 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, end: #if CONFIG_D3D11VA - if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) { 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) diff --git a/libavcodec/version.h b/libavcodec/version.h index 94cc775..d74a861 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,8 +29,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 56 -#define LIBAVCODEC_VERSION_MINOR 35 -#define LIBAVCODEC_VERSION_MICRO 1 +#define LIBAVCODEC_VERSION_MINOR 36 +#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ -- 2.4.5 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel