mirror of https://github.com/FFmpeg/FFmpeg.git
Patch by James Darnley <james darnley at gmail>. Originally committed as revision 22605 to svn://svn.ffmpeg.org/ffmpeg/trunkrelease/0.6
parent
64f6e357fd
commit
66061a1220
12 changed files with 207 additions and 25 deletions
@ -0,0 +1,73 @@ |
||||
/*
|
||||
* VorbisComment writer |
||||
* Copyright (c) 2009 James Darnley |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
#include "avformat.h" |
||||
#include "metadata.h" |
||||
#include "vorbiscomment.h" |
||||
#include "libavcodec/bytestream.h" |
||||
|
||||
/**
|
||||
* VorbisComment metadata conversion mapping. |
||||
* from Ogg Vorbis I format specification: comment field and header specification |
||||
* http://xiph.org/vorbis/doc/v-comment.html
|
||||
*/ |
||||
const AVMetadataConv ff_vorbiscomment_metadata_conv[] = { |
||||
{ "ALBUMARTIST", "album_artist"}, |
||||
{ "TRACKNUMBER", "track" }, |
||||
{ 0 } |
||||
}; |
||||
|
||||
int ff_vorbiscomment_length(AVMetadata *m, const char *vendor_string, |
||||
unsigned *count) |
||||
{ |
||||
int len = 8; |
||||
len += strlen(vendor_string); |
||||
*count = 0; |
||||
if (m) { |
||||
AVMetadataTag *tag = NULL; |
||||
while ( (tag = av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX) ) ) { |
||||
len += 4 +strlen(tag->key) + 1 + strlen(tag->value); |
||||
(*count)++; |
||||
} |
||||
} |
||||
return len; |
||||
} |
||||
|
||||
int ff_vorbiscomment_write(uint8_t **p, AVMetadata *m, |
||||
const char *vendor_string, const unsigned count) |
||||
{ |
||||
bytestream_put_le32(p, strlen(vendor_string)); |
||||
bytestream_put_buffer(p, vendor_string, strlen(vendor_string)); |
||||
if (m) { |
||||
AVMetadataTag *tag = NULL; |
||||
bytestream_put_le32(p, count); |
||||
while ( (tag = av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX) ) ) { |
||||
unsigned int len1 = strlen(tag->key); |
||||
unsigned int len2 = strlen(tag->value); |
||||
bytestream_put_le32(p, len1+1+len2); |
||||
bytestream_put_buffer(p, tag->key, len1); |
||||
bytestream_put_byte(p, '='); |
||||
bytestream_put_buffer(p, tag->value, len2); |
||||
} |
||||
} else |
||||
bytestream_put_le32(p, 0); |
||||
return 0; |
||||
} |
@ -0,0 +1,57 @@ |
||||
/*
|
||||
* VorbisComment writer |
||||
* Copyright (c) 2009 James Darnley |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
#ifndef AVFORMAT_VORBISCOMMENT_H |
||||
#define AVFORMAT_VORBISCOMMENT_H |
||||
|
||||
#include "avformat.h" |
||||
#include "metadata.h" |
||||
|
||||
/**
|
||||
* Calculates the length in bytes of a VorbisComment. This is the minimum |
||||
* size required by ff_vorbiscomment_write(). |
||||
* |
||||
* @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. |
||||
* 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. |
||||
*/ |
||||
int ff_vorbiscomment_length(AVMetadata *m, const char *vendor_string, |
||||
unsigned *count); |
||||
|
||||
/**
|
||||
* Writes a VorbisComment into a buffer. The buffer, p, must have enough |
||||
* data to hold the whole VorbisComment. The minimum size required can be |
||||
* obtained by passing the same AVMetadata and vendor_string to |
||||
* ff_vorbiscomment_length() |
||||
* |
||||
* @param p The buffer in which to write. |
||||
* @param m The metadata struct 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, AVMetadata *m, |
||||
const char *vendor_string, const unsigned count); |
||||
|
||||
extern const AVMetadataConv ff_vorbiscomment_metadata_conv[]; |
||||
|
||||
#endif /* AVFORMAT_VORBISCOMMENT_H */ |
@ -1,4 +1,4 @@ |
||||
7781a016edfc242a39e4d65af02d861a *./tests/data/acodec/flac.flac |
||||
353368 ./tests/data/acodec/flac.flac |
||||
151eef9097f944726968bec48649f00a *./tests/data/acodec/flac.flac |
||||
361582 ./tests/data/acodec/flac.flac |
||||
95e54b261530a1bcf6de6fe3b21dc5f6 *./tests/data/flac.acodec.out.wav |
||||
stddev: 0.00 PSNR:999.99 bytes: 1058444/ 1058444 |
||||
|
Loading…
Reference in new issue