summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2009-01-04 18:48:37 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-01-04 18:48:37 +0000
commit47146dfbf6bca94dd0706b4313cc5e26edaf18d4 (patch)
treeba7242f58b79aadcd06267356a5fdc5b08e17130 /libavformat
parent045cbba92dad0728d9c277a6588a6c3e114f3917 (diff)
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. Originally committed as revision 16424 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/avformat.h2
-rw-r--r--libavformat/avidec.c26
-rw-r--r--libavformat/avienc.c27
-rw-r--r--libavformat/utils.c9
4 files changed, 41 insertions, 23 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 3f4271ae5f..46e692452e 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -608,6 +608,8 @@ typedef struct AVFormatContext {
struct AVPacketList *raw_packet_buffer_end;
struct AVPacketList *packet_buffer_end;
+
+ struct AVMetaData *meta_data;
} AVFormatContext;
typedef struct AVPacketList {
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 83c01a9826..ebb1a4c674 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -216,13 +216,17 @@ static void clean_index(AVFormatContext *s){
}
}
-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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
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 --git a/libavformat/avienc.c b/libavformat/avienc.c
index a672e8d85c..4ae608f780 100644
--- a/libavformat/avienc.c
+++ b/libavformat/avienc.c
@@ -103,6 +103,15 @@ static void avi_write_info_tag(ByteIOContext *pb, const char *tag, const char *s
}
}
+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 @@ static int avi_write_header(AVFormatContext *s)
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 --git a/libavformat/utils.c b/libavformat/utils.c
index 80171ca903..9bee5cd7e8 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -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 <sys/time.h>
@@ -2305,6 +2306,14 @@ void av_close_input_stream(AVFormatContext *s)
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);
}