mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-21 15:56:42 +00:00
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
This commit is contained in:
parent
a83dabd5e8
commit
711589ebde
2 changed files with 59 additions and 0 deletions
|
@ -26,6 +26,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <gst/rtp/gstrtpbuffer.h>
|
#include <gst/rtp/gstrtpbuffer.h>
|
||||||
|
#include <gst/audio/audio.h>
|
||||||
#include "gstrtpopusdepay.h"
|
#include "gstrtpopusdepay.h"
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (rtpopusdepay_debug);
|
GST_DEBUG_CATEGORY_STATIC (rtpopusdepay_debug);
|
||||||
|
@ -137,6 +138,25 @@ gst_rtp_opus_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps)
|
||||||
return ret;
|
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 *
|
static GstBuffer *
|
||||||
gst_rtp_opus_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf)
|
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);
|
outbuf = gst_rtp_buffer_get_payload_buffer (&rtpbuf);
|
||||||
gst_rtp_buffer_unmap (&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;
|
return outbuf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <gst/rtp/gstrtpbuffer.h>
|
#include <gst/rtp/gstrtpbuffer.h>
|
||||||
|
#include <gst/audio/audio.h>
|
||||||
|
|
||||||
#include "gstrtpopuspay.h"
|
#include "gstrtpopuspay.h"
|
||||||
|
|
||||||
|
@ -160,18 +161,52 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps)
|
||||||
return res;
|
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
|
static GstFlowReturn
|
||||||
gst_rtp_opus_pay_handle_buffer (GstRTPBasePayload * basepayload,
|
gst_rtp_opus_pay_handle_buffer (GstRTPBasePayload * basepayload,
|
||||||
GstBuffer * buffer)
|
GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstBuffer *outbuf;
|
GstBuffer *outbuf;
|
||||||
GstClockTime pts, dts, duration;
|
GstClockTime pts, dts, duration;
|
||||||
|
CopyMetaData data;
|
||||||
|
|
||||||
pts = GST_BUFFER_PTS (buffer);
|
pts = GST_BUFFER_PTS (buffer);
|
||||||
dts = GST_BUFFER_DTS (buffer);
|
dts = GST_BUFFER_DTS (buffer);
|
||||||
duration = GST_BUFFER_DURATION (buffer);
|
duration = GST_BUFFER_DURATION (buffer);
|
||||||
|
|
||||||
outbuf = gst_rtp_buffer_new_allocate (0, 0, 0);
|
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);
|
outbuf = gst_buffer_append (outbuf, buffer);
|
||||||
|
|
||||||
GST_BUFFER_PTS (outbuf) = pts;
|
GST_BUFFER_PTS (outbuf) = pts;
|
||||||
|
|
Loading…
Reference in a new issue