From 711589ebde39bd3a56ff7724993dcd5492648f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 30 Jun 2015 13:51:33 +0200 Subject: [PATCH] opus: Copy metadata in the (de)payloader, but only the relevant ones The payloader didn't copy anything so far, the depayloader copied every possible meta. Let's make it consistent and just copy all metas without tags or with only the audio tag. https://bugzilla.gnome.org/show_bug.cgi?id=751774 --- ext/opus/gstrtpopusdepay.c | 24 ++++++++++++++++++++++++ ext/opus/gstrtpopuspay.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/ext/opus/gstrtpopusdepay.c b/ext/opus/gstrtpopusdepay.c index af3237bebb..abb7218e03 100644 --- a/ext/opus/gstrtpopusdepay.c +++ b/ext/opus/gstrtpopusdepay.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "gstrtpopusdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpopusdepay_debug); @@ -137,6 +138,25 @@ gst_rtp_opus_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) return ret; } +static gboolean +foreach_metadata (GstBuffer * inbuf, GstMeta ** meta, gpointer user_data) +{ + GstRTPOpusDepay *depay = user_data; + const GstMetaInfo *info = (*meta)->info; + const gchar *const *tags = gst_meta_api_type_get_tags (info->api); + + if (!tags || (g_strv_length ((gchar **) tags) == 1 + && gst_meta_api_type_has_tag (info->api, + g_quark_from_string (GST_META_TAG_AUDIO_STR)))) { + GST_DEBUG_OBJECT (depay, "keeping metadata %s", g_type_name (info->api)); + } else { + GST_DEBUG_OBJECT (depay, "dropping metadata %s", g_type_name (info->api)); + *meta = NULL; + } + + return TRUE; +} + static GstBuffer * gst_rtp_opus_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) { @@ -147,5 +167,9 @@ gst_rtp_opus_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) outbuf = gst_rtp_buffer_get_payload_buffer (&rtpbuf); gst_rtp_buffer_unmap (&rtpbuf); + outbuf = gst_buffer_make_writable (outbuf); + /* Filter away all metas that are not sensible to copy */ + gst_buffer_foreach_meta (outbuf, foreach_metadata, depayload); + return outbuf; } diff --git a/ext/opus/gstrtpopuspay.c b/ext/opus/gstrtpopuspay.c index 057c8d0cc3..ead49a58a6 100644 --- a/ext/opus/gstrtpopuspay.c +++ b/ext/opus/gstrtpopuspay.c @@ -26,6 +26,7 @@ #include #include +#include #include "gstrtpopuspay.h" @@ -160,18 +161,52 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps) return res; } +typedef struct +{ + GstRtpOPUSPay *pay; + GstBuffer *outbuf; +} CopyMetaData; + +static gboolean +foreach_metadata (GstBuffer * inbuf, GstMeta ** meta, gpointer user_data) +{ + CopyMetaData *data = user_data; + GstRtpOPUSPay *pay = data->pay; + GstBuffer *outbuf = data->outbuf; + const GstMetaInfo *info = (*meta)->info; + const gchar *const *tags = gst_meta_api_type_get_tags (info->api); + + if (!tags || (g_strv_length ((gchar **) tags) == 1 + && gst_meta_api_type_has_tag (info->api, + g_quark_from_string (GST_META_TAG_AUDIO_STR)))) { + GstMetaTransformCopy copy_data = { FALSE, 0, -1 }; + GST_DEBUG_OBJECT (pay, "copy metadata %s", g_type_name (info->api)); + /* simply copy then */ + info->transform_func (outbuf, *meta, inbuf, + _gst_meta_transform_copy, ©_data); + } else { + GST_DEBUG_OBJECT (pay, "not copying metadata %s", g_type_name (info->api)); + } + + return TRUE; +} + static GstFlowReturn gst_rtp_opus_pay_handle_buffer (GstRTPBasePayload * basepayload, GstBuffer * buffer) { GstBuffer *outbuf; GstClockTime pts, dts, duration; + CopyMetaData data; pts = GST_BUFFER_PTS (buffer); dts = GST_BUFFER_DTS (buffer); duration = GST_BUFFER_DURATION (buffer); outbuf = gst_rtp_buffer_new_allocate (0, 0, 0); + data.pay = GST_RTP_OPUS_PAY (basepayload); + data.outbuf = outbuf; + gst_buffer_foreach_meta (buffer, foreach_metadata, &data); outbuf = gst_buffer_append (outbuf, buffer); GST_BUFFER_PTS (outbuf) = pts;