gst/rtp/: Ported mulaw and alaw payloaders to use new base class
authorPhilippe Kalaf <philippe.kalaf@collabora.co.uk>
Wed, 14 Mar 2007 22:21:26 +0000 (22:21 +0000)
committerPhilippe Kalaf <philippe.kalaf@collabora.co.uk>
Wed, 14 Mar 2007 22:21:26 +0000 (22:21 +0000)
Original commit message from CVS:
* gst/rtp/gstrtppcmapay.c:
* gst/rtp/gstrtppcmapay.h:
* gst/rtp/gstrtppcmupay.c:
* gst/rtp/gstrtppcmupay.h:
Ported mulaw and alaw payloaders to use new base class

ChangeLog
gst/rtp/gstrtppcmapay.c
gst/rtp/gstrtppcmapay.h
gst/rtp/gstrtppcmupay.c
gst/rtp/gstrtppcmupay.h

index cc23bca..2e1c4c2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-03-14 Philippe Kalaf <philippe.kalaf@collabora.co.uk>      
+       * gst/rtp/gstrtppcmapay.c:
+       * gst/rtp/gstrtppcmapay.h:
+       * gst/rtp/gstrtppcmupay.c:
+       * gst/rtp/gstrtppcmupay.h:
+       Ported mulaw and alaw payloaders to use new base class
+
 2007-03-14  Thomas Vander Stichele  <thomas at apestaart dot org>
 
        * po/af.po:
index be1e5aa..cd9f17e 100644 (file)
@@ -59,17 +59,9 @@ static GstStaticPadTemplate gst_rtp_pcma_pay_src_template =
 
 static gboolean gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload,
     GstCaps * caps);
-static GstFlowReturn gst_rtp_pcma_pay_handle_buffer (GstBaseRTPPayload *
-    payload, GstBuffer * buffer);
-static void gst_rtp_pcma_pay_finalize (GObject * object);
 
-GST_BOILERPLATE (GstRtpPmcaPay, gst_rtp_pcma_pay, GstBaseRTPPayload,
-    GST_TYPE_BASE_RTP_PAYLOAD);
-
-/* The lower limit for number of octet to put in one packet
- * (clock-rate=8000, octet-per-sample=1). The default 80 is equal
- * to to 10msec (see RFC3551) */
-#define GST_RTP_PCMA_MIN_PTIME_OCTETS   80
+GST_BOILERPLATE (GstRtpPmcaPay, gst_rtp_pcma_pay, GstBaseRTPAudioPayload,
+    GST_TYPE_BASE_RTP_AUDIO_PAYLOAD);
 
 static void
 gst_rtp_pcma_pay_base_init (gpointer klass)
@@ -95,30 +87,24 @@ gst_rtp_pcma_pay_class_init (GstRtpPmcaPayClass * klass)
   gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass;
 
   parent_class = g_type_class_peek_parent (klass);
-  gobject_class->finalize = gst_rtp_pcma_pay_finalize;
 
   gstbasertppayload_class->set_caps = gst_rtp_pcma_pay_setcaps;
-  gstbasertppayload_class->handle_buffer = gst_rtp_pcma_pay_handle_buffer;
 }
 
 static void
 gst_rtp_pcma_pay_init (GstRtpPmcaPay * rtppcmapay, GstRtpPmcaPayClass * klass)
 {
-  rtppcmapay->adapter = gst_adapter_new ();
-  GST_BASE_RTP_PAYLOAD (rtppcmapay)->clock_rate = 8000;
-}
+  GstBaseRTPAudioPayload *basertpaudiopayload;
 
-static void
-gst_rtp_pcma_pay_finalize (GObject * object)
-{
-  GstRtpPmcaPay *rtppcmapay;
+  basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmapay);
 
-  rtppcmapay = GST_RTP_PCMA_PAY (object);
+  GST_BASE_RTP_PAYLOAD (rtppcmapay)->clock_rate = 8000;
 
-  g_object_unref (rtppcmapay->adapter);
-  rtppcmapay->adapter = NULL;
+  /* tell basertpaudiopayload that this is a sample based codec */
+  gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload);
 
-  G_OBJECT_CLASS (parent_class)->finalize (object);
+  /* octet-per-sample is 1 for PCM */
+  gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 1);
 }
 
 static gboolean
@@ -132,114 +118,6 @@ gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps)
   return TRUE;
 }
 
