mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 09:55:36 +00:00
autoconvert: Cache incoming new segment events and push to children.
Cache incoming new-segment info. When installing a child element, inform it of the current segment info. https://bugzilla.gnome.org/show_bug.cgi?id=599469
This commit is contained in:
parent
ee8b143e95
commit
55a3f6a08c
2 changed files with 45 additions and 0 deletions
|
@ -227,6 +227,8 @@ gst_auto_convert_init (GstAutoConvert * autoconvert,
|
|||
|
||||
gst_element_add_pad (GST_ELEMENT (autoconvert), autoconvert->sinkpad);
|
||||
gst_element_add_pad (GST_ELEMENT (autoconvert), autoconvert->srcpad);
|
||||
|
||||
gst_segment_init (&autoconvert->sink_segment, GST_FORMAT_UNDEFINED);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -801,6 +803,19 @@ gst_auto_convert_sink_setcaps (GstPad * pad, GstCaps * caps)
|
|||
autoconvert->current_internal_sinkpad = internal_sinkpad;
|
||||
GST_AUTOCONVERT_UNLOCK (autoconvert);
|
||||
|
||||
/* Send new-segment event if we have one */
|
||||
if (autoconvert->sink_segment.format != GST_FORMAT_UNDEFINED) {
|
||||
GstEvent *event;
|
||||
GstSegment *seg = &autoconvert->sink_segment;
|
||||
event = gst_event_new_new_segment_full (TRUE,
|
||||
seg->rate, seg->applied_rate, seg->format, seg->start,
|
||||
seg->stop, seg->time);
|
||||
|
||||
autoconvert->drop_newseg = TRUE;
|
||||
gst_pad_push_event (internal_srcpad, event);
|
||||
autoconvert->drop_newseg = FALSE;
|
||||
}
|
||||
|
||||
GST_INFO_OBJECT (autoconvert,
|
||||
"Selected element %s",
|
||||
GST_OBJECT_NAME (GST_OBJECT (autoconvert->current_subelement)));
|
||||
|
@ -988,6 +1003,26 @@ gst_auto_convert_sink_event (GstPad * pad, GstEvent * event)
|
|||
GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
|
||||
GstPad *internal_srcpad;
|
||||
|
||||
if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
||||
GstFormat format;
|
||||
gdouble rate, arate;
|
||||
gint64 start, stop, time;
|
||||
gboolean update;
|
||||
|
||||
gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
|
||||
&start, &stop, &time);
|
||||
|
||||
GST_DEBUG_OBJECT (autoconvert,
|
||||
"newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT
|
||||
", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT,
|
||||
update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
|
||||
GST_TIME_ARGS (time));
|
||||
|
||||
/* Store the values for feeding to sub-elements */
|
||||
gst_segment_set_newsegment_full (&autoconvert->sink_segment, update,
|
||||
rate, arate, format, start, stop, time);
|
||||
}
|
||||
|
||||
internal_srcpad = gst_auto_convert_get_internal_srcpad (autoconvert);
|
||||
if (internal_srcpad) {
|
||||
ret = gst_pad_push_event (internal_srcpad, event);
|
||||
|
@ -1323,6 +1358,14 @@ gst_auto_convert_internal_sink_event (GstPad * pad, GstEvent * event)
|
|||
GST_AUTO_CONVERT (g_object_get_qdata (G_OBJECT (pad),
|
||||
parent_quark));
|
||||
|
||||
if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
|
||||
if (autoconvert->drop_newseg) {
|
||||
GST_DEBUG_OBJECT (autoconvert, "Dropping primer newsegment event");
|
||||
gst_event_unref (event);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return gst_pad_push_event (autoconvert->srcpad, event);
|
||||
}
|
||||
|
||||
|
|
|
@ -54,6 +54,8 @@ struct _GstAutoConvert
|
|||
GstPad *current_internal_sinkpad;
|
||||
|
||||
GList *cached_events;
|
||||
GstSegment sink_segment;
|
||||
gboolean drop_newseg;
|
||||
};
|
||||
|
||||
struct _GstAutoConvertClass
|
||||
|
|
Loading…
Reference in a new issue