asfdec: read values properly
The length of BOOL values is 16 bits in the Metadata Object but 32 bits in the Extended Content Description Object. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
		
							parent
							
								
									b197f78329
								
							
						
					
					
						commit
						944f60866f
					
				@ -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, uint64_t *value)
 | 
			
		||||
{
 | 
			
		||||
    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;
 | 
			
		||||
    uint64_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,16 @@ 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 int 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;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    value = avio_rl16(pb);
 | 
			
		||||
    ret = asf_read_generic_value(pb, type, &value);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    if (st_num < ASF_MAX_STREAMS) {
 | 
			
		||||
        if (!strcmp(name, "AspectRatioX"))
 | 
			
		||||
@ -542,6 +560,7 @@ static void asf_store_aspect_ratio(AVFormatContext *s, uint8_t st_num, uint8_t *
 | 
			
		||||
        else
 | 
			
		||||
            asf->asf_sd[st_num].aspect_ratio.den = value;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int asf_read_metadata_obj(AVFormatContext *s, const GUIDParseTable *g)
 | 
			
		||||
@ -569,9 +588,10 @@ 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);
 | 
			
		||||
            ret = asf_store_aspect_ratio(s, st_num, name, type);
 | 
			
		||||
            if (ret < 0)
 | 
			
		||||
                return ret;
 | 
			
		||||
        } else {
 | 
			
		||||
            if (st_num < ASF_MAX_STREAMS) {
 | 
			
		||||
                if ((ret = process_metadata(s, name, name_len, val_len, type,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user