-static GstFlowReturn
-gst_rtp_pcma_pay_flush (GstRtpPmcaPay * rtppcmapay, guint32 clock_rate)
-{
-  guint avail;
-  GstBuffer *outbuf;
-  GstFlowReturn ret;
-  guint maxptime_octets = G_MAXUINT;
-  guint minptime_octets = GST_RTP_PCMA_MIN_PTIME_OCTETS;
-
-  if (GST_BASE_RTP_PAYLOAD (rtppcmapay)->max_ptime > 0) {
-    /* calculate octet count with:
-       maxptime-nsec * samples-per-sec / nsecs-per-sec * octets-per-sample */
-    maxptime_octets =
-        gst_util_uint64_scale_int (GST_BASE_RTP_PAYLOAD (rtppcmapay)->max_ptime,
-        clock_rate, GST_SECOND);
-  }
-
-  /* the data available in the adapter is either smaller
-   * than the MTU or bigger. In the case it is smaller, the complete
-   * adapter contents can be put in one packet.  */
-  avail = gst_adapter_available (rtppcmapay->adapter);
-
-  ret = GST_FLOW_OK;
-
-  while (avail >= minptime_octets) {
-    guint8 *payload;
-    guint8 *data;
-    guint payload_len;
-    guint packet_len;
-
-    /* fill one MTU or all available bytes */
-    payload_len =
-        MIN (MIN (GST_BASE_RTP_PAYLOAD_MTU (rtppcmapay), maxptime_octets),
-        avail);
-
-    /* this will be the total lenght of the packet */
-    packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0);
-
-    /* create buffer to hold the payload */
-    outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0);
-
-    /* copy payload */
-    gst_rtp_buffer_set_payload_type (outbuf,
-        GST_BASE_RTP_PAYLOAD_PT (rtppcmapay));
-    payload = gst_rtp_buffer_get_payload (outbuf);
-    data = (guint8 *) gst_adapter_peek (rtppcmapay->adapter, payload_len);
-    memcpy (payload, data, payload_len);
-    gst_adapter_flush (rtppcmapay->adapter, payload_len);
-
-    avail -= payload_len;
-
-    GST_BUFFER_TIMESTAMP (outbuf) = rtppcmapay->first_ts;
-    ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtppcmapay), outbuf);
-
-    /* increase count (in ts) of data pushed to basertppayload */
-    rtppcmapay->first_ts +=
-        gst_util_uint64_scale_int (payload_len, GST_SECOND, clock_rate);
-
-    /* store amount of unpushed data (in ts) */
-    rtppcmapay->duration =
-        gst_util_uint64_scale_int (avail, GST_SECOND, clock_rate);
-  }
-
-  return ret;
-}
-
-static GstFlowReturn
-gst_rtp_pcma_pay_handle_buffer (GstBaseRTPPayload * basepayload,
-    GstBuffer * buffer)
-{
-  GstRtpPmcaPay *rtppcmapay;
-  guint size, packet_len, avail;
-  GstFlowReturn ret;
-  GstClockTime duration;
-  guint32 clock_rate;
-
-  rtppcmapay = GST_RTP_PCMA_PAY (basepayload);
-
-  clock_rate = basepayload->clock_rate;
-
-  size = GST_BUFFER_SIZE (buffer);
-  duration = gst_util_uint64_scale_int (size, GST_SECOND, clock_rate);
-
-  avail = gst_adapter_available (rtppcmapay->adapter);
-  if (avail == 0) {
-    rtppcmapay->first_ts = GST_BUFFER_TIMESTAMP (buffer);
-    rtppcmapay->duration = 0;
-  }
-
-  /* get packet length of data and see if we exceeded MTU. */
-  packet_len = gst_rtp_buffer_calc_packet_len (avail + size, 0, 0);
-
-  /* if this buffer is going to overflow the packet, flush what we
-   * have. */
-  if (gst_basertppayload_is_filled (basepayload,
-          packet_len, rtppcmapay->duration + duration)) {
-    ret = gst_rtp_pcma_pay_flush (rtppcmapay, clock_rate);
-    /* note: first_ts and duration updated in ...pay_flush() */
-  } else {
-    ret = GST_FLOW_OK;
-  }
-
-  gst_adapter_push (rtppcmapay->adapter, buffer);
-  rtppcmapay->duration += duration;
-
-  return ret;
-}
-
 gboolean
 gst_rtp_pcma_pay_plugin_init (GstPlugin * plugin)
 {
index 7b5d1b1..f5cf800 100644 (file)
@@ -17,8 +17,7 @@
 #define __GST_RTP_PCMA_PAY_H__
 
 #include <gst/gst.h>
-#include <gst/rtp/gstbasertppayload.h>
-#include <gst/base/gstadapter.h>
+#include <gst/rtp/gstbasertpaudiopayload.h>
 
 G_BEGIN_DECLS
 
@@ -38,16 +37,12 @@ typedef struct _GstRtpPmcaPayClass GstRtpPmcaPayClass;
 
 struct _GstRtpPmcaPay
 {
-  GstBaseRTPPayload payload;
-  GstAdapter *adapter;
-  
-  GstClockTime first_ts;
-  GstClockTime duration;  
+  GstBaseRTPAudioPayload audiopayload;
 };
 
 struct _GstRtpPmcaPayClass
 {
-  GstBaseRTPPayloadClass parent_class;
+  GstBaseRTPAudioPayloadClass parent_class;
 };
 
 gboolean gst_rtp_pcma_pay_plugin_init (GstPlugin * plugin);
index 984eef5..1525260 100644 (file)
@@ -59,17 +59,9 @@ static GstStaticPadTemplate gst_rtp_pcmu_pay_src_template =
 
 static gboolean gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload,
     GstCaps * caps);
