On Tue, Aug 4, 2015 at 10:10 AM, Alexandra Hájková
<[email protected]> wrote:
> The length of BOOL values is 16 bits in the Metadata Object but
> 32 bits in the Extended Content Description Object.
> ---
>  libavformat/asfdec.c | 46 ++++++++++++++++++++++++++++++----------------
>  1 file changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
> index a42120d..6c447e9 100644
> --- a/libavformat/asfdec.c
> +++ b/libavformat/asfdec.c
> @@ -304,30 +304,41 @@ 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 int asf_read_generic_value(AVIOContext *pb, int type, int64_t *value)

Shouldn't value be unsigned? All of the values it reads are unsigned.

>  {
> -    AVIOContext *pb = s->pb;
> -    uint64_t value;
> -    char buf[32];
>
>      switch (type) {
>      case ASF_BOOL:
> -        value = avio_rl32(pb);
> +        *value = avio_rl16(pb);
>          break;
>      case ASF_DWORD:
> -        value = avio_rl32(pb);
> +        *value = avio_rl32(pb);
>          break;
>      case ASF_QWORD:
> -        value = avio_rl64(pb);
> +        *value = avio_rl64(pb);
>          break;
>      case ASF_WORD:
> -        value = avio_rl16(pb);
> +        *value = avio_rl16(pb);
>          break;
>      default:
>          return AVERROR_INVALIDDATA;
>      }
> +
> +    return 0;
> +}
> +
> +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];
> +    int ret;
> +
> +    ret = asf_read_generic_value(pb, type, &value);
> +    if (ret < 0)
> +        return ret;
> +
>      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, &value);
>
>      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
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to