On Tue, Jun 6, 2017 at 6:51 PM, wm4 <[email protected]> wrote:
> 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.
> ---
>  libavcodec/dxva2.c | 46 ++++++++++++++++++++++++++++------------------
>  1 file changed, 28 insertions(+), 18 deletions(-)
>
> diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
> index 1cb79fe294..0d4effd228 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))

Did you mean ff_dxva2_lock() ?

>              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))

Same here

>          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;
> --
> 2.11.0
>
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to