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]);

Reply via email to