summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThijs Vermeir <thijsvermeir@gmail.com>2008-02-01 11:09:16 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-02-01 11:09:16 +0000
commitb8d39bc20053b1711bee866a028983535a993f72 (patch)
tree82dd078bd8f5b36d917de3dee96903f0fbd7c970
parent88322ce012f86f4afc37e992520f710ccba14e34 (diff)
Add gst_rtp_buffer_set_extension_data()
Original commit message from CVS: Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> * gst-libs/gst/rtp/gstrtpbuffer.c: (gst_rtp_buffer_set_extension_data): * gst-libs/gst/rtp/gstrtpbuffer.h: * tests/check/libs/rtp.c: (GST_START_TEST), (rtp_suite): Add gst_rtp_buffer_set_extension_data() Add a unit test for this addition. Fixes #511478. API: GstRTPBuffer:gst_rtp_buffer_set_extension_data()
-rw-r--r--ChangeLog12
-rw-r--r--gst-libs/gst/rtp/gstrtpbuffer.c45
-rw-r--r--gst-libs/gst/rtp/gstrtpbuffer.h1
-rw-r--r--tests/check/libs/rtp.c44
4 files changed, 102 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 782dd030a..7e3bb2dad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-02-01 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Patch by: Thijs Vermeir <thijsvermeir at gmail dot com>
+
+ * gst-libs/gst/rtp/gstrtpbuffer.c:
+ (gst_rtp_buffer_set_extension_data):
+ * gst-libs/gst/rtp/gstrtpbuffer.h:
+ * tests/check/libs/rtp.c: (GST_START_TEST), (rtp_suite):
+ Add gst_rtp_buffer_set_extension_data()
+ Add a unit test for this addition. Fixes #511478.
+ API: GstRTPBuffer:gst_rtp_buffer_set_extension_data()
+
2008-01-30 Jan Schmidt <jan.schmidt@sun.com>
* configure.ac:
diff --git a/gst-libs/gst/rtp/gstrtpbuffer.c b/gst-libs/gst/rtp/gstrtpbuffer.c
index 7284adddf..ab207a4b0 100644
--- a/gst-libs/gst/rtp/gstrtpbuffer.c
+++ b/gst-libs/gst/rtp/gstrtpbuffer.c
@@ -631,6 +631,51 @@ gst_rtp_buffer_get_extension_data (GstBuffer * buffer, guint16 * bits,
}
/**
+ * gst_rtp_buffer_set_extension_data:
+ * @buffer: the buffer
+ * @bits: the bits specific for the extension
+ * @length: the length that counts the number of 32-bit words in
+ * the extension, excluding the extension header ( therefore zero is a valid length)
+ *
+ * Set the extension bit of the rtp buffer and fill in the @bits and @length of the
+ * extension header. It will refuse to set the extension data if the buffer is not
+ * large enough.
+ *
+ * Returns: True if done.
+ *
+ * Since : 0.10.18
+ */
+gboolean
+gst_rtp_buffer_set_extension_data (GstBuffer * buffer, guint16 bits,
+ guint16 length)
+{
+ guint32 min_size = 0;
+ guint8 *data;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+ g_return_val_if_fail (GST_BUFFER_DATA (buffer) != NULL, FALSE);
+
+ gst_rtp_buffer_set_extension (buffer, TRUE);
+ min_size =
+ GST_RTP_HEADER_LEN + GST_RTP_HEADER_CSRC_SIZE (buffer) + 4 +
+ length * sizeof (guint32);
+
+ if (min_size > GST_BUFFER_SIZE (buffer)) {
+ GST_WARNING_OBJECT (buffer,
+ "rtp buffer too small: need more than %d bytes but only have %d bytes",
+ min_size, GST_BUFFER_SIZE (buffer));
+ return FALSE;
+ }
+
+ data =
+ GST_BUFFER_DATA (buffer) + GST_RTP_HEADER_LEN +
+ GST_RTP_HEADER_CSRC_SIZE (buffer);
+ GST_WRITE_UINT16_BE (data, bits);
+ GST_WRITE_UINT16_BE (data + 2, length);
+ return TRUE;
+}
+
+/**
* gst_rtp_buffer_get_ssrc:
* @buffer: the buffer
*
diff --git a/gst-libs/gst/rtp/gstrtpbuffer.h b/gst-libs/gst/rtp/gstrtpbuffer.h
index dc8c2ace1..a9106e365 100644
--- a/gst-libs/gst/rtp/gstrtpbuffer.h
+++ b/gst-libs/gst/rtp/gstrtpbuffer.h
@@ -68,6 +68,7 @@ gboolean gst_rtp_buffer_get_extension (GstBuffer *buffer);
void gst_rtp_buffer_set_extension (GstBuffer *buffer, gboolean extension);
gboolean gst_rtp_buffer_get_extension_data (GstBuffer *buffer, guint16 *bits,
gpointer *data, guint *wordlen);
+gboolean gst_rtp_buffer_set_extension_data (GstBuffer *buffer, guint16 bits, guint16 length);
guint32 gst_rtp_buffer_get_ssrc (GstBuffer *buffer);
void gst_rtp_buffer_set_ssrc (GstBuffer *buffer, guint32 ssrc);
diff --git a/tests/check/libs/rtp.c b/tests/check/libs/rtp.c
index 82423d55e..757f00b3d 100644
--- a/tests/check/libs/rtp.c
+++ b/tests/check/libs/rtp.c
@@ -106,6 +106,49 @@ GST_START_TEST (test_rtp_buffer)
GST_END_TEST;
+GST_START_TEST (test_rtp_buffer_set_extension_data)
+{
+ GstBuffer *buf;
+ guint8 *data;
+ guint16 bits;
+ guint size;
+ gpointer pointer;
+
+ /* check GstRTPHeader structure alignment and packing */
+ buf = gst_rtp_buffer_new_allocate (4, 0, 0);
+ data = GST_BUFFER_DATA (buf);
+
+ /* should be impossible to set the extension data */
+ fail_unless (gst_rtp_buffer_set_extension_data (buf, 0, 4) == FALSE);
+ fail_unless (gst_rtp_buffer_get_extension (buf) == TRUE);
+
+ /* should be possible to set the extension data */
+ fail_unless (gst_rtp_buffer_set_extension_data (buf, 270, 0) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension (buf) == TRUE);
+ gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size);
+ fail_unless (bits == 270);
+ fail_unless (size == 0);
+ fail_unless (pointer == GST_BUFFER_DATA (buf) + 16);
+ pointer = gst_rtp_buffer_get_payload (buf);
+ fail_unless (pointer == GST_BUFFER_DATA (buf) + 16);
+ gst_buffer_unref (buf);
+
+ buf = gst_rtp_buffer_new_allocate (20, 0, 0);
+ data = GST_BUFFER_DATA (buf);
+ fail_unless (gst_rtp_buffer_get_extension (buf) == FALSE);
+ fail_unless (gst_rtp_buffer_set_extension_data (buf, 333, 2) == TRUE);
+ fail_unless (gst_rtp_buffer_get_extension (buf) == TRUE);
+ gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size);
+ fail_unless (bits == 333);
+ fail_unless (size == 2);
+ fail_unless (pointer == GST_BUFFER_DATA (buf) + 16);
+ pointer = gst_rtp_buffer_get_payload (buf);
+ fail_unless (pointer == GST_BUFFER_DATA (buf) + 24);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
static Suite *
rtp_suite (void)
{
@@ -114,6 +157,7 @@ rtp_suite (void)
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_rtp_buffer);
+ tcase_add_test (tc_chain, test_rtp_buffer_set_extension_data);
return s;
}