[FFmpeg-cvslog] avformat/bonk: add support for ID3 metadata

Paul B Mahol git at videolan.org
Mon Jan 2 20:51:19 EET 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Jan  2 19:37:19 2023 +0100| [cc2b1a325162fd76969ce21fff9ba84228bc8212] | committer: Paul B Mahol

avformat/bonk: add support for ID3 metadata

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

 libavformat/bonk.c | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/libavformat/bonk.c b/libavformat/bonk.c
index 0fff0b5bda..7ce895fa96 100644
--- a/libavformat/bonk.c
+++ b/libavformat/bonk.c
@@ -20,9 +20,11 @@
  */
 
 #include "libavutil/intreadwrite.h"
+#include "avio_internal.h"
 #include "avformat.h"
 #include "demux.h"
 #include "internal.h"
+#include "id3v2.h"
 #include "rawdec.h"
 
 static int bonk_probe(const AVProbeData *p)
@@ -45,8 +47,6 @@ static int bonk_probe(const AVProbeData *p)
             if (AV_RL16(p->buf + i + 20) == 0)
                 return 0;
             return AVPROBE_SCORE_MAX;
-        } else if (!p->buf[i]) {
-            break;
         }
     }
 
@@ -55,15 +55,35 @@ static int bonk_probe(const AVProbeData *p)
 
 static int bonk_read_header(AVFormatContext *s)
 {
+    ID3v2ExtraMeta *extra_meta;
     AVStream *st;
     int ret;
 
     for (int i = 0; !avio_feof(s->pb); i++) {
-        int b = avio_r8(s->pb);
-        if (!b && avio_rl32(s->pb) == MKTAG('B','O','N','K'))
-            break;
-        else if (!b)
-            return AVERROR_INVALIDDATA;
+        const int b = avio_r8(s->pb);
+        if (!b) {
+            uint32_t t;
+            int ret = ffio_ensure_seekback(s->pb, 3);
+
+            if (ret < 0)
+                return ret;
+
+            t = avio_rl32(s->pb);
+            if (t == MKTAG('B','O','N','K')) {
+                break;
+            } else if (t == MKTAG(' ','I','D','3')) {
+                avio_seek(s->pb, -3, SEEK_CUR);
+                ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &extra_meta, 0);
+                if (extra_meta) {
+                    ff_id3v2_parse_apic(s, extra_meta);
+                    ff_id3v2_parse_priv(s, extra_meta);
+                    ff_id3v2_free_extra_meta(&extra_meta);
+                }
+                avio_skip(s->pb, 8);
+            } else {
+                return AVERROR_INVALIDDATA;
+            }
+        }
     }
 
     st = avformat_new_stream(s, NULL);



More information about the ffmpeg-cvslog mailing list