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:
Wim Taymans 2007-09-15 18:48:03 +00:00 committed by Tim-Philipp Müller
parent a93348cc6d
commit 0441ef80b0
3 changed files with 44 additions and 6 deletions

View file

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

View file

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

View file

@ -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,