lavf/id3v2enc: use metadata_header_padding
authorJames Darnley <james.darnley@gmail.com>
Mon, 30 Dec 2013 17:13:08 +0000 (18:13 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 24 Jan 2014 21:50:06 +0000 (22:50 +0100)
As with the change to flacenc this allows the user to control the amount
of padding they want added to the file.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/aiffenc.c
libavformat/id3v2.h
libavformat/id3v2enc.c
libavformat/mp3enc.c

index 6e3d8bc..90fc433 100644 (file)
@@ -66,7 +66,7 @@ static int put_id3v2_tags(AVFormatContext *s, AIFFOutputContext *aiff)
             return ret;
         pict_list = pict_list->next;
     }
-    ff_id3v2_finish(&id3v2, pb);
+    ff_id3v2_finish(&id3v2, pb, s->metadata_header_padding);
 
     end = avio_tell(pb);
     size = end - pos;
index 935e934..eb4dc79 100644 (file)
@@ -134,7 +134,7 @@ int ff_id3v2_write_apic(AVFormatContext *s, ID3v2EncContext *id3, AVPacket *pkt)
 /**
  * Finalize an opened ID3v2 tag.
  */
-void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb);
+void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb, int padding_bytes);
 
 /**
  * Write an ID3v2 tag containing all global metadata from s.
index 6052244..8bb5392 100644 (file)
@@ -29,8 +29,6 @@
 #include "avio_internal.h"
 #include "id3v2.h"
 
-#define PADDING_BYTES 10
-
 static void id3v2_put_size(AVIOContext *pb, int size)
 {
     avio_w8(pb, size >> 21 & 0x7f);
@@ -324,15 +322,24 @@ int ff_id3v2_write_apic(AVFormatContext *s, ID3v2EncContext *id3, AVPacket *pkt)
     return 0;
 }
 
-void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb)
+void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb,
+                     int padding_bytes)
 {
     int64_t cur_pos;
 
+    if (padding_bytes < 0)
+        padding_bytes = 10;
+
+    /* The ID3v2.3 specification states that 28 bits are used to represent the
+     * size of the whole tag.  Therefore the current size of the tag needs to be
+     * subtracted from the upper limit of 2^28-1 to clip the value correctly. */
+    padding_bytes = av_clip(padding_bytes, 10, 268435455 - id3->len);
+
     /* adding an arbitrary amount of padding bytes at the end of the
      * ID3 metadata fixes cover art display for some software (iTunes,
      * Traktor, Serato, Torq) */
-    ffio_fill(pb, 0, PADDING_BYTES);
-    id3->len += PADDING_BYTES;
+    ffio_fill(pb, 0, padding_bytes);
+    id3->len += padding_bytes;
 
     cur_pos = avio_tell(pb);
     avio_seek(pb, id3->size_pos, SEEK_SET);
@@ -349,7 +356,7 @@ int ff_id3v2_write_simple(struct AVFormatContext *s, int id3v2_version,
     ff_id3v2_start(&id3, s->pb, id3v2_version, magic);
     if ((ret = ff_id3v2_write_metadata(s, &id3)) < 0)
         return ret;
-    ff_id3v2_finish(&id3, s->pb);
+    ff_id3v2_finish(&id3, s->pb, s->metadata_header_padding);
 
     return 0;
 }
index 9523cf9..adf6a32 100644 (file)
@@ -304,7 +304,7 @@ static int mp3_queue_flush(AVFormatContext *s)
     AVPacketList *pktl;
     int ret = 0, write = 1;
 
-    ff_id3v2_finish(&mp3->id3, s->pb);
+    ff_id3v2_finish(&mp3->id3, s->pb, s->metadata_header_padding);
     mp3_write_xing(s);
 
     while ((pktl = mp3->queue)) {
@@ -513,7 +513,7 @@ static int mp3_write_header(struct AVFormatContext *s)
 
     if (!mp3->pics_to_write) {
         if (mp3->id3v2_version)
-            ff_id3v2_finish(&mp3->id3, s->pb);
+            ff_id3v2_finish(&mp3->id3, s->pb, s->metadata_header_padding);
         mp3_write_xing(s);
     }