Blame tests/check/libs/rtp.c

Packit 971217
/* GStreamer unit tests for the RTP support library
Packit 971217
 *
Packit 971217
 * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
Packit 971217
 *
Packit 971217
 * This library is free software; you can redistribute it and/or
Packit 971217
 * modify it under the terms of the GNU Library General Public
Packit 971217
 * License as published by the Free Software Foundation; either
Packit 971217
 * version 2 of the License, or (at your option) any later version.
Packit 971217
 *
Packit 971217
 * This library is distributed in the hope that it will be useful,
Packit 971217
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 971217
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 971217
 * Library General Public License for more details.
Packit 971217
 *
Packit 971217
 * You should have received a copy of the GNU Library General Public
Packit 971217
 * License along with this library; if not, write to the
Packit 971217
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 971217
 * Boston, MA 02110-1301, USA.
Packit 971217
 */
Packit 971217
Packit 971217
#ifdef HAVE_CONFIG_H
Packit 971217
#include "config.h"
Packit 971217
#endif
Packit 971217
Packit 971217
#include <gst/check/gstcheck.h>
Packit 971217
Packit 971217
#include <gst/rtp/gstrtpbuffer.h>
Packit 971217
#include <gst/rtp/gstrtphdrext.h>
Packit 971217
#include <gst/rtp/gstrtcpbuffer.h>
Packit 971217
#include <string.h>
Packit 971217
Packit 971217
#define RTP_HEADER_LEN 12
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstMapInfo map;
Packit 971217
  guint8 *data;
Packit 971217
  gsize size;
Packit 971217
  GstRTPBuffer rtp = { NULL, };
Packit 971217
Packit 971217
  /* check GstRTPHeader structure alignment and packing */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (16, 4, 0);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  gst_buffer_map (buf, &map, GST_MAP_READWRITE);
Packit 971217
  data = map.data;
Packit 971217
  size = map.size;
Packit 971217
  fail_unless_equals_int (size, RTP_HEADER_LEN + 16 + 4);
Packit 971217
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  /* check defaults */
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_version (&rtp), 2);
Packit 971217
  fail_unless (gst_rtp_buffer_get_padding (&rtp) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp), 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_marker (&rtp) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_payload_type (&rtp) == 0);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT16_BE (data), 0xa000);
Packit 971217
Packit 971217
  /* check version in bitfield */
Packit 971217
  gst_rtp_buffer_set_version (&rtp, 3);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_version (&rtp), 3);
Packit 971217
  fail_unless_equals_int ((data[0] & 0xC0) >> 6, 3);
Packit 971217
  gst_rtp_buffer_set_version (&rtp, 2);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_version (&rtp), 2);
Packit 971217
  fail_unless_equals_int ((data[0] & 0xC0) >> 6, 2);
Packit 971217
Packit 971217
  /* check padding bit */
Packit 971217
  gst_rtp_buffer_set_padding (&rtp, TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_padding (&rtp) == TRUE);
Packit 971217
  fail_unless_equals_int ((data[0] & 0x20) >> 5, 1);
Packit 971217
  gst_rtp_buffer_set_padding (&rtp, FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_padding (&rtp) == FALSE);
Packit 971217
  fail_unless_equals_int ((data[0] & 0x20) >> 5, 0);
Packit 971217
Packit 971217
  /* check marker bit */
Packit 971217
  gst_rtp_buffer_set_marker (&rtp, TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_marker (&rtp) == TRUE);
Packit 971217
  fail_unless_equals_int ((data[1] & 0x80) >> 7, 1);
Packit 971217
  gst_rtp_buffer_set_marker (&rtp, FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_marker (&rtp) == FALSE);
Packit 971217
  fail_unless_equals_int ((data[1] & 0x80) >> 7, 0);
Packit 971217
Packit 971217
  /* check sequence offset */
Packit 971217
  gst_rtp_buffer_set_seq (&rtp, 0xF2C9);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_seq (&rtp), 0xF2C9);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT16_BE (data + 2), 0xF2C9);
Packit 971217
  gst_rtp_buffer_set_seq (&rtp, 0);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_seq (&rtp), 0);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT16_BE (data + 2), 0);
Packit 971217
Packit 971217
  /* check timestamp offset */
Packit 971217
  gst_rtp_buffer_set_timestamp (&rtp, 432191);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 4), 432191);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_timestamp (&rtp), 432191);
Packit 971217
  gst_rtp_buffer_set_timestamp (&rtp, 0);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_timestamp (&rtp), 0);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 4), 0);
Packit 971217
Packit 971217
  /* check ssrc offset */
Packit 971217
  gst_rtp_buffer_set_ssrc (&rtp, 0xf04043C2);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_ssrc (&rtp), (gint) 0xf04043c2);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 4 + 4), (gint) 0xf04043c2);
Packit 971217
  gst_rtp_buffer_set_ssrc (&rtp, 0);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_ssrc (&rtp), 0);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 4 + 4), 0);
Packit 971217
Packit 971217
  /* check csrc bits */
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp), 0);
Packit 971217
  ASSERT_CRITICAL (gst_rtp_buffer_get_csrc (&rtp, 0));
Packit 971217
  fail_unless_equals_int (data[0] & 0xf, 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unmap (buf, &map);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* and again, this time with CSRCs */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (16, 4, 3);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  gst_buffer_map (buf, &map, GST_MAP_READWRITE);
Packit 971217
  data = map.data;
Packit 971217
  size = map.size;
Packit 971217
  fail_unless_equals_int (size, RTP_HEADER_LEN + 16 + 4 + 4 * 3);
Packit 971217
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp), 3);
Packit 971217
  ASSERT_CRITICAL (gst_rtp_buffer_get_csrc (&rtp, 3));
Packit 971217
  fail_unless_equals_int (data[0] & 0xf, 3);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_csrc (&rtp, 0), 0);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_csrc (&rtp, 1), 0);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_csrc (&rtp, 2), 0);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_header_len (&rtp),
Packit 971217
      RTP_HEADER_LEN + 4 * 3);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_get_payload_len (&rtp), 16);
Packit 971217
Packit 971217
  data += RTP_HEADER_LEN;       /* skip the other header stuff */
Packit 971217
  gst_rtp_buffer_set_csrc (&rtp, 0, 0xf7c0);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 0 * 4), 0xf7c0);
Packit 971217
  gst_rtp_buffer_set_csrc (&rtp, 1, 0xf7c1);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 1 * 4), 0xf7c1);
Packit 971217
  gst_rtp_buffer_set_csrc (&rtp, 2, 0xf7c2);
Packit 971217
  fail_unless_equals_int (GST_READ_UINT32_BE (data + 2 * 4), 0xf7c2);
Packit 971217
  ASSERT_CRITICAL (gst_rtp_buffer_set_csrc (&rtp, 3, 0xf123));
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unmap (buf, &map);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer_validate_corrupt)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  guint8 corrupt_rtp_packet[58] = {
Packit 971217
    0x90, 0x7a, 0xbf, 0x28, 0x3a, 0x8a, 0x0a, 0xf4, 0x69, 0x6b, 0x76, 0xc0,
Packit 971217
    0x21, 0xe0, 0xe0, 0x60, 0x81, 0x10, 0x84, 0x30, 0x21, 0x52, 0x06, 0xc2,
Packit 971217
    0xb8, 0x30, 0x10, 0x4c, 0x08, 0x62, 0x67, 0xc2, 0x6e, 0x1a, 0x53, 0x3f,
Packit 971217
    0xaf, 0xd6, 0x1b, 0x29, 0x40, 0xe0, 0xa5, 0x83, 0x01, 0x4b, 0x04, 0x02,
Packit 971217
    0xb0, 0x97, 0x63, 0x08, 0x10, 0x4b, 0x43, 0x85, 0x37, 0x2c
Packit 971217
  };
