Index: /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmapay.c =================================================================== --- /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmapay.c (revision 2857) +++ /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmapay.c (revision 2944) @@ -56,15 +56,7 @@ 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 @@ -92,8 +84,6 @@ 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; } @@ -101,19 +91,14 @@ gst_rtp_pcma_pay_init (GstRtpPmcaPay * rtppcmapay, GstRtpPmcaPayClass * klass) { - rtppcmapay->adapter = gst_adapter_new (); + GstBaseRTPAudioPayload *basertpaudiopayload; + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmapay); + GST_BASE_RTP_PAYLOAD (rtppcmapay)->clock_rate = 8000; -} -static void -gst_rtp_pcma_pay_finalize (GObject * object) -{ - GstRtpPmcaPay *rtppcmapay; + /* tell basertpaudiopayload that this is a sample based codec */ + gst_basertpaudiopayload_set_sample_based (basertpaudiopayload); - rtppcmapay = GST_RTP_PCMA_PAY (object); - - g_object_unref (rtppcmapay->adapter); - rtppcmapay->adapter = NULL; - - G_OBJECT_CLASS (parent_class)->finalize (object); + /* octet-per-sample is 1 for PCM */ + gst_basertpaudiopayload_set_sample_options (basertpaudiopayload, 1); } @@ -129,112 +114,4 @@ } -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: /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmapay.h =================================================================== --- /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmapay.h (revision 2857) +++ /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmapay.h (revision 2944) @@ -18,6 +18,5 @@ #include -#include -#include +#include G_BEGIN_DECLS @@ -39,14 +38,10 @@ struct _GstRtpPmcaPay { - GstBaseRTPPayload payload; - GstAdapter *adapter; - - GstClockTime first_ts; - GstClockTime duration; + GstBaseRTPAudioPayload audiopayload; }; struct _GstRtpPmcaPayClass { - GstBaseRTPPayloadClass parent_class; + GstBaseRTPAudioPayloadClass parent_class; }; Index: /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmupay.c =================================================================== --- /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmupay.c (revision 2857) +++ /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmupay.c (revision 2944) @@ -56,15 +56,7 @@ 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 @@ -92,8 +84,6 @@ 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; } @@ -101,19 +91,14 @@ gst_rtp_pcmu_pay_init (GstRtpPcmuPay * rtppcmupay, GstRtpPcmuPayClass * klass) { - rtppcmupay->adapter = gst_adapter_new (); + GstBaseRTPAudioPayload *basertpaudiopayload; + basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtppcmupay); + GST_BASE_RTP_PAYLOAD (rtppcmupay)->clock_rate = 8000; -} -static void -gst_rtp_pcmu_pay_finalize (GObject * object) -{ - GstRtpPcmuPay *rtppcmupay; + /* tell basertpaudiopayload that this is a sample based codec */ + gst_basertpaudiopayload_set_sample_based (basertpaudiopayload); - rtppcmupay = GST_RTP_PCMU_PAY (object); - - g_object_unref (rtppcmupay->adapter); - rtppcmupay->adapter = NULL; - - G_OBJECT_CLASS (parent_class)->finalize (object); + /* octet-per-sample is 1 for PCM */ + gst_basertpaudiopayload_set_sample_options (basertpaudiopayload, 1); } @@ -129,112 +114,4 @@ } -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: /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmupay.h =================================================================== --- /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmupay.h (revision 2857) +++ /gagarin/trunk/gst-libraries/gst-plugins-good/gst/rtp/gstrtppcmupay.h (revision 2944) @@ -18,6 +18,5 @@ #include -#include -#include +#include G_BEGIN_DECLS @@ -39,14 +38,10 @@ struct _GstRtpPcmuPay { - GstBaseRTPPayload payload; - GstAdapter *adapter; - - GstClockTime first_ts; - GstClockTime duration; + GstBaseRTPAudioPayload audiopayload; }; struct _GstRtpPcmuPayClass { - GstBaseRTPPayloadClass parent_class; + GstBaseRTPAudioPayloadClass parent_class; };