[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