Message ID | 20180522024616.3091-2-atomnuker@gmail.com |
---|---|
State | New |
Headers | show |
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 --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;
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(+)