Packit 971217
  GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
Packit 971217
Packit 971217
  buf = gst_buffer_new_and_alloc (sizeof (corrupt_rtp_packet));
Packit 971217
  gst_buffer_fill (buf, 0, corrupt_rtp_packet, sizeof (corrupt_rtp_packet));
Packit 971217
  fail_if (gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp));
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer_validate_padding)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  guint8 packet_with_padding[] = {
Packit 971217
    0xa0, 0x60, 0x6c, 0x49, 0x58, 0xab, 0xaa, 0x65, 0x65, 0x2e, 0xaf, 0xce,
Packit 971217
    0x68, 0xce, 0x3c, 0x80, 0x00, 0x00, 0x00, 0x04
Packit 971217
  };
Packit 971217
  GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
Packit 971217
Packit 971217
  buf = gst_buffer_new_and_alloc (sizeof (packet_with_padding));
Packit 971217
  gst_buffer_fill (buf, 0, packet_with_padding, sizeof (packet_with_padding));
Packit 971217
  fail_unless (gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp));
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* Set the padding to something invalid */
Packit 971217
  buf = gst_buffer_new_and_alloc (sizeof (packet_with_padding));
Packit 971217
  gst_buffer_fill (buf, 0, packet_with_padding, sizeof (packet_with_padding));
Packit 971217
  gst_buffer_memset (buf, gst_buffer_get_size (buf) - 1, 0xff, 1);
Packit 971217
  fail_if (gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp));
Packit 971217
Packit 971217
  memset (&rtp, 0, sizeof (rtp));
Packit 971217
  fail_unless (gst_rtp_buffer_map (buf, GST_MAP_READ |
Packit 971217
          GST_RTP_BUFFER_MAP_FLAG_SKIP_PADDING, &rtp));
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
#if 0
Packit 971217
GST_START_TEST (test_rtp_buffer_list)
Packit 971217
{
Packit 971217
  GstBuffer *rtp_header;
Packit 971217
  GstBuffer *rtp_payload;
Packit 971217
  GstBufferList *list = NULL;
Packit 971217
  GstBufferListIterator *it;
Packit 971217
  guint i;
Packit 971217
Packit 971217
  list = gst_buffer_list_new ();
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
Packit 971217
  /* Creating a list of two RTP packages */
Packit 971217
Packit 971217
  /* Create first group to hold the rtp header and the payload */
Packit 971217
  gst_buffer_list_iterator_add_group (it);
Packit 971217
  rtp_header = gst_rtp_buffer_new_allocate (0, 0, 0);
Packit 971217
  gst_buffer_list_iterator_add (it, rtp_header);
Packit 971217
  rtp_payload = gst_buffer_new_and_alloc (42);
Packit 971217
  gst_buffer_list_iterator_add (it, rtp_payload);
Packit 971217
Packit 971217
  /* Create second group to hold an rtp header and a payload */
Packit 971217
  gst_buffer_list_iterator_add_group (it);
Packit 971217
  rtp_header = gst_rtp_buffer_new_allocate (0, 0, 0);
Packit 971217
  gst_buffer_list_iterator_add (it, rtp_header);
Packit 971217
  rtp_payload = gst_buffer_new_and_alloc (42);
Packit 971217
  gst_buffer_list_iterator_add (it, rtp_payload);
Packit 971217
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
Packit 971217
  /* Test SEQ number */
Packit 971217
  i = gst_rtp_buffer_list_set_seq (list, 1024);
Packit 971217
  fail_if (1026 != i);
Packit 971217
  fail_if (!gst_rtp_buffer_list_validate (list));
Packit 971217
Packit 971217
  /* Timestamp */
Packit 971217
  gst_rtp_buffer_list_set_timestamp (list, 432191);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_list_get_timestamp (list), 432191);
Packit 971217
Packit 971217
  /* SSRC */
Packit 971217
  gst_rtp_buffer_list_set_ssrc (list, 0xf04043C2);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_list_get_ssrc (list),
Packit 971217
      (gint) 0xf04043c2);
Packit 971217
Packit 971217
  /* Payload type */
Packit 971217
  gst_rtp_buffer_list_set_payload_type (list, 127);
Packit 971217
  fail_unless_equals_int (gst_rtp_buffer_list_get_payload_type (list), 127);
Packit 971217
Packit 971217
  gst_buffer_list_unref (list);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
#endif
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer_set_extension_data)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  guint8 *data;
Packit 971217
  guint16 bits;
Packit 971217
  guint size;
Packit 971217
  guint8 misc_data[4] = { 1, 2, 3, 4 };
Packit 971217
  gpointer pointer;
Packit 971217
  guint8 appbits;
Packit 971217
  GstRTPBuffer rtp = { NULL, };
Packit 971217
Packit 971217
  /* check GstRTPHeader structure alignment and packing */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (4, 0, 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  /* should be possible to set the extension data */
Packit 971217
  fail_unless (gst_rtp_buffer_set_extension_data (&rtp, 270, 4) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp) == TRUE);
Packit 971217
  gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer, &size);
Packit 971217
  fail_unless (bits == 270);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  buf = gst_rtp_buffer_new_allocate (20, 0, 0);
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_set_extension_data (&rtp, 333, 2) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp) == TRUE);
Packit 971217
  gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer, &size);
Packit 971217
  fail_unless (bits == 333);
Packit 971217
  fail_unless (size == 2);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* Test header extensions with a one byte header */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (20, 0, 0);
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 5,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer,
Packit 971217
          &size));
Packit 971217
  fail_unless (bits == 0xBEDE);
Packit 971217
  fail_unless (size == 1);
Packit 971217
  data = (guint8 *) pointer;
Packit 971217
  fail_unless (data[0] == ((5 << 4) | 1));
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 2,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 5,
Packit 971217
          misc_data, 4) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 2,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 6,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          3, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 2,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 6,
Packit 971217
          2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_onebyte_header (&rtp, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* Test header extensions with a two bytes header */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (20, 0, 0);
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp) == FALSE);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_twobytes_header (&rtp, 0, 5,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer,
Packit 971217
          &size));
Packit 971217
  fail_unless (bits == 0x100 << 4);
Packit 971217
  fail_unless (size == 1);
Packit 971217
  data = (guint8 *) pointer;
Packit 971217
  fail_unless (data[0] == 5);
Packit 971217
  fail_unless (data[1] == 2);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 2,
Packit 971217
          0, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_twobytes_header (&rtp, 0, 5,
Packit 971217
          misc_data, 4) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 2,
Packit 971217
          0, &pointer, &size) == FALSE);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_twobytes_header (&rtp, 0, 6,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 2,
Packit 971217
          0, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 6,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_twobytes_header (&rtp, &appbits, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
#if 0
Packit 971217
GST_START_TEST (test_rtp_buffer_list_set_extension)
Packit 971217
{
Packit 971217
  GstBufferList *list;
Packit 971217
  GstBuffer *buf;
Packit 971217
  guint8 *data;
Packit 971217
  guint16 bits;
Packit 971217
  guint size;
Packit 971217
  guint8 misc_data[4] = { 1, 2, 3, 4 };
Packit 971217
  gpointer pointer;
Packit 971217
  guint8 appbits;
Packit 971217
  GstBufferListIterator *it;
Packit 971217
Packit 971217
  buf = gst_rtp_buffer_new_allocate (20, 0, 0);
Packit 971217
  list = gst_rtp_buffer_list_from_buffer (buf);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  buf = gst_buffer_list_iterator_next (it);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  fail_unless (GST_BUFFER_SIZE (buf) == 12);
Packit 971217
  buf = gst_buffer_list_iterator_next (it);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  fail_unless (GST_BUFFER_SIZE (buf) == 20);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
Packit 971217
  /* Test header extensions with a one byte header */
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  fail_unless (gst_buffer_list_iterator_next (it) != NULL);
Packit 971217
  fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 5,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  buf = gst_buffer_list_iterator_next (it);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
Packit 971217
  fail_unless (bits == 0xBEDE);
Packit 971217
  fail_unless (size == 1);
Packit 971217
  data = (guint8 *) pointer;
Packit 971217
  fail_unless (data[0] == ((5 << 4) | 1));
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
Packit 971217
          0, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  fail_unless (gst_buffer_list_iterator_next (it) != NULL);
Packit 971217
  fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 5,
Packit 971217
          misc_data, 4) == TRUE);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
Packit 971217
          0, &pointer, &size) == FALSE);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  fail_unless (gst_buffer_list_iterator_next (it) != NULL);
