Getting the GSM (de)payloader working and compatible with our plans for RTP.
authorZeeshan Ali <zeenix@gmail.com>
Tue, 25 Oct 2005 15:07:02 +0000 (15:07 +0000)
committerZeeshan Ali <zeenix@gmail.com>
Tue, 25 Oct 2005 15:07:02 +0000 (15:07 +0000)
Original commit message from CVS:
Getting the GSM (de)payloader working and compatible with our plans for RTP.

ChangeLog
gst/rtp/gstrtpgsmdepay.c
gst/rtp/gstrtpgsmdepay.h
gst/rtp/gstrtpgsmenc.c
gst/rtp/gstrtpgsmenc.h
gst/rtp/gstrtpgsmparse.c
gst/rtp/gstrtpgsmparse.h
gst/rtp/gstrtpgsmpay.c
gst/rtp/gstrtpgsmpay.h

index 7a2bf57c88f43caa46502e162e1d53e354a463ba..9000f216effc5d9d4a5f2e02b7f06848f0ca1821 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+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),
index 6b6122bd95024ad7fd86ff17fa65f1577692fe3f..9ec4441aa80f38466f36d2cc50a57fbee7b47308 100644 (file)
@@ -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
index 19bd5b28ff547ae871b616642ffe313a185fc3d3..5cb5162d0588d7b8105931ceddcc11ef1abcff82 100644 (file)
 #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;
@@ -48,9 +49,9 @@ struct _GstRtpGSMParse
   guint frequency;
 };
 
-struct _GstRtpGSMParseClass
+struct _GstRTPGSMParseClass
 {
-  GstElementClass parent_class;
+  GstBaseRTPDepayloadClass parent_class;
 };
 
 gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin);
index 0589e6e554cee5df5514e8257ef7b8dab538e26f..06fc9518e15f4b1a8ff343d5725becc7a5f3792e 100644 (file)
@@ -39,7 +39,7 @@ static GstStaticPadTemplate gst_rtpgsmenc_sink_template =
 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 =
@@ -53,9 +53,9 @@ GST_STATIC_PAD_TEMPLATE ("src",
     );
 
 
-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);
@@ -71,26 +71,26 @@ gst_rtpgsmenc_get_type (void)
 
   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);
 
@@ -102,7 +102,7 @@ gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass)
 }
 
 static void
-gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass)
+gst_rtpgsmenc_class_init (GstRTPGSMEncClass * klass)
 {
   GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
@@ -119,15 +119,16 @@ gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass)
 }
 
 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;
@@ -136,7 +137,9 @@ gst_rtpgsmenc_setcaps (GstBaseRTPPayload * payload, GstCaps * caps)
 
   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;
 
@@ -151,7 +154,7 @@ static GstFlowReturn
 gst_rtpgsmenc_handle_buffer (GstBaseRTPPayload * basepayload,
     GstBuffer * buffer)
 {
-  GstRtpGSMEnc *rtpgsmenc;
+  GstRTPGSMEnc *rtpgsmenc;
   guint size, payload_len;
   GstBuffer *outbuf;
   guint8 *payload, *data;
@@ -170,8 +173,6 @@ gst_rtpgsmenc_handle_buffer (GstBaseRTPPayload * basepayload,
   /* 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;
 
index 46fab46aabaf33bca46940720cf9ddf586021800..3b4ccabbaad2db92b78db3793fbcccbdd05f21e1 100644 (file)
 
 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;
 };
index 6b6122bd95024ad7fd86ff17fa65f1577692fe3f..9ec4441aa80f38466f36d2cc50a57fbee7b47308 100644 (file)
@@ -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
index 19bd5b28ff547ae871b616642ffe313a185fc3d3..5cb5162d0588d7b8105931ceddcc11ef1abcff82 100644 (file)
 #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;
@@ -48,9 +49,9 @@ struct _GstRtpGSMParse
   guint frequency;
 };
 
-struct _GstRtpGSMParseClass
+struct _GstRTPGSMParseClass
 {
-  GstElementClass parent_class;
+  GstBaseRTPDepayloadClass parent_class;
 };
 
 gboolean gst_rtpgsmparse_plugin_init (GstPlugin * plugin);
index 0589e6e554cee5df5514e8257ef7b8dab538e26f..06fc9518e15f4b1a8ff343d5725becc7a5f3792e 100644 (file)
@@ -39,7 +39,7 @@ static GstStaticPadTemplate gst_rtpgsmenc_sink_template =
 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 =
@@ -53,9 +53,9 @@ GST_STATIC_PAD_TEMPLATE ("src",
     );
 
 
-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);
@@ -71,26 +71,26 @@ gst_rtpgsmenc_get_type (void)
 
   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);
 
@@ -102,7 +102,7 @@ gst_rtpgsmenc_base_init (GstRtpGSMEncClass * klass)
 }
 
 static void
-gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass)
+gst_rtpgsmenc_class_init (GstRTPGSMEncClass * klass)
 {
   GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
@@ -119,15 +119,16 @@ gst_rtpgsmenc_class_init (GstRtpGSMEncClass * klass)
 }
 
 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;
@@ -136,7 +137,9 @@ gst_rtpgsmenc_setcaps (GstBaseRTPPayload * payload, GstCaps * caps)
 
   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;
 
@@ -151,7 +154,7 @@ static GstFlowReturn
 gst_rtpgsmenc_handle_buffer (GstBaseRTPPayload * basepayload,
     GstBuffer * buffer)
 {
-  GstRtpGSMEnc *rtpgsmenc;
+  GstRTPGSMEnc *rtpgsmenc;
   guint size, payload_len;
   GstBuffer *outbuf;
   guint8 *payload, *data;
@@ -170,8 +173,6 @@ gst_rtpgsmenc_handle_buffer (GstBaseRTPPayload * basepayload,
   /* 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;
 
index 46fab46aabaf33bca46940720cf9ddf586021800..3b4ccabbaad2db92b78db3793fbcccbdd05f21e1 100644 (file)
 
 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;
 };