On Sat, 5 Aug 2017 23:53:07 +0100 Mark Thompson <s...@jkqxz.net> wrote:
> AVFilterContext.extra_hw_frames functions identically to the field of > the same name in AVCodecContext. > --- > Implemented in such a way that an init_hw_frames callback could be added here > as well, if anyone had a use-case for it. > > > doc/APIchanges | 3 +++ > libavfilter/avfilter.c | 23 +++++++++++++++++++++++ > libavfilter/avfilter.h | 13 +++++++++++++ > libavfilter/internal.h | 16 ++++++++++++++++ > 4 files changed, 55 insertions(+) > > diff --git a/doc/APIchanges b/doc/APIchanges > index c111d08ad..5b8143561 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -13,6 +13,9 @@ libavutil: 2017-03-23 > > API changes, most recent first: > > +2017-xx-xx - xxxxxxx - lavfi 7.x+1.0 - avfilter.h > + Add AVFilterContext.extra_hw_frames. > + > 2017-xx-xx - xxxxxxx - lavc 58.x+1.0 - avcodec.h > Add AVCodecContext.init_hw_frames and AVCodecContext.extra_hw_frames. > > diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c > index 83c1a7c20..1161f4771 100644 > --- a/libavfilter/avfilter.c > +++ b/libavfilter/avfilter.c > @@ -368,6 +368,8 @@ static const AVOption avfilter_options[] = { > { "thread_type", "Allowed thread types", OFFSET(thread_type), > AV_OPT_TYPE_FLAGS, > { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, FLAGS, "thread_type" }, > { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > AVFILTER_THREAD_SLICE }, .unit = "thread_type" }, > + { "extra_hw_frames", "Number of extra hardware frames to allocate for > the user", > + OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, > INT_MAX, FLAGS }, > { NULL }, > }; > > @@ -707,3 +709,24 @@ const AVClass *avfilter_get_class(void) > { > return &avfilter_class; > } > + > +int ff_filter_init_hw_frames(AVFilterContext *avctx, AVFilterLink *link, > + int default_pool_size) > +{ > + AVHWFramesContext *frames; > + > + // Must already be set by caller. > + av_assert0(link->hw_frames_ctx); > + > + frames = (AVHWFramesContext*)link->hw_frames_ctx->data; > + > + if (frames->initial_pool_size == 0) { > + // Dynamically allocation is necessarily supported. > + } else if (avctx->extra_hw_frames >= 0) { > + frames->initial_pool_size += avctx->extra_hw_frames; > + } else { > + frames->initial_pool_size = default_pool_size; > + } > + > + return 0; > +} > diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h > index 6df69dbbb..c8f861076 100644 > --- a/libavfilter/avfilter.h > +++ b/libavfilter/avfilter.h > @@ -311,6 +311,19 @@ struct AVFilterContext { > * hardware context information. > */ > AVBufferRef *hw_device_ctx; > + > + /** > + * Sets the number of extra hardware frames which the filter will > + * allocate on its output links for use in following filters or by > + * the caller. > + * > + * Some hardware filters require all frames that they will use for > + * output to be defined in advance before filtering starts. For such > + * filters, any hardware frame pools used for output must therefore be > + * of fixed size. The extra frames set here are on top of any number > + * that the filter needs internally in order to operate normally. > + */ > + int extra_hw_frames; > }; > > /** > diff --git a/libavfilter/internal.h b/libavfilter/internal.h > index a377f9b2b..d17f917c6 100644 > --- a/libavfilter/internal.h > +++ b/libavfilter/internal.h > @@ -226,4 +226,20 @@ void ff_filter_graph_remove_filter(AVFilterGraph *graph, > AVFilterContext *filter > */ > #define FF_FILTER_FLAG_HWFRAME_AWARE (1 << 0) > > +/** > + * Perform any additional setup required for hardware frames. > + * > + * link->hw_frames_ctx must be set before calling this function. > + * Inside link->hw_frames_ctx, the fields format, sw_format, width and > + * height must be set. If dynamically allocated pools are not supported, > + * then initial_pool_size must also be set, to the minimum hardware frame > + * pool size necessary for decode (taking into account reference frames > + * and delay as appropriate). If default_pool_size is nonzero, then it > + * will be used as the pool size if no other modification takes place > + * (this can be used to preserve compatibility). > + */ > +int ff_filter_init_hw_frames(AVFilterContext *avctx, AVFilterLink *link, > + int default_pool_size); > + > + > #endif /* AVFILTER_INTERNAL_H */ Seems good. _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel