mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-27 09:38:17 +00:00
tag: id3v2: Adjust for data length indicators when parsing (Fixes #329810)
Original commit message from CVS: * gst-libs/gst/tag/id3v2frames.c: (id3demux_id3v2_parse_frame), (parse_split_strings): Adjust for data length indicators when parsing (Fixes #329810) Fix stupid bug parsing UTF-8 tag text. Output tag strings with multiple fields as multiple tags, so the app gets all the data.
This commit is contained in:
parent
207f8e9f23
commit
05a5fd1e51
1 changed files with 14 additions and 9 deletions
|
@ -100,8 +100,9 @@ id3demux_id3v2_parse_frame (ID3TagsWorking * work)
|
||||||
frame_data_size);
|
frame_data_size);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
work->parse_size = frame_data_size;
|
|
||||||
|
work->parse_size = frame_data_size;
|
||||||
|
|
||||||
if (work->frame_flags & ID3V2_FRAME_FORMAT_COMPRESSION) {
|
if (work->frame_flags & ID3V2_FRAME_FORMAT_COMPRESSION) {
|
||||||
#ifdef HAVE_ZLIB
|
#ifdef HAVE_ZLIB
|
||||||
|
@ -130,7 +131,7 @@ id3demux_id3v2_parse_frame (ID3TagsWorking * work)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
work->parse_data = work->hdr.frame_data;
|
work->parse_data = frame_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (work->frame_id[0] == 'T') {
|
if (work->frame_id[0] == 'T') {
|
||||||
|
@ -151,9 +152,8 @@ id3demux_id3v2_parse_frame (ID3TagsWorking * work)
|
||||||
/* Unique file identifier */
|
/* Unique file identifier */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (work->frame_flags & ID3V2_FRAME_FORMAT_COMPRESSION) {
|
if (work->frame_flags & ID3V2_FRAME_FORMAT_COMPRESSION)
|
||||||
g_free (work->parse_data);
|
g_free (work->parse_data);
|
||||||
}
|
|
||||||
|
|
||||||
if (tag_str != NULL) {
|
if (tag_str != NULL) {
|
||||||
/* g_print ("Tag %s value %s\n", tag_name, tag_str); */
|
/* g_print ("Tag %s value %s\n", tag_name, tag_str); */
|
||||||
|
@ -165,8 +165,13 @@ id3demux_id3v2_parse_frame (ID3TagsWorking * work)
|
||||||
/* Genre strings need special treatment */
|
/* Genre strings need special treatment */
|
||||||
result |= id3v2_genre_fields_to_taglist (work, tag_name, tag_fields);
|
result |= id3v2_genre_fields_to_taglist (work, tag_name, tag_fields);
|
||||||
} else {
|
} else {
|
||||||
tag_str = g_array_index (tag_fields, gchar *, 0);
|
gint t;
|
||||||
result |= id3v2_tag_to_taglist (work, tag_name, tag_str);
|
|
||||||
|
for (t = 0; t < tag_fields->len; t++) {
|
||||||
|
tag_str = g_array_index (tag_fields, gchar *, t);
|
||||||
|
if (tag_str != NULL && tag_str[0] != '\0')
|
||||||
|
result |= id3v2_tag_to_taglist (work, tag_name, tag_str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free_tag_strings (tag_fields);
|
free_tag_strings (tag_fields);
|
||||||
}
|
}
|
||||||
|
@ -484,7 +489,7 @@ parse_split_strings (guint8 encoding, gchar * data, gint data_size,
|
||||||
break;
|
break;
|
||||||
case ID3V2_ENCODING_UTF8:
|
case ID3V2_ENCODING_UTF8:
|
||||||
for (prev = 0, text_pos = 0; text_pos < data_size; text_pos++) {
|
for (prev = 0, text_pos = 0; text_pos < data_size; text_pos++) {
|
||||||
if (data[text_pos]) {
|
if (data[text_pos] == '\0') {
|
||||||
field = g_strndup (data + prev, text_pos - prev + 1);
|
field = g_strndup (data + prev, text_pos - prev + 1);
|
||||||
if (field)
|
if (field)
|
||||||
g_array_append_val (fields, field);
|
g_array_append_val (fields, field);
|
||||||
|
@ -502,7 +507,7 @@ parse_split_strings (guint8 encoding, gchar * data, gint data_size,
|
||||||
{
|
{
|
||||||
/* Find '\0\0' terminator */
|
/* Find '\0\0' terminator */
|
||||||
for (text_pos = 0; text_pos < data_size - 1; text_pos += 2) {
|
for (text_pos = 0; text_pos < data_size - 1; text_pos += 2) {
|
||||||
if (data[text_pos] == 0 && data[text_pos + 1] == 0) {
|
if (data[text_pos] == '\0' && data[text_pos + 1] == '\0') {
|
||||||
/* found a delimiter */
|
/* found a delimiter */
|
||||||
if (encoding == ID3V2_ENCODING_UTF16) {
|
if (encoding == ID3V2_ENCODING_UTF16) {
|
||||||
field = g_convert (data + prev, text_pos - prev + 2,
|
field = g_convert (data + prev, text_pos - prev + 2,
|
||||||
|
|
Loading…
Reference in a new issue