[vlc-devel] [PATCH] avcodec: va: directly set data[3] with surface

Thomas Guillem thomas at gllm.fr
Fri Jun 26 14:07:25 CEST 2020


LGTM

On Tue, Jun 23, 2020, at 18:51, Alexandre Janniaux wrote:
> We never use data[0] for anything, nor does avcodec, and it can
> actually keep the same initialized value or be NULL.
> 
> In particular, it fixes avcodec decoder with vaapi vlc_va_t backend
> which was generating VASurfaceID of value 0 to count, leading to the
> following assertion:
> 
>     vlc: ../../modules/codec/avcodec/video.c:1492: lavc_va_GetFrame: 
> Assertion `frame->data[0] != NULL' failed.
>     [1]    154639 abort (core dumped)  ./build-native/vlc <sample> 
> --dec-dev=vaapi -vvv
> ---
>  modules/codec/avcodec/d3d11va.c | 2 +-
>  modules/codec/avcodec/dxva2.c   | 2 +-
>  modules/codec/avcodec/vaapi.c   | 2 +-
>  modules/codec/avcodec/video.c   | 5 +----
>  4 files changed, 4 insertions(+), 7 deletions(-)
> 
> diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
> index aaa41fcd73a..c9793a55d1b 100644
> --- a/modules/codec/avcodec/d3d11va.c
> +++ b/modules/codec/avcodec/d3d11va.c
> @@ -227,7 +227,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
>          va_surface_Release(va_surface);
>          return VLC_ENOITEM;
>      }
> -    *data = (uint8_t*)sys->hw_surface[va_surface_GetIndex(va_surface)];
> +    data[3] = (uint8_t*)sys->hw_surface[va_surface_GetIndex(va_surface)];
>      return VLC_SUCCESS;
>  }
>  
> diff --git a/modules/codec/avcodec/dxva2.c 
> b/modules/codec/avcodec/dxva2.c
> index aefcb554971..4a7b62814f9 100644
> --- a/modules/codec/avcodec/dxva2.c
> +++ b/modules/codec/avcodec/dxva2.c
> @@ -238,7 +238,7 @@ static int Get(vlc_va_t *va, picture_t *pic, 
> uint8_t **data)
>          va_surface_Release(va_surface);
>          return VLC_ENOITEM;
>      }
> -    *data = 
> (uint8_t*)DXVA2_PICCONTEXT_FROM_PICCTX(pic->context)->ctx.picsys.surface;
> +    data[3] = 
> (uint8_t*)DXVA2_PICCONTEXT_FROM_PICCTX(pic->context)->ctx.picsys.surface;
>      return VLC_SUCCESS;
>  }
>  
> diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
> index 41136dc85a5..01d2b350f1a 100644
> --- a/modules/codec/avcodec/vaapi.c
> +++ b/modules/codec/avcodec/vaapi.c
> @@ -170,7 +170,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
>      vaapi_ctx->ctx.va_dpy = sys->hw_ctx.display;
>      vaapi_ctx->va_surface = va_surface;
>      vlc_vaapi_PicSetContext(pic, &vaapi_ctx->ctx);
> -    *data = (void *) (uintptr_t) vaapi_ctx->ctx.surface;
> +    data[3] = (void *) (uintptr_t) vaapi_ctx->ctx.surface;
>  
>      return VLC_SUCCESS;
>  }
> diff --git a/modules/codec/avcodec/video.c 
> b/modules/codec/avcodec/video.c
> index b74d77e0f54..d89635dbe8f 100644
> --- a/modules/codec/avcodec/video.c
> +++ b/modules/codec/avcodec/video.c
> @@ -1483,16 +1483,13 @@ static int lavc_va_GetFrame(struct 
> AVCodecContext *ctx, AVFrame *frame)
>      if (pic == NULL)
>          return -1;
>  
> +    /* data[3] will contains the format-specific surface handle. */
>      if (vlc_va_Get(va, pic, &frame->data[0]))
>      {
>          msg_Err(dec, "hardware acceleration picture allocation failed");
>          picture_Release(pic);
>          return -1;
>      }
> -    assert(frame->data[0] != NULL);
> -    /* data[0] must be non-NULL for libavcodec internal checks.
> -     * data[3] actually contains the format-specific surface handle. */
> -    frame->data[3] = frame->data[0];
>  
>      frame->buf[0] = av_buffer_create(frame->data[0], 0, 
> lavc_ReleaseFrame, pic, 0);
>      if (unlikely(frame->buf[0] == NULL))
> -- 
> 2.27.0
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list