-static GstFlowReturn gst_rtp_pcmu_pay_handle_buffer (GstBaseRTPPayload *
-    payload, GstBuffer * buffer);
-static void gst_rtp_pcmu_pay_finalize (GObject * object);
 
-GST_BOILERPLATE (GstRtpPcmuPay, gst_rtp_pcmu_pay, GstBaseRTPPayload,
-    GST_TYPE_BASE_RTP_PAYLOAD);
-
-/* The lower limit for number of octet to put in one packet
- * (clock-rate=8000, octet-per-sample=1). The default 80 is equal
- * to to 10msec (see RFC3551) */
-#define GST_RTP_PCMU_MIN_PTIME_OCTETS   80
+GST_BOILERPLATE (GstRtpPcmuPay, gst_rtp_pcmu_pay, GstBaseRTPAudioPayload,
+    GST_TYPE_BASE_RTP_AUDIO_PAYLOAD);
 
 static void
 gst_rtp_pcmu_pay_base_init (gpointer klass)
@@ -95,30 +87,24 @@ gst_rtp_pcmu_pay_class_init (GstRtpPcmuPayClass * klass)
   gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass;
 
   parent_class = g_type_class_peek_parent (klass);
-  gobject_class->finalize = gst_rtp_pcmu_pay_finalize;
 
   gstbasertppayload_class->set_caps = gst_rtp_pcmu_pay_setcaps;
-  gstbasertppayload_class->handle_buffer = gst_rtp_pcmu_pay_handle_buffer;
 }
 
 static void
 gst_rtp_pcmu_pay_init (GstRtpPcmuPay * rtppcmupay, GstRtpPcmuPayClass * klass)
 {
-  rtppcmupay->adapter = gst_adapter_new ();
-  GST_BASE_RTP_PAYLOAD (rtppcmupay)->clock_rate = 8000;
-}
+  GstBaseRTPAudioPayload *basertpaudiopayload;
 
-static void
-gst_rtp_pcmu_pay_finalize (GObject * object)
-{
-  GstRtpPcmuPay *rtppcmupay;
+  basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmupay);
 
-  rtppcmupay = GST_RTP_PCMU_PAY (object);
+  GST_BASE_RTP_PAYLOAD (rtppcmupay)->clock_rate = 8000;
 
-  g_object_unref (rtppcmupay->adapter);
-  rtppcmupay->adapter = NULL;
+  /* tell basertpaudiopayload that this is a sample based codec */
+  gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload);
 
-  G_OBJECT_CLASS (parent_class)->finalize (object);
+  /* octet-per-sample is 1 for PCM */
+  gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, 1);
 }
 
 static gboolean
@@ -132,114 +118,6 @@ gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps)
   return TRUE;
 }
 
