From d5d0364d7b73d731b68ecba8f15182a79e2dafc5 Mon Sep 17 00:00:00 2001 From: Ognyan Tonchev Date: Fri, 19 Jun 2009 17:57:12 +0200 Subject: rtpjpegpay: add support for buffer-lists See #585559 --- gst/rtp/gstrtpjpegpay.c | 65 +++++++++++++++++++++++++++++++++++++++++++------ gst/rtp/gstrtpjpegpay.h | 2 ++ 2 files changed, 60 insertions(+), 7 deletions(-) (limited to 'gst/rtp') diff --git a/gst/rtp/gstrtpjpegpay.c b/gst/rtp/gstrtpjpegpay.c index 61ecd56e..5b271f35 100644 --- a/gst/rtp/gstrtpjpegpay.c +++ b/gst/rtp/gstrtpjpegpay.c @@ -76,6 +76,12 @@ GST_DEBUG_CATEGORY_STATIC (rtpjpegpay_debug); */ #define QUANT_PREFIX_LEN 3 +/* + * DEFAULT_BUFFER_LIST: + * + */ +#define DEFAULT_BUFFER_LIST FALSE + typedef enum _RtpJpegMarker RtpJpegMarker; /* @@ -114,7 +120,9 @@ enum { PROP_0, PROP_JPEG_QUALITY, - PROP_JPEG_TYPE + PROP_JPEG_TYPE, + PROP_BUFFER_LIST, + PROP_LAST }; enum @@ -243,6 +251,11 @@ gst_rtp_jpeg_pay_class_init (GstRtpJPEGPayClass * klass) "Default JPEG Type, overwritten by SOF when present", 0, 255, DEFAULT_JPEG_TYPE, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BUFFER_LIST, + g_param_spec_boolean ("buffer-list", "Buffer List", + "Use Buffer Lists", + DEFAULT_BUFFER_LIST, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + GST_DEBUG_CATEGORY_INIT (rtpjpegpay_debug, "rtpjpegpay", 0, "Motion JPEG RTP Payloader"); } @@ -253,6 +266,7 @@ gst_rtp_jpeg_pay_init (GstRtpJPEGPay * pay, GstRtpJPEGPayClass * klass) pay->quality = DEFAULT_JPEG_QUALITY; pay->quant = DEFAULT_JPEG_QUANT; pay->type = DEFAULT_JPEG_TYPE; + pay->buffer_list = DEFAULT_BUFFER_LIST; } static gboolean @@ -478,6 +492,8 @@ gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, gboolean frame_done; gboolean sos_found, sof_found, dqt_found; gint i; + GstBufferList *list = NULL; + GstBufferListIterator *it = NULL; pay = GST_RTP_JPEG_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (pay); @@ -578,6 +594,11 @@ gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, GST_LOG_OBJECT (pay, "quant_data size %u", quant_data_size); + if (pay->buffer_list) { + list = gst_buffer_list_new (); + it = gst_buffer_list_iterate (list); + } + bytes_left = sizeof (jpeg_header) + quant_data_size + size; frame_done = FALSE; @@ -586,7 +607,12 @@ gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, guint8 *payload; guint payload_size = (bytes_left < mtu ? bytes_left : mtu); - outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); + if (pay->buffer_list) { + outbuf = gst_rtp_buffer_new_allocate (sizeof (jpeg_header) + + quant_data_size, 0, 0); + } else { + outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); + } GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (payload_size == bytes_left) { @@ -633,11 +659,23 @@ gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, } GST_LOG_OBJECT (pay, "sending payload size %d", payload_size); - memcpy (payload, data, payload_size); - - ret = gst_basertppayload_push (basepayload, outbuf); - if (ret != GST_FLOW_OK) - break; + if (pay->buffer_list) { + GstBuffer *paybuf; + + /* create a new buf to hold the payload */ + paybuf = gst_buffer_create_sub (buffer, jpeg_header_size + offset, + payload_size); + + /* create a new group to hold the rtp header and the payload */ + gst_buffer_list_iterator_add_group (it); + gst_buffer_list_iterator_add (it, outbuf); + gst_buffer_list_iterator_add (it, paybuf); + } else { + memcpy (payload, data, payload_size); + ret = gst_basertppayload_push (basepayload, outbuf); + if (ret != GST_FLOW_OK) + break; + } bytes_left -= payload_size; offset += payload_size; @@ -645,6 +683,12 @@ gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, } while (!frame_done); + if (pay->buffer_list) { + gst_buffer_list_iterator_free (it); + /* push the whole buffer list at once */ + ret = gst_basertppayload_push_list (basepayload, list); + } + gst_buffer_unref (buffer); return ret; @@ -693,6 +737,10 @@ gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, rtpjpegpay->type = g_value_get_int (value); GST_DEBUG_OBJECT (object, "type = %d", rtpjpegpay->type); break; + case PROP_BUFFER_LIST: + rtpjpegpay->buffer_list = g_value_get_boolean (value); + GST_DEBUG_OBJECT (object, "buffer_list = %d", rtpjpegpay->buffer_list); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -714,6 +762,9 @@ gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, case PROP_JPEG_TYPE: g_value_set_int (value, rtpjpegpay->type); break; + case PROP_BUFFER_LIST: + g_value_set_boolean (value, rtpjpegpay->buffer_list); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/gst/rtp/gstrtpjpegpay.h b/gst/rtp/gstrtpjpegpay.h index af78b11e..19fe378a 100644 --- a/gst/rtp/gstrtpjpegpay.h +++ b/gst/rtp/gstrtpjpegpay.h @@ -47,6 +47,8 @@ struct _GstRtpJPEGPay gint height; gint width; + gboolean buffer_list; + guint8 quant; }; -- cgit