* commit 'efcde917af407a6031ecff68edd51fce7b83d104': vorbiscomment: simplify API by using av_dict_count() Conflicts: libavformat/flacenc.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.3
@@ -47,12 +47,12 @@ static int flac_write_block_comment(AVIOContext *pb, AVDictionary **m, | |||||
int last_block, int bitexact) | int last_block, int bitexact) | ||||
{ | { | ||||
const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT; | const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT; | ||||
unsigned int len, count; | |||||
unsigned int len; | |||||
uint8_t *p, *p0; | uint8_t *p, *p0; | ||||
ff_metadata_conv(m, ff_vorbiscomment_metadata_conv, NULL); | ff_metadata_conv(m, ff_vorbiscomment_metadata_conv, NULL); | ||||
len = ff_vorbiscomment_length(*m, vendor, &count); | |||||
len = ff_vorbiscomment_length(*m, vendor); | |||||
p0 = av_malloc(len+4); | p0 = av_malloc(len+4); | ||||
if (!p0) | if (!p0) | ||||
return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
@@ -60,7 +60,7 @@ static int flac_write_block_comment(AVIOContext *pb, AVDictionary **m, | |||||
bytestream_put_byte(&p, last_block ? 0x84 : 0x04); | bytestream_put_byte(&p, last_block ? 0x84 : 0x04); | ||||
bytestream_put_be24(&p, len); | bytestream_put_be24(&p, len); | ||||
ff_vorbiscomment_write(&p, m, vendor, count); | |||||
ff_vorbiscomment_write(&p, m, vendor); | |||||
avio_write(pb, p0, len+4); | avio_write(pb, p0, len+4); | ||||
av_freep(&p0); | av_freep(&p0); | ||||
@@ -277,18 +277,17 @@ static uint8_t *ogg_write_vorbiscomment(int offset, int bitexact, | |||||
const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT; | const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT; | ||||
int size; | int size; | ||||
uint8_t *p, *p0; | uint8_t *p, *p0; | ||||
unsigned int count; | |||||
ff_metadata_conv(m, ff_vorbiscomment_metadata_conv, NULL); | ff_metadata_conv(m, ff_vorbiscomment_metadata_conv, NULL); | ||||
size = offset + ff_vorbiscomment_length(*m, vendor, &count) + framing_bit; | |||||
size = offset + ff_vorbiscomment_length(*m, vendor) + framing_bit; | |||||
p = av_mallocz(size); | p = av_mallocz(size); | ||||
if (!p) | if (!p) | ||||
return NULL; | return NULL; | ||||
p0 = p; | p0 = p; | ||||
p += offset; | p += offset; | ||||
ff_vorbiscomment_write(&p, m, vendor, count); | |||||
ff_vorbiscomment_write(&p, m, vendor); | |||||
if (framing_bit) | if (framing_bit) | ||||
bytestream_put_byte(&p, 1); | bytestream_put_byte(&p, 1); | ||||
@@ -38,28 +38,26 @@ const AVMetadataConv ff_vorbiscomment_metadata_conv[] = { | |||||
{ 0 } | { 0 } | ||||
}; | }; | ||||
int ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string, | |||||
unsigned *count) | |||||
int ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string) | |||||
{ | { | ||||
int len = 8; | int len = 8; | ||||
len += strlen(vendor_string); | len += strlen(vendor_string); | ||||
*count = 0; | |||||
if (m) { | if (m) { | ||||
AVDictionaryEntry *tag = NULL; | AVDictionaryEntry *tag = NULL; | ||||
while ((tag = av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) { | while ((tag = av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) { | ||||
len += 4 +strlen(tag->key) + 1 + strlen(tag->value); | len += 4 +strlen(tag->key) + 1 + strlen(tag->value); | ||||
(*count)++; | |||||
} | } | ||||
} | } | ||||
return len; | return len; | ||||
} | } | ||||
int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m, | int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m, | ||||
const char *vendor_string, const unsigned count) | |||||
const char *vendor_string) | |||||
{ | { | ||||
bytestream_put_le32(p, strlen(vendor_string)); | bytestream_put_le32(p, strlen(vendor_string)); | ||||
bytestream_put_buffer(p, vendor_string, strlen(vendor_string)); | bytestream_put_buffer(p, vendor_string, strlen(vendor_string)); | ||||
if (*m) { | if (*m) { | ||||
int count = av_dict_count(*m); | |||||
AVDictionaryEntry *tag = NULL; | AVDictionaryEntry *tag = NULL; | ||||
bytestream_put_le32(p, count); | bytestream_put_le32(p, count); | ||||
while ((tag = av_dict_get(*m, "", tag, AV_DICT_IGNORE_SUFFIX))) { | while ((tag = av_dict_get(*m, "", tag, AV_DICT_IGNORE_SUFFIX))) { | ||||
@@ -32,11 +32,9 @@ | |||||
* @param m The metadata structure to be parsed. For no metadata, set to NULL. | * @param m The metadata structure to be parsed. For no metadata, set to NULL. | ||||
* @param vendor_string The vendor string to be added into the VorbisComment. | * @param vendor_string The vendor string to be added into the VorbisComment. | ||||
* For no string, set to an empty string. | * For no string, set to an empty string. | ||||
* @param count Pointer to store the number of tags in m because m->count is "not allowed" | |||||
* @return The length in bytes. | * @return The length in bytes. | ||||
*/ | */ | ||||
int ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string, | |||||
unsigned *count); | |||||
int ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string); | |||||
/** | /** | ||||
* Write a VorbisComment into a buffer. The buffer, p, must have enough | * Write a VorbisComment into a buffer. The buffer, p, must have enough | ||||
@@ -47,10 +45,9 @@ int ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string, | |||||
* @param p The buffer in which to write. | * @param p The buffer in which to write. | ||||
* @param m The metadata struct to write. | * @param m The metadata struct to write. | ||||
* @param vendor_string The vendor string to write. | * @param vendor_string The vendor string to write. | ||||
* @param count The number of tags in m because m->count is "not allowed" | |||||
*/ | */ | ||||
int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m, | int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m, | ||||
const char *vendor_string, const unsigned count); | |||||
const char *vendor_string); | |||||
extern const AVMetadataConv ff_vorbiscomment_metadata_conv[]; | extern const AVMetadataConv ff_vorbiscomment_metadata_conv[]; | ||||