diff --git a/libavformat/avienc.c b/libavformat/avienc.c index fa6321200e..9d1f5102a1 100644 --- a/libavformat/avienc.c +++ b/libavformat/avienc.c @@ -105,19 +105,6 @@ static char* avi_stream2fourcc(char* tag, int index, enum AVMediaType type) return tag; } -static void avi_write_info_tag(AVIOContext *pb, const char *tag, const char *str) -{ - int len = strlen(str); - if (len > 0) { - len++; - ffio_wfourcc(pb, tag); - avio_wl32(pb, len); - avio_put_str(pb, str); - if (len & 1) - avio_w8(pb, 0); - } -} - static int avi_write_counters(AVFormatContext* s, int riff_id) { AVIOContext *pb = s->pb; @@ -300,7 +287,7 @@ static int avi_write_header(AVFormatContext *s) } ff_end_tag(pb, strf); if ((t = av_dict_get(s->streams[i]->metadata, "title", NULL, 0))) { - avi_write_info_tag(s->pb, "strn", t->value); + ff_riff_write_info_tag(s->pb, "strn", t->value); t = NULL; } } @@ -377,14 +364,7 @@ static int avi_write_header(AVFormatContext *s) ff_end_tag(pb, list1); - list2 = ff_start_tag(pb, "LIST"); - ffio_wfourcc(pb, "INFO"); - ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL); - for (i = 0; *ff_riff_tags[i]; i++) { - if ((t = av_dict_get(s->metadata, ff_riff_tags[i], NULL, AV_DICT_MATCH_CASE))) - avi_write_info_tag(s->pb, t->key, t->value); - } - ff_end_tag(pb, list2); + ff_riff_write_info(s); /* some padding for easier tag editing */ list2 = ff_start_tag(pb, "JUNK"); diff --git a/libavformat/riff.c b/libavformat/riff.c index 2539b23134..3d805d8884 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -1,5 +1,5 @@ /* - * RIFF codec tags + * RIFF common functions and data * Copyright (c) 2000 Fabrice Bellard * * This file is part of Libav. @@ -708,3 +708,33 @@ int ff_read_riff_info(AVFormatContext *s, int64_t size) return 0; } + +void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str) +{ + int len = strlen(str); + if (len > 0) { + len++; + ffio_wfourcc(pb, tag); + avio_wl32(pb, len); + avio_put_str(pb, str); + if (len & 1) + avio_w8(pb, 0); + } +} + +void ff_riff_write_info(AVFormatContext *s) +{ + AVIOContext *pb = s->pb; + int i; + int64_t list_pos; + AVDictionaryEntry *t = NULL; + + list_pos = ff_start_tag(pb, "LIST"); + ffio_wfourcc(pb, "INFO"); + ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL); + for (i = 0; *ff_riff_tags[i]; i++) { + if ((t = av_dict_get(s->metadata, ff_riff_tags[i], NULL, AV_DICT_MATCH_CASE))) + ff_riff_write_info_tag(s->pb, t->key, t->value); + } + ff_end_tag(pb, list_pos); +} diff --git a/libavformat/riff.h b/libavformat/riff.h index 42a28d17c9..167d8fc49b 100644 --- a/libavformat/riff.h +++ b/libavformat/riff.h @@ -1,5 +1,5 @@ /* - * RIFF codec tags + * RIFF common functions and data * copyright (c) 2000 Fabrice Bellard * * This file is part of Libav. @@ -60,4 +60,14 @@ void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssiz int ff_read_riff_info(AVFormatContext *s, int64_t size); +/** + * Write all recognized RIFF tags from s->metadata + */ +void ff_riff_write_info(AVFormatContext *s); + +/** + * Write a single RIFF info tag + */ +void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str); + #endif /* AVFORMAT_RIFF_H */