-static GstFlowReturn
-gst_rtp_pcmu_pay_flush (GstRtpPcmuPay * rtppcmupay, guint32 clock_rate)
-{
-  guint avail;
-  GstBuffer *outbuf;
-  GstFlowReturn ret;
-  guint maxptime_octets = G_MAXUINT;
-  guint minptime_octets = GST_RTP_PCMU_MIN_PTIME_OCTETS;
-
-  if (GST_BASE_RTP_PAYLOAD (rtppcmupay)->max_ptime > 0) {
-    /* calculate octet count with:
-       maxptime-nsec * samples-per-sec / nsecs-per-sec * octets-per-sample */
-    maxptime_octets =
-        gst_util_uint64_scale_int (GST_BASE_RTP_PAYLOAD (rtppcmupay)->max_ptime,
-        clock_rate, GST_SECOND);
-  }
-
-  /* the data available in the adapter is either smaller
-   * than the MTU or bigger. In the case it is smaller, the complete
-   * adapter contents can be put in one packet.  */
-  avail = gst_adapter_available (rtppcmupay->adapter);
-
-  ret = GST_FLOW_OK;
-
-  while (avail >= minptime_octets) {
-    guint8 *payload;
-    guint8 *data;
-    guint payload_len;
-    guint packet_len;
-
-    /* fill one MTU or all available bytes */
-    payload_len =
-        MIN (MIN (GST_BASE_RTP_PAYLOAD_MTU (rtppcmupay), maxptime_octets),
-        avail);
-
-    /* this will be the total lenght of the packet */
-    packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0);
-
-    /* create buffer to hold the payload */
-    outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0);
-
-    /* copy payload */
-    gst_rtp_buffer_set_payload_type (outbuf,
-        GST_BASE_RTP_PAYLOAD_PT (rtppcmupay));
-    payload = gst_rtp_buffer_get_payload (outbuf);
-    data = (guint8 *) gst_adapter_peek (rtppcmupay->adapter, payload_len);
-    memcpy (payload, data, payload_len);
-    gst_adapter_flush (rtppcmupay->adapter, payload_len);
-
-    avail -= payload_len;
-
-    GST_BUFFER_TIMESTAMP (outbuf) = rtppcmupay->first_ts;
-    ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtppcmupay), outbuf);
-
-    /* increase count (in ts) of data pushed to basertppayload */
-    rtppcmupay->first_ts +=
-        gst_util_uint64_scale_int (payload_len, GST_SECOND, clock_rate);
-
-    /* store amount of unpushed data (in ts) */
-    rtppcmupay->duration =
-        gst_util_uint64_scale_int (avail, GST_SECOND, clock_rate);
-  }
-
-  return ret;
-}
-
-static GstFlowReturn
-gst_rtp_pcmu_pay_handle_buffer (GstBaseRTPPayload * basepayload,
-    GstBuffer * buffer)
-{
-  GstRtpPcmuPay *rtppcmupay;
-  guint size, packet_len, avail;
-  GstFlowReturn ret;
-  GstClockTime duration;
-  guint32 clock_rate;
-
-  rtppcmupay = GST_RTP_PCMU_PAY (basepayload);
-
-  clock_rate = basepayload->clock_rate;
-
-  size = GST_BUFFER_SIZE (buffer);
-  duration = gst_util_uint64_scale_int (size, GST_SECOND, clock_rate);
-
-  avail = gst_adapter_available (rtppcmupay->adapter);
-  if (avail == 0) {
-    rtppcmupay->first_ts = GST_BUFFER_TIMESTAMP (buffer);
-    rtppcmupay->duration = 0;
-  }
-
-  /* get packet length of data and see if we exceeded MTU. */
-  packet_len = gst_rtp_buffer_calc_packet_len (avail + size, 0, 0);
-
-  /* if this buffer is going to overflow the packet, flush what we
-   * have. */
-  if (gst_basertppayload_is_filled (basepayload,
-          packet_len, rtppcmupay->duration + duration)) {
-    /* note: first_ts and duration updated in ...pay_flush() */
-    ret = gst_rtp_pcmu_pay_flush (rtppcmupay, clock_rate);
-  } else {
-    ret = GST_FLOW_OK;
-  }
-
-  gst_adapter_push (rtppcmupay->adapter, buffer);
-  rtppcmupay->duration += duration;
-
-  return ret;
-}
-
 gboolean
 gst_rtp_pcmu_pay_plugin_init (GstPlugin * plugin)
 {
index a95f3ba..411ad8f 100644 (file)
@@ -17,8 +17,7 @@
 #define __GST_RTP_PCMU_PAY_H__
 
 #include <gst/gst.h>
-#include <gst/rtp/gstbasertppayload.h>
-#include <gst/base/gstadapter.h>
+#include <gst/rtp/gstbasertpaudiopayload.h>
 
 G_BEGIN_DECLS
 
@@ -38,16 +37,12 @@ typedef struct _GstRtpPcmuPayClass GstRtpPcmuPayClass;
 
 struct _GstRtpPcmuPay
 {
-  GstBaseRTPPayload payload;
-  GstAdapter *adapter;
-  
-  GstClockTime first_ts;
-  GstClockTime duration;  
+  GstBaseRTPAudioPayload audiopayload;
 };
 
 struct _GstRtpPcmuPayClass
 {
-  GstBaseRTPPayloadClass parent_class;
+  GstBaseRTPAudioPayloadClass parent_class;
 };
 
 gboolean gst_rtp_pcmu_pay_plugin_init (GstPlugin * plugin);