improved the code:

>From 772232db7f6e1dc45e63929b0371acf0c13be7a1 Mon Sep 17 00:00:00 2001
From: Matthijs Tempels <matth...@townsville.nl>
Date: Thu, 29 Jan 2015 16:33:46 +0100
Subject: [PATCH] Improved %t handling to add a timestamp to the filename
 including milliseconds

---
 libavformat/utils.c | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index f6df49b..7280ebc 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -24,6 +24,8 @@
 #include <stdarg.h>
 #include <stdint.h>

+#include <sys/time.h>
+
 #include "config.h"

 #include "libavutil/avassert.h"
@@ -3804,12 +3806,16 @@ uint64_t ff_ntp_time(void)
 int av_get_frame_filename(char *buf, int buf_size, const char *path, int 
number)
 {
     const char *p;
-    char *q, buf1[20], c;
-    int nd, len, percentd_found;
+    char *q, buf1[30], buf2[30], c;
+    int nd, len, percentd_found, percentt_found;
+       long            ms; // Milliseconds
+       time_t          s;  // Seconds
+       struct timespec spec;

     q = buf;
     p = path;
     percentd_found = 0;
+    percentt_found = 0;
     for (;;) {
         c = *p++;
         if (c == '\0')
@@ -3824,7 +3830,7 @@ int av_get_frame_filename(char *buf, int buf_size, const 
char *path, int number)

             switch (c) {
             case '%':
-                goto addchar;
+                               goto addchar;
             case 'd':
                 if (percentd_found)
                     goto fail;
@@ -3836,7 +3842,22 @@ int av_get_frame_filename(char *buf, int buf_size, const 
char *path, int number)
                 memcpy(q, buf1, len);
                 q += len;
                 break;
-            default:
+                       case 't':
+                               if (percentt_found)
+                                       goto fail;
+                               percentt_found = 1;
+                               clock_gettime(CLOCK_REALTIME, &spec);
+                               s  = spec.tv_sec;
+                               ms = round(spec.tv_nsec / 1.0e6); // Convert 
nanoseconds to milliseconds
+                               strftime(buf2, sizeof(buf2), "%Y%m%d_%H%M%S", 
localtime(&s));
+                               snprintf(buf1, sizeof(buf1), "%s%03ld", buf2, 
ms);
+                               len = strlen(buf1);
+                               if ((q - buf + len) > buf_size - 1)
+                                       goto fail;
+                               memcpy(q, buf1, len);
+                               q += len;
+                               break;
+       default:
                 goto fail;
             }
         } else {
@@ -3845,7 +3866,7 @@ addchar:
                 *q++ = c;
         }
     }
-    if (!percentd_found)
+    if (!percentd_found && !percentt_found)
         goto fail;
     *q = '\0';
     return 0;
--
2.1.0




> Op 28 jan. 2015, om 14:24 heeft wm4 <nfx...@googlemail.com> het volgende 
> geschreven:
> 
> On Wed, 28 Jan 2015 14:03:06 +0100
> Matthijs Tempels <matth...@townsville.nl <mailto:matth...@townsville.nl>> 
> wrote:
> 
>> From 15952b6cb38ac2f532a2f35d50e9dc4f8320c1c5 Mon Sep 17 00:00:00 2001
>> From: Matthijs Tempels <matth...@townsville.nl>
>> Date: Wed, 28 Jan 2015 13:59:54 +0100
>> Subject: [PATCH] Added the %t option to the filename pattern to add a
>> yyyyMMdd_HHmmssfff pattern to the filename
>> 
>> ---
>> libavformat/utils.c | 18 +++++++++++++++++-
>> 1 file changed, 17 insertions(+), 1 deletion(-)
>> 
>> diff --git a/libavformat/utils.c b/libavformat/utils.c
>> index f6df49b..b57136a 100644
>> --- a/libavformat/utils.c
>> +++ b/libavformat/utils.c
>> @@ -3805,11 +3805,13 @@ int av_get_frame_filename(char *buf, int buf_size, 
>> const char *path, int number)
>> {
>>     const char *p;
>>     char *q, buf1[20], c;
>> -    int nd, len, percentd_found;
>> +    int nd, len, percentd_found, percentt_found;
>> +    struct timeval tv;
>> 
>>     q = buf;
>>     p = path;
>>     percentd_found = 0;
>> +    percentt_found = 0;
>>     for (;;) {
>>         c = *p++;
>>         if (c == '\0')
>> @@ -3836,6 +3838,20 @@ int av_get_frame_filename(char *buf, int buf_size, 
>> const char *path, int number)
>>                 memcpy(q, buf1, len);
>>                 q += len;
>>                 break;
>> +            case 't':
>> +                if (percentt_found)
>> +                    goto fail;
>> +                percentt_found = 1;
>> +                gettimeofday(&tv, NULL);
>> +                int milli = tv.tv_usec / 1000;
>> +                strftime(buf1, sizeof(buf1), "%Y%m%d_%H%M%S", 
>> localtime(&tv.tv_sec));
> 
>> +                sprintf(buf1, "%s%03d", buf1, milli);
> 
> This line tries to append some stuff to buf1, but:
> - you can't use a string both as source and destination for sprintf
> - this can actually overflow the buf1, because strftime can fill it
>  completely
> 
>> +                len = strlen(buf1);
>> +                if ((q - buf + len) > buf_size - 1)
>> +                    goto fail;
>> +                memcpy(q, buf1, len);
>> +                q += len;
>> +                break;
>>             default:
>>                 goto fail;
>>             }
>> --
>> 2.1.0
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel 
>> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel>
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel 
> <http://ffmpeg.org/mailman/listinfo/ffmpeg-devel>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to