Packit 971217
  fail_unless (gst_rtp_buffer_list_add_extension_onebyte_header (it, 6,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 2,
Packit 971217
          0, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 6,
Packit 971217
          1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_onebyte_header (list, 0, 5,
Packit 971217
          0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  gst_buffer_list_unref (list);
Packit 971217
Packit 971217
Packit 971217
  /* Test header extensions with a two bytes header */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (20, 0, 0);
Packit 971217
  list = gst_rtp_buffer_list_from_buffer (buf);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  fail_unless (gst_buffer_list_iterator_next (it) != NULL);
Packit 971217
  fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 5,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  buf = gst_buffer_list_iterator_next (it);
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_data (buf, &bits, &pointer, &size));
Packit 971217
  fail_unless (bits == 0x100 << 4);
Packit 971217
  fail_unless (size == 1);
Packit 971217
  data = (guint8 *) pointer;
Packit 971217
  fail_unless (data[0] == 5);
Packit 971217
  fail_unless (data[1] == 2);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 2, 0, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  fail_unless (gst_buffer_list_iterator_next (it) != NULL);
Packit 971217
  fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 5,
Packit 971217
          misc_data, 4) == TRUE);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 2, 0, &pointer, &size) == FALSE);
Packit 971217
Packit 971217
  it = gst_buffer_list_iterate (list);
Packit 971217
  fail_unless (gst_buffer_list_iterator_next_group (it));
Packit 971217
  fail_unless (gst_buffer_list_iterator_next (it) != NULL);
Packit 971217
  fail_unless (gst_rtp_buffer_list_add_extension_twobytes_header (it, 0, 6,
Packit 971217
          misc_data, 2) == TRUE);
Packit 971217
  gst_buffer_list_iterator_free (it);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 1, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 4);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 4) == 0);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 2, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 2, 0, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 6, 1, &pointer, &size) == FALSE);
Packit 971217
  fail_unless (gst_rtp_buffer_list_get_extension_twobytes_header (list, 0,
Packit 971217
          &appbits, 5, 0, &pointer, &size) == TRUE);
Packit 971217
  fail_unless (size == 2);
Packit 971217
  fail_unless (memcmp (pointer, misc_data, 2) == 0);
Packit 971217
Packit 971217
  gst_buffer_list_unref (list);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
#endif
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_seqnum_compare)
Packit 971217
{
Packit 971217
#define ASSERT_COMP(a,b,c) fail_unless (gst_rtp_buffer_compare_seqnum ((guint16)a,(guint16)b) == c);
Packit 971217
  ASSERT_COMP (0xfffe, 0xfffd, -1);
Packit 971217
  ASSERT_COMP (0xffff, 0xfffe, -1);
Packit 971217
  ASSERT_COMP (0x0000, 0xffff, -1);
Packit 971217
  ASSERT_COMP (0x0001, 0x0000, -1);
Packit 971217
  ASSERT_COMP (0x0002, 0x0001, -1);
Packit 971217
Packit 971217
  ASSERT_COMP (0xffff, 0xfffd, -2);
Packit 971217
  ASSERT_COMP (0x0000, 0xfffd, -3);
Packit 971217
  ASSERT_COMP (0x0001, 0xfffd, -4);
Packit 971217
  ASSERT_COMP (0x0002, 0xfffd, -5);
Packit 971217
Packit 971217
  ASSERT_COMP (0x7ffe, 0x7ffd, -1);
Packit 971217
  ASSERT_COMP (0x7fff, 0x7ffe, -1);
Packit 971217
  ASSERT_COMP (0x8000, 0x7fff, -1);
Packit 971217
  ASSERT_COMP (0x8001, 0x8000, -1);
Packit 971217
  ASSERT_COMP (0x8002, 0x8001, -1);
Packit 971217
Packit 971217
  ASSERT_COMP (0x7fff, 0x7ffd, -2);
Packit 971217
  ASSERT_COMP (0x8000, 0x7ffd, -3);
Packit 971217
  ASSERT_COMP (0x8001, 0x7ffd, -4);
Packit 971217
  ASSERT_COMP (0x8002, 0x7ffd, -5);
Packit 971217
Packit 971217
  ASSERT_COMP (0x7ffd, 0xffff, -0x7ffe);
Packit 971217
  ASSERT_COMP (0x7ffe, 0x0000, -0x7ffe);
Packit 971217
  ASSERT_COMP (0x7fff, 0x0001, -0x7ffe);
Packit 971217
  ASSERT_COMP (0x7fff, 0x0000, -0x7fff);
Packit 971217
  ASSERT_COMP (0x8000, 0x0001, -0x7fff);
Packit 971217
  ASSERT_COMP (0x8001, 0x0002, -0x7fff);
Packit 971217
Packit 971217
  ASSERT_COMP (0xfffd, 0x7ffe, -0x7fff);
Packit 971217
  ASSERT_COMP (0xfffe, 0x7fff, -0x7fff);
Packit 971217
  ASSERT_COMP (0xffff, 0x8000, -0x7fff);
Packit 971217
  ASSERT_COMP (0x0000, 0x8001, -0x7fff);
Packit 971217
  ASSERT_COMP (0x0001, 0x8002, -0x7fff);
Packit 971217
Packit 971217
  ASSERT_COMP (0xfffe, 0x7ffe, -0x8000);
Packit 971217
  ASSERT_COMP (0xffff, 0x7fff, -0x8000);
Packit 971217
  ASSERT_COMP (0x0000, 0x8000, -0x8000);
Packit 971217
  ASSERT_COMP (0x0001, 0x8001, -0x8000);
Packit 971217
Packit 971217
  ASSERT_COMP (0x7ffe, 0xfffe, -0x8000);
Packit 971217
  ASSERT_COMP (0x7fff, 0xffff, -0x8000);
Packit 971217
  ASSERT_COMP (0x8000, 0x0000, -0x8000);
Packit 971217
  ASSERT_COMP (0x8001, 0x0001, -0x8000);
Packit 971217
Packit 971217
  ASSERT_COMP (0x0001, 0x0002, 1);
Packit 971217
  ASSERT_COMP (0x0000, 0x0001, 1);
Packit 971217
  ASSERT_COMP (0xffff, 0x0000, 1);
Packit 971217
  ASSERT_COMP (0xfffe, 0xffff, 1);
Packit 971217
  ASSERT_COMP (0xfffd, 0xfffe, 1);
Packit 971217
Packit 971217
  ASSERT_COMP (0x0000, 0x0002, 2);
Packit 971217
  ASSERT_COMP (0xffff, 0x0002, 3);
Packit 971217
  ASSERT_COMP (0xfffe, 0x0002, 4);
Packit 971217
  ASSERT_COMP (0xfffd, 0x0002, 5);
Packit 971217
Packit 971217
  ASSERT_COMP (0x8001, 0x8002, 1);
Packit 971217
  ASSERT_COMP (0x8000, 0x8001, 1);
Packit 971217
  ASSERT_COMP (0x7fff, 0x8000, 1);
Packit 971217
  ASSERT_COMP (0x7ffe, 0x7fff, 1);
Packit 971217
  ASSERT_COMP (0x7ffd, 0x7ffe, 1);
Packit 971217
Packit 971217
  ASSERT_COMP (0x8000, 0x8002, 2);
Packit 971217
  ASSERT_COMP (0x7fff, 0x8002, 3);
Packit 971217
  ASSERT_COMP (0x7ffe, 0x8002, 4);
Packit 971217
  ASSERT_COMP (0x7ffd, 0x8002, 5);
Packit 971217
Packit 971217
  ASSERT_COMP (0xfffe, 0x7ffd, 0x7fff);
Packit 971217
  ASSERT_COMP (0xffff, 0x7ffe, 0x7fff);
Packit 971217
  ASSERT_COMP (0x0000, 0x7fff, 0x7fff);
Packit 971217
  ASSERT_COMP (0x0001, 0x8000, 0x7fff);
Packit 971217
  ASSERT_COMP (0x0002, 0x8001, 0x7fff);
Packit 971217
Packit 971217
  ASSERT_COMP (0x7ffe, 0xfffd, 0x7fff);
Packit 971217
  ASSERT_COMP (0x7fff, 0xfffe, 0x7fff);
Packit 971217
  ASSERT_COMP (0x8000, 0xffff, 0x7fff);
Packit 971217
  ASSERT_COMP (0x8001, 0x0000, 0x7fff);
Packit 971217
  ASSERT_COMP (0x8002, 0x0001, 0x7fff);
Packit 971217
#undef ASSERT_COMP
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_buffer)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstRTCPPacket packet;
Packit 971217
  GstRTCPBuffer rtcp = { NULL, };
