diff mbox series

[FFmpeg-devel,10/25] avformat/matroskaenc: Factor writing Info out

Message ID AM7PR03MB6660203E840C65CFE2610D668F569@AM7PR03MB6660.eurprd03.prod.outlook.com
State Accepted
Commit 6221491f9027c55464c3995d67c30e000608ddb2
Headers show
Series [FFmpeg-devel,01/25] avformat/matroskaenc: Fix potential overflow | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_aarch64_jetson success Make finished
andriy/make_fate_aarch64_jetson success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished

Commit Message

Andreas Rheinhardt Jan. 16, 2022, 11:03 p.m. UTC
Avoids the surprise of using pb for the main AVIOContext
at the beginning and end of mkv_write_header() and for
for the dynamic buffer opened for the Info element
in the middle of mkv_write_header().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavformat/matroskaenc.c | 64 +++++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 29 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index fa58f1e171..fb790ebe8b 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -2175,36 +2175,13 @@  static void ebml_write_header(AVIOContext *pb,
     ebml_writer_write(&writer, pb);
 }
 
-static int mkv_write_header(AVFormatContext *s)
+static int mkv_write_info(AVFormatContext *s)
 {
     MatroskaMuxContext *mkv = s->priv_data;
-    AVIOContext *pb = s->pb;
     const AVDictionaryEntry *tag;
-    int ret, i, version = 2;
     int64_t creation_time;
-
-    if (!IS_WEBM(mkv) ||
-        av_dict_get(s->metadata, "stereo_mode", NULL, 0) ||
-        av_dict_get(s->metadata, "alpha_mode", NULL, 0))
-        version = 4;
-
-    for (i = 0; i < s->nb_streams; i++) {
-        if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_OPUS ||
-            av_dict_get(s->streams[i]->metadata, "stereo_mode", NULL, 0) ||
-            av_dict_get(s->streams[i]->metadata, "alpha_mode", NULL, 0))
-            version = 4;
-    }
-
-    ebml_write_header(pb, s->oformat->name, version);
-    put_ebml_id(pb, MATROSKA_ID_SEGMENT);
-    put_ebml_size_unknown(pb, 8);
-    mkv->segment_offset = avio_tell(pb);
-
-    // We write a SeekHead at the beginning to point to all other level
-    // one elements (except Clusters).
-    mkv_start_seekhead(mkv, pb);
-
-    ret = start_ebml_master_crc32(&mkv->info.bc, mkv);
+    AVIOContext *pb;
+    int ret = start_ebml_master_crc32(&mkv->info.bc, mkv);
     if (ret < 0)
         return ret;
     pb = mkv->info.bc;
@@ -2253,11 +2230,40 @@  static int mkv_write_header(AVFormatContext *s)
             put_ebml_void(pb, 11);              // assumes double-precision float to be written
         }
     }
-    ret = end_ebml_master_crc32_tentatively(s->pb, &mkv->info,
-                                            mkv, MATROSKA_ID_INFO);
+    return end_ebml_master_crc32_tentatively(s->pb, &mkv->info,
+                                             mkv, MATROSKA_ID_INFO);
+}
+
+static int mkv_write_header(AVFormatContext *s)
+{
+    MatroskaMuxContext *mkv = s->priv_data;
+    AVIOContext *pb = s->pb;
+    int ret, version = 2;
+
+    if (!IS_WEBM(mkv) ||
+        av_dict_get(s->metadata, "stereo_mode", NULL, 0) ||
+        av_dict_get(s->metadata, "alpha_mode", NULL, 0))
+        version = 4;
+
+    for (unsigned i = 0; i < s->nb_streams; i++) {
+        if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_OPUS ||
+            av_dict_get(s->streams[i]->metadata, "stereo_mode", NULL, 0) ||
+            av_dict_get(s->streams[i]->metadata, "alpha_mode", NULL, 0))
+            version = 4;
+    }
+
+    ebml_write_header(pb, s->oformat->name, version);
+    put_ebml_id(pb, MATROSKA_ID_SEGMENT);
+    put_ebml_size_unknown(pb, 8);
+    mkv->segment_offset = avio_tell(pb);
+
+    // We write a SeekHead at the beginning to point to all other level
+    // one elements (except Clusters).
+    mkv_start_seekhead(mkv, pb);
+
+    ret = mkv_write_info(s);
     if (ret < 0)
         return ret;
-    pb = s->pb;
 
     ret = mkv_write_tracks(s);
     if (ret < 0)