summaryrefslogtreecommitdiffstats
path: root/gst/rtp/gstrtpgsmdepay.c
diff options
context:
space:
mode:
authorZeeshan Ali <zeenix@gmail.com>2005-10-25 15:07:02 +0000
committerZeeshan Ali <zeenix@gmail.com>2005-10-25 15:07:02 +0000
commit240bea74177ed0d4a5cd333ed8e35a5cd1606997 (patch)
tree0c4cc6b461c376f71c3431783e64c716a93c9bda /gst/rtp/gstrtpgsmdepay.c
parent4f40e2e01e913e7005d8f85d3c4694e8366c59d6 (diff)
Getting the GSM (de)payloader working and compatible with our plans for RTP.
Original commit message from CVS: Getting the GSM (de)payloader working and compatible with our plans for RTP.
Diffstat (limited to 'gst/rtp/gstrtpgsmdepay.c')
-rw-r--r--gst/rtp/gstrtpgsmdepay.c212
1 files changed, 47 insertions, 165 deletions
diff --git a/gst/rtp/gstrtpgsmdepay.c b/gst/rtp/gstrtpgsmdepay.c
index 6b6122bd..9ec4441a 100644
--- a/gst/rtp/gstrtpgsmdepay.c
+++ b/gst/rtp/gstrtpgsmdepay.c
@@ -28,24 +28,18 @@ static GstElementDetails gst_rtp_gsmparse_details = {
"Zeeshan Ali <zak147@yahoo.com>"
};
-/* RtpGSMParse signals and args */
+/* RTPGSMParse signals and args */
enum
{
/* FILL ME */
LAST_SIGNAL
};
-enum
-{
- ARG_0,
- ARG_FREQUENCY
-};
-
static GstStaticPadTemplate gst_rtpgsmparse_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]")
+ GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = 1")
);
static GstStaticPadTemplate gst_rtpgsmparse_sink_template =
@@ -58,21 +52,14 @@ GST_STATIC_PAD_TEMPLATE ("sink",
"clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"")
);
-
-static void gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass);
-static void gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass);
-static void gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse);
-
-static GstFlowReturn gst_rtpgsmparse_chain (GstPad * pad, GstBuffer * buffer);
-
-static void gst_rtpgsmparse_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_rtpgsmparse_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-
-static GstStateChangeReturn gst_rtpgsmparse_change_state (GstElement * element,
- GstStateChange transition);
-
+static void gst_rtpgsmparse_class_init (GstRTPGSMParseClass * klass);
+static void gst_rtpgsmparse_base_init (GstRTPGSMParseClass * klass);
+static void gst_rtpgsmparse_init (GstRTPGSMParse * rtpgsmparse);
+static GstBuffer *gst_rtpgsmparse_process (GstBaseRTPDepayload * depayload,
+ GstBuffer * buf);
+static gboolean gst_rtpgsmparse_setcaps (GstBaseRTPDepayload * payload,
+ GstCaps * caps);
+static void gst_rtpgsmparse_finalize (GObject * object);
static GstElementClass *parent_class = NULL;
static GType
@@ -82,26 +69,26 @@ gst_rtpgsmparse_get_type (void)
if (!rtpgsmparse_type) {
static const GTypeInfo rtpgsmparse_info = {
- sizeof (GstRtpGSMParseClass),
+ sizeof (GstRTPGSMParseClass),
(GBaseInitFunc) gst_rtpgsmparse_base_init,
NULL,
(GClassInitFunc) gst_rtpgsmparse_class_init,
NULL,
NULL,
- sizeof (GstRtpGSMParse),
+ sizeof (GstRTPGSMParse),
0,
(GInstanceInitFunc) gst_rtpgsmparse_init,
};
rtpgsmparse_type =
- g_type_register_static (GST_TYPE_ELEMENT, "GstRtpGSMParse",
+ g_type_register_static (GST_TYPE_BASE_RTP_DEPAYLOAD, "GstRTPGSMParse",
&rtpgsmparse_info, 0);
}
return rtpgsmparse_type;
}
static void
-gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass)
+gst_rtpgsmparse_base_init (GstRTPGSMParseClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
@@ -113,172 +100,67 @@ gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass)
}
static void
-gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass)
+gst_rtpgsmparse_class_init (GstRTPGSMParseClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
+ GstBaseRTPDepayloadClass *gstbasertpdepayload_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
+ gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass;
- parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
+ parent_class = g_type_class_ref (GST_TYPE_BASE_RTP_DEPAYLOAD);
- gobject_class->set_property = gst_rtpgsmparse_set_property;
- gobject_class->get_property = gst_rtpgsmparse_get_property;
+ gstbasertpdepayload_class->process = gst_rtpgsmparse_process;
+ gstbasertpdepayload_class->set_caps = gst_rtpgsmparse_setcaps;
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY,
- g_param_spec_int ("frequency", "frequency", "frequency",
- G_MININT, G_MAXINT, 8000, G_PARAM_READWRITE));
-
- gstelement_class->change_state = gst_rtpgsmparse_change_state;
+ gobject_class->finalize = gst_rtpgsmparse_finalize;
}
static void
-gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse)
+gst_rtpgsmparse_init (GstRTPGSMParse * rtpgsmparse)
{
- rtpgsmparse->srcpad =
- gst_pad_new_from_template (gst_static_pad_template_get
- (&gst_rtpgsmparse_src_template), "src");
- rtpgsmparse->sinkpad =
- gst_pad_new_from_template (gst_static_pad_template_get
- (&gst_rtpgsmparse_sink_template), "sink");
- gst_element_add_pad (GST_ELEMENT (rtpgsmparse), rtpgsmparse->srcpad);
- gst_element_add_pad (GST_ELEMENT (rtpgsmparse), rtpgsmparse->sinkpad);
- gst_pad_set_chain_function (rtpgsmparse->sinkpad, gst_rtpgsmparse_chain);
-
- rtpgsmparse->frequency = 8000;
+ GST_BASE_RTP_DEPAYLOAD (rtpgsmparse)->clock_rate = 8000;
}
-static void
-gst_rtpgsm_caps_nego (GstRtpGSMParse * rtpgsmparse)
+static gboolean
+gst_rtpgsmparse_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps)
{
- GstCaps *caps;
+ GstRTPGSMParse *rtpgsmparse;
+ GstCaps *srccaps;
- caps = gst_caps_new_simple ("audio/x-gsm",
- "rate", G_TYPE_INT, rtpgsmparse->frequency, NULL);
+ rtpgsmparse = GST_RTP_GSM_PARSE (depayload);
- gst_pad_set_caps (rtpgsmparse->srcpad, caps);
- gst_caps_unref (caps);
-}
-
-static GstFlowReturn
-gst_rtpgsmparse_chain (GstPad * pad, GstBuffer * buf)
-{
- GstRtpGSMParse *rtpgsmparse;
- GstBuffer *outbuf;
- GstFlowReturn ret;
- guint8 pt;
-
- rtpgsmparse = GST_RTP_GSM_PARSE (gst_pad_get_parent (pad));
-
- if (GST_PAD_CAPS (rtpgsmparse->srcpad) == NULL) {
- gst_rtpgsm_caps_nego (rtpgsmparse);
- }
-
- if (!gst_rtpbuffer_validate (buf))
- goto bad_packet;
-
- if ((pt = gst_rtpbuffer_get_payload_type (buf)) != GST_RTP_PAYLOAD_GSM)
- goto bad_payload;
-
- {
- gint payload_len;
- guint8 *payload;
- guint32 timestamp;
-
- payload_len = gst_rtpbuffer_get_payload_len (buf);
- payload = gst_rtpbuffer_get_payload (buf);
-
- timestamp = gst_rtpbuffer_get_timestamp (buf);
-
- outbuf = gst_buffer_new_and_alloc (payload_len);
-
- GST_BUFFER_TIMESTAMP (outbuf) = timestamp * GST_SECOND / 8000;
-
- memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len);
-
- GST_DEBUG ("pushing buffer of size %d", GST_BUFFER_SIZE (outbuf));
-
- gst_buffer_unref (buf);
-
- ret = gst_pad_push (rtpgsmparse->srcpad, outbuf);
- }
-
- return ret;
-
-bad_packet:
- {
- GST_DEBUG ("Packet did not validate");
- gst_buffer_unref (buf);
- return GST_FLOW_ERROR;
- }
-bad_payload:
- {
- GST_DEBUG ("Unexpected payload type %u", pt);
- gst_buffer_unref (buf);
- return GST_FLOW_ERROR;
- }
+ srccaps = gst_static_pad_template_get_caps (&gst_rtpgsmparse_src_template);
+ return gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps);
}
static void
-gst_rtpgsmparse_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
+gst_rtpgsmparse_finalize (GObject * object)
{
- GstRtpGSMParse *rtpgsmparse;
-
- rtpgsmparse = GST_RTP_GSM_PARSE (object);
-
- switch (prop_id) {
- case ARG_FREQUENCY:
- rtpgsmparse->frequency = g_value_get_int (value);
- break;
- default:
- break;
- }
+ if (G_OBJECT_CLASS (parent_class)->finalize)
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
-static void
-gst_rtpgsmparse_get_property (GObject * object, guint prop_id, GValue * value,
- GParamSpec * pspec)
+static GstBuffer *
+gst_rtpgsmparse_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
{
- GstRtpGSMParse *rtpgsmparse;
-
- rtpgsmparse = GST_RTP_GSM_PARSE (object);
+ GstBuffer *outbuf = NULL;
+ gint payload_len;
+ guint8 *payload;
- switch (prop_id) {
- case ARG_FREQUENCY:
- g_value_set_int (value, rtpgsmparse->frequency);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
+ GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d",
+ GST_BUFFER_SIZE (buf),
+ gst_rtpbuffer_get_marker (buf),
+ gst_rtpbuffer_get_timestamp (buf), gst_rtpbuffer_get_seq (buf));
-static GstStateChangeReturn
-gst_rtpgsmparse_change_state (GstElement * element, GstStateChange transition)
-{
- GstRtpGSMParse *rtpgsmparse;
- GstStateChangeReturn ret;
+ payload_len = gst_rtpbuffer_get_payload_len (buf);
+ payload = gst_rtpbuffer_get_payload (buf);
- rtpgsmparse = GST_RTP_GSM_PARSE (element);
-
- switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- switch (transition) {
- case GST_STATE_CHANGE_READY_TO_NULL:
- break;
- default:
- break;
- }
- return ret;
+ outbuf = gst_buffer_new_and_alloc (payload_len);
+ memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len);
+ return outbuf;
}
gboolean