+2005-10-25 Zeeshan Ali <zeenix@gmail.com>
+
+ * gst/rtp/gstrtpgsmenc.c: (gst_rtpgsmenc_get_type),
+ (gst_rtpgsmenc_base_init), (gst_rtpgsmenc_class_init),
+ (gst_rtpgsmenc_init), (gst_rtpgsmenc_setcaps),
+ (gst_rtpgsmenc_handle_buffer):
+ * gst/rtp/gstrtpgsmenc.h:
+ * gst/rtp/gstrtpgsmparse.c: (gst_rtpgsmparse_get_type),
+ (gst_rtpgsmparse_base_init), (gst_rtpgsmparse_class_init),
+ (gst_rtpgsmparse_init), (gst_rtpgsmparse_setcaps),
+ (gst_rtpgsmparse_finalize), (gst_rtpgsmparse_process):
+ * gst/rtp/gstrtpgsmparse.h:
+ Getting the GSM (de)payloader working and compatible with our plans for RTP.
+
2005-10-25 Julien MOUTTE <julien@moutte.net>
* ext/libpng/gstpngdec.c: (user_info_callback),
"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 =
"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
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);
}
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
#define __GST_RTP_GSM_PARSE_H__
#include <gst/gst.h>
+#include <gst/rtp/gstbasertpdepayload.h>
G_BEGIN_DECLS
-typedef struct _GstRtpGSMParse GstRtpGSMParse;
-typedef struct _GstRtpGSMParseClass GstRtpGSMParseClass;
+typedef struct _GstRTPGSMParse GstRTPGSMParse;
+typedef struct _GstRTPGSMParseClass GstRTPGSMParseClass;
#define GST_TYPE_RTP_GSM_PARSE \
(gst_rtpgsmparse_get_type())
#define GST_RTP_GSM_PARSE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_PARSE,GstRtpGSMParse))
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_PARSE,GstRTPGSMParse))
#define GST_RTP_GSM_PARSE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_PARSE,GstRtpGSMParse))
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_PARSE,GstRTPGSMParse))
#define GST_IS_RTP_GSM_PARSE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_PARSE))
#define GST_IS_RTP_GSM_PARSE_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_PARSE))
-struct _GstRtpGSMParse
+struct _GstRTPGSMParse
{
- GstElement element;
+ GstBaseRTPDepayload depayload;
GstPad *sinkpad;
GstPad *srcpad;
guint frequency;
};
-struct _GstRtpGSMParseClass
+struct _GstRTPGSMParseClass
{
- GstElementClass parent_class;
+ GstBaseRTPDepayloadClass parent_class;
};
gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin);
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]")
+ GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = (int) 1")
);
static GstStaticPadTemplate gst_rtpgsmenc_src_template =
);
-static void gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass);
-static void gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass);
-static void gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc);
+static void gst_rtpgsmenc_class_init (GstRTPGSMEncClass * klass);
+static void gst_rtpgsmenc_base_init (GstRTPGSMEncClass * klass);
+static void gst_rtpgsmenc_init (GstRTPGSMEnc * rtpgsmenc);
static gboolean gst_rtpgsmenc_setcaps (GstBaseRTPPayload * payload,
GstCaps * caps);
if (!rtpgsmenc_type) {
static const GTypeInfo rtpgsmenc_info = {
- sizeof (GstRtpGSMEncClass),
+ sizeof (GstRTPGSMEncClass),
(GBaseInitFunc) gst_rtpgsmenc_base_init,
NULL,
(GClassInitFunc) gst_rtpgsmenc_class_init,
NULL,
NULL,
- sizeof (GstRtpGSMEnc),
+ sizeof (GstRTPGSMEnc),
0,
(GInstanceInitFunc) gst_rtpgsmenc_init,
};
rtpgsmenc_type =
- g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRtpGSMEnc",
+ g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRTPGSMEnc",
&rtpgsmenc_info, 0);
}
return rtpgsmenc_type;
}
static void
-gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass)
+gst_rtpgsmenc_base_init (GstRTPGSMEncClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
}
static void
-gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass)
+gst_rtpgsmenc_class_init (GstRTPGSMEncClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
}
static void
-gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc)
+gst_rtpgsmenc_init (GstRTPGSMEnc * rtpgsmenc)
{
- rtpgsmenc->frequency = 8000;
+ GST_BASE_RTP_PAYLOAD (rtpgsmenc)->clock_rate = 8000;
+ GST_BASE_RTP_PAYLOAD_PT (rtpgsmenc) = GST_RTP_PAYLOAD_GSM;
}
static gboolean
gst_rtpgsmenc_setcaps (GstBaseRTPPayload * payload, GstCaps * caps)
{
- GstRtpGSMEnc *rtpgsmenc;
+ GstRTPGSMEnc *rtpgsmenc;
GstStructure *structure;
gboolean ret;
GstCaps *srccaps;
structure = gst_caps_get_structure (caps, 0);
- ret = gst_structure_get_int (structure, "rate", &rtpgsmenc->frequency);
+ ret =
+ gst_structure_get_int (structure, "rate",
+ &(GST_BASE_RTP_PAYLOAD (rtpgsmenc)->clock_rate));
if (!ret)
return FALSE;
gst_rtpgsmenc_handle_buffer (GstBaseRTPPayload * basepayload,
GstBuffer * buffer)
{
- GstRtpGSMEnc *rtpgsmenc;
+ GstRTPGSMEnc *rtpgsmenc;
guint size, payload_len;
GstBuffer *outbuf;
guint8 *payload, *data;
/* FIXME, assert for now */
g_assert (GST_BUFFER_SIZE (outbuf) < GST_BASE_RTP_PAYLOAD_MTU (rtpgsmenc));
- gst_rtpbuffer_set_timestamp (outbuf, timestamp * 8000 / GST_SECOND);
-
/* copy timestamp */
GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
G_BEGIN_DECLS
-typedef struct _GstRtpGSMEnc GstRtpGSMEnc;
-typedef struct _GstRtpGSMEncClass GstRtpGSMEncClass;
+typedef struct _GstRTPGSMEnc GstRTPGSMEnc;
+typedef struct _GstRTPGSMEncClass GstRTPGSMEncClass;
#define GST_TYPE_RTP_GSM_ENC \
(gst_rtpgsmenc_get_type())
#define GST_RTP_GSM_ENC(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_ENC,GstRtpGSMEnc))
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_ENC,GstRTPGSMEnc))
#define GST_RTP_GSM_ENC_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_ENC,GstRtpGSMEnc))
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_ENC,GstRTPGSMEnc))
#define GST_IS_RTP_GSM_ENC(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_ENC))
#define GST_IS_RTP_GSM_ENC_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_ENC))
-struct _GstRtpGSMEnc
+struct _GstRTPGSMEnc
{
GstBaseRTPPayload payload;
-
- gint frequency;
};
-struct _GstRtpGSMEncClass
+struct _GstRTPGSMEncClass
{
GstBaseRTPPayloadClass parent_class;
};
"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 =
"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
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);
}
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
#define __GST_RTP_GSM_PARSE_H__
#include <gst/gst.h>
+#include <gst/rtp/gstbasertpdepayload.h>
G_BEGIN_DECLS
-typedef struct _GstRtpGSMParse GstRtpGSMParse;
-typedef struct _GstRtpGSMParseClass GstRtpGSMParseClass;
+typedef struct _GstRTPGSMParse GstRTPGSMParse;
+typedef struct _GstRTPGSMParseClass GstRTPGSMParseClass;
#define GST_TYPE_RTP_GSM_PARSE \
(gst_rtpgsmparse_get_type())
#define GST_RTP_GSM_PARSE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_PARSE,GstRtpGSMParse))
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_PARSE,GstRTPGSMParse))
#define GST_RTP_GSM_PARSE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_PARSE,GstRtpGSMParse))
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_PARSE,GstRTPGSMParse))
#define GST_IS_RTP_GSM_PARSE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_PARSE))
#define GST_IS_RTP_GSM_PARSE_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_PARSE))
-struct _GstRtpGSMParse
+struct _GstRTPGSMParse
{
- GstElement element;
+ GstBaseRTPDepayload depayload;
GstPad *sinkpad;
GstPad *srcpad;
guint frequency;
};
-struct _GstRtpGSMParseClass
+struct _GstRTPGSMParseClass
{
- GstElementClass parent_class;
+ GstBaseRTPDepayloadClass parent_class;
};
gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin);
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) [ 1000, 48000 ]")
+ GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = (int) 1")
);
static GstStaticPadTemplate gst_rtpgsmenc_src_template =
);
-static void gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass);
-static void gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass);
-static void gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc);
+static void gst_rtpgsmenc_class_init (GstRTPGSMEncClass * klass);
+static void gst_rtpgsmenc_base_init (GstRTPGSMEncClass * klass);
+static void gst_rtpgsmenc_init (GstRTPGSMEnc * rtpgsmenc);
static gboolean gst_rtpgsmenc_setcaps (GstBaseRTPPayload * payload,
GstCaps * caps);
if (!rtpgsmenc_type) {
static const GTypeInfo rtpgsmenc_info = {
- sizeof (GstRtpGSMEncClass),
+ sizeof (GstRTPGSMEncClass),
(GBaseInitFunc) gst_rtpgsmenc_base_init,
NULL,
(GClassInitFunc) gst_rtpgsmenc_class_init,
NULL,
NULL,
- sizeof (GstRtpGSMEnc),
+ sizeof (GstRTPGSMEnc),
0,
(GInstanceInitFunc) gst_rtpgsmenc_init,
};
rtpgsmenc_type =
- g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRtpGSMEnc",
+ g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRTPGSMEnc",
&rtpgsmenc_info, 0);
}
return rtpgsmenc_type;
}
static void
-gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass)
+gst_rtpgsmenc_base_init (GstRTPGSMEncClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
}
static void
-gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass)
+gst_rtpgsmenc_class_init (GstRTPGSMEncClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
}
static void
-gst_rtpgsmenc_init (GstRtpGSMEnc * rtpgsmenc)
+gst_rtpgsmenc_init (GstRTPGSMEnc * rtpgsmenc)
{
- rtpgsmenc->frequency = 8000;
+ GST_BASE_RTP_PAYLOAD (rtpgsmenc)->clock_rate = 8000;
+ GST_BASE_RTP_PAYLOAD_PT (rtpgsmenc) = GST_RTP_PAYLOAD_GSM;
}
static gboolean
gst_rtpgsmenc_setcaps (GstBaseRTPPayload * payload, GstCaps * caps)
{
- GstRtpGSMEnc *rtpgsmenc;
+ GstRTPGSMEnc *rtpgsmenc;
GstStructure *structure;
gboolean ret;
GstCaps *srccaps;
structure = gst_caps_get_structure (caps, 0);
- ret = gst_structure_get_int (structure, "rate", &rtpgsmenc->frequency);
+ ret =
+ gst_structure_get_int (structure, "rate",
+ &(GST_BASE_RTP_PAYLOAD (rtpgsmenc)->clock_rate));
if (!ret)
return FALSE;
gst_rtpgsmenc_handle_buffer (GstBaseRTPPayload * basepayload,
GstBuffer * buffer)
{
- GstRtpGSMEnc *rtpgsmenc;
+ GstRTPGSMEnc *rtpgsmenc;
guint size, payload_len;
GstBuffer *outbuf;
guint8 *payload, *data;
/* FIXME, assert for now */
g_assert (GST_BUFFER_SIZE (outbuf) < GST_BASE_RTP_PAYLOAD_MTU (rtpgsmenc));
- gst_rtpbuffer_set_timestamp (outbuf, timestamp * 8000 / GST_SECOND);
-
/* copy timestamp */
GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
G_BEGIN_DECLS
-typedef struct _GstRtpGSMEnc GstRtpGSMEnc;
-typedef struct _GstRtpGSMEncClass GstRtpGSMEncClass;
+typedef struct _GstRTPGSMEnc GstRTPGSMEnc;
+typedef struct _GstRTPGSMEncClass GstRTPGSMEncClass;
#define GST_TYPE_RTP_GSM_ENC \
(gst_rtpgsmenc_get_type())
#define GST_RTP_GSM_ENC(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_ENC,GstRtpGSMEnc))
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_GSM_ENC,GstRTPGSMEnc))
#define GST_RTP_GSM_ENC_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_ENC,GstRtpGSMEnc))
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_GSM_ENC,GstRTPGSMEnc))
#define GST_IS_RTP_GSM_ENC(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_GSM_ENC))
#define GST_IS_RTP_GSM_ENC_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_GSM_ENC))
-struct _GstRtpGSMEnc
+struct _GstRTPGSMEnc
{
GstBaseRTPPayload payload;
-
- gint frequency;
};
-struct _GstRtpGSMEncClass
+struct _GstRTPGSMEncClass
{
GstBaseRTPPayloadClass parent_class;
};