aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2016-10-07 02:32:10 -0300
committerJames Almer <jamrial@gmail.com>2016-10-07 16:46:45 -0300
commitc45ba265fcbb57fcacf82f66cb2a2643210308e1 (patch)
tree3de99d92c85564e0f3439078a5e427c3f03c30b5
parent72061177f38381ff3e365d89e1c99685eaeaed9a (diff)
downloadffmpeg-c45ba265fcbb57fcacf82f66cb2a2643210308e1.tar.gz
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@dericed.com> Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r--libavformat/matroskaenc.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 484b5d6191..593ddd1843 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);