summaryrefslogtreecommitdiffstats
path: root/gst/rtp/gstrtpgsmdepay.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2005-09-15 13:57:56 +0000
committerWim Taymans <wim.taymans@gmail.com>2005-09-15 13:57:56 +0000
commitfc158bc3c2739eabfb092f7a45f6656ac8c96e25 (patch)
tree199f9ea3d2fddfcbc8315e95d6fe17c2e9936cd5 /gst/rtp/gstrtpgsmdepay.c
parentc7468729e9e05fa3cbcf6ee1fbbd578c516e2200 (diff)
Updates to payloader/depayloaders, make payloaders use the base classes.
Original commit message from CVS: Updates to payloader/depayloaders, make payloaders use the base classes. Updated README with suggested RTP caps and how to convert to/from SDP. Added config descriptor in mp4v payloader.
Diffstat (limited to 'gst/rtp/gstrtpgsmdepay.c')
-rw-r--r--gst/rtp/gstrtpgsmdepay.c139
1 files changed, 59 insertions, 80 deletions
diff --git a/gst/rtp/gstrtpgsmdepay.c b/gst/rtp/gstrtpgsmdepay.c
index 78171cbf..97b43420 100644
--- a/gst/rtp/gstrtpgsmdepay.c
+++ b/gst/rtp/gstrtpgsmdepay.c
@@ -17,8 +17,8 @@
#endif
#include <string.h>
+#include <gst/rtp/gstrtpbuffer.h>
#include "gstrtpgsmparse.h"
-#include "gstrtp-common.h"
/* elementfactory information */
static GstElementDetails gst_rtp_gsmparse_details = {
@@ -60,13 +60,15 @@ static void gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass);
static void gst_rtpgsmparse_base_init (GstRtpGSMParseClass * klass);
static void gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse);
-static void gst_rtpgsmparse_chain (GstPad * pad, GstData * _data);
+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);
+
+static GstStateChangeReturn gst_rtpgsmparse_change_state (GstElement * element,
+ GstStateChange transition);
static GstElementClass *parent_class = NULL;
@@ -118,13 +120,13 @@ gst_rtpgsmparse_class_init (GstRtpGSMParseClass * klass)
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
+ gobject_class->set_property = gst_rtpgsmparse_set_property;
+ gobject_class->get_property = gst_rtpgsmparse_get_property;
+
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));
- gobject_class->set_property = gst_rtpgsmparse_set_property;
- gobject_class->get_property = gst_rtpgsmparse_get_property;
-
gstelement_class->change_state = gst_rtpgsmparse_change_state;
}
@@ -144,21 +146,7 @@ gst_rtpgsmparse_init (GstRtpGSMParse * rtpgsmparse)
rtpgsmparse->frequency = 8000;
}
-void
-gst_rtpgsmparse_ntohs (GstBuffer * buf)
-{
- gint16 *i, *len;
-
- /* FIXME: is this code correct or even sane at all? */
- i = (gint16 *) GST_BUFFER_DATA (buf);
- len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *);
-
- for (; i < len; i++) {
- *i = g_ntohs (*i);
- }
-}
-
-void
+static void
gst_rtpgsm_caps_nego (GstRtpGSMParse * rtpgsmparse)
{
GstCaps *caps;
@@ -166,72 +154,67 @@ gst_rtpgsm_caps_nego (GstRtpGSMParse * rtpgsmparse)
caps = gst_caps_new_simple ("audio/x-gsm",
"rate", G_TYPE_INT, rtpgsmparse->frequency, NULL);
- gst_pad_try_set_caps (rtpgsmparse->srcpad, caps);
+ gst_pad_set_caps (rtpgsmparse->srcpad, caps);
+ gst_caps_unref (caps);
}
-static void
-gst_rtpgsmparse_chain (GstPad * pad, GstData * _data)
+static GstFlowReturn
+gst_rtpgsmparse_chain (GstPad * pad, GstBuffer * buf)
{
- GstBuffer *buf = GST_BUFFER (_data);
GstRtpGSMParse *rtpgsmparse;
GstBuffer *outbuf;
- Rtp_Packet packet;
- rtp_payload_t pt;
-
- g_return_if_fail (pad != NULL);
- g_return_if_fail (GST_IS_PAD (pad));
- g_return_if_fail (buf != NULL);
+ GstFlowReturn ret;
+ guint8 pt;
- rtpgsmparse = GST_RTP_GSM_PARSE (GST_OBJECT_PARENT (pad));
+ rtpgsmparse = GST_RTP_GSM_PARSE (gst_pad_get_parent (pad));
- g_return_if_fail (rtpgsmparse != NULL);
- g_return_if_fail (GST_IS_RTP_GSM_PARSE (rtpgsmparse));
+ if (GST_PAD_CAPS (rtpgsmparse->srcpad) == NULL) {
+ gst_rtpgsm_caps_nego (rtpgsmparse);
+ }
- if (GST_IS_EVENT (buf)) {
- GstEvent *event = GST_EVENT (buf);
+ if (!gst_rtpbuffer_validate (buf))
+ goto bad_packet;
- gst_pad_event_default (pad, event);
+ if ((pt = gst_rtpbuffer_get_payload_type (buf)) != GST_RTP_PAYLOAD_GSM)
+ goto bad_payload;
- return;
- }
+ {
+ gint payload_len;
+ guint8 *payload;
+ guint32 timestamp;
- if (GST_PAD_CAPS (rtpgsmparse->srcpad) == NULL) {
- gst_rtpgsm_caps_nego (rtpgsmparse);
- }
+ payload_len = gst_rtpbuffer_get_payload_len (buf);
+ payload = gst_rtpbuffer_get_payload (buf);
- packet =
- rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
+ timestamp = gst_rtpbuffer_get_timestamp (buf);
- pt = rtp_packet_get_payload_type (packet);
+ outbuf = gst_buffer_new_and_alloc (payload_len);
- if (pt != PAYLOAD_GSM) {
- g_warning ("Unexpected paload type %u\n", pt);
- rtp_packet_free (packet);
- gst_buffer_unref (buf);
- return;
- }
+ GST_BUFFER_TIMESTAMP (outbuf) = timestamp * GST_SECOND / 8000;
- outbuf = gst_buffer_new ();
- GST_BUFFER_SIZE (outbuf) = rtp_packet_get_payload_len (packet);
- GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf));
- GST_BUFFER_TIMESTAMP (outbuf) =
- g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND;
+ memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len);
- memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet),
- GST_BUFFER_SIZE (outbuf));
+ GST_DEBUG ("pushing buffer of size %d", GST_BUFFER_SIZE (outbuf));
- GST_DEBUG ("gst_rtpgsmparse_chain: pushing buffer of size %d",
- GST_BUFFER_SIZE (outbuf));
+ gst_buffer_unref (buf);
-/* FIXME: According to RFC 1890, this is required, right? */
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
- gst_rtpgsmparse_ntohs (outbuf);
-#endif
+ ret = gst_pad_push (rtpgsmparse->srcpad, outbuf);
+ }
- gst_pad_push (rtpgsmparse->srcpad, GST_DATA (outbuf));
+ return ret;
- rtp_packet_free (packet);
- gst_buffer_unref (buf);
+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;
+ }
}
static void
@@ -240,7 +223,6 @@ gst_rtpgsmparse_set_property (GObject * object, guint prop_id,
{
GstRtpGSMParse *rtpgsmparse;
- g_return_if_fail (GST_IS_RTP_GSM_PARSE (object));
rtpgsmparse = GST_RTP_GSM_PARSE (object);
switch (prop_id) {
@@ -258,7 +240,6 @@ gst_rtpgsmparse_get_property (GObject * object, guint prop_id, GValue * value,
{
GstRtpGSMParse *rtpgsmparse;
- g_return_if_fail (GST_IS_RTP_GSM_PARSE (object));
rtpgsmparse = GST_RTP_GSM_PARSE (object);
switch (prop_id) {
@@ -275,28 +256,26 @@ static GstStateChangeReturn
gst_rtpgsmparse_change_state (GstElement * element, GstStateChange transition)
{
GstRtpGSMParse *rtpgsmparse;
-
- g_return_val_if_fail (GST_IS_RTP_GSM_PARSE (element),
- GST_STATE_CHANGE_FAILURE);
+ GstStateChangeReturn ret;
rtpgsmparse = GST_RTP_GSM_PARSE (element);
- GST_DEBUG ("state pending %d\n", GST_STATE_PENDING (element));
-
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
break;
- case GST_STATE_CHANGE_READY_TO_NULL:
- break;
default:
break;
}
- /* if we haven't failed already, give the parent class a chance to ;-) */
- if (GST_ELEMENT_CLASS (parent_class)->change_state)
- return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
- return GST_STATE_CHANGE_SUCCESS;
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+ return ret;
}
gboolean