The length of BOOL values is 16 bits in the Metadata Object but
32 bits in the Extended Content Description Object.
---
 libavformat/asfdec.c | 40 +++++++++++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 13 deletions(-)

diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
index a42120d..4ca253f 100644
--- a/libavformat/asfdec.c
+++ b/libavformat/asfdec.c
@@ -304,17 +304,13 @@ failed:
     av_freep(&value);
     return ret;
 }
-
-static int asf_read_generic_value(AVFormatContext *s, const uint8_t *name,
-                                  uint16_t name_len, int type, AVDictionary 
**met)
+static uint64_t asf_read_generic_value(AVIOContext *pb, int type)
 {
-    AVIOContext *pb = s->pb;
-    uint64_t value;
-    char buf[32];
+    int64_t value;
 
     switch (type) {
     case ASF_BOOL:
-        value = avio_rl32(pb);
+        value = avio_rl16(pb);
         break;
     case ASF_DWORD:
         value = avio_rl32(pb);
@@ -328,6 +324,21 @@ static int asf_read_generic_value(AVFormatContext *s, 
const uint8_t *name,
     default:
         return AVERROR_INVALIDDATA;
     }
+
+    return value;
+}
+
+static int asf_set_metadata(AVFormatContext *s, const uint8_t *name,
+                            uint16_t name_len, int type, AVDictionary **met)
+{
+    AVIOContext *pb = s->pb;
+    int64_t value;
+    char buf[32];
+
+    value = asf_read_generic_value(pb, type);
+    if (value < 0)
+        return value;
+
     snprintf(buf, sizeof(buf), "%"PRIu64, value);
     if (av_dict_set(met, name, buf, 0) < 0)
         av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
@@ -470,7 +481,7 @@ static int process_metadata(AVFormatContext *s, const 
uint8_t *name, uint16_t na
             ff_get_guid(s->pb, &guid);
             break;
         default:
-            if ((ret = asf_read_generic_value(s, name, name_len, type, met)) < 
0)
+            if ((ret = asf_set_metadata(s, name, name_len, type, met)) < 0)
                 return ret;
             break;
         }
@@ -500,6 +511,10 @@ static int asf_read_ext_content(AVFormatContext *s, const 
GUIDParseTable *g)
         avio_get_str16le(pb, name_len, name,
                          name_len);
         type    = avio_rl16(pb);
+        // BOOL values are 16 bits long in the Metadata Object
+        // but 32 bits long in the Extended Content Description Object
+        if (type == ASF_BOOL)
+            type = ASF_DWORD;
         val_len = avio_rl16(pb);
 
         ret = process_metadata(s, name, name_len, val_len, type, &s->metadata);
@@ -528,13 +543,13 @@ static AVStream *find_stream(AVFormatContext *s, uint16_t 
st_num)
     return st;
 }
 
-static void asf_store_aspect_ratio(AVFormatContext *s, uint8_t st_num, uint8_t 
*name)
+static void asf_store_aspect_ratio(AVFormatContext *s, uint8_t st_num, uint8_t 
*name, int type)
 {
     ASFContext *asf   = s->priv_data;
     AVIOContext *pb   = s->pb;
-    uint16_t value = 0;
+    uint64_t value = 0;
 
-    value = avio_rl16(pb);
+    value = asf_read_generic_value(pb, type);
 
     if (st_num < ASF_MAX_STREAMS) {
         if (!strcmp(name, "AspectRatioX"))
@@ -569,9 +584,8 @@ static int asf_read_metadata_obj(AVFormatContext *s, const 
GUIDParseTable *g)
             return AVERROR(ENOMEM);
         avio_get_str16le(pb, name_len, name,
                          buflen);
-
         if (!strcmp(name, "AspectRatioX") || !strcmp(name, "AspectRatioY")) {
-            asf_store_aspect_ratio(s, st_num, name);
+            asf_store_aspect_ratio(s, st_num, name, type);
         } else {
             if (st_num < ASF_MAX_STREAMS) {
                 if ((ret = process_metadata(s, name, name_len, val_len, type,
-- 
2.0.1

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to