subtitleoverlay: Update segments after pushing the events downstream
This makes sure that we don't apply segments twice downstream. Also always send our newsegment events downstream.
This commit is contained in:
parent
e869b57296
commit
af3d16dbb1
@ -532,7 +532,7 @@ _setup_passthrough (GstSubtitleOverlay * self)
|
|||||||
|
|
||||||
/* Send segment to the identity. This is dropped because identity
|
/* Send segment to the identity. This is dropped because identity
|
||||||
* is not linked downstream yet */
|
* is not linked downstream yet */
|
||||||
if (!self->video_segment_pending) {
|
if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
|
||||||
GstEvent *event1, *event2;
|
GstEvent *event1, *event2;
|
||||||
|
|
||||||
_generate_update_newsegment_event (&self->video_segment, &event1, &event2);
|
_generate_update_newsegment_event (&self->video_segment, &event1, &event2);
|
||||||
@ -914,7 +914,7 @@ _pad_blocked_cb (GstPad * pad, gboolean blocked, gpointer user_data)
|
|||||||
|
|
||||||
/* Send segments to the parser/overlay if necessary. These are not sent
|
/* Send segments to the parser/overlay if necessary. These are not sent
|
||||||
* outside this element because of the proxy pad event function */
|
* outside this element because of the proxy pad event function */
|
||||||
if (!self->video_segment_pending) {
|
if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
|
||||||
GstEvent *event1, *event2;
|
GstEvent *event1, *event2;
|
||||||
|
|
||||||
sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
|
sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
|
||||||
@ -937,7 +937,7 @@ _pad_blocked_cb (GstPad * pad, gboolean blocked, gpointer user_data)
|
|||||||
gst_object_unref (sink);
|
gst_object_unref (sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self->subtitle_segment_pending) {
|
if (self->subtitle_segment.format != GST_FORMAT_UNDEFINED) {
|
||||||
GstEvent *event1, *event2;
|
GstEvent *event1, *event2;
|
||||||
|
|
||||||
sink = gst_element_get_static_pad (element, "sink");
|
sink = gst_element_get_static_pad (element, "sink");
|
||||||
@ -1078,7 +1078,7 @@ _pad_blocked_cb (GstPad * pad, gboolean blocked, gpointer user_data)
|
|||||||
|
|
||||||
/* Send segments to the renderer if necessary. These are not sent
|
/* Send segments to the renderer if necessary. These are not sent
|
||||||
* outside this element because of the proxy pad event handler */
|
* outside this element because of the proxy pad event handler */
|
||||||
if (!self->video_segment_pending) {
|
if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
|
||||||
GstEvent *event1, *event2;
|
GstEvent *event1, *event2;
|
||||||
|
|
||||||
sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
|
sink = gst_element_get_static_pad (self->pre_colorspace, "sink");
|
||||||
@ -1100,7 +1100,7 @@ _pad_blocked_cb (GstPad * pad, gboolean blocked, gpointer user_data)
|
|||||||
gst_object_unref (sink);
|
gst_object_unref (sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self->subtitle_segment_pending) {
|
if (self->subtitle_segment.format != GST_FORMAT_UNDEFINED) {
|
||||||
GstEvent *event1, *event2;
|
GstEvent *event1, *event2;
|
||||||
|
|
||||||
sink = _get_sub_pad (element);
|
sink = _get_sub_pad (element);
|
||||||
@ -1206,8 +1206,6 @@ gst_subtitle_overlay_change_state (GstElement * element,
|
|||||||
|
|
||||||
self->fps_n = self->fps_d = 0;
|
self->fps_n = self->fps_d = 0;
|
||||||
|
|
||||||
self->video_segment_pending = FALSE;
|
|
||||||
self->subtitle_segment_pending = FALSE;
|
|
||||||
self->subtitle_flush = FALSE;
|
self->subtitle_flush = FALSE;
|
||||||
|
|
||||||
do_async_start (self);
|
do_async_start (self);
|
||||||
@ -1478,7 +1476,15 @@ gst_subtitle_overlay_video_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
{
|
{
|
||||||
GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
|
GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
gboolean is_newsegment_event = FALSE;
|
|
||||||
|
if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
|
||||||
|
GST_DEBUG_OBJECT (pad,
|
||||||
|
"Resetting video segment because of flush-stop event");
|
||||||
|
gst_segment_init (&self->video_segment, GST_FORMAT_UNDEFINED);
|
||||||
|
self->fps_n = self->fps_d = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = self->video_sink_event (pad, gst_event_ref (event));
|
||||||
|
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
||||||
gboolean update;
|
gboolean update;
|
||||||
@ -1505,19 +1511,9 @@ gst_subtitle_overlay_video_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
applied_rate, format, start, stop, position);
|
applied_rate, format, start, stop, position);
|
||||||
GST_DEBUG_OBJECT (pad, "New video segment: %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (pad, "New video segment: %" GST_SEGMENT_FORMAT,
|
||||||
&self->video_segment);
|
&self->video_segment);
|
||||||
is_newsegment_event = TRUE;
|
|
||||||
} else if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
|
|
||||||
GST_DEBUG_OBJECT (pad,
|
|
||||||
"Resetting video segment because of flush-stop event");
|
|
||||||
gst_segment_init (&self->video_segment, GST_FORMAT_UNDEFINED);
|
|
||||||
self->fps_n = self->fps_d = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_newsegment_event)
|
gst_event_unref (event);
|
||||||
self->video_segment_pending = TRUE;
|
|
||||||
ret = self->video_sink_event (pad, event);
|
|
||||||
self->video_segment_pending = FALSE;
|
|
||||||
|
|
||||||
gst_object_unref (self);
|
gst_object_unref (self);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1666,35 +1662,9 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
{
|
{
|
||||||
GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
|
GstSubtitleOverlay *self = GST_SUBTITLE_OVERLAY (gst_pad_get_parent (pad));
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
gboolean is_newsegment = FALSE;
|
|
||||||
|
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
|
||||||
gboolean update;
|
|
||||||
gdouble rate, applied_rate;
|
|
||||||
GstFormat format;
|
GstFormat format;
|
||||||
gint64 start, stop, position;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad, "Newsegment event: %" GST_PTR_FORMAT,
|
if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB &&
|
||||||
event->structure);
|
|
||||||
gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
|
|
||||||
&format, &start, &stop, &position);
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad, "Old subtitle segment: %" GST_SEGMENT_FORMAT,
|
|
||||||
&self->subtitle_segment);
|
|
||||||
if (self->subtitle_segment.format != format) {
|
|
||||||
GST_DEBUG_OBJECT (pad, "Subtitle segment format changed: %s -> %s",
|
|
||||||
gst_format_get_name (self->subtitle_segment.format),
|
|
||||||
gst_format_get_name (format));
|
|
||||||
gst_segment_init (&self->subtitle_segment, format);
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_segment_set_newsegment_full (&self->subtitle_segment, update, rate,
|
|
||||||
applied_rate, format, start, stop, position);
|
|
||||||
GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
|
|
||||||
&self->subtitle_segment);
|
|
||||||
|
|
||||||
is_newsegment = TRUE;
|
|
||||||
} else if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB &&
|
|
||||||
event->structure
|
event->structure
|
||||||
&& strcmp (gst_structure_get_name (event->structure),
|
&& strcmp (gst_structure_get_name (event->structure),
|
||||||
"subtitleoverlay-flush-subtitle") == 0) {
|
"subtitleoverlay-flush-subtitle") == 0) {
|
||||||
@ -1715,6 +1685,16 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
event = NULL;
|
event = NULL;
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
goto out;
|
goto out;
|
||||||
|
} else if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
||||||
|
gst_event_parse_new_segment_full (event, NULL, NULL, NULL,
|
||||||
|
&format, NULL, NULL, NULL);
|
||||||
|
if (self->subtitle_segment.format != GST_FORMAT_UNDEFINED &&
|
||||||
|
self->subtitle_segment.format != format) {
|
||||||
|
GST_DEBUG_OBJECT (pad, "Subtitle segment format changed: %s -> %s",
|
||||||
|
gst_format_get_name (self->subtitle_segment.format),
|
||||||
|
gst_format_get_name (format));
|
||||||
|
gst_segment_init (&self->subtitle_segment, GST_FORMAT_UNDEFINED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
@ -1744,10 +1724,33 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_newsegment)
|
ret = self->subtitle_sink_event (pad, gst_event_ref (event));
|
||||||
self->subtitle_segment_pending = TRUE;
|
|
||||||
ret = self->subtitle_sink_event (pad, event);
|
if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
||||||
self->subtitle_segment_pending = FALSE;
|
gboolean update;
|
||||||
|
gdouble rate, applied_rate;
|
||||||
|
gint64 start, stop, position;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "Newsegment event: %" GST_PTR_FORMAT,
|
||||||
|
event->structure);
|
||||||
|
gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
|
||||||
|
&format, &start, &stop, &position);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "Old subtitle segment: %" GST_SEGMENT_FORMAT,
|
||||||
|
&self->subtitle_segment);
|
||||||
|
if (self->subtitle_segment.format != format) {
|
||||||
|
GST_DEBUG_OBJECT (pad, "Subtitle segment format changed: %s -> %s",
|
||||||
|
gst_format_get_name (self->subtitle_segment.format),
|
||||||
|
gst_format_get_name (format));
|
||||||
|
gst_segment_init (&self->subtitle_segment, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_segment_set_newsegment_full (&self->subtitle_segment, update, rate,
|
||||||
|
applied_rate, format, start, stop, position);
|
||||||
|
GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
|
||||||
|
&self->subtitle_segment);
|
||||||
|
}
|
||||||
|
gst_event_unref (event);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
gst_object_unref (self);
|
gst_object_unref (self);
|
||||||
|
@ -75,7 +75,6 @@ struct _GstSubtitleOverlay
|
|||||||
GstPadEventFunction video_sink_event;
|
GstPadEventFunction video_sink_event;
|
||||||
gboolean video_sink_blocked;
|
gboolean video_sink_blocked;
|
||||||
GstSegment video_segment;
|
GstSegment video_segment;
|
||||||
gboolean video_segment_pending;
|
|
||||||
gint fps_n, fps_d;
|
gint fps_n, fps_d;
|
||||||
|
|
||||||
GstPad *subtitle_sinkpad;
|
GstPad *subtitle_sinkpad;
|
||||||
@ -86,7 +85,6 @@ struct _GstSubtitleOverlay
|
|||||||
GstPadSetCapsFunction subtitle_sink_setcaps;
|
GstPadSetCapsFunction subtitle_sink_setcaps;
|
||||||
gboolean subtitle_sink_blocked;
|
gboolean subtitle_sink_blocked;
|
||||||
GstSegment subtitle_segment;
|
GstSegment subtitle_segment;
|
||||||
gboolean subtitle_segment_pending;
|
|
||||||
gboolean subtitle_flush;
|
gboolean subtitle_flush;
|
||||||
|
|
||||||
GList *factories;
|
GList *factories;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user