# HG changeset patch # User michael # Date 1231094917 0 # Node ID 1f857a4519bd3d156e912eab487efb15c48225b5 # Parent 33f55d10246d068e5ecdfce96e7ba82e9cfb6efb Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel. diff -r 33f55d10246d -r 1f857a4519bd avformat.h --- a/avformat.h Sun Jan 04 16:23:18 2009 +0000 +++ b/avformat.h Sun Jan 04 18:48:37 2009 +0000 @@ -608,6 +608,8 @@ struct AVPacketList *raw_packet_buffer_end; struct AVPacketList *packet_buffer_end; + + struct AVMetaData *meta_data; } AVFormatContext; typedef struct AVPacketList { diff -r 33f55d10246d -r 1f857a4519bd avidec.c --- a/avidec.c Sun Jan 04 16:23:18 2009 +0000 +++ b/avidec.c Sun Jan 04 18:48:37 2009 +0000 @@ -216,13 +216,17 @@ } } -static int avi_read_tag(ByteIOContext *pb, char *buf, int maxlen, unsigned int size) +static int avi_read_tag(AVFormatContext *s, const char *key, unsigned int size) { + ByteIOContext *pb = s->pb; + uint8_t value[1024]; + int64_t i = url_ftell(pb); size += (size & 1); - get_strz(pb, buf, maxlen); + get_strz(pb, value, sizeof(value)); url_fseek(pb, i+size, SEEK_SET); - return 0; + + return av_metadata_set(&s->meta_data, (const AVMetaDataTag){key, value}); } static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) @@ -235,7 +239,6 @@ int i; AVStream *st; AVIStream *ast = NULL; - char str_track[4]; int avih_width=0, avih_height=0; int amv_file_format=0; @@ -561,26 +564,25 @@ url_fseek(pb, size, SEEK_CUR); break; case MKTAG('I', 'N', 'A', 'M'): - avi_read_tag(pb, s->title, sizeof(s->title), size); + avi_read_tag(s, "Title", size); break; case MKTAG('I', 'A', 'R', 'T'): - avi_read_tag(pb, s->author, sizeof(s->author), size); + avi_read_tag(s, "Artist", size); break; case MKTAG('I', 'C', 'O', 'P'): - avi_read_tag(pb, s->copyright, sizeof(s->copyright), size); + avi_read_tag(s, "Copyright", size); break; case MKTAG('I', 'C', 'M', 'T'): - avi_read_tag(pb, s->comment, sizeof(s->comment), size); + avi_read_tag(s, "Comment", size); break; case MKTAG('I', 'G', 'N', 'R'): - avi_read_tag(pb, s->genre, sizeof(s->genre), size); + avi_read_tag(s, "Genre", size); break; case MKTAG('I', 'P', 'R', 'D'): - avi_read_tag(pb, s->album, sizeof(s->album), size); + avi_read_tag(s, "Album", size); break; case MKTAG('I', 'P', 'R', 'T'): - avi_read_tag(pb, str_track, sizeof(str_track), size); - sscanf(str_track, "%d", &s->track); + avi_read_tag(s, "Track", size); break; default: if(size > 1000000){ diff -r 33f55d10246d -r 1f857a4519bd avienc.c --- a/avienc.c Sun Jan 04 16:23:18 2009 +0000 +++ b/avienc.c Sun Jan 04 18:48:37 2009 +0000 @@ -103,6 +103,15 @@ } } +static void avi_write_info_tag2(AVFormatContext *s, const char *fourcc, const char *key1, const char *key2) +{ + AVMetaDataTag *tag= av_metadata_get(s->meta_data, key1, NULL, AV_METADATA_IGNORE_CASE); + if(!tag && key2) + tag= av_metadata_get(s->meta_data, key2, NULL, AV_METADATA_IGNORE_CASE); + if(tag) + avi_write_info_tag(s->pb, fourcc, tag->value); +} + static int avi_write_counters(AVFormatContext* s, int riff_id) { ByteIOContext *pb = s->pb; @@ -332,17 +341,13 @@ list2 = start_tag(pb, "LIST"); put_tag(pb, "INFO"); - avi_write_info_tag(pb, "INAM", s->title); - avi_write_info_tag(pb, "IART", s->author); - avi_write_info_tag(pb, "ICOP", s->copyright); - avi_write_info_tag(pb, "ICMT", s->comment); - avi_write_info_tag(pb, "IPRD", s->album); - avi_write_info_tag(pb, "IGNR", s->genre); - if (s->track) { - char str_track[4]; - snprintf(str_track, 4, "%d", s->track); - avi_write_info_tag(pb, "IPRT", str_track); - } + avi_write_info_tag2(s, "INAM", "Title", NULL); + avi_write_info_tag2(s, "IART", "Artist", "Author"); + avi_write_info_tag2(s, "ICOP", "Copyright", NULL); + avi_write_info_tag2(s, "ICMT", "Comment", NULL); + avi_write_info_tag2(s, "IPRD", "Album", NULL); + avi_write_info_tag2(s, "IGNR", "Genre", NULL); + avi_write_info_tag2(s, "IPRT", "Track", NULL); if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) avi_write_info_tag(pb, "ISFT", LIBAVFORMAT_IDENT); end_tag(pb, list2); diff -r 33f55d10246d -r 1f857a4519bd utils.c --- a/utils.c Sun Jan 04 16:23:18 2009 +0000 +++ b/utils.c Sun Jan 04 18:48:37 2009 +0000 @@ -21,6 +21,7 @@ #include "avformat.h" #include "internal.h" #include "libavcodec/opt.h" +#include "libavcodec/metadata.h" #include "libavutil/avstring.h" #include "riff.h" #include @@ -2305,6 +2306,14 @@ av_free(s->chapters[s->nb_chapters]); } av_freep(&s->chapters); + if(s->meta_data){ + while(s->meta_data->count--){ + av_freep(&s->meta_data->elems[s->meta_data->count].key); + av_freep(&s->meta_data->elems[s->meta_data->count].value); + } + av_freep(&s->meta_data->elems); + } + av_freep(&s->meta_data); av_free(s); }