On 26/01/18 23:13, Mark Thompson wrote:
> AVFilterContext.extra_hw_frames functions identically to the field of
> the same name in AVCodecContext.

Of course, that field doesn't actually exist before this patch now.  Updated to 
reflect that.

Still, should the field be in AVCodecContext as well?  (The 
hw_frames_parameters API can do this for library users, but it isn't usable in 
avconv.)

- Mark


> ---
>  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 0bde3a052..645ac231a 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -13,6 +13,9 @@ libavutil:     2017-03-23
>  
>  API changes, most recent first:
>  
> +2018-xx-xx - xxxxxxx - lavfi 7.x+1.0 - avfilter.h
> +  Add AVFilterContext.extra_hw_frames.
> +
>  2017-xx-xx - xxxxxxx - lavc 58.8.0 - avcodec.h
>    Add const to AVCodecContext.hwaccel.
>  
> diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> index 83c1a7c20..2c4a385ea 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) {
> +        // Dynamic 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 */
> 
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to