| Index: patched-ffmpeg-mt/libavformat/avidec.c
|
| ===================================================================
|
| --- patched-ffmpeg-mt/libavformat/avidec.c (revision 41250)
|
| +++ patched-ffmpeg-mt/libavformat/avidec.c (working copy)
|
| @@ -132,7 +132,7 @@
|
| longs_pre_entry,index_type, entries_in_use, chunk_id, base);
|
| #endif
|
|
|
| - if(stream_id > s->nb_streams || stream_id < 0)
|
| + if(stream_id >= s->nb_streams || stream_id < 0)
|
| return -1;
|
| st= s->streams[stream_id];
|
| ast = st->priv_data;
|
| @@ -227,10 +227,10 @@
|
| }
|
| }
|
|
|
| -static int avi_read_tag(AVFormatContext *s, const char *key, unsigned int size)
|
| +static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag, uint32_t size)
|
| {
|
| ByteIOContext *pb = s->pb;
|
| - char *value;
|
| + char key[5] = {0}, *value;
|
|
|
| size += (size & 1);
|
|
|
| @@ -239,12 +239,28 @@
|
| value = av_malloc(size+1);
|
| if (!value)
|
| return -1;
|
| - get_strz(pb, value, size);
|
| + get_buffer(pb, value, size);
|
| + value[size]=0;
|
|
|
| + AV_WL32(key, tag);
|
| +
|
| + if(st)
|
| + return av_metadata_set2(&st->metadata, key, value,
|
| + AV_METADATA_DONT_STRDUP_VAL);
|
| + else
|
| return av_metadata_set2(&s->metadata, key, value,
|
| AV_METADATA_DONT_STRDUP_VAL);
|
| }
|
|
|
| +static void avi_read_info(AVFormatContext *s, uint64_t end)
|
| +{
|
| + while (url_ftell(s->pb) < end) {
|
| + uint32_t tag = get_le32(s->pb);
|
| + uint32_t size = get_le32(s->pb);
|
| + avi_read_tag(s, NULL, tag, size);
|
| + }
|
| +}
|
| +
|
| static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
| {
|
| AVIContext *avi = s->priv_data;
|
| @@ -296,6 +312,9 @@
|
| dprintf(NULL, "movi end=%"PRIx64"\n", avi->movi_end);
|
| goto end_of_header;
|
| }
|
| + else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
|
| + avi_read_info(s, list_end);
|
| +
|
| break;
|
| case MKTAG('d', 'm', 'l', 'h'):
|
| avi->is_odml = 1;
|
| @@ -601,27 +620,11 @@
|
| }
|
| url_fseek(pb, size, SEEK_CUR);
|
| break;
|
| - case MKTAG('I', 'N', 'A', 'M'):
|
| - avi_read_tag(s, "Title", size);
|
| - break;
|
| - case MKTAG('I', 'A', 'R', 'T'):
|
| - avi_read_tag(s, "Artist", size);
|
| - break;
|
| - case MKTAG('I', 'C', 'O', 'P'):
|
| - avi_read_tag(s, "Copyright", size);
|
| - break;
|
| - case MKTAG('I', 'C', 'M', 'T'):
|
| - avi_read_tag(s, "Comment", size);
|
| - break;
|
| - case MKTAG('I', 'G', 'N', 'R'):
|
| - avi_read_tag(s, "Genre", size);
|
| - break;
|
| - case MKTAG('I', 'P', 'R', 'D'):
|
| - avi_read_tag(s, "Album", size);
|
| - break;
|
| - case MKTAG('I', 'P', 'R', 'T'):
|
| - avi_read_tag(s, "Track", size);
|
| - break;
|
| + case MKTAG('s', 't', 'r', 'n'):
|
| + if(s->nb_streams){
|
| + avi_read_tag(s, s->streams[s->nb_streams-1], tag, size);
|
| + break;
|
| + }
|
| default:
|
| if(size > 1000000){
|
| av_log(s, AV_LOG_ERROR, "Something went wrong during header parsing, "
|
| @@ -1180,4 +1183,5 @@
|
| avi_read_packet,
|
| avi_read_close,
|
| avi_read_seek,
|
| + .metadata_conv = ff_avi_metadata_conv,
|
| };
|
|
|