X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fapetag.c;h=cdc602e1a9c71a4e21c1cd40ea9d3dda5fa9ac7a;hb=8b13492c9ecf85f1f674f99df370a19992b3910a;hp=08e80f4aa38a15903e31f11cba3b3356931c1dd4;hpb=ba5d08938130b2545f8b3e73a701989563316e49;p=ffmpeg diff --git a/libavformat/apetag.c b/libavformat/apetag.c index 08e80f4aa38..cdc602e1a9c 100644 --- a/libavformat/apetag.c +++ b/libavformat/apetag.c @@ -30,7 +30,7 @@ #include "internal.h" #define APE_TAG_FLAG_CONTAINS_HEADER (1 << 31) -#define APE_TAG_FLAG_CONTAINS_FOOTER (1 << 30) +#define APE_TAG_FLAG_LACKS_FOOTER (1 << 30) #define APE_TAG_FLAG_IS_HEADER (1 << 29) #define APE_TAG_FLAG_IS_BINARY (1 << 1) @@ -150,7 +150,6 @@ int64_t ff_ape_parse_tag(AVFormatContext *s) av_log(s, AV_LOG_ERROR, "Invalid tag size %"PRIu32".\n", tag_bytes); return 0; } - tag_start = file_size - tag_bytes - APE_TAG_FOOTER_BYTES; fields = avio_rl32(pb); /* number of fields */ if (fields > 65536) { @@ -166,6 +165,11 @@ int64_t ff_ape_parse_tag(AVFormatContext *s) avio_seek(pb, file_size - tag_bytes, SEEK_SET); + if (val & APE_TAG_FLAG_CONTAINS_HEADER) + tag_bytes += APE_TAG_HEADER_BYTES; + + tag_start = file_size - tag_bytes; + for (i=0; imetadata, "", e, AV_DICT_IGNORE_SUFFIX))) { int val_len; @@ -215,7 +214,7 @@ int ff_ape_write_tag(AVFormatContext *s) size = avio_close_dyn_buf(dyn_bc, &dyn_buf); if (size <= 0) goto end; - size += 20; + size += APE_TAG_FOOTER_BYTES; // header avio_write(s->pb, "APETAGEX", 8); // id @@ -223,7 +222,11 @@ int ff_ape_write_tag(AVFormatContext *s) avio_wl32(s->pb, size); avio_wl32(s->pb, count); - avio_write(s->pb, dyn_buf, size - 20); + // flags + avio_wl32(s->pb, APE_TAG_FLAG_CONTAINS_HEADER | APE_TAG_FLAG_IS_HEADER); + ffio_fill(s->pb, 0, 8); // reserved + + avio_write(s->pb, dyn_buf, size - APE_TAG_FOOTER_BYTES); // footer avio_write(s->pb, "APETAGEX", 8); // id @@ -232,7 +235,7 @@ int ff_ape_write_tag(AVFormatContext *s) avio_wl32(s->pb, count); // tag count // flags - avio_wl32(s->pb, APE_TAG_FLAG_CONTAINS_HEADER | APE_TAG_FLAG_CONTAINS_FOOTER); + avio_wl32(s->pb, APE_TAG_FLAG_CONTAINS_HEADER); ffio_fill(s->pb, 0, 8); // reserved end: