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