diff options
author | Philippe Kalaf <philippe.kalaf@collabora.co.uk> | 2007-03-14 22:21:26 +0000 |
---|---|---|
committer | Philippe Kalaf <philippe.kalaf@collabora.co.uk> | 2007-03-14 22:21:26 +0000 |
commit | 1be3219c706bf105acde3efcafe20b962def928d (patch) | |
tree | ac20d55e5dee45f95401c62a9c175dfd9514243e /gst/rtp/gstrtppcmapay.c | |
parent | c209a3f8941bd1998332e418989255ac94d9f8e8 (diff) |
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
Diffstat (limited to 'gst/rtp/gstrtppcmapay.c')
-rw-r--r-- | gst/rtp/gstrtppcmapay.c | 140 |
1 files changed, 9 insertions, 131 deletions
diff --git a/gst/rtp/gstrtppcmapay.c b/gst/rtp/gstrtppcmapay.c index be1e5aaf..cd9f17e7 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) { |