From 106ceba6661486a95f1e2e2287875b8d3b0ef1b6 Mon Sep 17 00:00:00 2001
From: Alex Agranovsky <alex@sighthound.com>
Date: Fri, 9 Oct 2015 07:33:10 -0400
Subject: [PATCH] avfilter/drawtext: allow to format pts with strftime

---
 doc/filters.texi          |  6 +++++-
 libavfilter/vf_drawtext.c | 12 +++++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 506b5a6..774aaf5 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -5398,14 +5398,18 @@ A 1 character description of the current picture type.
 
 @item pts
 The timestamp of the current frame.
-It can take up to two arguments.
+It can take up to three arguments.
 
 The first argument is the format of the timestamp; it defaults to @code{flt}
 for seconds as a decimal number with microsecond accuracy; @code{hms} stands
 for a formatted @var{[-]HH:MM:SS.mmm} timestamp with millisecond accuracy.
+@code{gmtime} stands for the timestamp of the frame formatted as UTC time; 
+@code{localtime} stands for the timestamp of the frame formatted as local time zone time.
 
 The second argument is an offset added to the timestamp.
 
+If the format is set to @code{localtime} or @code{gmtime}, third argument may be supplied:
+a strftime() format string. By default, @var{YYYY-MM-DD H:M:S} format will be used.
 @end table
 
 @subsection Examples
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index 9fd9461..cda3834 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -824,6 +824,16 @@ static int func_pts(AVFilterContext *ctx, AVBPrint *bp,
                        (int)(ms / 1000) % 60,
                        (int)ms % 1000);
         }
+    } else if (!strcmp(fmt, "localtime") || 
+               !strcmp(fmt, "gmtime")) {
+        struct tm tm;
+        time_t ms = (time_t)pts;
+        const char *timefmt = argc >= 3 ? argv[2] : "%Y-%m-%d %H:%M:%S";
+        if (!strcmp(fmt, "localtime"))
+            localtime_r(&ms, &tm);
+        else
+            gmtime_r(&ms, &tm);
+        av_bprint_strftime(bp, timefmt, &tm);
     } else {
         av_log(ctx, AV_LOG_ERROR, "Invalid format '%s'\n", fmt);
         return AVERROR(EINVAL);
@@ -958,7 +968,7 @@ static const struct drawtext_function {
     { "expr_int_format", 2, 3, 0, func_eval_expr_int_format },
     { "eif",       2, 3, 0,   func_eval_expr_int_format },
     { "pict_type", 0, 0, 0,   func_pict_type },
-    { "pts",       0, 2, 0,   func_pts      },
+    { "pts",       0, 3, 0,   func_pts      },
     { "gmtime",    0, 1, 'G', func_strftime },
     { "localtime", 0, 1, 'L', func_strftime },
     { "frame_num", 0, 0, 0,   func_frame_num },
-- 
2.3.8 (Apple Git-58)

