gst_plugins_base/gst/subparse/gstssaparse.c
changeset 8 4a7fac7dd34a
parent 0 0e761a78d257
child 30 7e817e7e631c
equal deleted inserted replaced
7:71e347f905f2 8:4a7fac7dd34a
    50     element, GstStateChange transition);
    50     element, GstStateChange transition);
    51 static gboolean gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps);
    51 static gboolean gst_ssa_parse_setcaps (GstPad * sinkpad, GstCaps * caps);
    52 static gboolean gst_ssa_parse_src_event (GstPad * pad, GstEvent * event);
    52 static gboolean gst_ssa_parse_src_event (GstPad * pad, GstEvent * event);
    53 static gboolean gst_ssa_parse_sink_event (GstPad * pad, GstEvent * event);
    53 static gboolean gst_ssa_parse_sink_event (GstPad * pad, GstEvent * event);
    54 static GstFlowReturn gst_ssa_parse_chain (GstPad * sinkpad, GstBuffer * buf);
    54 static GstFlowReturn gst_ssa_parse_chain (GstPad * sinkpad, GstBuffer * buf);
    55 
       
    56 
    55 
    57 static void
    56 static void
    58 gst_ssa_parse_base_init (gpointer klass)
    57 gst_ssa_parse_base_init (gpointer klass)
    59 {
    58 {
    60   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
    59   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
   106   gst_pad_set_caps (parse->srcpad,
   105   gst_pad_set_caps (parse->srcpad,
   107       gst_static_pad_template_get_caps (&src_templ));
   106       gst_static_pad_template_get_caps (&src_templ));
   108 
   107 
   109   parse->ini = NULL;
   108   parse->ini = NULL;
   110   parse->framed = FALSE;
   109   parse->framed = FALSE;
       
   110   parse->send_tags = FALSE;
   111 }
   111 }
   112 
   112 
   113 static void
   113 static void
   114 gst_ssa_parse_class_init (GstSsaParseClass * klass)
   114 gst_ssa_parse_class_init (GstSsaParseClass * klass)
   115 {
   115 {
   151     GST_ERROR ("Only SSA subtitles embedded in containers are supported");
   151     GST_ERROR ("Only SSA subtitles embedded in containers are supported");
   152     return FALSE;
   152     return FALSE;
   153   }
   153   }
   154 
   154 
   155   parse->framed = TRUE;
   155   parse->framed = TRUE;
       
   156   parse->send_tags = TRUE;
   156 
   157 
   157   priv = (GstBuffer *) gst_value_get_mini_object (val);
   158   priv = (GstBuffer *) gst_value_get_mini_object (val);
   158   g_return_val_if_fail (priv != NULL, FALSE);
   159   g_return_val_if_fail (priv != NULL, FALSE);
   159 
   160 
   160   gst_buffer_ref (priv);
   161   gst_buffer_ref (priv);
   303   gchar *txt;
   304   gchar *txt;
   304 
   305 
   305   if (G_UNLIKELY (!parse->framed))
   306   if (G_UNLIKELY (!parse->framed))
   306     goto not_framed;
   307     goto not_framed;
   307 
   308 
       
   309   if (G_UNLIKELY (parse->send_tags)) {
       
   310     GstTagList *tags;
       
   311 
       
   312     tags = gst_tag_list_new ();
       
   313     gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_SUBTITLE_CODEC,
       
   314         "SubStation Alpha", NULL);
       
   315     gst_element_found_tags_for_pad (GST_ELEMENT (parse), parse->srcpad, tags);
       
   316     parse->send_tags = FALSE;
       
   317   }
       
   318 
   308   /* make double-sure it's 0-terminated and all */
   319   /* make double-sure it's 0-terminated and all */
   309   txt = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
   320   txt = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
   310 
       
   311   if (txt == NULL)
   321   if (txt == NULL)
   312     return GST_FLOW_UNEXPECTED;
   322     goto empty_text;
   313 
   323 
   314   ts = GST_BUFFER_TIMESTAMP (buf);
   324   ts = GST_BUFFER_TIMESTAMP (buf);
   315   ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf));
   325   ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf));
   316 
   326 
   317   if (ret != GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (ts)) {
   327   if (ret != GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (ts)) {
   319     gst_pad_push_event (parse->srcpad,
   329     gst_pad_push_event (parse->srcpad,
   320         gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, ts, -1, ts));
   330         gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, ts, -1, ts));
   321     ret = GST_FLOW_OK;
   331     ret = GST_FLOW_OK;
   322   }
   332   }
   323 
   333 
       
   334   gst_buffer_unref (buf);
   324   g_free (txt);
   335   g_free (txt);
   325 
   336 
   326   return ret;
   337   return ret;
   327 
   338 
   328 /* ERRORS */
   339 /* ERRORS */
   329 not_framed:
   340 not_framed:
   330   {
   341   {
   331     GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL),
   342     GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL),
   332         ("Only SSA subtitles embedded in containers are supported"));
   343         ("Only SSA subtitles embedded in containers are supported"));
       
   344     gst_buffer_unref (buf);
   333     return GST_FLOW_NOT_NEGOTIATED;
   345     return GST_FLOW_NOT_NEGOTIATED;
       
   346   }
       
   347 empty_text:
       
   348   {
       
   349     GST_ELEMENT_WARNING (parse, STREAM, FORMAT, (NULL),
       
   350         ("Received empty subtitle"));
       
   351     gst_buffer_unref (buf);
       
   352     return GST_FLOW_OK;
   334   }
   353   }
   335 }
   354 }
   336 
   355 
   337 static GstStateChangeReturn
   356 static GstStateChangeReturn
   338 gst_ssa_parse_change_state (GstElement * element, GstStateChange transition)
   357 gst_ssa_parse_change_state (GstElement * element, GstStateChange transition)