AVFilterContext.extra_hw_frames functions identically to the field of the same name in AVCodecContext. --- (This part all unchanged.)
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 be6cd1431..6de6971fb 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 */ -- 2.11.0 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel