]> git.sesse.net Git - ffmpeg/commitdiff
avformat/hlsenc: Emulate strftime("%z") using other functions if it does not work
authorMichael Niedermayer <michael@niedermayer.cc>
Wed, 14 Sep 2016 23:01:51 +0000 (01:01 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Thu, 15 Sep 2016 00:31:42 +0000 (02:31 +0200)
This should fix the code on windows

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavformat/hlsenc.c

index 46b439d796448a84e8ff3d3301420881016431be..0ca59329b6a1e07a05ef0bff508e6fc021065a0b 100644 (file)
@@ -537,7 +537,7 @@ static int hls_window(AVFormatContext *s, int last)
              avio_printf(out, "#EXT-X-BYTERANGE:%"PRIi64"@%"PRIi64"\n",
                          en->size, en->pos);
         if (hls->flags & HLS_PROGRAM_DATE_TIME) {
-            time_t tt;
+            time_t tt, wrongsecs;
             int milli;
             struct tm *tm, tmpbuf;
             char buf0[128], buf1[128];
@@ -545,8 +545,18 @@ static int hls_window(AVFormatContext *s, int last)
             milli = av_clip(lrint(1000*(prog_date_time - tt)), 0, 999);
             tm = localtime_r(&tt, &tmpbuf);
             strftime(buf0, sizeof(buf0), "%Y-%m-%dT%H:%M:%S", tm);
-            if (!strftime(buf1, sizeof(buf1), "%z", tm))
-                av_strlcpy(buf1, "Z", sizeof(buf1));
+            if (!strftime(buf1, sizeof(buf1), "%z", tm) || buf1[1]<'0' ||buf1[1]>'2') {
+                int tz_min, dst = tm->tm_isdst;
+                tm = gmtime_r(&tt, &tmpbuf);
+                tm->tm_isdst = dst;
+                wrongsecs = mktime(tm);
+                tz_min = (abs(wrongsecs - tt) + 30) / 60;
+                snprintf(buf1, sizeof(buf1),
+                         "%c%02d%02d",
+                         wrongsecs <= tt ? '+' : '-',
+                         tz_min / 60,
+                         tz_min % 60);
+            }
             avio_printf(out, "#EXT-X-PROGRAM-DATE-TIME:%s.%03d%s\n", buf0, milli, buf1);
             prog_date_time += en->duration;
         }