summaryrefslogtreecommitdiffstats
path: root/gst/id3demux/id3tags.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/id3demux/id3tags.c')
-rw-r--r--gst/id3demux/id3tags.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gst/id3demux/id3tags.c b/gst/id3demux/id3tags.c
index 1d511f33..96d25521 100644
--- a/gst/id3demux/id3tags.c
+++ b/gst/id3demux/id3tags.c
@@ -97,7 +97,7 @@ id3demux_calc_id3v2_tag_size (GstBuffer * buf)
return size;
}
-static guint8 *
+guint8 *
id3demux_ununsync_data (const guint8 * unsync_data, guint32 * size)
{
const guint8 *end;
@@ -195,7 +195,10 @@ id3demux_read_id3v2_tag (GstBuffer * buffer, guint * id3v2_size,
else
work.hdr.frame_data_size = read_size - ID3V2_HDR_SIZE;
- if ((flags & ID3V2_HDR_FLAG_UNSYNC)) {
+ /* in v2.3 the frame sizes are not syncsafe, so the entire tag had to be
+ * unsynced. In v2.4 the frame sizes are syncsafe so it's just the frame
+ * data that needs un-unsyncing, but not the frame headers. */
+ if ((flags & ID3V2_HDR_FLAG_UNSYNC) != 0 && ID3V2_VER_MAJOR (version) <= 3) {
GST_DEBUG ("Un-unsyncing entire tag");
uu_data = id3demux_ununsync_data (work.hdr.frame_data,
&work.hdr.frame_data_size);