Packit 971217
  gsize offset;
Packit 971217
  gsize maxsize;
Packit 971217
Packit 971217
  buf = gst_rtcp_buffer_new (1400);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  fail_unless_equals_int (gst_buffer_get_sizes (buf, &offset, &maxsize), 0);
Packit 971217
  fail_unless_equals_int (offset, 0);
Packit 971217
  fail_unless_equals_int (maxsize, 1400);
Packit 971217
Packit 971217
  gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcp);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_buffer_validate (buf) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_get_packet_count (&rtcp) == 0);
Packit 971217
Packit 971217
  /* add an SR packet */
Packit 971217
  fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_SR,
Packit 971217
          &packet) == TRUE);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_count (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR);
Packit 971217
  fail_unless (gst_rtcp_packet_get_length (&packet) == 6);
Packit 971217
Packit 971217
  gst_rtcp_packet_sr_set_sender_info (&packet, 0x44556677,
Packit 971217
      G_GUINT64_CONSTANT (1), 0x11111111, 101, 123456);
Packit 971217
  {
Packit 971217
    guint32 ssrc;
Packit 971217
    guint64 ntptime;
Packit 971217
    guint32 rtptime;
Packit 971217
    guint32 packet_count;
Packit 971217
    guint32 octet_count;
Packit 971217
Packit 971217
    gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime,
Packit 971217
        &packet_count, &octet_count);
Packit 971217
Packit 971217
    fail_unless (ssrc == 0x44556677);
Packit 971217
    fail_unless (ntptime == G_GUINT64_CONSTANT (1));
Packit 971217
    fail_unless (rtptime == 0x11111111);
Packit 971217
    fail_unless (packet_count == 101);
Packit 971217
    fail_unless (octet_count == 123456);
Packit 971217
  }
Packit 971217
Packit 971217
  /* go to first packet, this should be the packet we just added */
Packit 971217
  fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == TRUE);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_count (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SR);
Packit 971217
  fail_unless (gst_rtcp_packet_get_length (&packet) == 6);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_packet_move_to_next (&packet) == FALSE);
Packit 971217
Packit 971217
  /* add some SDES */
Packit 971217
  fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_SDES,
Packit 971217
          &packet) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_packet_sdes_add_item (&packet, 0xff658743) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_packet_sdes_add_entry (&packet, GST_RTCP_SDES_CNAME,
Packit 971217
          sizeof ("test@foo.bar"), (guint8 *) "test@foo.bar") == TRUE);
Packit 971217
Packit 971217
  /* add some BYE */
Packit 971217
  fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_BYE,
Packit 971217
          &packet) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_packet_bye_add_ssrc (&packet, 0x5613212f) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_packet_bye_add_ssrc (&packet, 0x00112233) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_packet_bye_get_ssrc_count (&packet) == 2);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_count (&packet) == 2);
Packit 971217
  fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_BYE);
Packit 971217
  fail_unless (gst_rtcp_packet_get_length (&packet) == 2);
Packit 971217
Packit 971217
  /* move to SDES */
Packit 971217
  fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_packet_move_to_next (&packet) == TRUE);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_count (&packet) == 1);
Packit 971217
  fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_SDES);
Packit 971217
  fail_unless (gst_rtcp_packet_get_length (&packet) == 5);
Packit 971217
Packit 971217
  /* remove the SDES */
Packit 971217
  fail_unless (gst_rtcp_packet_remove (&packet) == TRUE);
Packit 971217
Packit 971217
  /* we are now at the BYE packet */
Packit 971217
  fail_unless (gst_rtcp_packet_get_padding (&packet) == 0);
Packit 971217
  fail_unless (gst_rtcp_packet_get_count (&packet) == 2);
Packit 971217
  fail_unless (gst_rtcp_packet_get_type (&packet) == GST_RTCP_TYPE_BYE);
Packit 971217
  fail_unless (gst_rtcp_packet_get_length (&packet) == 2);
Packit 971217
Packit 971217
  /* close and validate */
Packit 971217
  gst_rtcp_buffer_unmap (&rtcp);
Packit 971217
  fail_unless (gst_rtcp_buffer_validate (buf) == TRUE);
Packit 971217
  fail_unless (gst_rtcp_buffer_validate_reduced (buf) == TRUE);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_reduced_buffer)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstRTCPPacket packet;
Packit 971217
  GstRTCPBuffer rtcp = { NULL, };
Packit 971217
  gsize offset;
Packit 971217
  gsize maxsize;
Packit 971217
Packit 971217
  buf = gst_rtcp_buffer_new (1400);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  fail_unless_equals_int (gst_buffer_get_sizes (buf, &offset, &maxsize), 0);
Packit 971217
  fail_unless_equals_int (offset, 0);
Packit 971217
  fail_unless_equals_int (maxsize, 1400);
Packit 971217
Packit 971217
  gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcp);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_buffer_validate (buf) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_get_packet_count (&rtcp) == 0);
Packit 971217
Packit 971217
  /* add an SR packet */
Packit 971217
  fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_PSFB,
Packit 971217
          &packet) == TRUE);
Packit 971217
Packit 971217
  /* close and validate */
Packit 971217
  gst_rtcp_buffer_unmap (&rtcp);
Packit 971217
  fail_unless (gst_rtcp_buffer_validate (buf) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_validate_reduced (buf) == TRUE);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_validate_with_padding)
