On Mon, 20 Feb 2017 21:54:03 +0000 Mark Thompson <[email protected]> wrote:
> On 20/02/17 05:37, wm4 wrote: > > On Sun, 19 Feb 2017 18:46:23 +0000 > > Mark Thompson <[email protected]> wrote: > > > >> Creates a new device context from another of a different type which > >> refers to the same underlying hardware. > >> --- > >> libavutil/hwcontext.c | 78 > >> ++++++++++++++++++++++++++++++++++++++++++ > >> libavutil/hwcontext.h | 16 +++++++++ > >> libavutil/hwcontext_internal.h | 8 +++++ > >> 3 files changed, 102 insertions(+) > >> > >> diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c > >> index 608da6872..1f9442622 100644 > >> --- a/libavutil/hwcontext.c > >> +++ b/libavutil/hwcontext.c > >> @@ -65,6 +65,8 @@ static void hwdevice_ctx_free(void *opaque, uint8_t > >> *data) > >> if (ctx->free) > >> ctx->free(ctx); > >> > >> + av_buffer_unref(&ctx->internal->source_device); > >> + > >> av_freep(&ctx->hwctx); > >> av_freep(&ctx->internal->priv); > >> av_freep(&ctx->internal); > >> @@ -535,6 +537,82 @@ fail: > >> return ret; > >> } > >> > >> +int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ref_ptr, > >> + enum AVHWDeviceType type, > >> + AVBufferRef *src_ref, int flags) > >> +{ > >> + AVBufferRef *dst_ref = NULL, *tmp_ref; > >> + AVHWDeviceContext *dst_ctx, *src_ctx, *tmp_ctx; > >> + int ret = 0; > >> + > >> + src_ctx = (AVHWDeviceContext*)src_ref->data; > >> + if (src_ctx->type == type) { > >> + // Currently disallowed. It is possible that deriving a device of > >> + // the same type could do something useful (device partitioning?), > >> + // but for now just don't support it. > >> + return AVERROR(EINVAL); > > > > It could just be a no-nop (basically creating an alias). Whether that'd > > be useful, who knows. > > If you can come up with any case where that is useful, then sure. I couldn't > think of one, so making it always fail rather than doing something unhelpful > seemed reasonable. > It looks to me like this would be quite orthogonal. The user could call this function simply to create a new reference to a desired device type, without having to check whether src_ref is already the desired type (and having to call av_buffer_ref instead in this case). > >> + } > >> + > >> + // If the source device was originally derived from a device of the > >> + // target type (possibly through more intermediates), then return a > >> + // new reference to the original device. > >> + tmp_ref = src_ctx->internal->source_device; > >> + while (tmp_ref) { > >> + tmp_ctx = (AVHWDeviceContext*)tmp_ref->data; > >> + if (tmp_ctx->type == type) { > >> + dst_ref = av_buffer_ref(tmp_ref); > >> + if (!dst_ref) { > >> + ret = AVERROR(ENOMEM); > >> + goto fail; > >> + } > >> + goto done; > > > > In fact, it seems this searches and returns a new reference if a > > "similar" device is found. So my suggestion above would make sense? > > The point of this is that it allows X -> Y -> X derivation to succeed when > derivation is only possible in one direction. For example, VAAPI -> OpenCL > -> VAAPI: OpenCL -> VAAPI isn't possible in isolation, but we would still > like it to work in this case because it is helpful with hwmap in filter > graphs. Sure, I'm not questioning that. _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
