Yes, these files do exist

Signed-off-by: Vladimir Pantelic <[email protected]>
---
 Changelog            |    1 +
 libavformat/asfdec.c |   24 +++++++++++++++++++++---
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/Changelog b/Changelog
index c235727..f56c112 100644
--- a/Changelog
+++ b/Changelog
@@ -3,6 +3,7 @@ releases are sorted from youngest to oldest.
 
 version 10:
 - av_strnstr
+- support ID3v2 tags in ASF files
 
 
 version 9:
diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
index 51422ea..3329814 100644
--- a/libavformat/asfdec.c
+++ b/libavformat/asfdec.c
@@ -277,6 +277,16 @@ fail:
     return ret;
 }
 
+static void get_id3_tag(AVFormatContext *s, int len)
+{
+    ID3v2ExtraMeta *id3v2_extra_meta = NULL;
+
+    ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
+    if (id3v2_extra_meta)
+        ff_id3v2_parse_apic(s, &id3v2_extra_meta);
+    ff_id3v2_free_extra_meta(&id3v2_extra_meta);
+}
+
 static void get_tag(AVFormatContext *s, const char *key, int type, int len, 
int type2_size)
 {
     char *value;
@@ -291,12 +301,18 @@ static void get_tag(AVFormatContext *s, const char *key, 
int type, int len, int
 
     if (type == 0) {         // UTF16-LE
         avio_get_str16le(s->pb, len, value, 2 * len + 1);
+    } else if (type == 1) {  // byte array
+        if (!strcmp(key, "WM/Picture")) { // handle cover art
+            asf_read_picture(s, len);
+        } else if (!strcmp(key, "ID3")) { // handle ID3 tag
+            get_id3_tag(s, len);
+        } else {
+            av_dlog(s, "Unsupported byte array in tag %s.\n", key);
+        }
+        goto finish;
     } else if (type > 1 && type <= 5) {  // boolean or DWORD or QWORD or WORD
         uint64_t num = get_value(s->pb, type, type2_size);
         snprintf(value, len, "%"PRIu64, num);
-    } else if (type == 1 && !strcmp(key, "WM/Picture")) { // handle cover art
-        asf_read_picture(s, len);
-        goto finish;
     } else if (type == 6) { // (don't) handle GUID
         av_log(s, AV_LOG_DEBUG, "Unsupported GUID value in tag %s.\n", key);
         goto finish;
@@ -590,6 +606,8 @@ static int asf_read_ext_content_desc(AVFormatContext *s, 
int64_t size)
         value_len  = avio_rl16(pb);
         if (!value_type && value_len % 2)
             value_len += 1;
+        av_dlog(s, "%d name_len %2d type %d len %5d <%s>\n",
+                i, name_len, value_type, value_len, name);
         /* My sample has that stream set to 0 maybe that mean the container.
          * ASF stream count starts at 1. I am using 0 to the container value
          * since it's unused. */
-- 
1.7.6.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to