Packit 971217
{
Packit 971217
  /* Compound packet with padding in the last packet. Padding is included in
Packit 971217
   * the length of the last packet. */
Packit 971217
  guint8 rtcp_pkt[] = {
Packit 971217
    0x80, 0xC9, 0x00, 0x07,     /* Type RR, length = 7 */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x4d, 0x16, 0xaf, 0x14,
Packit 971217
    0x10, 0x1f, 0xd9, 0x91,
Packit 971217
    0x0f, 0xb7, 0x50, 0x88,
Packit 971217
    0x3b, 0x79, 0x31, 0x50,
Packit 971217
    0xbe, 0x19, 0x12, 0xa8,
Packit 971217
    0xbb, 0xce, 0x9e, 0x3e,
Packit 971217
    0xA0, 0xCA, 0x00, 0x0A,     /* P=1, Type SDES, length = 10 (includes padding) */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x01, 0x0F, 0x00, 0x00,     /* Type 1 (CNAME), length 15 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x02, 0x09, 0x00,     /* Type 2 (NAME), length 9 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,     /* Type 0 (no length, 2 unused bytes) */
Packit 971217
    0x00, 0x00, 0x00, 0x04      /* RTCP padding */
Packit 971217
  };
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_buffer_validate_data (rtcp_pkt, sizeof (rtcp_pkt)));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_validate_with_padding_wrong_padlength)
Packit 971217
{
Packit 971217
  /* Compound packet with padding in the last packet. Padding is included in
Packit 971217
   * the length of the last packet. */
Packit 971217
  guint8 rtcp_pkt[] = {
Packit 971217
    0x80, 0xC9, 0x00, 0x07,     /* Type RR, length = 7 */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x4d, 0x16, 0xaf, 0x14,
Packit 971217
    0x10, 0x1f, 0xd9, 0x91,
Packit 971217
    0x0f, 0xb7, 0x50, 0x88,
Packit 971217
    0x3b, 0x79, 0x31, 0x50,
Packit 971217
    0xbe, 0x19, 0x12, 0xa8,
Packit 971217
    0xbb, 0xce, 0x9e, 0x3e,
Packit 971217
    0xA0, 0xCA, 0x00, 0x0A,     /* P=1, Type SDES, length = 10 (includes padding) */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x01, 0x0F, 0x00, 0x00,     /* Type 1 (CNAME), length 15 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x02, 0x09, 0x00,     /* Type 2 (NAME), length 9 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,     /* Type 0 (no length, 2 unused bytes) */
Packit 971217
    0x00, 0x00, 0x00, 0x03      /* RTCP padding (wrong length) */
Packit 971217
  };
Packit 971217
Packit 971217
  fail_if (gst_rtcp_buffer_validate_data (rtcp_pkt, sizeof (rtcp_pkt)));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_validate_with_padding_excluded_from_length)
Packit 971217
{
Packit 971217
  /* Compound packet with padding in the last packet. Padding is not included
Packit 971217
   * in the length. */
Packit 971217
  guint8 rtcp_pkt[] = {
Packit 971217
    0x80, 0xC9, 0x00, 0x07,     /* Type RR, length = 7 */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x4d, 0x16, 0xaf, 0x14,
Packit 971217
    0x10, 0x1f, 0xd9, 0x91,
Packit 971217
    0x0f, 0xb7, 0x50, 0x88,
Packit 971217
    0x3b, 0x79, 0x31, 0x50,
Packit 971217
    0xbe, 0x19, 0x12, 0xa8,
Packit 971217
    0xbb, 0xce, 0x9e, 0x3e,
Packit 971217
    0xA0, 0xCA, 0x00, 0x09,     /* P=1, Type SDES, length = 9 (excludes padding) */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x01, 0x0F, 0x00, 0x00,     /* Type 1 (CNAME), length 15 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x02, 0x09, 0x00,     /* Type 2 (NAME), length 9 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,     /* Type 0 (no length, 2 unused bytes) */
Packit 971217
    0x00, 0x00, 0x00, 0x04      /* RTCP padding */
Packit 971217
  };
Packit 971217
Packit 971217
  fail_if (gst_rtcp_buffer_validate_data (rtcp_pkt, sizeof (rtcp_pkt)));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_validate_with_padding_set_in_first_packet)
Packit 971217
{
Packit 971217
  /* Compound packet with padding in the last packet but with the pad
Packit 971217
     bit set on first packet */
Packit 971217
  guint8 rtcp_pkt[] = {
Packit 971217
    0xA0, 0xC9, 0x00, 0x07,     /* P=1, Type RR, length = 7 */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x4d, 0x16, 0xaf, 0x14,
Packit 971217
    0x10, 0x1f, 0xd9, 0x91,
Packit 971217
    0x0f, 0xb7, 0x50, 0x88,
Packit 971217
    0x3b, 0x79, 0x31, 0x50,
Packit 971217
    0xbe, 0x19, 0x12, 0xa8,
Packit 971217
    0xbb, 0xce, 0x9e, 0x3e,
Packit 971217
    0x80, 0xCA, 0x00, 0x0a,     /* Type SDES, length = 10 (include padding) */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x01, 0x0F, 0x00, 0x00,     /* Type 1 (CNAME), length 15 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x02, 0x09, 0x00,     /* Type 2 (NAME), length 9 */
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,
Packit 971217
    0x00, 0x00, 0x00, 0x00,     /* Type 0 (no length, 2 unused bytes) */
Packit 971217
    0x00, 0x00, 0x00, 0x04      /* RTCP padding */
Packit 971217
  };
Packit 971217
Packit 971217
  fail_if (gst_rtcp_buffer_validate_data (rtcp_pkt, sizeof (rtcp_pkt)));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_validate_reduced_without_padding)
Packit 971217
{
Packit 971217
  /* Reduced size packet without padding */
Packit 971217
  guint8 rtcp_pkt[] = {
Packit 971217
    0x80, 0xcd, 0x00, 0x07,     /* Type FB, length = 8 */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x4d, 0x16, 0xaf, 0x14,
Packit 971217
    0x10, 0x1f, 0xd9, 0x91,
Packit 971217
    0x0f, 0xb7, 0x50, 0x88,
Packit 971217
    0x3b, 0x79, 0x31, 0x50,
Packit 971217
    0xbe, 0x19, 0x12, 0xa8,
Packit 971217
    0xbb, 0xce, 0x9e, 0x3e,
Packit 971217
  };
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_buffer_validate_data_reduced (rtcp_pkt,
Packit 971217
          sizeof (rtcp_pkt)));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_validate_reduced_with_padding)
Packit 971217
{
Packit 971217
  /* Reduced size packet with padding. */
Packit 971217
  guint8 rtcp_pkt[] = {
Packit 971217
    0xA0, 0xcd, 0x00, 0x08,     /* P=1, Type FB, length = 8 */
Packit 971217
    0x97, 0x6d, 0x21, 0x6a,
Packit 971217
    0x4d, 0x16, 0xaf, 0x14,
Packit 971217
    0x10, 0x1f, 0xd9, 0x91,
Packit 971217
    0x0f, 0xb7, 0x50, 0x88,
Packit 971217
    0x3b, 0x79, 0x31, 0x50,
Packit 971217
    0xbe, 0x19, 0x12, 0xa8,
Packit 971217
    0xbb, 0xce, 0x9e, 0x3e,
Packit 971217
    0x00, 0x00, 0x00, 0x04      /* RTCP padding */
Packit 971217
  };
Packit 971217
Packit 971217
  fail_if (gst_rtcp_buffer_validate_data_reduced (rtcp_pkt, sizeof (rtcp_pkt)));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_buffer_profile_specific_extension)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstRTCPBuffer rtcp = GST_RTCP_BUFFER_INIT;
Packit 971217
  GstRTCPPacket packet;
Packit 971217
  const guint8 pse[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
Packit 971217
  const guint8 pse2[] = { 0x01, 0x23, 0x45, 0x67 };
Packit 971217
Packit 971217
  fail_unless ((buf = gst_rtcp_buffer_new (1400)) != NULL);
Packit 971217
  gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcp);
Packit 971217
Packit 971217
  fail_unless (gst_rtcp_buffer_validate (buf) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_get_first_packet (&rtcp, &packet) == FALSE);
Packit 971217
  fail_unless (gst_rtcp_buffer_get_packet_count (&rtcp) == 0);
Packit 971217
Packit 971217
  /* add an SR packet with sender info */
Packit 971217
  fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_SR, &packet));
Packit 971217
  gst_rtcp_packet_sr_set_sender_info (&packet, 0x44556677,
Packit 971217
      G_GUINT64_CONSTANT (1), 0x11111111, 101, 123456);
Packit 971217
  fail_unless_equals_int (0,
Packit 971217
      gst_rtcp_packet_get_profile_specific_ext_length (&packet));
