avformat/matroskaenc: fix Tags master on seekable output if there are tags after...
authorJames Almer <jamrial@gmail.com>
Fri, 7 Oct 2016 05:32:10 +0000 (02:32 -0300)
committerJames Almer <jamrial@gmail.com>
Fri, 7 Oct 2016 19:46:45 +0000 (16:46 -0300)
The dynamic AVIOContext would get closed pointing to the wrong position
in the buffer.
This is a regression since 650e17d88b63b5aca6e0a43483e89e64b0f7d2dd.

Reviewed-by: Dave Rice <dave@dericed.com>
Signed-off-by: James Almer <jamrial@gmail.com>
libavformat/matroskaenc.c

index 484b5d6..593ddd1 100644 (file)
@@ -2264,17 +2264,19 @@ static int mkv_write_trailer(AVFormatContext *s)
         end_ebml_master_crc32(pb, &mkv->info_bc, mkv, mkv->info);
 
         // update stream durations
-        if (mkv->stream_durations) {
+        if (!mkv->is_live && mkv->stream_durations) {
             int i;
+            int64_t curr = avio_tell(mkv->tags_bc);
             for (i = 0; i < s->nb_streams; ++i) {
                 AVStream *st = s->streams[i];
-                double duration_sec = mkv->stream_durations[i] * av_q2d(st->time_base);
-                char duration_string[20] = "";
 
-                av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i,
-                       mkv->stream_durations[i]);
+                if (mkv->stream_duration_offsets[i] > 0) {
+                    double duration_sec = mkv->stream_durations[i] * av_q2d(st->time_base);
+                    char duration_string[20] = "";
+
+                    av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i,
+                           mkv->stream_durations[i]);
 
-                if (!mkv->is_live && mkv->stream_duration_offsets[i] > 0) {
                     avio_seek(mkv->tags_bc, mkv->stream_duration_offsets[i], SEEK_SET);
 
                     snprintf(duration_string, 20, "%02d:%02d:%012.9f",
@@ -2284,6 +2286,7 @@ static int mkv_write_trailer(AVFormatContext *s)
                     put_ebml_binary(mkv->tags_bc, MATROSKA_ID_TAGSTRING, duration_string, 20);
                 }
             }
+            avio_seek(mkv->tags_bc, curr, SEEK_SET);
         }
         if (mkv->tags.pos && !mkv->is_live) {
             avio_seek(pb, mkv->tags.pos, SEEK_SET);