mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
rtpfunnel: forward correct segment when switching pad
Forwarding a single segment event from the pad that first gets chained is incorrect: when that first event was sent by an element such as x264enc, with its offset start, we end pushing out of segment buffers for the other pad(s). Instead, everytime the active pad changes, forward the appropriate segment event. Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1028
This commit is contained in:
parent
86ec5c1031
commit
e18d5d6ec6
1 changed files with 23 additions and 9 deletions
|
@ -75,6 +75,8 @@ struct _GstRtpFunnel
|
||||||
GstCaps *srccaps;
|
GstCaps *srccaps;
|
||||||
gboolean send_sticky_events;
|
gboolean send_sticky_events;
|
||||||
GHashTable *ssrc_to_pad;
|
GHashTable *ssrc_to_pad;
|
||||||
|
/* The last pad data was chained on */
|
||||||
|
GstPad *current_pad;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
gint common_ts_offset;
|
gint common_ts_offset;
|
||||||
|
@ -96,12 +98,11 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
G_DEFINE_TYPE (GstRtpFunnel, gst_rtp_funnel, GST_TYPE_ELEMENT);
|
G_DEFINE_TYPE (GstRtpFunnel, gst_rtp_funnel, GST_TYPE_ELEMENT);
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
gst_rtp_funnel_send_sticky (GstRtpFunnel * funnel, GstPad * pad)
|
gst_rtp_funnel_send_sticky (GstRtpFunnel * funnel, GstPad * pad)
|
||||||
{
|
{
|
||||||
GstEvent *stream_start;
|
GstEvent *stream_start;
|
||||||
GstEvent *caps;
|
GstEvent *caps;
|
||||||
GstEvent *segment;
|
|
||||||
|
|
||||||
if (!funnel->send_sticky_events)
|
if (!funnel->send_sticky_events)
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -118,16 +119,31 @@ gst_rtp_funnel_send_sticky (GstRtpFunnel * funnel, GstPad * pad)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
funnel->send_sticky_events = FALSE;
|
||||||
|
|
||||||
|
done:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_rtp_funnel_forward_segment (GstRtpFunnel * funnel, GstPad * pad)
|
||||||
|
{
|
||||||
|
GstEvent *segment;
|
||||||
|
|
||||||
|
if (pad == funnel->current_pad) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
segment = gst_pad_get_sticky_event (pad, GST_EVENT_SEGMENT, 0);
|
segment = gst_pad_get_sticky_event (pad, GST_EVENT_SEGMENT, 0);
|
||||||
if (segment && !gst_pad_push_event (funnel->srcpad, segment)) {
|
if (segment && !gst_pad_push_event (funnel->srcpad, segment)) {
|
||||||
GST_ERROR_OBJECT (funnel, "Could not push segment");
|
GST_ERROR_OBJECT (funnel, "Could not push segment");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
funnel->send_sticky_events = FALSE;
|
funnel->current_pad = pad;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return !funnel->send_sticky_events;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
|
@ -140,11 +156,8 @@ gst_rtp_funnel_sink_chain_object (GstPad * pad, GstRtpFunnel * funnel,
|
||||||
|
|
||||||
GST_PAD_STREAM_LOCK (funnel->srcpad);
|
GST_PAD_STREAM_LOCK (funnel->srcpad);
|
||||||
|
|
||||||
if (!gst_rtp_funnel_send_sticky (funnel, pad)) {
|
gst_rtp_funnel_send_sticky (funnel, pad);
|
||||||
GST_PAD_STREAM_UNLOCK (funnel->srcpad);
|
gst_rtp_funnel_forward_segment (funnel, pad);
|
||||||
gst_mini_object_unref (obj);
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_list)
|
if (is_list)
|
||||||
res = gst_pad_push_list (funnel->srcpad, GST_BUFFER_LIST_CAST (obj));
|
res = gst_pad_push_list (funnel->srcpad, GST_BUFFER_LIST_CAST (obj));
|
||||||
|
@ -474,4 +487,5 @@ gst_rtp_funnel_init (GstRtpFunnel * funnel)
|
||||||
funnel->send_sticky_events = TRUE;
|
funnel->send_sticky_events = TRUE;
|
||||||
funnel->srccaps = gst_caps_new_empty_simple (RTP_CAPS);
|
funnel->srccaps = gst_caps_new_empty_simple (RTP_CAPS);
|
||||||
funnel->ssrc_to_pad = g_hash_table_new (NULL, NULL);
|
funnel->ssrc_to_pad = g_hash_table_new (NULL, NULL);
|
||||||
|
funnel->current_pad = NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue