diff mbox

[FFmpeg-devel] avfilter/vf_tile: add init_padding option

Message ID 20171124211213.24375-1-onemda@gmail.com
State Superseded
Headers show

Commit Message

Paul B Mahol Nov. 24, 2017, 9:12 p.m. UTC
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 doc/filters.texi      |  4 ++++
 libavfilter/vf_tile.c | 12 +++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

Comments

Nicolas George Nov. 26, 2017, 6:29 p.m. UTC | #1
Paul B Mahol (2017-11-24):
> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> ---
>  doc/filters.texi      |  4 ++++
>  libavfilter/vf_tile.c | 12 +++++++++++-
>  2 files changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 76929e4db5..11ce0482c2 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -14497,6 +14497,10 @@ is "black".
>  @item overlap
>  Set the number of frames to overlap when tiling several successive frames together.
>  The value must be between @code{0} and @var{nb_frames - 1}.
> +

> +@item init_padding
> +Set the number of input frames to initially consume before displaying first output frame.
> +The value must be between @code{0} and @var{nb_frames - 1}.

The documentations says that, the code does the opposite.

>  @end table
>  
>  @subsection Examples
> diff --git a/libavfilter/vf_tile.c b/libavfilter/vf_tile.c
> index 7717ce12e7..c78fa611dd 100644
> --- a/libavfilter/vf_tile.c
> +++ b/libavfilter/vf_tile.c
> @@ -38,6 +38,7 @@ typedef struct TileContext {
>      unsigned margin;
>      unsigned padding;
>      unsigned overlap;
> +    unsigned init_padding;
>      unsigned current;
>      unsigned nb_frames;
>      FFDrawContext draw;
> @@ -62,6 +63,8 @@ static const AVOption tile_options[] = {
>      { "color",   "set the color of the unused area", OFFSET(rgba_color), AV_OPT_TYPE_COLOR, {.str = "black"}, .flags = FLAGS },
>      { "overlap", "set how many frames to overlap for each render", OFFSET(overlap),
>          AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
> +    { "init_padding", " set how many frames to initially pad", OFFSET(init_padding),
> +        AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
>      { NULL }
>  };
>  
> @@ -99,6 +102,13 @@ static av_cold int init(AVFilterContext *ctx)
>          tile->overlap = tile->nb_frames - 1;
>      }
>  
> +    if (tile->init_padding >= tile->nb_frames) {
> +        av_log(ctx, AV_LOG_WARNING, "init_padding must be less than %d\n", tile->nb_frames);

> +        tile->current = 0;

Unnecessary and confusing.

> +    } else {
> +        tile->current = tile->init_padding;
> +    }
> +
>      return 0;
>  }
>  
> @@ -201,7 +211,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
>          tile->out_ref->height = outlink->h;
>  
>          /* fill surface once for margin/padding */

> -        if (tile->margin || tile->padding)
> +        if (tile->margin || tile->padding || tile->init_padding != 0)

This change should only be applied to the first frame.

>              ff_fill_rectangle(&tile->draw, &tile->blank,
>                                tile->out_ref->data,
>                                tile->out_ref->linesize,

Regards,
diff mbox

Patch

diff --git a/doc/filters.texi b/doc/filters.texi
index 76929e4db5..11ce0482c2 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -14497,6 +14497,10 @@  is "black".
 @item overlap
 Set the number of frames to overlap when tiling several successive frames together.
 The value must be between @code{0} and @var{nb_frames - 1}.
+
+@item init_padding
+Set the number of input frames to initially consume before displaying first output frame.
+The value must be between @code{0} and @var{nb_frames - 1}.
 @end table
 
 @subsection Examples
diff --git a/libavfilter/vf_tile.c b/libavfilter/vf_tile.c
index 7717ce12e7..c78fa611dd 100644
--- a/libavfilter/vf_tile.c
+++ b/libavfilter/vf_tile.c
@@ -38,6 +38,7 @@  typedef struct TileContext {
     unsigned margin;
     unsigned padding;
     unsigned overlap;
+    unsigned init_padding;
     unsigned current;
     unsigned nb_frames;
     FFDrawContext draw;
@@ -62,6 +63,8 @@  static const AVOption tile_options[] = {
     { "color",   "set the color of the unused area", OFFSET(rgba_color), AV_OPT_TYPE_COLOR, {.str = "black"}, .flags = FLAGS },
     { "overlap", "set how many frames to overlap for each render", OFFSET(overlap),
         AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
+    { "init_padding", " set how many frames to initially pad", OFFSET(init_padding),
+        AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS },
     { NULL }
 };
 
@@ -99,6 +102,13 @@  static av_cold int init(AVFilterContext *ctx)
         tile->overlap = tile->nb_frames - 1;
     }
 
+    if (tile->init_padding >= tile->nb_frames) {
+        av_log(ctx, AV_LOG_WARNING, "init_padding must be less than %d\n", tile->nb_frames);
+        tile->current = 0;
+    } else {
+        tile->current = tile->init_padding;
+    }
+
     return 0;
 }
 
@@ -201,7 +211,7 @@  static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
         tile->out_ref->height = outlink->h;
 
         /* fill surface once for margin/padding */
-        if (tile->margin || tile->padding)
+        if (tile->margin || tile->padding || tile->init_padding != 0)
             ff_fill_rectangle(&tile->draw, &tile->blank,
                               tile->out_ref->data,
                               tile->out_ref->linesize,