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) |