Quoting Alexandra Hájková (2015-03-12 19:57:28)
>  
> -static int asf_read_ext_stream_properties(AVFormatContext *s, int64_t size)
> +static int asf_read_content_desc(AVFormatContext *s, const GUIDParseTable *g)
>  {
>      ASFContext *asf = s->priv_data;
>      AVIOContext *pb = s->pb;
> -    ff_asf_guid g;
> -    int ext_len, payload_ext_ct, stream_ct, i;
> -    uint32_t leak_rate, stream_num;
> -    unsigned int stream_languageid_index;
> -
> -    avio_rl64(pb); // starttime
> -    avio_rl64(pb); // endtime
> -    leak_rate = avio_rl32(pb); // leak-datarate
> -    avio_rl32(pb); // bucket-datasize
> -    avio_rl32(pb); // init-bucket-fullness
> -    avio_rl32(pb); // alt-leak-datarate
> -    avio_rl32(pb); // alt-bucket-datasize
> -    avio_rl32(pb); // alt-init-bucket-fullness
> -    avio_rl32(pb); // max-object-size
> -    avio_rl32(pb); // flags 
> (reliable,seekable,no_cleanpoints?,resend-live-cleanpoints, rest of bits 
> reserved)
> -    stream_num = avio_rl16(pb); // stream-num
> -
> -    stream_languageid_index = avio_rl16(pb); // stream-language-id-index
> -    if (stream_num < 128)
> -        asf->streams[stream_num].stream_language_index = 
> stream_languageid_index;
> -
> -    avio_rl64(pb); // avg frametime in 100ns units
> -    stream_ct      = avio_rl16(pb); // stream-name-count
> -    payload_ext_ct = avio_rl16(pb); // payload-extension-system-count
> -
> -    if (stream_num < 128)
> -        asf->stream_bitrates[stream_num] = leak_rate;
> -
> -    for (i = 0; i < stream_ct; i++) {
> -        avio_rl16(pb);
> -        ext_len = avio_rl16(pb);
> -        avio_skip(pb, ext_len);
> +    int i;
> +    static const char *const titles[] =
> +    { "Title", "Author", "Copyright", "Description", "Rate" };
> +    uint16_t len[5], max_len = 0;
> +    uint8_t *ch;
> +    uint64_t size = avio_rl64(pb);
> +
> +    for (i = 0; i < 5; i++) {
> +        len[i]  = avio_rl16(pb);
> +        // utf8 string should be <= 2 * utf16 string, extra byte for the 
> terminator
> +        len[i]  = 2 * len[i] + 1;

Now the lenght read from the file is wrong. Same in the other places.

> -static int asf_read_content_desc(AVFormatContext *s, int64_t size)
> +static int asf_read_properties(AVFormatContext *s, const GUIDParseTable *g)
>  {
> +    ASFContext *asf = s->priv_data;
>      AVIOContext *pb = s->pb;
> -    int len1, len2, len3, len4, len5;
> -
> -    len1 = avio_rl16(pb);
> -    len2 = avio_rl16(pb);
> -    len3 = avio_rl16(pb);
> -    len4 = avio_rl16(pb);
> -    len5 = avio_rl16(pb);
> -    get_tag(s, "title", 0, len1, 32);
> -    get_tag(s, "author", 0, len2, 32);
> -    get_tag(s, "copyright", 0, len3, 32);
> -    get_tag(s, "comment", 0, len4, 32);
> -    avio_skip(pb, len5);
> +    uint64_t creation_time;
> +    struct tm tmbuf;
> +    struct tm *tm;
> +    char buf[100];
> +
> +    avio_rl64(pb); // read object size
> +    avio_skip(pb, 16); // skip File ID
> +    avio_skip(pb, 8);  // skip File size
> +    creation_time = avio_rl64(pb);
> +    if (!(asf->b_flags & IS_BROADCAST)) {
> +        // creation date is in 100 ns units from 1 Jan 1601, conversion to s
> +        creation_time /= 10000000;
> +        // there are 11644473600 seconds between 1 Jan 1601 and 1 Jan 1970
> +        creation_time -= 11644473600;
> +        tm = gmtime_r(&creation_time, &tmbuf);
> +        if (tm) {
> +            if (!strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm))
> +                buf[0] = '\0';
> +        } else
> +            buf[0] = '\0';
> +    }
> +    if (av_dict_set(&s->metadata, "creation time", buf, 0) < 0)
> +        av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");

neither of the comments from last review is addressed here

> -static int asf_read_ext_content_desc(AVFormatContext *s, int64_t size)
> +static int parse_video_info(AVIOContext *pb, AVStream *st)
> +{
> +    uint16_t size;
> +    unsigned int tag;
> +
> +    st->codec->width  = avio_rl32(pb);
> +    st->codec->height = avio_rl32(pb);
> +    avio_skip(pb, 1); // skip reserved flags
> +    size = avio_rl16(pb); // size of the Format Data
> +    tag  = ff_get_bmp_header(pb, st);
> +    st->codec->codec_tag = tag;
> +    st->codec->codec_id  = ff_codec_get_id(ff_codec_bmp_tags, tag);
> +
> +    if (size > BMP_HEADER_SIZE) {
> +        int ret;
> +        st->codec->extradata_size  = size - BMP_HEADER_SIZE;
> +        if (!(st->codec->extradata = av_malloc(st->codec->extradata_size +
> +                                               
> FF_INPUT_BUFFER_PADDING_SIZE)))
> +            return AVERROR(ENOMEM);
> +            memset(st->codec->extradata, 0, st->codec->extradata_size +
> +                   FF_INPUT_BUFFER_PADDING_SIZE);

Broken indentation.

Also, on failure it leaves a bogus value in extradata_size.
(it's also a pointless waste of cpu cycles to memset all of the
extradata instead of just the padding, but that doesn't matter much)

> +static int asf_read_ext_stream_properties(AVFormatContext *s, const 
> GUIDParseTable *g)
>  {
> -    AVIOContext *pb = s->pb;
>      ASFContext *asf = s->priv_data;
> -    int j, ret;
> -    int stream_count = avio_rl16(pb);
> -    for (j = 0; j < stream_count; j++) {
> -        char lang[6];
> -        unsigned int lang_len = avio_r8(pb);
> -        if ((ret = avio_get_str16le(pb, lang_len, lang,
> -                                    sizeof(lang))) < lang_len)
> -            avio_skip(pb, lang_len - ret);
> -        if (j < 128)
> -            av_strlcpy(asf->stream_languages[j], lang,
> -                       sizeof(*asf->stream_languages));
> +    AVIOContext *pb = s->pb;
> +    AVStream *st    = NULL;
> +    ff_asf_guid guid;
> +    uint16_t nb_st_name, nb_pay_exts, st_num, lang_idx;
> +    int i, ret;
> +    uint32_t bitrate;
> +    uint64_t start_time, end_time, time_per_frame;
> +    uint64_t size = avio_rl64(pb);
> +
> +    start_time = avio_rl64(pb);
> +    end_time   = avio_rl64(pb);
> +    bitrate    = avio_rl32(pb);
> +    avio_skip(pb, 28); // skip some unused values
> +    st_num     = avio_rl16(pb);
> +    st_num    &= ASF_STREAM_NUM;
> +    lang_idx   = avio_rl16(pb); // Stream Language ID Index
> +    for (i = 0; i < asf->nb_streams; i++) {
> +        if (st_num == asf->asf_st[i]->stream_index) {
> +            st                       = s->streams[asf->asf_st[i]->index];
> +            asf->asf_st[i]->lang_idx = lang_idx;
> +            break;
> +        }
> +    }
> +    time_per_frame = avio_rl64(pb); // average time per frame
> +    if (st) {
> +        st->start_time           = start_time;
> +        st->duration             = end_time - start_time;
> +        st->codec->bit_rate      = bitrate;
> +        st->avg_frame_rate.num = 1;
> +        st->avg_frame_rate.den = time_per_frame;

This does not seem correct, since this value is not in seconds.

> +    }
> +    nb_st_name = avio_rl16(pb);
> +    nb_pay_exts   = avio_rl16(pb);
> +    for (i = 0; i < nb_st_name; i++) {
> +        uint16_t len;
> +
> +        avio_rl16(pb); // Language ID Index
> +        len = avio_rl16(pb);
> +        avio_skip(pb, len);
> +    }
> +
> +    for (i = 0; i < nb_pay_exts; i++) {
> +        uint32_t len;
> +        avio_skip(pb, 16); // Extension System ID
> +        avio_skip(pb, 2);  // Extension Data Size
> +        len = avio_rl32(pb);
> +        avio_skip(pb, len);
> +    }
> +
> +    if ((ret = ff_get_guid(pb, &guid)) < 0) {
> +        align_position(pb, asf->offset, size);
> +
> +        return 0;
>      }
>  
> +    g = find_guid(guid);
> +    if (g && !(strcmp(g->name, "Extended Stream Properties"))) {

The comment from last time is not addressed here.

> +        if ((ret = g->read_object(s, g)) < 0)
> +            return ret;
> +    }
> +
> +    align_position(pb, asf->offset, size);
>      return 0;
>  }
>  
> -static int asf_read_metadata(AVFormatContext *s, int64_t size)
> +static int asf_read_language_list(AVFormatContext *s, const GUIDParseTable 
> *g)
>  {
> -    AVIOContext *pb = s->pb;
> -    ASFContext *asf = s->priv_data;
> -    int n, stream_num, name_len, value_len;
> -    int ret, i;
> -    n = avio_rl16(pb);
> -
> -    for (i = 0; i < n; i++) {
> -        char name[1024];
> -        int value_type;
> -
> -        avio_rl16(pb);  // lang_list_index
> -        stream_num = avio_rl16(pb);
> -        name_len   = avio_rl16(pb);
> -        value_type = avio_rl16(pb); /* value_type */
> -        value_len  = avio_rl32(pb);
> -
> -        if ((ret = avio_get_str16le(pb, name_len, name, sizeof(name))) < 
> name_len)
> -            avio_skip(pb, name_len - ret);
> -        av_dlog(s, "%d stream %d name_len %2d type %d len %4d <%s>\n",
> -                i, stream_num, name_len, value_type, value_len, name);
> -
> -        if (!strcmp(name, "AspectRatioX")){
> -            int aspect_x = get_value(s->pb, value_type, 16);
> -            if(stream_num < 128)
> -                asf->dar[stream_num].num = aspect_x;
> -        } else if(!strcmp(name, "AspectRatioY")){
> -            int aspect_y = get_value(s->pb, value_type, 16);
> -            if(stream_num < 128)
> -                asf->dar[stream_num].den = aspect_y;
> -        } else {
> -            get_tag(s, name, value_type, value_len, 16);
> +    ASFContext *asf   = s->priv_data;
> +    AVIOContext *pb   = s->pb;
> +    int i, ret;
> +    uint64_t size     = avio_rl64(pb);
> +    uint16_t nb_langs = avio_rl16(pb);
> +
> +    for (i = 0; i < nb_langs; i++) {
> +        size_t len;
> +        uint8_t *name;

So what is the purpose of this variable now?

> +        len = avio_r8(pb);
> +        if (!len)
> +            len = 6;
> +        // len is number of unicode characters - 2 bytes for each char
> +        name = av_malloc(2 * len + 1);
> +        if (!name)
> +            return AVERROR(ENOMEM);
> +        if ((ret = get_asf_string(pb, len, asf->langs[i], 2 * len + 1)) < 0) 
> {

The output buffer size is again incorrect.

> +static const GUIDParseTable gdef[] = {
> +    { "Data",                         { 0x75, 0xB2, 0x26, 0x36, 0x66, 0x8E, 
> 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, asf_read_data, 
> 1 },
> +    { "Simple Index",                 { 0x33, 0x00, 0x08, 0x90, 0xE5, 0xB1, 
> 0x11, 0xCF, 0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB }, 
> asf_read_simple_index, 1 },
> +    { "Content Description",          { 0x75, 0xB2, 0x26, 0x33, 0x66 ,0x8E, 
> 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, 
> asf_read_content_desc, 1 },
> +    { "Extended Content Description", { 0xD2, 0xD0, 0xA4, 0x40, 0xE3, 0x07, 
> 0x11, 0xD2, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5e, 0xA8, 0x50 }, 
> asf_read_ext_content, 1 },
> +    { "Stream Bitrate Properties",    { 0x7B, 0xF8, 0x75, 0xCE, 0x46, 0x8D, 
> 0x11, 0xD1, 0x8D, 0x82, 0x00, 0x60, 0x97, 0xC9, 0xA2, 0xB2 }, 
> asf_read_unknown, 1 },
> +    { "File Properties",              { 0x8C, 0xAB, 0xDC, 0xA1, 0xA9, 0x47, 
> 0x11, 0xCF, 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, 
> asf_read_properties, 1 },
> +    { "Header Extension",             { 0x5F, 0xBF, 0x03, 0xB5, 0xA9, 0x2E, 
> 0x11, 0xCF, 0x8E, 0xE3, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, 
> asf_read_unknown, 0 },
> +    { "Stream Properties",            { 0xB7, 0xDC, 0x07, 0x91, 0xA9, 0xB7, 
> 0x11, 0xCF, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, 
> asf_read_stream_properties, 1 },
> +    { "Codec List",                   { 0x86, 0xD1, 0x52, 0x40, 0x31, 0x1D, 
> 0x11, 0xD0, 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, 
> asf_read_unknown, 1 },
> +    { "Marker",                       { 0xF4, 0x87, 0xCD, 0x01, 0xA9, 0x51, 
> 0x11, 0xCF, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 }, 
> asf_read_marker, 1 },
> +    { "Script Command",               { 0x1E, 0xFB, 0x1A, 0x30, 0x0B, 0x62, 
> 0x11, 0xD0, 0xA3, 0x9B, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 }, 
> asf_read_unknown, 1 },
> +    { "Language List",                { 0x7C, 0x43, 0x46, 0xa9, 0xef, 0xe0, 
> 0x4B, 0xFC, 0xB2, 0x29, 0x39, 0x3e, 0xde, 0x41, 0x5c, 0x85 }, 
> asf_read_language_list, 1},
> +    { "Padding",                      { 0x18, 0x06, 0xD4, 0x74, 0xCA, 0xDF, 
> 0x45, 0x09, 0xA4, 0xBA, 0x9A, 0xAB, 0xCB, 0x96, 0xAA, 0xE8 }, 
> asf_read_unknown, 1 },
> +    { "DRMv1 Header",                 { 0x22, 0x11, 0xB3, 0xFB, 0xBD, 0x23, 
> 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, 
> asf_read_unknown, 1 },
> +    { "DRMv2 Header",                 { 0x29, 0x8A, 0xE6, 0x14, 0x26, 0x22, 
> 0x4C, 0x17, 0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9c }, 
> asf_read_unknown, 1 },
> +    { "Index",                        { 0xD6, 0xE2, 0x29, 0xD3, 0x35, 0xDA, 
> 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, 
> asf_read_unknown, 1 },
> +    { "Media Object Index",           { 0xFE, 0xB1, 0x03, 0xF8, 0x12, 0xAD, 
> 0x4C, 0x64, 0x84, 0x0F, 0x2A, 0x1D, 0x2F, 0x7A, 0xD4, 0x8C }, 
> asf_read_unknown, 1 },
> +    { "Timecode Index",               { 0x3C, 0xB7, 0x3F, 0xD0, 0x0C, 0x4A, 
> 0x48, 0x03, 0x95, 0x3D, 0xED, 0xF7, 0xB6, 0x22, 0x8F, 0x0C }, 
> asf_read_unknown, 0 },
> +    { "Bitrate_Mutual_Exclusion",     { 0xD6, 0xE2, 0x29, 0xDC, 0x35, 0xDA, 
> 0x11, 0xD1, 0x90, 0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, 
> asf_read_unknown, 1 },
> +    { "Error Correction",             { 0x75, 0xB2, 0x26, 0x35, 0x66, 0x8E, 
> 0x11, 0xCF, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }, 
> asf_read_unknown, 1 },
> +    { "Content Branding",             { 0x22, 0x11, 0xB3, 0xFA, 0xBD, 0x23, 
> 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, 
> asf_read_unknown, 1 },
> +    { "Content Encryption",           { 0x22, 0x11, 0xB3, 0xFB, 0xBD, 0x23, 
> 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, 
> asf_read_unknown, 1 },
> +    { "Extended Content Encryption",  { 0x29, 0x8A, 0xE6, 0x14, 0x26, 0x22, 
> 0x4C, 0x17, 0xB9, 0x35, 0xDA, 0xE0, 0x7E, 0xE9, 0x28, 0x9C }, 
> asf_read_unknown, 1 },
> +    { "Digital Signature",            { 0x22, 0x11, 0xB3, 0xFC, 0xBD, 0x23, 
> 0x11, 0xD2, 0xB4, 0xB7, 0x00, 0xA0, 0xC9, 0x55, 0xFC, 0x6E }, 
> asf_read_unknown, 1 },
> +    { "Extended Stream Properties",   { 0x14, 0xE6, 0xA5, 0xCB, 0xC6, 0x72, 
> 0x43, 0x32, 0x83, 0x99, 0xA9, 0x69, 0x52, 0x06, 0x5B, 0x5A }, 
> asf_read_ext_stream_properties, 1 },
> +    { "Advanced Mutual Exclusion",    { 0xA0, 0x86, 0x49, 0xCF, 0x47, 0x75, 
> 0x46, 0x70, 0x8A, 0x16, 0x6E, 0x35, 0x35, 0x75, 0x66, 0xCD }, 
> asf_read_unknown, 1 },
> +    { "Group Mutual Exclusion",       { 0xD1, 0x46, 0x5A, 0x40, 0x5A, 0x79, 
> 0x43, 0x38, 0xB7, 0x1B, 0xE3, 0x6B, 0x8F, 0xD6, 0xC2, 0x49 }, 
> asf_read_unknown, 1},
> +    { "Stream Prioritization",        { 0xD4, 0xFE, 0xD1, 0x5B, 0x88, 0xD3, 
> 0x45, 0x4F, 0x81, 0xF0, 0xED, 0x5C, 0x45, 0x99, 0x9E, 0x24 }, 
> asf_read_unknown, 1 },
> +    { "Bandwidth Sharing Object",     { 0xA6, 0x96, 0x09, 0xE6, 0x51, 0x7B, 
> 0x11, 0xD2, 0xB6, 0xAF, 0x00, 0xC0, 0x4F, 0xD9, 0x08, 0xE9 }, 
> asf_read_unknown, 1 },
> +    { "Metadata",                     { 0xC5, 0xF8, 0xCB, 0xEA, 0x5B, 0xAF, 
> 0x48, 0x77, 0x84, 0x67, 0xAA, 0x8C, 0x44, 0xFA, 0x4C, 0xCA }, 
> asf_read_metadata_obj, 1 },
> +    { "Metadata Library",             { 0x44, 0x23, 0x1C, 0x94, 0x94, 0x98, 
> 0x49, 0xD1, 0xA1, 0x41, 0x1D, 0x13, 0x4E, 0x45, 0x70, 0x54 }, 
> asf_read_metadata_obj, 1 },
> +    { "Audio Spread",                 { 0xBF, 0xC3, 0xCD, 0x50, 0x61, 0x8F, 
> 0x11, 0xCF, 0x8B, 0xB2, 0x00, 0xAA, 0x00, 0xB4, 0xE2, 0x20 }, 
> asf_read_unknown, 1 },
> +    { "Index Parameters",             { 0xD6, 0xE2, 0x29, 0xDF, 0x35, 0xDA, 
> 0x11, 0xD1, 0x90,
> +    0x34, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xBE }, asf_read_unknown, 1 },

Why is this entry split but not the others?

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

Reply via email to