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