Packit 971217
  fail_unless_equals_int (6, gst_rtcp_packet_get_length (&packet));
Packit 971217
Packit 971217
  /* add profile-specific extension */
Packit 971217
  fail_unless (gst_rtcp_packet_add_profile_specific_ext (&packet,
Packit 971217
          pse, sizeof (pse)));
Packit 971217
  {
Packit 971217
    guint8 *data = NULL;
Packit 971217
    guint len = 0;
Packit 971217
Packit 971217
    fail_unless_equals_int (8, gst_rtcp_packet_get_length (&packet));
Packit 971217
    fail_unless_equals_int (sizeof (pse) / 4,
Packit 971217
        gst_rtcp_packet_get_profile_specific_ext_length (&packet));
Packit 971217
Packit 971217
    /* gst_rtcp_packet_get_profile_specific_ext */
Packit 971217
    fail_unless (gst_rtcp_packet_get_profile_specific_ext (&packet, &data,
Packit 971217
            &len));
Packit 971217
    fail_unless_equals_int (sizeof (pse), len);
Packit 971217
    fail_unless (data != NULL);
Packit 971217
    fail_unless_equals_int (0, memcmp (pse, data, sizeof (pse)));
Packit 971217
Packit 971217
    /* gst_rtcp_packet_copy_profile_specific_ext */
Packit 971217
    fail_unless (gst_rtcp_packet_copy_profile_specific_ext (&packet, &data,
Packit 971217
            &len));
Packit 971217
    fail_unless_equals_int (sizeof (pse), len);
Packit 971217
    fail_unless (data != NULL);
Packit 971217
    fail_unless_equals_int (0, memcmp (pse, data, sizeof (pse)));
Packit 971217
    g_free (data);
Packit 971217
  }
Packit 971217
Packit 971217
  /* append more profile-specific extension */
Packit 971217
  fail_unless (gst_rtcp_packet_add_profile_specific_ext (&packet,
Packit 971217
          pse2, sizeof (pse2)));
Packit 971217
  {
Packit 971217
    guint8 *data = NULL;
Packit 971217
    guint len = 0;
Packit 971217
    guint concat_len;
Packit 971217
    guint8 *concat_pse;
Packit 971217
Packit 971217
    /* Expect the second extension to be appended to the first */
Packit 971217
    concat_len = sizeof (pse) + sizeof (pse2);
Packit 971217
    concat_pse = g_malloc (concat_len);
Packit 971217
    memcpy (concat_pse, pse, sizeof (pse));
Packit 971217
    memcpy (concat_pse + sizeof (pse), pse2, sizeof (pse2));
Packit 971217
Packit 971217
    fail_unless_equals_int (9, gst_rtcp_packet_get_length (&packet));
Packit 971217
    fail_unless_equals_int (concat_len / 4,
Packit 971217
        gst_rtcp_packet_get_profile_specific_ext_length (&packet));
Packit 971217
Packit 971217
    /* gst_rtcp_packet_get_profile_specific_ext */
Packit 971217
    fail_unless (gst_rtcp_packet_get_profile_specific_ext (&packet, &data,
Packit 971217
            &len));
Packit 971217
    fail_unless_equals_int (concat_len, len);
Packit 971217
    fail_unless (data != NULL);
Packit 971217
    fail_unless_equals_int (0, memcmp (concat_pse, data, len));
Packit 971217
Packit 971217
    /* gst_rtcp_packet_copy_profile_specific_ext */
Packit 971217
    fail_unless (gst_rtcp_packet_copy_profile_specific_ext (&packet, &data,
Packit 971217
            &len));
Packit 971217
    fail_unless_equals_int (concat_len, len);
Packit 971217
    fail_unless (data != NULL);
Packit 971217
    fail_unless_equals_int (0, memcmp (concat_pse, data, len));
Packit 971217
    g_free (data);
Packit 971217
    g_free (concat_pse);
Packit 971217
  }
Packit 971217
Packit 971217
  /* close and validate */
Packit 971217
  gst_rtcp_buffer_unmap (&rtcp);
Packit 971217
  fail_unless (gst_rtcp_buffer_validate (buf) == TRUE);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtcp_buffer_app)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstRTCPBuffer rtcp = GST_RTCP_BUFFER_INIT;
Packit 971217
  GstRTCPPacket packet;
Packit 971217
  guint mtu = 1000;
Packit 971217
  const guint8 data[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
Packit 971217
  guint max_data_length = (mtu - 12) / 4;
Packit 971217
  guint8 *data_ptr;
Packit 971217
Packit 971217
  fail_unless ((buf = gst_rtcp_buffer_new (mtu)) != NULL);
Packit 971217
  gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcp);
Packit 971217
Packit 971217
  /* Not a valid packet yet */
Packit 971217
  fail_if (gst_rtcp_buffer_validate (buf));
Packit 971217
  fail_if (gst_rtcp_buffer_get_first_packet (&rtcp, &packet));
Packit 971217
  fail_unless_equals_int (gst_rtcp_buffer_get_packet_count (&rtcp), 0);
Packit 971217
Packit 971217
  /* Add APP packet  */
Packit 971217
  fail_unless (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_APP, &packet));
Packit 971217
  gst_rtcp_packet_app_set_subtype (&packet, 0x15);
Packit 971217
  gst_rtcp_packet_app_set_ssrc (&packet, 0x01234567);
Packit 971217
  gst_rtcp_packet_app_set_name (&packet, "Test");
Packit 971217
Packit 971217
  /* Check maximum allowed data */
Packit 971217
  fail_if (gst_rtcp_packet_app_set_data_length (&packet, max_data_length + 1));
Packit 971217
  fail_unless (gst_rtcp_packet_app_set_data_length (&packet, max_data_length));
Packit 971217
Packit 971217
  /* Add data */
Packit 971217
  fail_unless (gst_rtcp_packet_app_set_data_length (&packet,
Packit 971217
          (sizeof (data) + 3) / 4));
Packit 971217
  fail_unless_equals_int (gst_rtcp_packet_app_get_data_length (&packet), 2);
Packit 971217
  fail_unless ((data_ptr = gst_rtcp_packet_app_get_data (&packet)));
Packit 971217
  memcpy (data_ptr, data, sizeof (data));
Packit 971217
Packit 971217
  gst_rtcp_buffer_unmap (&rtcp);
Packit 971217
Packit 971217
  /* Map again with only the READ flag and check fields */
Packit 971217
  gst_rtcp_buffer_map (buf, GST_MAP_READ, &rtcp);
Packit 971217
  fail_unless_equals_int (gst_rtcp_packet_app_get_subtype (&packet), 0x15);
Packit 971217
  fail_unless_equals_int (gst_rtcp_packet_app_get_ssrc (&packet), 0x01234567);
Packit 971217
  fail_unless (memcmp (gst_rtcp_packet_app_get_name (&packet), "Test", 4) == 0);
Packit 971217
  fail_unless_equals_int (gst_rtcp_packet_app_get_data_length (&packet), 2);
Packit 971217
  fail_unless ((data_ptr = gst_rtcp_packet_app_get_data (&packet)));
Packit 971217
  fail_unless (memcmp (data_ptr, data, sizeof (data)) == 0);
Packit 971217
  gst_rtcp_buffer_unmap (&rtcp);
Packit 971217
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_ntp64_extension)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  gpointer data;
Packit 971217
  guint size;
Packit 971217
  GstRTPBuffer rtp = { NULL, };
Packit 971217
  guint8 bytes[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0x01, 0x23, 0x45 };
Packit 971217
  guint64 ntptime;
Packit 971217
  guint8 hdrext_ntp64[GST_RTP_HDREXT_NTP_64_SIZE];
