[FFmpeg-cvslog] avformat/matroskaenc: fix Tags master on seekable output if there are tags after the last stream duration

James Almer git at videolan.org
Fri Oct 7 22:50:08 EEST 2016


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Fri Oct  7 02:32:10 2016 -0300| [c45ba265fcbb57fcacf82f66cb2a2643210308e1] | committer: James Almer

avformat/matroskaenc: fix Tags master on seekable output if there are tags after the last stream duration

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 at dericed.com>
Signed-off-by: James Almer <jamrial at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c45ba265fcbb57fcacf82f66cb2a2643210308e1
---

 libavformat/matroskaenc.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 484b5d6..593ddd1 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -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);



More information about the ffmpeg-cvslog mailing list