summaryrefslogtreecommitdiffstats
path: root/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/fix-id3demux-utf16-to-utf8-issue.patch
blob: ef3f75fba5a29e03f504c070ac340efa75a62857 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Author: Lyon Wang <b12696@freescale.com>
Date:   Thu Oct 9 17:37:43 2014 +0800

[id3v2frames] Bug fix for id3demux issue

Fix the issue that id3 tags utf16 charaters cannot be extreacted in id3demux
when I tried to get the id3v2 tag such as TIT2, TALB etc. it will return extrac
failed.

Checked in id3v2frame.c,  When parse the UTF-16 streams, it used g_convert() to
convert the buffer from UTF-16 to UTF-8, however it will return err that this
conversion is not supported which cause the extraction failed with these UTF-16
characters.

In the patch, use g_utf16_to_utf8() instead of g_convert, which can convert the
character format successfully.

https://bugzilla.gnome.org/show_bug.cgi?id=741144

Upstream-Status: Backport [1.5.1]

Signed-off-by: Lyon Wang <b12696@freescale.com>

diff --git a/gst-libs/gst/tag/id3v2frames.c b/gst-libs/gst/tag/id3v2frames.c
old mode 100644
new mode 100755
index 3785c2a..7b9d8ac
--- a/gst-libs/gst/tag/id3v2frames.c
+++ b/gst-libs/gst/tag/id3v2frames.c
@@ -1057,14 +1057,17 @@ parse_insert_string_field (guint8 encoding, gchar * data, gint data_size,
         data_size -= 2;
       }
 
-      field = g_convert (data, data_size, "UTF-8", in_encode, NULL, NULL, NULL);
-
-      if (field == NULL || g_utf8_validate (field, -1, NULL) == FALSE) {
-        /* As a fallback, try interpreting UTF-16 in the other endianness */
-        if (in_encode == utf16beenc)
-          field = g_convert (data, data_size, "UTF-8", utf16leenc,
-              NULL, NULL, NULL);
+      if (in_encode == utf16beenc) {
+           gunichar2 *data_utf16;
+           guint i;
+           data_utf16 =  (gunichar2 *) data;
+          for (i=0; i<(data_size>>1); i++) {
+            data_utf16[i] = GUINT16_TO_LE (data_utf16[i]);
+          }
       }
+      //field = g_convert (data, data_size, "UTF-8", in_encode, NULL, NULL, NULL);
+       field = g_utf16_to_utf8((gunichar2 *)data, (glong)(data_size>>1), NULL, NULL, NULL);
+
     }
 
       break;