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

Submitted by Paul B Mahol on Nov. 29, 2017, 7:29 p.m.

Details

Message ID 20171129192949.19952-1-onemda@gmail.com
State New
Headers show

Commit Message

Paul B Mahol Nov. 29, 2017, 7:29 p.m.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 doc/filters.texi      |  5 +++++
 libavfilter/vf_tile.c | 16 +++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

Comments

Moritz Barsnick Nov. 30, 2017, 2:10 p.m.
On Wed, Nov 29, 2017 at 20:29:49 +0100, Paul B Mahol wrote:
> +    { "init_padding", " set how many frames to initially pad", OFFSET(init_padding),
                          ^ space
Some whitespace slipped in there. 

> +        if (tile->first_frame)
> +            tile->first_frame = 0;

Wouldn't
           tile->first_frame = 0;
be faster and easier? Or did you mean to use different variables in the
check and the assignment?

Moritz
Nicolas George Nov. 30, 2017, 2:12 p.m.
Moritz Barsnick (2017-11-30):
> Wouldn't
>            tile->first_frame = 0;
> be faster and easier? Or did you mean to use different variables in the
> check and the assignment?

Or even clearing the option after is has been used. Single test, single
field: faster, less memory, less code.

Regards,
Paul B Mahol Nov. 30, 2017, 4:57 p.m.
On 11/30/17, Nicolas George <george@nsup.org> wrote:
> Moritz Barsnick (2017-11-30):
>> Wouldn't
>>            tile->first_frame = 0;
>> be faster and easier? Or did you mean to use different variables in the
>> check and the assignment?
>
> Or even clearing the option after is has been used. Single test, single
> field: faster, less memory, less code.

I like nano-optimizations!

Should I commit with that changed or send another one for review?
Nicolas George Dec. 1, 2017, 9:04 a.m.
Paul B Mahol (2017-11-30):
> I like nano-optimizations!

If it makes the code negligibly faster at the cost of making it more
complex, it is a nano-optimization. In this case, since it makes the
code both simpler and faster, it is just better coding.

> Should I commit with that changed or send another one for review?

Go ahead.

Regards,

Patch hide | download patch | download mbox

diff --git a/doc/filters.texi b/doc/filters.texi
index 4a4efc70c8..ec37b9dcb8 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -14637,6 +14637,11 @@  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 frames to initially be empty before displaying first output frame.
+This controls how soon will one get 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..924cfe77bb 100644
--- a/libavfilter/vf_tile.c
+++ b/libavfilter/vf_tile.c
@@ -38,6 +38,8 @@  typedef struct TileContext {
     unsigned margin;
     unsigned padding;
     unsigned overlap;
+    unsigned init_padding;
+    unsigned first_frame;
     unsigned current;
     unsigned nb_frames;
     FFDrawContext draw;
@@ -62,6 +64,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 +103,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);
+    } else {
+        tile->current = tile->init_padding;
+    }
+    tile->first_frame = 1;
+
     return 0;
 }
 
@@ -201,11 +212,14 @@  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 && tile->first_frame))
             ff_fill_rectangle(&tile->draw, &tile->blank,
                               tile->out_ref->data,
                               tile->out_ref->linesize,
                               0, 0, outlink->w, outlink->h);
+        if (tile->first_frame)
+            tile->first_frame = 0;
     }
 
     if (tile->prev_out_ref) {