gnif <[email protected]> added the comment:
Attached patch to add support for oggenc metadata when
the contained format is vorbis.
________________________________________________
FFmpeg issue tracker <[email protected]>
<https://roundup.ffmpeg.org/issue555>
________________________________________________
diff --git a/xbmc/cores/dvdplayer/Codecs/ffmpeg/libavformat/oggenc.c
b/xbmc/cores/dvdplayer/Codecs/ffmpeg/libavformat/oggenc.c
index d22e1ad..01a4f96 100644
--- a/xbmc/cores/dvdplayer/Codecs/ffmpeg/libavformat/oggenc.c
+++ b/xbmc/cores/dvdplayer/Codecs/ffmpeg/libavformat/oggenc.c
@@ -32,6 +32,7 @@ typedef struct {
unsigned page_counter;
uint8_t *header[3];
int header_len[3];
+ int free_header; // if the header needs to be freed outside of libvorbis
/** for theora granule */
int kfgshift;
int64_t last_kf_pts;
@@ -160,7 +161,7 @@ static int ogg_build_comment_header(OGGStreamContext
*oggstream, AVMetadata *m)
//split up the comment name & value
name = strtok(comment_string, "=");
- value = strtok(NULL, "=");
+ value = name + strlen(name) + 1;
//set the name & value
av_metadata_set2(&m, name, value, 0);
@@ -174,10 +175,9 @@ static int ogg_build_comment_header(OGGStreamContext
*oggstream, AVMetadata *m)
}
if (!vendor_length) {
- #define OGG_VENDOR "LibAvfVorbis"
- vendor_string = (char*)av_mallocz(sizeof(OGG_VENDOR));
- memcpy(vendor_string, OGG_VENDOR, sizeof(OGG_VENDOR) - 1);
- vendor_length = sizeof(OGG_VENDOR) - 1;
+ vendor_string = (char*)av_mallocz(sizeof(LIBAVFORMAT_IDENT));
+ memcpy(vendor_string, LIBAVFORMAT_IDENT, sizeof(LIBAVFORMAT_IDENT) -
1);
+ vendor_length = sizeof(LIBAVFORMAT_IDENT) - 1;
framing_bit = 1;
}
@@ -190,10 +190,6 @@ static int ogg_build_comment_header(OGGStreamContext
*oggstream, AVMetadata *m)
size += sizeof(uint32_t) + strlen(m->elems[c].key) + 1 +
strlen(m->elems[c].value);
size += 1; // framing bit
- // free the old header
- if (oggstream->header_len[1])
- av_free(oggstream->header[1]);
-
// allocate a new header
oggstream->header_len[1] = size;
oggstream->header [1] = (uint8_t*)av_mallocz(size);
@@ -203,6 +199,8 @@ static int ogg_build_comment_header(OGGStreamContext
*oggstream, AVMetadata *m)
return AVERROR_NOMEM;
}
+ oggstream->free_header = 1;
+
// setup the new header
p = oggstream->header[1];
*(uint8_t*)p = 3;
@@ -480,6 +478,9 @@ static int ogg_write_trailer(AVFormatContext *s)
for (i = 0; i < s->nb_streams; i++) {
AVStream *st = s->streams[i];
OGGStreamContext *oggstream = st->priv_data;
+ if (oggstream->free_header)
+ av_free(oggstream->header[1]);
+ else
if (st->codec->codec_id == CODEC_ID_FLAC ||
st->codec->codec_id == CODEC_ID_SPEEX) {
av_free(oggstream->header[0]);