diff mbox

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

Message ID 20180522024616.3091-2-atomnuker@gmail.com
State New
Headers show

Commit Message

Rostislav Pehlivanov May 22, 2018, 2:46 a.m. UTC
Used to fix unmapping when no direct interop exists between APIs.

Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
---
 libavutil/hwcontext.c          | 7 +++++++
 libavutil/hwcontext_internal.h | 5 +++++
 2 files changed, 12 insertions(+)

Comments

Mark Thompson May 27, 2018, 2:04 p.m. UTC | #1
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@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@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
diff mbox

Patch

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
+ */
+int ff_hwframe_map_replace(AVFrame *dst, const AVFrame *src);
 
 extern const HWContextType ff_hwcontext_type_cuda;
 extern const HWContextType ff_hwcontext_type_d3d11va;