diff -r 4b0c6ed43234 -r 8e837d1bf446 gst_plugins_base/gst/subparse/gstssaparse.c --- a/gst_plugins_base/gst/subparse/gstssaparse.c Wed Mar 24 17:58:42 2010 -0500 +++ b/gst_plugins_base/gst/subparse/gstssaparse.c Wed Mar 24 18:04:17 2010 -0500 @@ -53,7 +53,6 @@ static gboolean gst_ssa_parse_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_ssa_parse_chain (GstPad * sinkpad, GstBuffer * buf); - static void gst_ssa_parse_base_init (gpointer klass) { @@ -108,6 +107,7 @@ parse->ini = NULL; parse->framed = FALSE; + parse->send_tags = FALSE; } static void @@ -153,6 +153,7 @@ } parse->framed = TRUE; + parse->send_tags = TRUE; priv = (GstBuffer *) gst_value_get_mini_object (val); g_return_val_if_fail (priv != NULL, FALSE); @@ -305,11 +306,20 @@ if (G_UNLIKELY (!parse->framed)) goto not_framed; + if (G_UNLIKELY (parse->send_tags)) { + GstTagList *tags; + + tags = gst_tag_list_new (); + gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_SUBTITLE_CODEC, + "SubStation Alpha", NULL); + gst_element_found_tags_for_pad (GST_ELEMENT (parse), parse->srcpad, tags); + parse->send_tags = FALSE; + } + /* make double-sure it's 0-terminated and all */ txt = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - if (txt == NULL) - return GST_FLOW_UNEXPECTED; + goto empty_text; ts = GST_BUFFER_TIMESTAMP (buf); ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf)); @@ -321,6 +331,7 @@ ret = GST_FLOW_OK; } + gst_buffer_unref (buf); g_free (txt); return ret; @@ -330,8 +341,16 @@ { GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL), ("Only SSA subtitles embedded in containers are supported")); + gst_buffer_unref (buf); return GST_FLOW_NOT_NEGOTIATED; } +empty_text: + { + GST_ELEMENT_WARNING (parse, STREAM, FORMAT, (NULL), + ("Received empty subtitle")); + gst_buffer_unref (buf); + return GST_FLOW_OK; + } } static GstStateChangeReturn