tests/rtp/payload: add test for shrinking extension data
authorMatthew Waters <matthew@centricular.com>
Tue, 31 Aug 2021 06:21:09 +0000 (16:21 +1000)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 19 Oct 2021 03:26:57 +0000 (03:26 +0000)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1146>

subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasepayload.c
subprojects/gst-plugins-base/tests/check/libs/rtpbasepayload.c
subprojects/gst-plugins-base/tests/check/libs/rtpdummyhdrextimpl.c

index e72469c..3ee8798 100644 (file)
@@ -1651,6 +1651,9 @@ write_header_extension (GstRTPHeaderExtension * ext, gpointer user_data)
       hdr->payload->priv->input_meta_buffer, hdr->flags, hdr->output,
       &hdr->data[offset], remaining);
 
+  GST_TRACE_OBJECT (hdr->payload, "extension %" GST_PTR_FORMAT " wrote %"
+      G_GSIZE_FORMAT, ext, written);
+
   if (written == 0) {
     /* extension wrote no data */
     return;
index a94faa5..49a7058 100644 (file)
@@ -111,9 +111,7 @@ gst_rtp_dummy_pay_handle_buffer (GstRTPBasePayload * pay, GstBuffer * buffer)
 {
   GstBuffer *paybuffer;
 
-  GST_LOG ("payloading buffer pts=%" GST_TIME_FORMAT " offset=%"
-      G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
-      GST_BUFFER_OFFSET (buffer));
+  GST_LOG ("payloading %" GST_PTR_FORMAT, buffer);
 
   if (!gst_pad_has_current_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (pay))) {
     if (!gst_rtp_base_payload_set_outcaps (GST_RTP_BASE_PAYLOAD (pay),
@@ -132,9 +130,7 @@ gst_rtp_dummy_pay_handle_buffer (GstRTPBasePayload * pay, GstBuffer * buffer)
 
   gst_buffer_append (paybuffer, buffer);
 
-  GST_LOG ("payloaded buffer pts=%" GST_TIME_FORMAT " offset=%"
-      G_GUINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (paybuffer)),
-      GST_BUFFER_OFFSET (paybuffer));
+  GST_LOG ("payloaded %" GST_PTR_FORMAT, paybuffer);
 
   if (GST_BUFFER_PTS (paybuffer) < BUFFER_BEFORE_LIST) {
     return gst_rtp_base_payload_push (pay, paybuffer);
@@ -342,7 +338,7 @@ static void
 push_buffer_full (State * state, GstFlowReturn expected,
     const gchar * field, ...)
 {
-  GstBuffer *buf = gst_rtp_buffer_new_allocate (0, 0, 0);
+  GstBuffer *buf = gst_buffer_new_allocate (0, 0, 0);
   GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
   gboolean mapped = FALSE;
   va_list var_args;
@@ -478,6 +474,10 @@ validate_buffer_valist (GstBuffer * buf, const gchar * field, va_list var_args)
       } else {
         fail_if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT));
       }
+    } else if (!g_strcmp0 (field, "size")) {
+      gsize expected_size = va_arg (var_args, gsize);
+      fail_unless_equals_int64 ((guint64) expected_size,
+          gst_buffer_get_size (buf));
     } else {
       if (!mapped) {
         gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp);
@@ -503,6 +503,17 @@ validate_buffer_valist (GstBuffer * buf, const gchar * field, va_list var_args)
         guint csrc_count = va_arg (var_args, guint);
         fail_unless_equals_int (gst_rtp_buffer_get_csrc_count (&rtp),
             csrc_count);
+      } else if (!g_strcmp0 (field, "ext-data")) {
+        guint expected_bits = va_arg (var_args, guint) & 0xFFFF;
+        gsize expected_size = va_arg (var_args, gsize);
+        gpointer data;
+        guint word_len;
+        guint16 ext_bits;
+        gst_rtp_buffer_get_extension_data (&rtp, &ext_bits, &data, &word_len);
+        GST_MEMDUMP ("ext data", data, word_len * 4);
+        fail_unless_equals_int (expected_bits, ext_bits);
+        fail_unless_equals_int64 ((guint64) expected_size,
+            (guint64) word_len * 4);
       } else {
         fail ("test cannot validate unknown buffer field '%s'", field);
       }
@@ -2261,6 +2272,44 @@ GST_START_TEST (rtp_base_payload_extensions_in_output_caps)
 }
 
 GST_END_TEST;
+
+GST_START_TEST (rtp_base_payload_extensions_shrink_ext_data)
+{
+  GstRTPHeaderExtension *ext;
+  State *state;
+
+  state = create_payloader ("application/x-rtp", &sinktmpl, NULL);
+  ext = rtp_dummy_hdr_ext_new ();
+  GST_RTP_DUMMY_HDR_EXT (ext)->supported_flags =
+      GST_RTP_HEADER_EXTENSION_ONE_BYTE;
+  GST_RTP_DUMMY_HDR_EXT (ext)->max_size = 5;
+  gst_rtp_header_extension_set_id (ext, 1);
+
+  g_signal_emit_by_name (state->element, "add-extension", ext);
+
+  set_state (state, GST_STATE_PLAYING);
+
+  push_buffer (state, "pts", 0 * GST_SECOND, NULL);
+
+  set_state (state, GST_STATE_NULL);
+
+  validate_buffers_received (1);
+
+  validate_buffer (0, "pts", 0 * GST_SECOND, "size", (gsize) 20, "ext-data",
+      (guint) 0xBEDE, (gsize) 4, NULL);
+
+  validate_events_received (3);
+
+  validate_normal_start_events (0);
+
+  fail_unless_equals_int (GST_RTP_DUMMY_HDR_EXT (ext)->write_count, 1);
+  gst_object_unref (ext);
+  ext = NULL;
+
+  destroy_payloader (state);
+}
+
+GST_END_TEST;
 static Suite *
 rtp_basepayloading_suite (void)
 {
@@ -2310,6 +2359,7 @@ rtp_basepayloading_suite (void)
   tcase_add_test (tc_chain, rtp_base_payload_caps_request);
   tcase_add_test (tc_chain, rtp_base_payload_caps_request_ignored);
   tcase_add_test (tc_chain, rtp_base_payload_extensions_in_output_caps);
+  tcase_add_test (tc_chain, rtp_base_payload_extensions_shrink_ext_data);
 
   return s;
 }
index a6f8440..ca96132 100644 (file)
@@ -57,6 +57,8 @@ struct _GstRTPDummyHdrExt
   guint caps_field_value;
 
   gchar *attributes;
+
+  gsize max_size;
 };
 
 struct _GstRTPDummyHdrExtClass
@@ -129,6 +131,7 @@ gst_rtp_dummy_hdr_ext_init (GstRTPDummyHdrExt * dummy)
 {
   dummy->supported_flags =
       GST_RTP_HEADER_EXTENSION_ONE_BYTE | GST_RTP_HEADER_EXTENSION_TWO_BYTE;
+  dummy->max_size = 1;
 }
 
 static void
@@ -160,7 +163,9 @@ static gsize
 gst_rtp_dummy_hdr_ext_get_max_size (GstRTPHeaderExtension * ext,
     const GstBuffer * input_meta)
 {
-  return 1;
+  GstRTPDummyHdrExt *dummy = GST_RTP_DUMMY_HDR_EXT (ext);
+
+  return dummy->max_size;
 }
 
 #define TEST_DATA_BYTE 0x9d