| @@ -49,12 +49,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 ? "Libav" : LIBAVFORMAT_IDENT; | const char *vendor = bitexact ? "Libav" : 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); | ||||
| @@ -62,7 +62,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); | ||||
| @@ -273,18 +273,17 @@ static uint8_t *ogg_write_vorbiscomment(int offset, int bitexact, | |||||
| const char *vendor = bitexact ? "Libav" : LIBAVFORMAT_IDENT; | const char *vendor = bitexact ? "Libav" : 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); | ||||
| @@ -37,28 +37,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[]; | ||||