[FFmpeg-cvslog] lavf/mxfdec: Speed up klv_read_packet()

Tomas Härdin git at videolan.org
Tue Oct 1 20:19:50 EEST 2024


ffmpeg | branch: master | Tomas Härdin <git at haerdin.se> | Sat Sep 14 11:48:09 2024 +0200| [e3fa469a55a09901d59c37e6977e0154a1c0ce47] | committer: Tomas Härdin

lavf/mxfdec: Speed up klv_read_packet()

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e3fa469a55a09901d59c37e6977e0154a1c0ce47
---

 libavformat/mxfdec.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 24f4ed1c33..99bf352e00 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -458,10 +458,26 @@ static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size)
     return i == size;
 }
 
+// special case of mxf_read_sync for mxf_klv_key
+static int mxf_read_sync_klv(AVIOContext *pb)
+{
+    uint32_t key = avio_rb32(pb);
+    // key will never match mxf_klv_key on EOF
+    if (key == AV_RB32(mxf_klv_key))
+        return 1;
+
+    while (!avio_feof(pb)) {
+        key = (key << 8) | avio_r8(pb);
+        if (key == AV_RB32(mxf_klv_key))
+            return 1;
+    }
+    return 0;
+}
+
 static int klv_read_packet(MXFContext *mxf, KLVPacket *klv, AVIOContext *pb)
 {
     int64_t length, pos;
-    if (!mxf_read_sync(pb, mxf_klv_key, 4))
+    if (!mxf_read_sync_klv(pb))
         return AVERROR_INVALIDDATA;
     klv->offset = avio_tell(pb) - 4;
     if (klv->offset < mxf->run_in)
@@ -3982,6 +3998,7 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
             ret = klv_read_packet(mxf, &klv, s->pb);
             if (ret < 0)
                 break;
+            // klv.key[0..3] == mxf_klv_key from here forward
             max_data_size = klv.length;
             pos = klv.next_klv - klv.length;
             PRINT_KEY(s, "read packet", klv.key);



More information about the ffmpeg-cvslog mailing list