lavfi/testsrc: add "decimals" option to the testsrc filter
This commit is contained in:
parent
9f7144b44c
commit
a798c20a76
@ -3237,6 +3237,14 @@ See also the function @code{av_parse_time()}.
|
|||||||
|
|
||||||
If not specified, or the expressed duration is negative, the video is
|
If not specified, or the expressed duration is negative, the video is
|
||||||
supposed to be generated forever.
|
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
|
@end table
|
||||||
|
|
||||||
For example the following:
|
For example the following:
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#define LIBAVFILTER_VERSION_MAJOR 2
|
#define LIBAVFILTER_VERSION_MAJOR 2
|
||||||
#define LIBAVFILTER_VERSION_MINOR 59
|
#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, \
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
LIBAVFILTER_VERSION_MINOR, \
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
@ -47,6 +47,7 @@ typedef struct {
|
|||||||
char *rate; ///< video frame rate
|
char *rate; ///< video frame rate
|
||||||
char *duration; ///< total duration of the generated video
|
char *duration; ///< total duration of the generated video
|
||||||
AVRational sar; ///< sample aspect ratio
|
AVRational sar; ///< sample aspect ratio
|
||||||
|
int nb_decimals;
|
||||||
|
|
||||||
void (* fill_picture_fn)(AVFilterContext *ctx, AVFilterBufferRef *picref);
|
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 },
|
{ "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 },
|
{ "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 },
|
{ "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 },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -97,6 +100,12 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
|
|||||||
return ret;
|
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.num = frame_rate_q.den;
|
||||||
test->time_base.den = frame_rate_q.num;
|
test->time_base.den = frame_rate_q.num;
|
||||||
test->max_pts = duration >= 0 ?
|
test->max_pts = duration >= 0 ?
|
||||||
@ -361,7 +370,11 @@ static void test_fill_picture(AVFilterContext *ctx, AVFilterBufferRef *picref)
|
|||||||
/* draw digits */
|
/* draw digits */
|
||||||
seg_size = width / 80;
|
seg_size = width / 80;
|
||||||
if (seg_size >= 1 && height >= 13 * seg_size) {
|
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;
|
x = width - (width - seg_size * 64) / 2;
|
||||||
y = (height - seg_size * 13) / 2;
|
y = (height - seg_size * 13) / 2;
|
||||||
p = data + (x*3 + y * picref->linesize[0]);
|
p = data + (x*3 + y * picref->linesize[0]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user