gst_plugins_base/gst/subparse/gstssaparse.c
changeset 8 4a7fac7dd34a
parent 0 0e761a78d257
child 30 7e817e7e631c
--- a/gst_plugins_base/gst/subparse/gstssaparse.c	Fri Mar 19 09:35:09 2010 +0200
+++ b/gst_plugins_base/gst/subparse/gstssaparse.c	Fri Apr 16 15:15:52 2010 +0300
@@ -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