mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
gst/rtpmanager/gstrtpbin.c: Also set NTP base time on new sessions.
Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session): Also set NTP base time on new sessions. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): Use the right lock to protect our variables. Fix some comment. * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_getcaps_send_rtp), (gst_rtp_session_chain_send_rtp), (create_send_rtp_sink): Implement getcaps on the sender sinkpad so that payloaders can negotiate the right SSRC.
This commit is contained in:
parent
a93348cc6d
commit
0441ef80b0
3 changed files with 44 additions and 6 deletions
|
@ -427,6 +427,9 @@ create_session (GstRtpBin * rtpbin, gint id)
|
||||||
sess->ptmap = g_hash_table_new (NULL, NULL);
|
sess->ptmap = g_hash_table_new (NULL, NULL);
|
||||||
rtpbin->sessions = g_slist_prepend (rtpbin->sessions, sess);
|
rtpbin->sessions = g_slist_prepend (rtpbin->sessions, sess);
|
||||||
|
|
||||||
|
/* set NTP base or new session */
|
||||||
|
g_object_set (session, "ntp-ns-base", rtpbin->priv->ntp_ns_base, NULL);
|
||||||
|
|
||||||
/* provide clock_rate to the session manager when needed */
|
/* provide clock_rate to the session manager when needed */
|
||||||
g_signal_connect (session, "request-pt-map",
|
g_signal_connect (session, "request-pt-map",
|
||||||
(GCallback) pt_map_requested, sess);
|
(GCallback) pt_map_requested, sess);
|
||||||
|
|
|
@ -1018,7 +1018,8 @@ again:
|
||||||
priv->clock_base = exttimestamp;
|
priv->clock_base = exttimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* take rtp timestamp offset into account, this can wrap around */
|
/* take rtp timestamp offset into account, this should not wrap around since
|
||||||
|
* we are dealing with the extended timestamp here. */
|
||||||
exttimestamp -= priv->clock_base;
|
exttimestamp -= priv->clock_base;
|
||||||
|
|
||||||
/* bring timestamp to gst time */
|
/* bring timestamp to gst time */
|
||||||
|
@ -1218,9 +1219,8 @@ gst_rtp_jitter_buffer_query (GstPad * pad, GstQuery * query)
|
||||||
/* store this so that we can safely sync on the peer buffers. */
|
/* store this so that we can safely sync on the peer buffers. */
|
||||||
JBUF_LOCK (priv);
|
JBUF_LOCK (priv);
|
||||||
priv->peer_latency = min_latency;
|
priv->peer_latency = min_latency;
|
||||||
JBUF_UNLOCK (priv);
|
|
||||||
|
|
||||||
our_latency = ((guint64) priv->latency_ms) * GST_MSECOND;
|
our_latency = ((guint64) priv->latency_ms) * GST_MSECOND;
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (jitterbuffer, "Our latency: %" GST_TIME_FORMAT,
|
GST_DEBUG_OBJECT (jitterbuffer, "Our latency: %" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (our_latency));
|
GST_TIME_ARGS (our_latency));
|
||||||
|
@ -1263,11 +1263,12 @@ gst_rtp_jitter_buffer_set_property (GObject * object,
|
||||||
{
|
{
|
||||||
guint new_latency, old_latency;
|
guint new_latency, old_latency;
|
||||||
|
|
||||||
/* FIXME, not threadsafe */
|
|
||||||
new_latency = g_value_get_uint (value);
|
new_latency = g_value_get_uint (value);
|
||||||
old_latency = priv->latency_ms;
|
|
||||||
|
|
||||||
|
JBUF_LOCK (priv);
|
||||||
|
old_latency = priv->latency_ms;
|
||||||
priv->latency_ms = new_latency;
|
priv->latency_ms = new_latency;
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
|
|
||||||
/* post message if latency changed, this will inform the parent pipeline
|
/* post message if latency changed, this will inform the parent pipeline
|
||||||
* that a latency reconfiguration is possible/needed. */
|
* that a latency reconfiguration is possible/needed. */
|
||||||
|
@ -1306,7 +1307,9 @@ gst_rtp_jitter_buffer_get_property (GObject * object,
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_LATENCY:
|
case PROP_LATENCY:
|
||||||
|
JBUF_LOCK (priv);
|
||||||
g_value_set_uint (value, priv->latency_ms);
|
g_value_set_uint (value, priv->latency_ms);
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
break;
|
break;
|
||||||
case PROP_DROP_ON_LATENCY:
|
case PROP_DROP_ON_LATENCY:
|
||||||
g_value_set_boolean (value, priv->drop_on_latency);
|
g_value_set_boolean (value, priv->drop_on_latency);
|
||||||
|
|
|
@ -1226,6 +1226,33 @@ gst_rtp_session_event_send_rtp_sink (GstPad * pad, GstEvent * event)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstCaps *
|
||||||
|
gst_rtp_session_getcaps_send_rtp (GstPad * pad)
|
||||||
|
{
|
||||||
|
GstRtpSession *rtpsession;
|
||||||
|
GstRtpSessionPrivate *priv;
|
||||||
|
GstCaps *result;
|
||||||
|
GstStructure *s1, *s2;
|
||||||
|
|
||||||
|
rtpsession = GST_RTP_SESSION (gst_pad_get_parent (pad));
|
||||||
|
priv = rtpsession->priv;
|
||||||
|
|
||||||
|
/* we can basically accept anything but we prefer to receive packets with our
|
||||||
|
* internal SSRC so that we don't have to patch it. Create a structure with
|
||||||
|
* the SSRC and another one without. */
|
||||||
|
s1 = gst_structure_new ("application/x-rtp",
|
||||||
|
"ssrc", G_TYPE_UINT, priv->session->source->ssrc, NULL);
|
||||||
|
s2 = gst_structure_new ("application/x-rtp", NULL);
|
||||||
|
|
||||||
|
result = gst_caps_new_full (s1, s2, NULL);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (rtpsession, "getting caps %" GST_PTR_FORMAT, result);
|
||||||
|
|
||||||
|
gst_object_unref (rtpsession);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Recieve an RTP packet to be send to the receivers, send to RTP session
|
/* Recieve an RTP packet to be send to the receivers, send to RTP session
|
||||||
* manager and forward to send_rtp_src.
|
* manager and forward to send_rtp_src.
|
||||||
*/
|
*/
|
||||||
|
@ -1252,8 +1279,11 @@ gst_rtp_session_chain_send_rtp (GstPad * pad, GstBuffer * buffer)
|
||||||
timestamp);
|
timestamp);
|
||||||
/* convert to NTP time by adding the NTP base */
|
/* convert to NTP time by adding the NTP base */
|
||||||
ntpnstime += priv->ntpnsbase;
|
ntpnstime += priv->ntpnsbase;
|
||||||
} else
|
} else {
|
||||||
|
/* no timestamp, we could take the current running_time and convert it to
|
||||||
|
* NTP time. */
|
||||||
ntpnstime = -1;
|
ntpnstime = -1;
|
||||||
|
}
|
||||||
|
|
||||||
ret = rtp_session_send_rtp (priv->session, buffer, ntpnstime);
|
ret = rtp_session_send_rtp (priv->session, buffer, ntpnstime);
|
||||||
|
|
||||||
|
@ -1341,6 +1371,8 @@ create_send_rtp_sink (GstRtpSession * rtpsession)
|
||||||
"send_rtp_sink");
|
"send_rtp_sink");
|
||||||
gst_pad_set_chain_function (rtpsession->send_rtp_sink,
|
gst_pad_set_chain_function (rtpsession->send_rtp_sink,
|
||||||
gst_rtp_session_chain_send_rtp);
|
gst_rtp_session_chain_send_rtp);
|
||||||
|
gst_pad_set_getcaps_function (rtpsession->send_rtp_sink,
|
||||||
|
gst_rtp_session_getcaps_send_rtp);
|
||||||
gst_pad_set_event_function (rtpsession->send_rtp_sink,
|
gst_pad_set_event_function (rtpsession->send_rtp_sink,
|
||||||
gst_rtp_session_event_send_rtp_sink);
|
gst_rtp_session_event_send_rtp_sink);
|
||||||
gst_pad_set_internal_link_function (rtpsession->send_rtp_sink,
|
gst_pad_set_internal_link_function (rtpsession->send_rtp_sink,
|
||||||
|
|
Loading…
Reference in a new issue