From 27978155bc661eec9f22bcf82c9cfc099cff4365 Mon Sep 17 00:00:00 2001 From: Mark Thompson Date: Sat, 4 Mar 2017 23:57:39 +0000 Subject: [PATCH] hwcontext: Add frame context mapping for nontrivial contexts Some frames contexts are not usable without additional format-specific state in hwctx. This change adds new functions frames_derive_from and frames_derive_to to initialise this state 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 ff9fe99aba..a6d88421d8 100644 --- a/libavutil/hwcontext.c +++ b/libavutil/hwcontext.c @@ -816,7 +816,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->frames_derive_from) + ret = src->internal->hw_type->frames_derive_from(dst, src, flags); + if (ret == AVERROR(ENOSYS) && + dst->internal->hw_type->frames_derive_to) + ret = dst->internal->hw_type->frames_derive_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 66f54142e8..87b32e191e 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 (*frames_derive_to)(AVHWFramesContext *dst_ctx, + AVHWFramesContext *src_ctx, int flags); + int (*frames_derive_from)(AVHWFramesContext *dst_ctx, + AVHWFramesContext *src_ctx, int flags); } HWContextType; struct AVHWDeviceInternal {