diff options
author | Thijs Vermeir <thijsvermeir@gmail.com> | 2008-02-01 11:09:16 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2008-02-01 11:09:16 +0000 |
commit | b8d39bc20053b1711bee866a028983535a993f72 (patch) | |
tree | 82dd078bd8f5b36d917de3dee96903f0fbd7c970 | |
parent | 88322ce012f86f4afc37e992520f710ccba14e34 (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-- | ChangeLog | 12 | ||||
-rw-r--r-- | gst-libs/gst/rtp/gstrtpbuffer.c | 45 | ||||
-rw-r--r-- | gst-libs/gst/rtp/gstrtpbuffer.h | 1 | ||||
-rw-r--r-- | tests/check/libs/rtp.c | 44 |
4 files changed, 102 insertions, 0 deletions
@@ -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; } |