[FFmpeg-devel] [PATCH] Add support for drawing PTS in HHMMSSms format to vf_drawtext

hjiodjf 97xgw46 jfbvxt at gmail.com
Fri Apr 25 19:04:15 CEST 2014


On Fri, Apr 25, 2014 at 5:04 AM, Nicolas George <george at nsup.org> wrote:
> Le quintidi 5 floréal, an CCXXII, hjiodjf 97xgw46 a écrit :
>> Thank you for pointing this out. I've simplified my patch and
>> converted it to use an expansion function.
>
> Thanks. A few more comments.
>
>> From 3fb6b22d59b5216717907f591e1b57f0bad80c7d Mon Sep 17 00:00:00 2001
>> From: tue46wsdgxfjrt <jfbvxt at gmail.com>
>> Date: Wed, 19 Mar 2014 13:26:11 -0700
>> Subject: [PATCH 2/2] Add support for drawing wall clock timestamps to
>>  vf_drawtext.
>>
>> ---
>>  doc/filters.texi          |  3 +++
>>  libavfilter/vf_drawtext.c | 25 +++++++++++++++++++++++++
>>  2 files changed, 28 insertions(+)
>>
>> diff --git a/doc/filters.texi b/doc/filters.texi
>> index e943923..6c437e0 100644
>> --- a/doc/filters.texi
>> +++ b/doc/filters.texi
>> @@ -3852,6 +3852,9 @@ A 1 character description of the current picture type.
>>  @item pts
>>  The timestamp of the current frame, in seconds, with microsecond accuracy.
>>
>> + at item timestamp
>
>> +The timestamp of the current frame as HH:MM:SS.ms, with millisecond accuracy.
>
> Maybe "HH:MM:SS.mmm", to make more obvious that millisecond means three
> digits.
>
>> +
>>  @end table
>>
>>  @subsection Examples
>> diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
>> index 280abb8..973f811 100644
>> --- a/libavfilter/vf_drawtext.c
>> +++ b/libavfilter/vf_drawtext.c
>> @@ -700,6 +700,30 @@ static int func_pts(AVFilterContext *ctx, AVBPrint *bp,
>>      return 0;
>>  }
>>
>> +static int func_timestamp(AVFilterContext *ctx, AVBPrint *bp,
>> +                          char *fct, unsigned argc, char **argv, int tag)
>> +{
>> +    DrawTextContext *s = ctx->priv;
>> +    int64_t ts = 0;
>> +    int hh, mm, ss, ms;
>> +
>
>> +    if (argc > 0) {
>> +        ts += round(atof(argv[0]) * 1000);
>> +    }
>
> I assume this means that %{timestamp:42} will shift the timestamps by 42
> seconds, but it is not explained in the doc. And it is a bit strange to have
> that feature for timestamp and not pts.
>
> Also, maybe use av_parse_time(), that would avoid floats completely.
>
>> +    ts += round(s->var_values[VAR_T] * 1000);
>
> The rest of the code seems to handle the NOPTS case, so I suppose it should
> be handled here too.
>
>> +
>> +    hh = ts / (3600 * 1000);
>> +    ts = ts % (3600 * 1000);
>> +    mm = ts / (60 * 1000);
>> +    ts = ts % (60 * 1000);
>> +    ss = ts / 1000;
>> +    ts = ts % 1000;
>> +    ms = ts;
>> +
>> +    av_bprintf(bp, "%02d:%02d:%02d.%03d", hh, mm, ss, ms);
>
> Also, negative case is not handled gracefully.
>
>> +    return 0;
>> +}
>> +
>>  static int func_frame_num(AVFilterContext *ctx, AVBPrint *bp,
>>                            char *fct, unsigned argc, char **argv, int tag)
>>  {
>> @@ -773,6 +797,7 @@ static const struct drawtext_function {
>>      { "e",         1, 1, 0,   func_eval_expr },
>>      { "pict_type", 0, 0, 0,   func_pict_type },
>>      { "pts",       0, 0, 0,   func_pts      },
>
>> +    { "timestamp", 0, 1, 0,   func_timestamp },
>
> I find the name "timestamp" a big vague, but I have no better proposal than
> "hmspts".
>
>>      { "gmtime",    0, 1, 'G', func_strftime },
>>      { "localtime", 0, 1, 'L', func_strftime },
>>      { "frame_num", 0, 0, 0,   func_frame_num },
>
> I have an alternate proposal. Please comment. And tel me if you want to be
> co-credited.
>
> Regards,
>
> --
>   Nicolas George

I'm perfectly fine with combining this functionality into the %{pts}
expansion. Does av_parse_time correctly handle both formatted time and
decimal seconds?

No need to worry about credits.


More information about the ffmpeg-devel mailing list