rtpbasedepayload: don't consider existing GstRTPSourceMeta

The meta should always be generated based on what is present in the
rtp-header.
This commit is contained in:
Havard Graff 2019-06-12 14:31:09 +02:00 committed by Sebastian Dröge
parent a83859aaee
commit 2e342a16ce
2 changed files with 57 additions and 0 deletions

View file

@ -750,17 +750,35 @@ create_segment_event (GstRTPBaseDepayload * filter, guint rtptime,
return event; 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 static void
add_rtp_source_meta (GstBuffer * outbuf, GstBuffer * rtpbuf) add_rtp_source_meta (GstBuffer * outbuf, GstBuffer * rtpbuf)
{ {
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT; GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
GstRTPSourceMeta *meta; GstRTPSourceMeta *meta;
guint32 ssrc; guint32 ssrc;
GType source_meta_api = gst_rtp_source_meta_api_get_type ();
if (!gst_rtp_buffer_map (rtpbuf, GST_MAP_READ, &rtp)) if (!gst_rtp_buffer_map (rtpbuf, GST_MAP_READ, &rtp))
return; return;
ssrc = gst_rtp_buffer_get_ssrc (&rtp); 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); meta = gst_buffer_add_rtp_source_meta (outbuf, &ssrc, NULL, 0);
if (meta != NULL) { if (meta != NULL) {
gint i; gint i;

View file

@ -1374,6 +1374,44 @@ GST_START_TEST (rtp_base_depayload_source_info_test)
GST_END_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 * static Suite *
rtp_basepayloading_suite (void) 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_clock_base_test);
tcase_add_test (tc_chain, rtp_base_depayload_source_info_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; return s;
} }