diff options
author | Olivier Crete <olivier.crete@collabora.co.uk> | 2007-03-30 00:17:00 +0000 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2009-02-21 17:47:57 +0100 |
commit | e32fcbe2b0ea32ad67bd16388e3e129e4fcb6381 (patch) | |
tree | 33f47f103204a0ede12ff040ec616d0d459ecc34 | |
parent | 44328d3355ee3a5709ba8096681e2a1f8e236626 (diff) | |
download | gst-plugins-bad-e32fcbe2b0ea32ad67bd16388e3e129e4fcb6381.tar.gz gst-plugins-bad-e32fcbe2b0ea32ad67bd16388e3e129e4fcb6381.tar.bz2 gst-plugins-bad-e32fcbe2b0ea32ad67bd16388e3e129e4fcb6381.zip |
[MOVED FROM GST-P-FARSIGHT] Make it generate the proper rtp timestamps in sync with the live source
20070330001700-3e2dc-bbf954e4edec0615c4eee603fbc6ab8a7d89436f.gz
-rw-r--r-- | gst/rtpdtmf/gstrtpdtmfsrc.c | 68 | ||||
-rw-r--r-- | gst/rtpdtmf/gstrtpdtmfsrc.h | 1 |
2 files changed, 32 insertions, 37 deletions
diff --git a/gst/rtpdtmf/gstrtpdtmfsrc.c b/gst/rtpdtmf/gstrtpdtmfsrc.c index a2a98bb9..ae253145 100644 --- a/gst/rtpdtmf/gstrtpdtmfsrc.c +++ b/gst/rtpdtmf/gstrtpdtmfsrc.c @@ -353,10 +353,13 @@ gst_rtp_dtmf_src_handle_event (GstPad * pad, GstEvent * event) !gst_structure_get_int (structure, "volume", &event_volume)) break; + GST_DEBUG_OBJECT (dtmfsrc, "Received start event %d with volume %d", + event_number, event_volume); gst_rtp_dtmf_src_start (dtmfsrc, event_number, event_volume); } else { + GST_DEBUG_OBJECT (dtmfsrc, "Received stop event"); gst_rtp_dtmf_src_stop (dtmfsrc); } } @@ -482,21 +485,11 @@ gst_rtp_dtmf_src_start (GstRTPDTMFSrc *dtmfsrc, dtmfsrc->timestamp = GST_CLOCK_TIME_NONE; } - if (dtmfsrc->ssrc == -1) - dtmfsrc->current_ssrc = g_random_int (); - else - dtmfsrc->current_ssrc = dtmfsrc->ssrc; - - if (dtmfsrc->seqnum_offset == -1) - dtmfsrc->seqnum_base = g_random_int_range (0, G_MAXUINT16); - else - dtmfsrc->seqnum_base = dtmfsrc->seqnum_offset; - dtmfsrc->seqnum = dtmfsrc->seqnum_base; - - if (dtmfsrc->ts_offset == -1) - dtmfsrc->ts_base = g_random_int (); - else - dtmfsrc->ts_base = dtmfsrc->ts_offset; + dtmfsrc->rtp_timestamp = dtmfsrc->ts_base; + gst_util_uint64_scale_int ( + dtmfsrc->timestamp - gst_element_get_base_time (GST_ELEMENT (dtmfsrc)), + dtmfsrc->clock_rate, GST_SECOND); + gst_rtp_dtmf_src_set_caps (dtmfsrc); @@ -531,24 +524,6 @@ gst_rtp_dtmf_src_stop (GstRTPDTMFSrc *dtmfsrc) } static void -gst_rtp_dtmf_src_calc_rtp_timestamp (GstRTPDTMFSrc *dtmfsrc) -{ - /* add our random offset to the timestamp */ - dtmfsrc->rtp_timestamp = dtmfsrc->ts_base; - - if (GST_CLOCK_TIME_IS_VALID (dtmfsrc->timestamp)) { - gint64 rtime; - - rtime = - gst_segment_to_running_time (&dtmfsrc->segment, GST_FORMAT_TIME, - dtmfsrc->timestamp); - rtime = gst_util_uint64_scale_int (rtime, dtmfsrc->clock_rate, GST_SECOND); - - dtmfsrc->rtp_timestamp += rtime; - } -} - -static void gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc) { GstBuffer *buf = NULL; @@ -569,8 +544,10 @@ gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc) gst_rtp_buffer_set_seq (buf, dtmfsrc->seqnum); /* timestamp of RTP header */ - gst_rtp_dtmf_src_calc_rtp_timestamp (dtmfsrc); gst_rtp_buffer_set_timestamp (buf, dtmfsrc->rtp_timestamp); + dtmfsrc->rtp_timestamp += + DEFAULT_PACKET_INTERVAL * dtmfsrc->clock_rate / 1000; + /* duration of DTMF payload */ dtmfsrc->payload->duration += @@ -648,7 +625,7 @@ gst_rtp_dtmf_src_change_state (GstElement * element, GstStateChange transition) { GstRTPDTMFSrc *dtmfsrc; GstStateChangeReturn result; - gboolean no_preroll = TRUE; + gboolean no_preroll = FALSE; dtmfsrc = GST_RTP_DTMF_SRC (element); @@ -656,9 +633,28 @@ gst_rtp_dtmf_src_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: + + if (dtmfsrc->ssrc == -1) + dtmfsrc->current_ssrc = g_random_int (); + else + dtmfsrc->current_ssrc = dtmfsrc->ssrc; + + if (dtmfsrc->seqnum_offset == -1) + dtmfsrc->seqnum_base = g_random_int_range (0, G_MAXUINT16); + else + dtmfsrc->seqnum_base = dtmfsrc->seqnum_offset; + dtmfsrc->seqnum = dtmfsrc->seqnum_base; + + if (dtmfsrc->ts_offset == -1) + dtmfsrc->ts_base = g_random_int (); + else + dtmfsrc->ts_base = dtmfsrc->ts_offset; + + + /* Indicate that we don't do PRE_ROLL */ no_preroll = TRUE; - gst_segment_init (&dtmfsrc->segment, GST_FORMAT_UNDEFINED); + break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; diff --git a/gst/rtpdtmf/gstrtpdtmfsrc.h b/gst/rtpdtmf/gstrtpdtmfsrc.h index 6d012f42..204492cf 100644 --- a/gst/rtpdtmf/gstrtpdtmfsrc.h +++ b/gst/rtpdtmf/gstrtpdtmfsrc.h @@ -83,7 +83,6 @@ struct _GstRTPDTMFSrc { gboolean first_packet; GstClockTime timestamp; - GstSegment segment; }; struct _GstRTPDTMFSrcClass { |