gst_plugins_base/gst/subparse/gstssaparse.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
equal deleted inserted replaced
29:567bb019e3e3 30:7e817e7e631c
    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 
    55 
    56 
    56 static void
    57 static void
    57 gst_ssa_parse_base_init (gpointer klass)
    58 gst_ssa_parse_base_init (gpointer klass)
    58 {
    59 {
    59   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
    60   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
   105   gst_pad_set_caps (parse->srcpad,
   106   gst_pad_set_caps (parse->srcpad,
   106       gst_static_pad_template_get_caps (&src_templ));
   107       gst_static_pad_template_get_caps (&src_templ));
   107 
   108 
   108   parse->ini = NULL;
   109   parse->ini = NULL;
   109   parse->framed = FALSE;
   110   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;
       
   157 
   156 
   158   priv = (GstBuffer *) gst_value_get_mini_object (val);
   157   priv = (GstBuffer *) gst_value_get_mini_object (val);
   159   g_return_val_if_fail (priv != NULL, FALSE);
   158   g_return_val_if_fail (priv != NULL, FALSE);
   160 
   159 
   161   gst_buffer_ref (priv);
   160   gst_buffer_ref (priv);
   304   gchar *txt;
   303   gchar *txt;
   305 
   304 
   306   if (G_UNLIKELY (!parse->framed))
   305   if (G_UNLIKELY (!parse->framed))
   307     goto not_framed;
   306     goto not_framed;
   308 
   307 
   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 
       
   319   /* make double-sure it's 0-terminated and all */
   308   /* make double-sure it's 0-terminated and all */
   320   txt = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
   309   txt = g_strndup ((gchar *) GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
       
   310 
   321   if (txt == NULL)
   311   if (txt == NULL)
   322     goto empty_text;
   312     return GST_FLOW_UNEXPECTED;
   323 
   313 
   324   ts = GST_BUFFER_TIMESTAMP (buf);
   314   ts = GST_BUFFER_TIMESTAMP (buf);
   325   ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf));
   315   ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf));
   326 
   316 
   327   if (ret != GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (ts)) {
   317   if (ret != GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (ts)) {
   329     gst_pad_push_event (parse->srcpad,
   319     gst_pad_push_event (parse->srcpad,
   330         gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, ts, -1, ts));
   320         gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, ts, -1, ts));
   331     ret = GST_FLOW_OK;
   321     ret = GST_FLOW_OK;
   332   }
   322   }
   333 
   323 
   334   gst_buffer_unref (buf);
       
   335   g_free (txt);
   324   g_free (txt);
   336 
   325 
   337   return ret;
   326   return ret;
   338 
   327 
   339 /* ERRORS */
   328 /* ERRORS */
   340 not_framed:
   329 not_framed:
   341   {
   330   {
   342     GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL),
   331     GST_ELEMENT_ERROR (parse, STREAM, FORMAT, (NULL),
   343         ("Only SSA subtitles embedded in containers are supported"));
   332         ("Only SSA subtitles embedded in containers are supported"));
   344     gst_buffer_unref (buf);
       
   345     return GST_FLOW_NOT_NEGOTIATED;
   333     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;
       
   353   }
   334   }
   354 }
   335 }
   355 
   336 
   356 static GstStateChangeReturn
   337 static GstStateChangeReturn
   357 gst_ssa_parse_change_state (GstElement * element, GstStateChange transition)
   338 gst_ssa_parse_change_state (GstElement * element, GstStateChange transition)