# HG changeset patch # User aurel # Date 1233711652 0 # Node ID 7eef34a6f1c0ded5bcc632ecc931810917e10d7f # Parent 6d94691fff919d6f2c3641ae315a428ad10b9dfa write all available metadata tags into extended_content_header diff -r 6d94691fff91 -r 7eef34a6f1c0 asf-enc.c --- a/asf-enc.c Wed Feb 04 01:37:16 2009 +0000 +++ b/asf-enc.c Wed Feb 04 01:40:52 2009 +0000 @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avformat.h" +#include "metadata.h" #include "riff.h" #include "asf.h" @@ -274,6 +275,7 @@ AVMetadataTag *title, *author, *copyright, *comment; int header_size, n, extra_size, extra_size2, wav_extra_size, file_time; int has_title; + int metadata_count; AVCodecContext *enc; int64_t header_offset, cur_pos, hpos; int bit_rate; @@ -286,6 +288,7 @@ duration = asf->duration + PREROLL_TIME * 10000; has_title = title || author || copyright || comment; + metadata_count = s->metadata ? s->metadata->count : 0; bit_rate = 0; for(n=0;nnb_streams;n++) { @@ -302,7 +305,7 @@ put_guid(pb, &asf_header); put_le64(pb, -1); /* header length, will be patched after */ - put_le32(pb, 3 + has_title + s->nb_streams); /* number of chunks in header */ + put_le32(pb, 3 + has_title + !!metadata_count + s->nb_streams); /* number of chunks in header */ put_byte(pb, 1); /* ??? */ put_byte(pb, 2); /* ??? */ @@ -344,6 +347,22 @@ if (comment ) put_str16_nolen(pb, comment->value ); end_header(pb, hpos); } + if (metadata_count) { + AVMetadataTag *tag = NULL; + hpos = put_header(pb, &extended_content_header); + put_le16(pb, metadata_count); + while ((tag = av_metadata_get(s->metadata, "", tag, AV_METADATA_IGNORE_SUFFIX))) { + put_le16(pb, 2*(strlen(tag->key) + 3) + 1); + put_le16(pb, 'W'); + put_le16(pb, 'M'); + put_le16(pb, '/'); + put_str16_nolen(pb, tag->key); + put_le16(pb, 0); + put_le16(pb, 2*strlen(tag->value) + 1); + put_str16_nolen(pb, tag->value); + } + end_header(pb, hpos); + } /* stream headers */ for(n=0;nnb_streams;n++) {