Re: [libav-devel] [PATCH 06/10] lavfi: Add support for modifying hardware frame pool sizes

2017-08-07 Thread wm4
On Sat,  5 Aug 2017 23:53:07 +0100
Mark Thompson  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 - xxx - lavfi 7.x+1.0 - avfilter.h
> +  Add AVFilterContext.extra_hw_frames.
> +
>  2017-xx-xx - xxx - 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

[libav-devel] [PATCH 06/10] lavfi: Add support for modifying hardware frame pool sizes

2017-08-05 Thread Mark Thompson
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 - xxx - lavfi 7.x+1.0 - avfilter.h
+  Add AVFilterContext.extra_hw_frames.
+
 2017-xx-xx - xxx - 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