lavfi/testsrc: add "decimals" option to the testsrc filter
authorStefano Sabatini <stefasab@gmail.com>
Tue, 10 Jan 2012 10:20:21 +0000 (11:20 +0100)
committerStefano Sabatini <stefasab@gmail.com>
Tue, 17 Jan 2012 11:03:30 +0000 (12:03 +0100)
doc/filters.texi
libavfilter/version.h
libavfilter/vsrc_testsrc.c

index 2afc1d3..3c9f554 100644 (file)
@@ -3237,6 +3237,14 @@ See also the function @code{av_parse_time()}.
 
 If not specified, or the expressed duration is negative, the video is
 supposed to be generated forever.
+
+@item decimals, n
+Set the number of decimals to show in the timestamp, only used in the
+@code{testsrc} source.
+
+The displayed timestamp value will correspond to the original
+timestamp value multiplied by the power of 10 of the specified
+value. Default value is 0.
 @end table
 
 For example the following:
index 0eb5f7e..d2af525 100644 (file)
@@ -30,7 +30,7 @@
 
 #define LIBAVFILTER_VERSION_MAJOR  2
 #define LIBAVFILTER_VERSION_MINOR 59
-#define LIBAVFILTER_VERSION_MICRO 100
+#define LIBAVFILTER_VERSION_MICRO 101
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                LIBAVFILTER_VERSION_MINOR, \
index 7336f98..0839a2b 100644 (file)
@@ -47,6 +47,7 @@ typedef struct {
     char *rate;                 ///< video frame rate
     char *duration;             ///< total duration of the generated video
     AVRational sar;             ///< sample aspect ratio
+    int nb_decimals;
 
     void (* fill_picture_fn)(AVFilterContext *ctx, AVFilterBufferRef *picref);
 
@@ -64,6 +65,8 @@ static const AVOption testsrc_options[]= {
     { "duration", "set video duration", OFFSET(duration), AV_OPT_TYPE_STRING, {.str = NULL},      0, 0 },
     { "d",        "set video duration", OFFSET(duration), AV_OPT_TYPE_STRING, {.str = NULL},      0, 0 },
     { "sar",      "set video sample aspect ratio", OFFSET(sar), AV_OPT_TYPE_RATIONAL, {.dbl= 1},  0, INT_MAX },
+    { "decimals", "set number of decimals to show", OFFSET(nb_decimals), AV_OPT_TYPE_INT, {.dbl=0},  INT_MIN, INT_MAX },
+    { "n",        "set number of decimals to show", OFFSET(nb_decimals), AV_OPT_TYPE_INT, {.dbl=0},  INT_MIN, INT_MAX },
     { NULL },
 };
 
@@ -97,6 +100,12 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
         return ret;
     }
 
+    if (test->nb_decimals && strcmp(ctx->filter->name, "testsrc")) {
+        av_log(ctx, AV_LOG_WARNING,
+               "Option 'decimals' is ignored with source '%s'\n",
+               ctx->filter->name);
+    }
+
     test->time_base.num = frame_rate_q.den;
     test->time_base.den = frame_rate_q.num;
     test->max_pts = duration >= 0 ?
@@ -361,7 +370,11 @@ static void test_fill_picture(AVFilterContext *ctx, AVFilterBufferRef *picref)
     /* draw digits */
     seg_size = width / 80;
     if (seg_size >= 1 && height >= 13 * seg_size) {
-        second = test->nb_frame * test->time_base.num / test->time_base.den;
+        double time = av_q2d(test->time_base) * test->nb_frame *
+                      pow(10, test->nb_decimals);
+        if (time > INT_MAX)
+            return;
+        second = (int)time;
         x = width - (width - seg_size * 64) / 2;
         y = (height - seg_size * 13) / 2;
         p = data + (x*3 + y * picref->linesize[0]);