Some frames contexts are not usable without additional format-specific
state in hwctx.  This adds new functions map_frames_from and
map_frames_to to set this up appropriately when deriving a frames
context which will require it to be set.
---
 libavutil/hwcontext.c          | 9 ++++++++-
 libavutil/hwcontext_internal.h | 5 +++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
index 8195a7245..4a47e258a 100644
--- a/libavutil/hwcontext.c
+++ b/libavutil/hwcontext.c
@@ -820,7 +820,14 @@ int av_hwframe_ctx_create_derived(AVBufferRef 
**derived_frame_ctx,
         goto fail;
     }
 
-    ret = av_hwframe_ctx_init(dst_ref);
+    ret = AVERROR(ENOSYS);
+    if (src->internal->hw_type->map_frames_from)
+        ret = src->internal->hw_type->map_frames_from(dst, src, flags);
+    if (ret == AVERROR(ENOSYS) &&
+        dst->internal->hw_type->map_frames_to)
+        ret = dst->internal->hw_type->map_frames_to(dst, src, flags);
+    if (ret == AVERROR(ENOSYS))
+        ret = 0;
     if (ret)
         goto fail;
 
diff --git a/libavutil/hwcontext_internal.h b/libavutil/hwcontext_internal.h
index 66f54142e..125517215 100644
--- a/libavutil/hwcontext_internal.h
+++ b/libavutil/hwcontext_internal.h
@@ -92,6 +92,11 @@ typedef struct HWContextType {
                                const AVFrame *src, int flags);
     int              (*map_from)(AVHWFramesContext *ctx, AVFrame *dst,
                                  const AVFrame *src, int flags);
+    int              (*map_frames_to)(AVHWFramesContext *dst_ctx,
+                                      AVHWFramesContext *src_ctx, int flags);
+    int              (*map_frames_from)(AVHWFramesContext *dst_ctx,
+                                        AVHWFramesContext *src_ctx, int flags);
+
 } HWContextType;
 
 struct AVHWDeviceInternal {
-- 
2.11.0

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to