Packit 971217
Packit 971217
  buf = gst_rtp_buffer_new_allocate (0, 0, 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  /* format extension data */
Packit 971217
  gst_rtp_hdrext_set_ntp_64 (hdrext_ntp64, GST_RTP_HDREXT_NTP_64_SIZE,
Packit 971217
      0x0123456789012345LL);
Packit 971217
  fail_unless (memcmp (bytes, hdrext_ntp64, sizeof (bytes)) == 0);
Packit 971217
Packit 971217
  /* add as 1byte header */
Packit 971217
  gst_rtp_buffer_add_extension_onebyte_header (&rtp, 1, hdrext_ntp64,
Packit 971217
      GST_RTP_HDREXT_NTP_64_SIZE);
Packit 971217
Packit 971217
  /* get extension again */
Packit 971217
  gst_rtp_buffer_get_extension_onebyte_header (&rtp, 1, 0, &data, &size);
Packit 971217
Packit 971217
  /* and check */
Packit 971217
  fail_unless (size == GST_RTP_HDREXT_NTP_64_SIZE);
Packit 971217
  fail_unless (memcmp (data, hdrext_ntp64, size) == 0);
Packit 971217
Packit 971217
  gst_rtp_hdrext_get_ntp_64 (data, size, &ntptime);
Packit 971217
  fail_unless (ntptime == 0x0123456789012345LL);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_ntp56_extension)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  gpointer data;
Packit 971217
  guint size;
Packit 971217
  GstRTPBuffer rtp = { NULL, };
Packit 971217
  guint8 bytes[] = { 0x23, 0x45, 0x67, 0x89, 0x01, 0x23, 0x45 };
Packit 971217
  guint64 ntptime;
Packit 971217
  guint8 hdrext_ntp56[GST_RTP_HDREXT_NTP_56_SIZE];
Packit 971217
Packit 971217
  buf = gst_rtp_buffer_new_allocate (0, 0, 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
Packit 971217
  /* format extension data */
Packit 971217
  gst_rtp_hdrext_set_ntp_56 (hdrext_ntp56, GST_RTP_HDREXT_NTP_56_SIZE,
Packit 971217
      0x0123456789012345LL);
Packit 971217
  /* truncates top bits */
Packit 971217
  fail_unless (memcmp (bytes, hdrext_ntp56, sizeof (bytes)) == 0);
Packit 971217
Packit 971217
  /* add as 1byte header */
Packit 971217
  gst_rtp_buffer_add_extension_onebyte_header (&rtp, 1, hdrext_ntp56,
Packit 971217
      GST_RTP_HDREXT_NTP_56_SIZE);
Packit 971217
Packit 971217
  /* get extension again */
Packit 971217
  gst_rtp_buffer_get_extension_onebyte_header (&rtp, 1, 0, &data, &size);
Packit 971217
Packit 971217
  /* and check */
Packit 971217
  fail_unless (size == GST_RTP_HDREXT_NTP_56_SIZE);
Packit 971217
  fail_unless (memcmp (data, hdrext_ntp56, size) == 0);
Packit 971217
Packit 971217
  gst_rtp_hdrext_get_ntp_56 (data, size, &ntptime);
Packit 971217
  fail_unless (ntptime == 0x23456789012345LL);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer_get_extension_bytes)
Packit 971217
{
Packit 971217
  GstBuffer *buf;
Packit 971217
  guint16 bits;
Packit 971217
  guint size;
Packit 971217
  guint8 misc_data[4] = { 1, 2, 3, 4 };
Packit 971217
  gpointer pointer;
Packit 971217
  GstRTPBuffer rtp = { NULL, };
Packit 971217
  GBytes *gb;
Packit 971217
  gsize gb_size;
Packit 971217
Packit 971217
  /* create RTP buffer without extension header */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (4, 0, 0);
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
  fail_if (gst_rtp_buffer_get_extension (&rtp));
Packit 971217
Packit 971217
  /* verify that obtaining extension data returns NULL and bits are unchanged */
Packit 971217
  bits = 0xabcd;
Packit 971217
  gb = gst_rtp_buffer_get_extension_bytes (&rtp, &bits);
Packit 971217
  fail_unless (gb == NULL);
Packit 971217
  fail_unless (bits == 0xabcd);
Packit 971217
Packit 971217
  g_bytes_unref (gb);
Packit 971217
Packit 971217
  /* add extension header without data and verify that
Packit 971217
   * an empty GBytes is returned */
Packit 971217
  fail_unless (gst_rtp_buffer_set_extension_data (&rtp, 270, 0));
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp));
Packit 971217
  gb = gst_rtp_buffer_get_extension_bytes (&rtp, &bits);
Packit 971217
  fail_unless (gb != NULL);
Packit 971217
  fail_unless_equals_int (g_bytes_get_size (gb), 0);
Packit 971217
Packit 971217
  g_bytes_unref (gb);
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
Packit 971217
  /* create RTP buffer with extension header and extension data */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (4, 0, 0);
Packit 971217
  gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp;;
Packit 971217
  fail_unless (gst_rtp_buffer_add_extension_onebyte_header (&rtp, 5,
Packit 971217
          misc_data, 2));
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension (&rtp));
Packit 971217
Packit 971217
  /* verify that gst_rtp_buffer_get_extension_bytes returns the same
Packit 971217
   * header bits and data as does gst_rtp_buffer_get_extension_data */
Packit 971217
  fail_unless (gst_rtp_buffer_get_extension_data (&rtp, &bits, &pointer,
Packit 971217
          &size));
Packit 971217
  fail_unless (bits == 0xBEDE);
Packit 971217
  fail_unless (size == 1);
Packit 971217
  gb = gst_rtp_buffer_get_extension_bytes (&rtp, &bits);
Packit 971217
  fail_unless (gb != NULL);
Packit 971217
  fail_unless (bits == 0xBEDE);
Packit 971217
  fail_unless_equals_int (g_bytes_get_size (gb), size * 4);
Packit 971217
  fail_unless (memcmp (pointer, g_bytes_get_data (gb, &gb_size),
Packit 971217
          size * 4) == 0);
Packit 971217
  fail_unless_equals_int (gb_size, size * 4);
Packit 971217
Packit 971217
  g_bytes_unref (gb);
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer_get_payload_bytes)
Packit 971217
{
Packit 971217
  guint8 rtppacket[] = {
Packit 971217
    0x80, 0xe0, 0xdf, 0xd7, 0xef, 0x84, 0xbe, 0xed, 0x9b, 0xc5, 0x29, 0x14,
Packit 971217
    'H', 'e', 'l', 'l', 'o', '\0'
Packit 971217
  };
Packit 971217
Packit 971217
  GstBuffer *buf;
Packit 971217
  GstMapInfo map;
Packit 971217
  gconstpointer data;
Packit 971217
  gsize size;
Packit 971217
  GstRTPBuffer rtp = { NULL, };
Packit 971217
  GBytes *gb;
Packit 971217
Packit 971217
  /* create empty RTP buffer, i.e. no payload */
Packit 971217
  buf = gst_rtp_buffer_new_allocate (0, 4, 0);
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  gst_buffer_map (buf, &map, GST_MAP_READWRITE);
Packit 971217
  fail_unless_equals_int (map.size, RTP_HEADER_LEN + 4);
Packit 971217
  fail_unless (gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp));
Packit 971217
Packit 971217
  /* verify that requesting payload data returns an empty GBytes */
