[FFmpeg-devel] [PATCH 4/5] avformat/matroskaenc: Refactor writing EBML lengths

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Fri Apr 17 02:54:34 EEST 2020


This commit factors the ability to write ordinary EBML numbers out of
the functions for writing EBML lengths. This is in preparation for
future commits.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
 libavformat/matroskaenc.c | 36 ++++++++++++++++++++++++++----------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 7cea813dc0..92cd819312 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -190,19 +190,38 @@ static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
 }
 
 /**
- * Calculate how many bytes are needed to represent the length field
- * of an EBML element whose payload has a given length.
+ * Returns how many bytes are needed to represent a number
+ * as EBML variable length integer.
  */
-static int ebml_length_size(uint64_t length)
+static int ebml_num_size(uint64_t num)
 {
     int bytes = 0;
-    length++;
     do {
         bytes++;
-    } while (length >>= 7);
+    } while (num >>= 7);
     return bytes;
 }
 
+/**
+ * Calculate how many bytes are needed to represent the length field
+ * of an EBML element whose payload has a given length.
+ */
+static int ebml_length_size(uint64_t length)
+{
+    return ebml_num_size(length + 1);
+}
+
+/**
+ * Write a number as EBML variable length integer on `bytes` bytes.
+ * `bytes` is taken literally without checking.
+ */
+static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
+{
+    num |= 1ULL << bytes * 7;
+    for (int i = bytes - 1; i >= 0; i--)
+        avio_w8(pb, (uint8_t)(num >> i * 8));
+}
+
 /**
  * Write a length as EBML variable length integer.
  *
@@ -211,7 +230,7 @@ static int ebml_length_size(uint64_t length)
  */
 static void put_ebml_length(AVIOContext *pb, uint64_t length, int bytes)
 {
-    int i, needed_bytes = ebml_length_size(length);
+    int needed_bytes = ebml_length_size(length);
 
     // sizes larger than this are currently undefined in EBML
     av_assert0(length < (1ULL << 56) - 1);
@@ -221,10 +240,7 @@ static void put_ebml_length(AVIOContext *pb, uint64_t length, int bytes)
     // The bytes needed to write the given size must not exceed
     // the bytes that we ought to use.
     av_assert0(bytes >= needed_bytes);
-
-    length |= 1ULL << bytes * 7;
-    for (i = bytes - 1; i >= 0; i--)
-        avio_w8(pb, (uint8_t)(length >> i * 8));
+    put_ebml_num(pb, length, bytes);
 }
 
 /**
-- 
2.20.1



More information about the ffmpeg-devel mailing list