summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2012-12-17 00:59:57 +0000
committerTim-Philipp Müller <tim@centricular.net>2012-12-17 01:09:11 +0000
commit53072a43261c8f45f6b572b7463f83953a4549d6 (patch)
tree2dbdfe4bfb2ca73fecd0eb0c8a23273d5dc55bc9
parent6549db36cd39237b2b6d8312b18594d11ec312a3 (diff)
ssaparse: ignore invalid UTF-8 in init section
The codec data blob we get from matroskademux with the SSA/ASS init section is supposed to be valid UTF-8. If it's not, just continue with the bits that are valid UTF-8 instead of erroring out. We don't actually parse the init section yet anyway.. https://bugzilla.gnome.org/show_bug.cgi?id=607630
-rw-r--r--gst/subparse/gstssaparse.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/gst/subparse/gstssaparse.c b/gst/subparse/gstssaparse.c
index ce1639a1f..f6fed8cf2 100644
--- a/gst/subparse/gstssaparse.c
+++ b/gst/subparse/gstssaparse.c
@@ -150,10 +150,11 @@ gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps)
const GValue *val;
GstStructure *s;
const guchar bom_utf8[] = { 0xEF, 0xBB, 0xBF };
+ const gchar *end;
GstBuffer *priv;
GstMapInfo map;
gchar *ptr;
- gsize left;
+ gsize left, bad_offset;
gboolean ret;
s = gst_caps_get_structure (caps, 0);
@@ -172,7 +173,10 @@ gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps)
gst_buffer_ref (priv);
- gst_buffer_map (priv, &map, GST_MAP_READ);
+ if (!gst_buffer_map (priv, &map, GST_MAP_READ))
+ return FALSE;
+
+ GST_MEMDUMP_OBJECT (parse, "init section", map.data, map.size);
ptr = (gchar *) map.data;
left = map.size;
@@ -186,8 +190,13 @@ gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps)
if (!strstr (ptr, "[Script Info]"))
goto invalid_init;
- if (!g_utf8_validate (ptr, left, NULL))
- goto invalid_utf8;
+ if (!g_utf8_validate (ptr, left, &end)) {
+ bad_offset = (gsize) (end - ptr);
+ GST_WARNING_OBJECT (parse, "Init section is not valid UTF-8. Problem at "
+ "byte offset %" G_GSIZE_FORMAT, bad_offset);
+ /* continue with valid UTF-8 data */
+ left = bad_offset;
+ }
/* FIXME: parse initial section */
parse->ini = g_strndup (ptr, left);
@@ -212,13 +221,6 @@ invalid_init:
gst_buffer_unref (priv);
return FALSE;
}
-invalid_utf8:
- {
- GST_WARNING_OBJECT (parse, "Init section is not valid UTF-8");
- gst_buffer_unmap (priv, &map);
- gst_buffer_unref (priv);
- return FALSE;
- }
}
static gboolean