Packit 971217
  gb = gst_rtp_buffer_get_payload_bytes (&rtp;;
Packit 971217
  fail_unless (gb != NULL);
Packit 971217
  fail_unless_equals_int (g_bytes_get_size (gb), 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unmap (buf, &map);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
  g_bytes_unref (gb);
Packit 971217
Packit 971217
  /* create RTP buffer containing RTP packet */
Packit 971217
  buf = gst_buffer_new_and_alloc (sizeof (rtppacket));
Packit 971217
  fail_unless (buf != NULL);
Packit 971217
  gst_buffer_fill (buf, 0, rtppacket, sizeof (rtppacket));
Packit 971217
  gst_buffer_map (buf, &map, GST_MAP_READWRITE);
Packit 971217
  fail_unless_equals_int (map.size, sizeof (rtppacket));
Packit 971217
  fail_unless (gst_rtp_buffer_map (buf, GST_MAP_READWRITE, &rtp));
Packit 971217
Packit 971217
  /* verify that the returned GBytes contains the correct payload data */
Packit 971217
  gb = gst_rtp_buffer_get_payload_bytes (&rtp;;
Packit 971217
  fail_unless (gb != NULL);
Packit 971217
  data = g_bytes_get_data (gb, &size);
Packit 971217
  fail_unless (data != NULL);
Packit 971217
  fail_unless (size == (sizeof (rtppacket) - RTP_HEADER_LEN));
Packit 971217
  fail_unless_equals_string ("Hello", data);
Packit 971217
  g_bytes_unref (gb);
Packit 971217
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
  gst_buffer_unmap (buf, &map);
Packit 971217
  gst_buffer_unref (buf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
Packit 971217
GST_START_TEST (test_rtp_buffer_empty_payload)
Packit 971217
{
Packit 971217
  GstRTPBuffer rtp = { NULL };
Packit 971217
  GstBuffer *paybuf, *outbuf;
Packit 971217
Packit 971217
  paybuf = gst_rtp_buffer_new_allocate (0, 0, 0);
Packit 971217
Packit 971217
  gst_rtp_buffer_map (paybuf, GST_MAP_READ, &rtp;;
Packit 971217
  outbuf = gst_rtp_buffer_get_payload_buffer (&rtp;;
Packit 971217
  gst_rtp_buffer_unmap (&rtp;;
Packit 971217
Packit 971217
  gst_buffer_unref (paybuf);
Packit 971217
  gst_buffer_unref (outbuf);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
Packit 971217
GST_START_TEST (test_ext_timestamp_basic)
Packit 971217
{
Packit 971217
  guint64 exttimestamp = -1;
Packit 971217
  guint64 result = 0;
Packit 971217
Packit 971217
  /* no wraparound when timestamps are increasing */
Packit 971217
  result = gst_rtp_buffer_ext_timestamp (&exttimestamp, 0);
Packit 971217
  fail_unless_equals_uint64 (result, 0);
Packit 971217
  result = gst_rtp_buffer_ext_timestamp (&exttimestamp, 10);
Packit 971217
  fail_unless_equals_uint64 (result, 10);
Packit 971217
  result = gst_rtp_buffer_ext_timestamp (&exttimestamp, 10);
Packit 971217
  fail_unless_equals_uint64 (result, 10);
Packit 971217
  result = gst_rtp_buffer_ext_timestamp (&exttimestamp,
Packit 971217
      G_GUINT64_CONSTANT (1) + G_MAXINT32);
Packit 971217
  fail_unless_equals_uint64 (result, G_GUINT64_CONSTANT (1) + G_MAXINT32);
Packit 971217
Packit 971217
  /* Even big bumps under G_MAXINT32 don't result in wrap-around */
Packit 971217
  exttimestamp = -1;
Packit 971217
  result = gst_rtp_buffer_ext_timestamp (&exttimestamp, 1087500);
Packit 971217
  fail_unless_equals_uint64 (result, 1087500);
Packit 971217
  result = gst_rtp_buffer_ext_timestamp (&exttimestamp, 24);
Packit 971217
  fail_unless_equals_uint64 (result, 24);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_ext_timestamp_wraparound)
Packit 971217
{
Packit 971217
  guint64 ext_ts = -1;
Packit 971217
Packit 971217
  fail_unless_equals_uint64 (gst_rtp_buffer_ext_timestamp (&ext_ts,
Packit 971217
          G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1)),
Packit 971217
      (G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1)));
Packit 971217
Packit 971217
  fail_unless_equals_uint64 (gst_rtp_buffer_ext_timestamp (&ext_ts, 0),
Packit 971217
      G_MAXUINT32 + G_GUINT64_CONSTANT (1));
Packit 971217
Packit 971217
  fail_unless_equals_uint64 (gst_rtp_buffer_ext_timestamp (&ext_ts, 90000),
Packit 971217
      (G_MAXUINT32 + G_GUINT64_CONSTANT (1) + 90000));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
Packit 971217
GST_START_TEST (test_ext_timestamp_wraparound_disordered)
Packit 971217
{
Packit 971217
  guint64 ext_ts = -1;
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts,
Packit 971217
          G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1))
Packit 971217
      == (G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1)));
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts, 0)
Packit 971217
      == G_MAXUINT32 + G_GUINT64_CONSTANT (1));
Packit 971217
Packit 971217
  /* Unwrapping around */
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts,
Packit 971217
          G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1))
Packit 971217
      == (G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1)));
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts, 90000)
Packit 971217
      == (G_MAXUINT32 + G_GUINT64_CONSTANT (1) + 90000));
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
GST_START_TEST (test_ext_timestamp_wraparound_disordered_cannot_unwrap)
Packit 971217
{
Packit 971217
  guint64 ext_ts = -1;
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts, 90000)
Packit 971217
      == 90000);
Packit 971217
Packit 971217
  /* Cannot unwrapping around */
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts,
Packit 971217
          G_MAXUINT32 - 90000 + G_GUINT64_CONSTANT (1)) == 0);
Packit 971217
Packit 971217
  fail_unless (gst_rtp_buffer_ext_timestamp (&ext_ts, 90000)
Packit 971217
      == 90000);
Packit 971217
}
Packit 971217
Packit 971217
GST_END_TEST;
Packit 971217
Packit 971217
static Suite *
Packit 971217
rtp_suite (void)
Packit 971217
{
Packit 971217
  Suite *s = suite_create ("rtp support library");
Packit 971217
  TCase *tc_chain = tcase_create ("general");
Packit 971217
Packit 971217
  suite_add_tcase (s, tc_chain);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer_validate_corrupt);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer_validate_padding);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer_set_extension_data);
Packit 971217
  //tcase_add_test (tc_chain, test_rtp_buffer_list_set_extension);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_seqnum_compare);
Packit 971217
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_buffer);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_reduced_buffer);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_validate_with_padding);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_validate_with_padding_wrong_padlength);
Packit 971217
  tcase_add_test (tc_chain,
Packit 971217
      test_rtcp_validate_with_padding_excluded_from_length);
Packit 971217
  tcase_add_test (tc_chain,
Packit 971217
      test_rtcp_validate_with_padding_set_in_first_packet);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_validate_reduced_without_padding);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_validate_reduced_with_padding);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_buffer_profile_specific_extension);
Packit 971217
  tcase_add_test (tc_chain, test_rtcp_buffer_app);
Packit 971217
Packit 971217
  tcase_add_test (tc_chain, test_rtp_ntp64_extension);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_ntp56_extension);
Packit 971217
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer_get_payload_bytes);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer_get_extension_bytes);
Packit 971217
  tcase_add_test (tc_chain, test_rtp_buffer_empty_payload);
Packit 971217
Packit 971217
  //tcase_add_test (tc_chain, test_rtp_buffer_list);
Packit 971217
Packit 971217
  tcase_add_test (tc_chain, test_ext_timestamp_basic);
Packit 971217
  tcase_add_test (tc_chain, test_ext_timestamp_wraparound);
Packit 971217
  tcase_add_test (tc_chain, test_ext_timestamp_wraparound_disordered);
Packit 971217
  tcase_add_test (tc_chain,
Packit 971217
      test_ext_timestamp_wraparound_disordered_cannot_unwrap);
Packit 971217
Packit 971217
  return s;
Packit 971217
}
Packit 971217
Packit 971217
GST_CHECK_MAIN (rtp);