diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-01-22 20:01:30 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-04-21 07:33:04 +0200 |
commit | 4dd63ae86c311da269426803d440d907cd9f66a2 (patch) | |
tree | 0cdd80b2d9d2da454838fcbfeb172aa39bbd230b | |
parent | 86de864741fdc046f353a82da526445db44c4287 (diff) | |
download | ffmpeg-4dd63ae86c311da269426803d440d907cd9f66a2.tar.gz |
avformat/matroskaenc: Don't use size of inexistent Cluster
In order to determine whether the current Cluster needs to be closed
because of the limits on clustersize and clustertime,
mkv_write_packet() would first get the size of the current Cluster by
applying avio_tell() on the dynamic buffer holding the current Cluster.
It did this without checking whether there is a dynamic buffer for
writing Clusters open right now.
In this case (which happens when writing the first packet)
avio_tell() returned AVERROR(EINVAL); yet it is not good to rely on
avio_tell() (or actually, avio_seek()) to handle the situation
gracefully.
Fixing this is easy: Only check whether a Cluster needs to be closed
if a Cluster is in fact open.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r-- | libavformat/matroskaenc.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 2cd5933da8..5e0346d341 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2332,6 +2332,7 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) return ret; + if (mkv->cluster_pos != -1) { if (mkv->tracks[pkt->stream_index].write_dts) cluster_time = pkt->dts - mkv->cluster_pts; else @@ -2359,9 +2360,10 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) start_new_cluster = 0; } - if (mkv->cluster_pos != -1 && start_new_cluster) { + if (start_new_cluster) { mkv_end_cluster(s); } + } if (!mkv->cluster_pos) avio_write_marker(s->pb, |