[FFmpeg-devel] [PATCH v3 1/8] hwcontext_internal: add ff_hwframe_map_replace

Mark Thompson sw at jkqxz.net
Sun May 27 17:04:53 EEST 2018


On 22/05/18 03:46, Rostislav Pehlivanov wrote:
> Used to fix unmapping when no direct interop exists between APIs.
> 
> Signed-off-by: Rostislav Pehlivanov <atomnuker at gmail.com>
> ---
>  libavutil/hwcontext.c          | 7 +++++++
>  libavutil/hwcontext_internal.h | 5 +++++
>  2 files changed, 12 insertions(+)
> 
> diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
> index 745016ed7e..f1e404ab20 100644
> --- a/libavutil/hwcontext.c
> +++ b/libavutil/hwcontext.c
> @@ -870,3 +870,10 @@ fail:
>      av_buffer_unref(&dst_ref);
>      return ret;
>  }
> +
> +int ff_hwframe_map_replace(AVFrame *dst, const AVFrame *src)
> +{
> +    HWMapDescriptor *hwmap = (HWMapDescriptor*)dst->buf[0]->data;
> +    av_frame_unref(hwmap->source);
> +    return av_frame_ref(hwmap->source, src);
> +}
> diff --git a/libavutil/hwcontext_internal.h b/libavutil/hwcontext_internal.h
> index 332062ddaa..77dc47ddd6 100644
> --- a/libavutil/hwcontext_internal.h
> +++ b/libavutil/hwcontext_internal.h
> @@ -156,6 +156,11 @@ int ff_hwframe_map_create(AVBufferRef *hwframe_ref,
>                                          HWMapDescriptor *hwmap),
>                            void *priv);
>  
> +/**
> + * Replace the current hwmap of dst with the one from src, used for indirect
> + * mappings like VAAPI->(DRM)->OpenCL/Vulkan where a direct interop is missing

"missing" makes it sound like you /want/ to have direct interop, and the consequent mess of one-to-one cases.  You shouldn't!  :P

> + */
> +int ff_hwframe_map_replace(AVFrame *dst, const AVFrame *src);
>  
>  extern const HWContextType ff_hwcontext_type_cuda;
>  extern const HWContextType ff_hwcontext_type_d3d11va;
> 
On 22/05/18 03:46, Rostislav Pehlivanov wrote:
> Signed-off-by: Rostislav Pehlivanov <atomnuker at gmail.com>
> ---
>  libavutil/hwcontext_opencl.c | 5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
> 
> diff --git a/libavutil/hwcontext_opencl.c b/libavutil/hwcontext_opencl.c
> index 43b5c5ae0c..1d18da37bf 100644
> --- a/libavutil/hwcontext_opencl.c
> +++ b/libavutil/hwcontext_opencl.c
> @@ -2171,10 +2171,7 @@ static int opencl_map_from_vaapi(AVHWFramesContext *dst_fc,
>      if (err < 0)
>          goto fail;
>  
> -    // Adjust the map descriptor so that unmap works correctly.
> -    hwmap = (HWMapDescriptor*)dst->buf[0]->data;
> -    av_frame_unref(hwmap->source);
> -    err = av_frame_ref(hwmap->source, src);
> +    err = ff_hwframe_map_replace(dst, src);
>  
>  fail:
>      av_frame_free(&tmp);
> 

These two patches LGTM.

Thanks,

- Mark


More information about the ffmpeg-devel mailing list