summaryrefslogtreecommitdiffstats
path: root/gst/rtp
diff options
context:
space:
mode:
authorOgnyan Tonchev <ognyan.tonchev at axis.com>2009-06-19 17:57:12 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2009-06-19 17:57:12 +0200
commitd5d0364d7b73d731b68ecba8f15182a79e2dafc5 (patch)
tree631aa8d6603ed286c28af2b071bd328fd0a3ffbf /gst/rtp
parent40ec22788fdd34600495c3b257d54e2b8256a759 (diff)
rtpjpegpay: add support for buffer-lists
See #585559
Diffstat (limited to 'gst/rtp')
-rw-r--r--gst/rtp/gstrtpjpegpay.c65
-rw-r--r--gst/rtp/gstrtpjpegpay.h2
2 files changed, 60 insertions, 7 deletions
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;
};