rtpbasedepayload: don't consider existing GstRTPSourceMeta
authorHavard Graff <havard.graff@gmail.com>
Wed, 12 Jun 2019 12:31:09 +0000 (14:31 +0200)
committerSebastian Dröge <slomo@coaxion.net>
Wed, 12 Jun 2019 12:38:26 +0000 (12:38 +0000)
The meta should always be generated based on what is present in the
rtp-header.

gst-libs/gst/rtp/gstrtpbasedepayload.c
tests/check/libs/rtpbasedepayload.c

index 5476193..ddc913c 100644 (file)
@@ -750,17 +750,35 @@ create_segment_event (GstRTPBaseDepayload * filter, guint rtptime,
   return event;
 }
 
+static gboolean
+foreach_metadata_drop (GstBuffer * buffer, GstMeta ** meta, gpointer user_data)
+{
+  GType drop_api_type = (GType) user_data;
+  const GstMetaInfo *info = (*meta)->info;
+
+  if (info->api == drop_api_type)
+    *meta = NULL;
+
+  return TRUE;
+}
+
 static void
 add_rtp_source_meta (GstBuffer * outbuf, GstBuffer * rtpbuf)
 {
   GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
   GstRTPSourceMeta *meta;
   guint32 ssrc;
+  GType source_meta_api = gst_rtp_source_meta_api_get_type ();
 
   if (!gst_rtp_buffer_map (rtpbuf, GST_MAP_READ, &rtp))
     return;
 
   ssrc = gst_rtp_buffer_get_ssrc (&rtp);
+
+  /* remove any pre-existing source-meta */
+  gst_buffer_foreach_meta (outbuf, foreach_metadata_drop,
+      (gpointer) source_meta_api);
+
   meta = gst_buffer_add_rtp_source_meta (outbuf, &ssrc, NULL, 0);
   if (meta != NULL) {
     gint i;
index b133e4e..b94273c 100644 (file)
@@ -1374,6 +1374,44 @@ GST_START_TEST (rtp_base_depayload_source_info_test)
 
 GST_END_TEST;
 
+/* verify that if a buffer arriving in the depayloader already has source-info
+   meta on it, that this does not affect the source-info coming out of the
+   depayloder, which should be all derived from the rtp-header */
+GST_START_TEST (rtp_base_depayload_source_info_from_rtp_only)
+{
+  GstHarness *h;
+  GstRtpDummyDepay *depay;
+  GstBuffer *buffer;
+  GstRTPSourceMeta *meta;
+  guint rtp_ssrc = 0x11;
+  guint rtp_csrc = 0x22;
+  guint32 meta_ssrc = 0x55;
+  guint32 meta_csrc = 0x66;
+
+  depay = rtp_dummy_depay_new ();
+  h = gst_harness_new_with_element (GST_ELEMENT_CAST (depay), "sink", "src");
+  gst_harness_set_src_caps_str (h, "application/x-rtp");
+
+  g_object_set (depay, "source-info", TRUE, NULL);
+  buffer = gst_rtp_buffer_new_allocate (0, 0, 1);
+  rtp_buffer_set (buffer, "seq", 0, "ssrc", rtp_ssrc, "csrc", 0, rtp_csrc,
+      NULL);
+  meta = gst_buffer_add_rtp_source_meta (buffer, &meta_ssrc, &meta_csrc, 1);
+
+  buffer = gst_harness_push_and_pull (h, buffer);
+  fail_unless ((meta = gst_buffer_get_rtp_source_meta (buffer)));
+  fail_unless (meta->ssrc_valid);
+  fail_unless_equals_int (meta->ssrc, rtp_ssrc);
+  fail_unless_equals_int (meta->csrc_count, 1);
+  fail_unless_equals_int (meta->csrc[0], rtp_csrc);
+  gst_buffer_unref (buffer);
+
+  g_object_unref (depay);
+  gst_harness_teardown (h);
+}
+
+GST_END_TEST;
+
 
 static Suite *
 rtp_basepayloading_suite (void)
@@ -1406,6 +1444,7 @@ rtp_basepayloading_suite (void)
   tcase_add_test (tc_chain, rtp_base_depayload_clock_base_test);
 
   tcase_add_test (tc_chain, rtp_base_depayload_source_info_test);
+  tcase_add_test (tc_chain, rtp_base_depayload_source_info_from_rtp_only);
 
   return s;
 }