mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
[MOVED FROM GST-P-FARSIGHT] Add redundancy and interval properties to rtpdtmfsrc (patch by SP GLE <spglegle@yahoo.fr>)
20070424193155-3e2dc-66688001e7b529c46f108633cd9520347c3c8c3e.gz
This commit is contained in:
parent
eb74905991
commit
2a8042fa72
2 changed files with 70 additions and 12 deletions
|
@ -130,7 +130,9 @@
|
||||||
#include "gstrtpdtmfsrc.h"
|
#include "gstrtpdtmfsrc.h"
|
||||||
|
|
||||||
#define GST_RTP_DTMF_TYPE_EVENT 1
|
#define GST_RTP_DTMF_TYPE_EVENT 1
|
||||||
#define DEFAULT_PACKET_INTERVAL ((guint16) 50) /* ms */
|
#define DEFAULT_PACKET_INTERVAL 50 /* ms */
|
||||||
|
#define MIN_PACKET_INTERVAL 10 /* ms */
|
||||||
|
#define MAX_PACKET_INTERVAL 50 /* ms */
|
||||||
#define DEFAULT_SSRC -1
|
#define DEFAULT_SSRC -1
|
||||||
#define DEFAULT_PT 96
|
#define DEFAULT_PT 96
|
||||||
#define DEFAULT_TIMESTAMP_OFFSET -1
|
#define DEFAULT_TIMESTAMP_OFFSET -1
|
||||||
|
@ -143,6 +145,10 @@
|
||||||
#define MIN_VOLUME 0
|
#define MIN_VOLUME 0
|
||||||
#define MAX_VOLUME 36
|
#define MAX_VOLUME 36
|
||||||
|
|
||||||
|
#define DEFAULT_PACKET_REDUNDANCY 1
|
||||||
|
#define MIN_PACKET_REDUNDANCY 1
|
||||||
|
#define MAX_PACKET_REDUNDANCY 5
|
||||||
|
|
||||||
/* elementfactory information */
|
/* elementfactory information */
|
||||||
static const GstElementDetails gst_rtp_dtmf_src_details =
|
static const GstElementDetails gst_rtp_dtmf_src_details =
|
||||||
GST_ELEMENT_DETAILS ("RTP DTMF packet generator",
|
GST_ELEMENT_DETAILS ("RTP DTMF packet generator",
|
||||||
|
@ -169,7 +175,9 @@ enum
|
||||||
PROP_PT,
|
PROP_PT,
|
||||||
PROP_CLOCK_RATE,
|
PROP_CLOCK_RATE,
|
||||||
PROP_TIMESTAMP,
|
PROP_TIMESTAMP,
|
||||||
PROP_SEQNUM
|
PROP_SEQNUM,
|
||||||
|
PROP_INTERVAL,
|
||||||
|
PROP_REDUNDANCY
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_rtp_dtmf_src_template =
|
static GstStaticPadTemplate gst_rtp_dtmf_src_template =
|
||||||
|
@ -289,6 +297,15 @@ gst_rtp_dtmf_src_class_init (GstRTPDTMFSrcClass * klass)
|
||||||
g_param_spec_uint ("pt", "payload type",
|
g_param_spec_uint ("pt", "payload type",
|
||||||
"The payload type of the packets",
|
"The payload type of the packets",
|
||||||
0, 0x80, DEFAULT_PT, G_PARAM_READWRITE));
|
0, 0x80, DEFAULT_PT, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INTERVAL,
|
||||||
|
g_param_spec_int ("interval", "Interval between rtp packets",
|
||||||
|
"Interval in ms between two rtp packets", MIN_PACKET_INTERVAL,
|
||||||
|
MAX_PACKET_INTERVAL, DEFAULT_PACKET_INTERVAL, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_REDUNDANCY,
|
||||||
|
g_param_spec_int ("packet-redundancy", "Packet Redundancy",
|
||||||
|
"Number of packets to send to indicate start and stop dtmf events",
|
||||||
|
MIN_PACKET_REDUNDANCY, MAX_PACKET_REDUNDANCY,
|
||||||
|
DEFAULT_PACKET_REDUNDANCY, G_PARAM_READWRITE));
|
||||||
|
|
||||||
gstelement_class->change_state =
|
gstelement_class->change_state =
|
||||||
GST_DEBUG_FUNCPTR (gst_rtp_dtmf_src_change_state);
|
GST_DEBUG_FUNCPTR (gst_rtp_dtmf_src_change_state);
|
||||||
|
@ -309,6 +326,9 @@ gst_rtp_dtmf_src_init (GstRTPDTMFSrc * dtmfsrc, gpointer g_class)
|
||||||
dtmfsrc->ts_offset = DEFAULT_TIMESTAMP_OFFSET;
|
dtmfsrc->ts_offset = DEFAULT_TIMESTAMP_OFFSET;
|
||||||
dtmfsrc->pt = DEFAULT_PT;
|
dtmfsrc->pt = DEFAULT_PT;
|
||||||
dtmfsrc->clock_rate = DEFAULT_CLOCK_RATE;
|
dtmfsrc->clock_rate = DEFAULT_CLOCK_RATE;
|
||||||
|
dtmfsrc->payload = NULL;
|
||||||
|
dtmfsrc->interval = DEFAULT_PACKET_INTERVAL;
|
||||||
|
dtmfsrc->packet_redundancy = DEFAULT_PACKET_REDUNDANCY;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (dtmfsrc, "init done");
|
GST_DEBUG_OBJECT (dtmfsrc, "init done");
|
||||||
}
|
}
|
||||||
|
@ -457,6 +477,12 @@ gst_rtp_dtmf_src_set_property (GObject * object, guint prop_id,
|
||||||
dtmfsrc->pt = g_value_get_uint (value);
|
dtmfsrc->pt = g_value_get_uint (value);
|
||||||
gst_rtp_dtmf_src_set_caps (dtmfsrc);
|
gst_rtp_dtmf_src_set_caps (dtmfsrc);
|
||||||
break;
|
break;
|
||||||
|
case PROP_INTERVAL :
|
||||||
|
dtmfsrc->interval = g_value_get_int (value);
|
||||||
|
break;
|
||||||
|
case PROP_REDUNDANCY :
|
||||||
|
dtmfsrc->packet_redundancy = g_value_get_int (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -493,6 +519,12 @@ gst_rtp_dtmf_src_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case PROP_SEQNUM:
|
case PROP_SEQNUM:
|
||||||
g_value_set_uint (value, dtmfsrc->seqnum);
|
g_value_set_uint (value, dtmfsrc->seqnum);
|
||||||
break;
|
break;
|
||||||
|
case PROP_INTERVAL:
|
||||||
|
g_value_set_uint (value, dtmfsrc->interval);
|
||||||
|
break;
|
||||||
|
case PROP_REDUNDANCY:
|
||||||
|
g_value_set_uint (value, dtmfsrc->packet_redundancy);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -616,7 +648,7 @@ gst_rtp_dtmf_prepare_rtp_headers (GstRTPDTMFSrc *dtmfsrc, GstBuffer *buf)
|
||||||
/* timestamp of RTP header */
|
/* timestamp of RTP header */
|
||||||
gst_rtp_buffer_set_timestamp (buf, dtmfsrc->rtp_timestamp);
|
gst_rtp_buffer_set_timestamp (buf, dtmfsrc->rtp_timestamp);
|
||||||
dtmfsrc->rtp_timestamp +=
|
dtmfsrc->rtp_timestamp +=
|
||||||
DEFAULT_PACKET_INTERVAL * dtmfsrc->clock_rate / 1000;
|
dtmfsrc->interval * dtmfsrc->clock_rate / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -628,10 +660,10 @@ gst_rtp_dtmf_prepare_buffer_data (GstRTPDTMFSrc *dtmfsrc, GstBuffer *buf)
|
||||||
|
|
||||||
/* duration of DTMF payload */
|
/* duration of DTMF payload */
|
||||||
dtmfsrc->payload->duration +=
|
dtmfsrc->payload->duration +=
|
||||||
DEFAULT_PACKET_INTERVAL * dtmfsrc->clock_rate / 1000;
|
dtmfsrc->interval * dtmfsrc->clock_rate / 1000;
|
||||||
|
|
||||||
/* timestamp and duration of GstBuffer */
|
/* timestamp and duration of GstBuffer */
|
||||||
GST_BUFFER_DURATION (buf) = DEFAULT_PACKET_INTERVAL * GST_MSECOND;
|
GST_BUFFER_DURATION (buf) = dtmfsrc->interval * GST_MSECOND;
|
||||||
GST_BUFFER_TIMESTAMP (buf) = dtmfsrc->timestamp;
|
GST_BUFFER_TIMESTAMP (buf) = dtmfsrc->timestamp;
|
||||||
dtmfsrc->timestamp += GST_BUFFER_DURATION (buf);
|
dtmfsrc->timestamp += GST_BUFFER_DURATION (buf);
|
||||||
|
|
||||||
|
@ -666,17 +698,40 @@ gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc)
|
||||||
{
|
{
|
||||||
GstBuffer *buf = NULL;
|
GstBuffer *buf = NULL;
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
|
gint redundancy_count = 1;
|
||||||
|
|
||||||
|
if (dtmfsrc->first_packet == TRUE || dtmfsrc->payload->e) {
|
||||||
|
redundancy_count = dtmfsrc->packet_redundancy;
|
||||||
|
|
||||||
|
if(dtmfsrc->first_packet == TRUE) {
|
||||||
|
GST_DEBUG_OBJECT (dtmfsrc,
|
||||||
|
"redundancy count set to %d due to dtmf start",
|
||||||
|
redundancy_count);
|
||||||
|
}
|
||||||
|
if(dtmfsrc->payload->e) {
|
||||||
|
GST_DEBUG_OBJECT (dtmfsrc,
|
||||||
|
"redundancy count set to %d due to dtmf stop",
|
||||||
|
redundancy_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* create buffer to hold the payload */
|
/* create buffer to hold the payload */
|
||||||
buf = gst_rtp_dtmf_src_create_next_rtp_packet (dtmfsrc);
|
buf = gst_rtp_dtmf_src_create_next_rtp_packet (dtmfsrc);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (dtmfsrc,
|
while ( redundancy_count-- ) {
|
||||||
"pushing buffer on src pad of size %d", GST_BUFFER_SIZE (buf));
|
gst_buffer_ref(buf);
|
||||||
ret = gst_pad_push (dtmfsrc->srcpad, buf);
|
|
||||||
if (ret != GST_FLOW_OK)
|
GST_DEBUG_OBJECT (dtmfsrc,
|
||||||
GST_ERROR_OBJECT (dtmfsrc,
|
"pushing buffer on src pad of size %d with redundancy count %d",
|
||||||
"Failed to push buffer on src pad", GST_BUFFER_SIZE (buf));
|
GST_BUFFER_SIZE (buf), redundancy_count);
|
||||||
|
ret = gst_pad_push (dtmfsrc->srcpad, buf);
|
||||||
|
if (ret != GST_FLOW_OK)
|
||||||
|
GST_ERROR_OBJECT (dtmfsrc,
|
||||||
|
"Failed to push buffer on src pad", GST_BUFFER_SIZE (buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_buffer_unref(buf);
|
||||||
GST_DEBUG_OBJECT (dtmfsrc,
|
GST_DEBUG_OBJECT (dtmfsrc,
|
||||||
"pushed DTMF event '%d' on src pad", dtmfsrc->payload->event);
|
"pushed DTMF event '%d' on src pad", dtmfsrc->payload->event);
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,6 +84,9 @@ struct _GstRTPDTMFSrc {
|
||||||
|
|
||||||
GstClockTime timestamp;
|
GstClockTime timestamp;
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
|
|
||||||
|
guint16 interval;
|
||||||
|
guint16 packet_redundancy;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstRTPDTMFSrcClass {
|
struct _GstRTPDTMFSrcClass {
|
||||||
|
|
Loading…
Reference in a new issue