From: Philippe Kalaf Date: Wed, 14 Mar 2007 22:21:26 +0000 (+0000) Subject: gst/rtp/: Ported mulaw and alaw payloaders to use new base class X-Git-Tag: 1.19.3~509^2~12075 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1be3219c706bf105acde3efcafe20b962def928d;p=platform%2Fupstream%2Fgstreamer.git gst/rtp/: Ported mulaw and alaw payloaders to use new base class 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 --- diff --git a/ChangeLog b/ChangeLog index cc23bca..2e1c4c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-03-14 Philippe Kalaf + * 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 * po/af.po: diff --git a/gst/rtp/gstrtppcmapay.c b/gst/rtp/gstrtppcmapay.c index be1e5aa..cd9f17e 100644 --- a/gst/rtp/gstrtppcmapay.c +++ b/gst/rtp/gstrtppcmapay.c @@ -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) { diff --git a/gst/rtp/gstrtppcmapay.h b/gst/rtp/gstrtppcmapay.h index 7b5d1b1..f5cf800 100644 --- a/gst/rtp/gstrtppcmapay.h +++ b/gst/rtp/gstrtppcmapay.h @@ -17,8 +17,7 @@ #define __GST_RTP_PCMA_PAY_H__ #include -#include -#include +#include 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); diff --git a/gst/rtp/gstrtppcmupay.c b/gst/rtp/gstrtppcmupay.c index 984eef5..1525260 100644 --- a/gst/rtp/gstrtppcmupay.c +++ b/gst/rtp/gstrtppcmupay.c @@ -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) { diff --git a/gst/rtp/gstrtppcmupay.h b/gst/rtp/gstrtppcmupay.h index a95f3ba..411ad8f 100644 --- a/gst/rtp/gstrtppcmupay.h +++ b/gst/rtp/gstrtppcmupay.h @@ -17,8 +17,7 @@ #define __GST_RTP_PCMU_PAY_H__ #include -#include -#include +#include 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);