mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-03-09 14:08:07 +00:00
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 650e17d88b
.
Reviewed-by: Dave Rice <dave@dericed.com>
Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
72061177f3
commit
c45ba265fc
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user