mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 18:51:11 +00:00
[MOVED FROM GST-P-FARSIGHT] Make it generate the proper rtp timestamps in sync with the live source
20070330001700-3e2dc-bbf954e4edec0615c4eee603fbc6ab8a7d89436f.gz
This commit is contained in:
parent
44328d3355
commit
e32fcbe2b0
2 changed files with 32 additions and 37 deletions
|
@ -353,10 +353,13 @@ gst_rtp_dtmf_src_handle_event (GstPad * pad, GstEvent * event)
|
||||||
!gst_structure_get_int (structure, "volume", &event_volume))
|
!gst_structure_get_int (structure, "volume", &event_volume))
|
||||||
break;
|
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);
|
gst_rtp_dtmf_src_start (dtmfsrc, event_number, event_volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
GST_DEBUG_OBJECT (dtmfsrc, "Received stop event");
|
||||||
gst_rtp_dtmf_src_stop (dtmfsrc);
|
gst_rtp_dtmf_src_stop (dtmfsrc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -482,21 +485,11 @@ gst_rtp_dtmf_src_start (GstRTPDTMFSrc *dtmfsrc,
|
||||||
dtmfsrc->timestamp = GST_CLOCK_TIME_NONE;
|
dtmfsrc->timestamp = GST_CLOCK_TIME_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dtmfsrc->ssrc == -1)
|
dtmfsrc->rtp_timestamp = dtmfsrc->ts_base;
|
||||||
dtmfsrc->current_ssrc = g_random_int ();
|
gst_util_uint64_scale_int (
|
||||||
else
|
dtmfsrc->timestamp - gst_element_get_base_time (GST_ELEMENT (dtmfsrc)),
|
||||||
dtmfsrc->current_ssrc = dtmfsrc->ssrc;
|
dtmfsrc->clock_rate, GST_SECOND);
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
gst_rtp_dtmf_src_set_caps (dtmfsrc);
|
gst_rtp_dtmf_src_set_caps (dtmfsrc);
|
||||||
|
|
||||||
|
@ -530,24 +523,6 @@ gst_rtp_dtmf_src_stop (GstRTPDTMFSrc *dtmfsrc)
|
||||||
dtmfsrc->payload = NULL;
|
dtmfsrc->payload = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
static void
|
||||||
gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc)
|
gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc)
|
||||||
{
|
{
|
||||||
|
@ -569,8 +544,10 @@ gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc)
|
||||||
gst_rtp_buffer_set_seq (buf, dtmfsrc->seqnum);
|
gst_rtp_buffer_set_seq (buf, dtmfsrc->seqnum);
|
||||||
|
|
||||||
/* timestamp of RTP header */
|
/* timestamp of RTP header */
|
||||||
gst_rtp_dtmf_src_calc_rtp_timestamp (dtmfsrc);
|
|
||||||
gst_rtp_buffer_set_timestamp (buf, dtmfsrc->rtp_timestamp);
|
gst_rtp_buffer_set_timestamp (buf, dtmfsrc->rtp_timestamp);
|
||||||
|
dtmfsrc->rtp_timestamp +=
|
||||||
|
DEFAULT_PACKET_INTERVAL * dtmfsrc->clock_rate / 1000;
|
||||||
|
|
||||||
|
|
||||||
/* duration of DTMF payload */
|
/* duration of DTMF payload */
|
||||||
dtmfsrc->payload->duration +=
|
dtmfsrc->payload->duration +=
|
||||||
|
@ -648,7 +625,7 @@ gst_rtp_dtmf_src_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstRTPDTMFSrc *dtmfsrc;
|
GstRTPDTMFSrc *dtmfsrc;
|
||||||
GstStateChangeReturn result;
|
GstStateChangeReturn result;
|
||||||
gboolean no_preroll = TRUE;
|
gboolean no_preroll = FALSE;
|
||||||
|
|
||||||
dtmfsrc = GST_RTP_DTMF_SRC (element);
|
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:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
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 */
|
/* Indicate that we don't do PRE_ROLL */
|
||||||
no_preroll = TRUE;
|
no_preroll = TRUE;
|
||||||
gst_segment_init (&dtmfsrc->segment, GST_FORMAT_UNDEFINED);
|
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -83,7 +83,6 @@ struct _GstRTPDTMFSrc {
|
||||||
gboolean first_packet;
|
gboolean first_packet;
|
||||||
|
|
||||||
GstClockTime timestamp;
|
GstClockTime timestamp;
|
||||||
GstSegment segment;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstRTPDTMFSrcClass {
|
struct _GstRTPDTMFSrcClass {
|
||||||
|
|
Loading…
Reference in a new issue