audio: video: Optimize by using cached quark for meta tag

Avoid taking the global quark lock for every single buffer.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/295>
This commit is contained in:
Havard Graff 2019-06-14 10:14:23 +02:00 committed by GStreamer Merge Bot
parent 5464d420f9
commit 0826fb95b7
9 changed files with 62 additions and 18 deletions

View file

@ -273,6 +273,10 @@ struct _GstAudioDecoderPrivate
gboolean use_default_pad_acceptcaps;
};
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_AUDIO meta_tag_audio_quark
static GQuark meta_tag_audio_quark;
static void gst_audio_decoder_finalize (GObject * object);
static void gst_audio_decoder_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
@ -440,6 +444,8 @@ gst_audio_decoder_class_init (GstAudioDecoderClass * klass)
GST_DEBUG_FUNCPTR (gst_audio_decoder_src_query_default);
audiodecoder_class->transform_meta =
GST_DEBUG_FUNCPTR (gst_audio_decoder_transform_meta_default);
meta_tag_audio_quark = g_quark_from_static_string (GST_META_TAG_AUDIO_STR);
}
static void
@ -1206,8 +1212,7 @@ gst_audio_decoder_transform_meta_default (GstAudioDecoder *
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_meta_api_type_has_tag (info->api, META_TAG_AUDIO)))
return TRUE;
return FALSE;

View file

@ -245,6 +245,10 @@ struct _GstAudioEncoderPrivate
static GstElementClass *parent_class = NULL;
static gint private_offset = 0;
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_AUDIO meta_tag_audio_quark
static GQuark meta_tag_audio_quark;
static void gst_audio_encoder_class_init (GstAudioEncoderClass * klass);
static void gst_audio_encoder_init (GstAudioEncoder * parse,
GstAudioEncoderClass * klass);
@ -391,6 +395,8 @@ gst_audio_encoder_class_init (GstAudioEncoderClass * klass)
klass->decide_allocation = gst_audio_encoder_decide_allocation_default;
klass->negotiate = gst_audio_encoder_negotiate_default;
klass->transform_meta = gst_audio_encoder_transform_meta_default;
meta_tag_audio_quark = g_quark_from_static_string (GST_META_TAG_AUDIO_STR);
}
static void
@ -668,8 +674,7 @@ gst_audio_encoder_transform_meta_default (GstAudioEncoder *
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_meta_api_type_has_tag (info->api, META_TAG_AUDIO)))
return TRUE;
return FALSE;

View file

@ -50,6 +50,10 @@
GST_DEBUG_CATEGORY_STATIC (audiofilter_dbg);
#define GST_CAT_DEFAULT audiofilter_dbg
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_AUDIO meta_tag_audio_quark
static GQuark meta_tag_audio_quark;
static GstStateChangeReturn gst_audio_filter_change_state (GstElement * element,
GstStateChange transition);
static gboolean gst_audio_filter_set_caps (GstBaseTransform * btrans,
@ -76,8 +80,7 @@ gst_audio_filter_transform_meta (GstBaseTransform * trans, GstBuffer * inbuf,
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_meta_api_type_has_tag (info->api, META_TAG_AUDIO)))
return TRUE;
return
@ -98,6 +101,8 @@ gst_audio_filter_class_init (GstAudioFilterClass * klass)
GST_DEBUG_FUNCPTR (gst_audio_filter_get_unit_size);
basetrans_class->transform_meta = gst_audio_filter_transform_meta;
basetrans_class->submit_input_buffer = gst_audio_filter_submit_input_buffer;
meta_tag_audio_quark = g_quark_from_static_string (GST_META_TAG_AUDIO_STR);
}
static void

View file

@ -153,6 +153,10 @@ static GstStateChangeReturn gst_rtp_base_payload_audio_change_state (GstElement
static gboolean gst_rtp_base_payload_audio_sink_event (GstRTPBasePayload
* payload, GstEvent * event);
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_AUDIO meta_tag_audio_quark
static GQuark meta_tag_audio_quark;
#define gst_rtp_base_audio_payload_parent_class parent_class
G_DEFINE_TYPE_WITH_PRIVATE (GstRTPBaseAudioPayload, gst_rtp_base_audio_payload,
GST_TYPE_RTP_BASE_PAYLOAD);
@ -164,6 +168,8 @@ gst_rtp_base_audio_payload_class_init (GstRTPBaseAudioPayloadClass * klass)
GstElementClass *gstelement_class;
GstRTPBasePayloadClass *gstrtpbasepayload_class;
meta_tag_audio_quark = g_quark_from_static_string (GST_META_TAG_AUDIO_STR);
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
gstrtpbasepayload_class = (GstRTPBasePayloadClass *) klass;
@ -488,8 +494,7 @@ foreach_metadata (GstBuffer * inbuf, GstMeta ** meta, gpointer user_data)
const gchar *const *tags = gst_meta_api_type_get_tags (info->api);
if (info->transform_func && (!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_meta_api_type_has_tag (info->api, META_TAG_AUDIO)))) {
GstMetaTransformCopy copy_data = { FALSE, 0, -1 };
GST_DEBUG_OBJECT (pay, "copy metadata %s", g_type_name (info->api));
/* simply copy then */

View file

@ -426,6 +426,10 @@ struct _GstVideoDecoderPrivate
static GstElementClass *parent_class = NULL;
static gint private_offset = 0;
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_VIDEO meta_tag_video_quark
static GQuark meta_tag_video_quark;
static void gst_video_decoder_class_init (GstVideoDecoderClass * klass);
static void gst_video_decoder_init (GstVideoDecoder * dec,
GstVideoDecoderClass * klass);
@ -589,6 +593,8 @@ gst_video_decoder_class_init (GstVideoDecoderClass * klass)
"Max consecutive decoder errors before returning flow error",
-1, G_MAXINT, DEFAULT_MAX_ERRORS,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
meta_tag_video_quark = g_quark_from_static_string (GST_META_TAG_VIDEO_STR);
}
static void
@ -3030,8 +3036,7 @@ gst_video_decoder_transform_meta_default (GstVideoDecoder *
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_VIDEO_STR))))
&& gst_meta_api_type_has_tag (info->api, META_TAG_VIDEO)))
return TRUE;
return FALSE;

View file

@ -236,6 +236,10 @@ forced_key_unit_event_compare (const ForcedKeyUnitEvent * a,
static GstElementClass *parent_class = NULL;
static gint private_offset = 0;
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_VIDEO meta_tag_video_quark
static GQuark meta_tag_video_quark;
static void gst_video_encoder_class_init (GstVideoEncoderClass * klass);
static void gst_video_encoder_init (GstVideoEncoder * enc,
GstVideoEncoderClass * klass);
@ -418,6 +422,8 @@ gst_video_encoder_class_init (GstVideoEncoderClass * klass)
"Minimum interval between force-keyunit requests in nanoseconds", 0,
G_MAXUINT64, DEFAULT_MIN_FORCE_KEY_UNIT_INTERVAL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
meta_tag_video_quark = g_quark_from_static_string (GST_META_TAG_VIDEO_STR);
}
static GList *
@ -2137,8 +2143,7 @@ gst_video_encoder_transform_meta_default (GstVideoEncoder *
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_VIDEO_STR))))
&& gst_meta_api_type_has_tag (info->api, META_TAG_VIDEO)))
return TRUE;
return FALSE;

View file

@ -47,6 +47,10 @@ GST_DEBUG_CATEGORY_STATIC (gst_video_filter_debug);
G_DEFINE_ABSTRACT_TYPE (GstVideoFilter, gst_video_filter,
GST_TYPE_BASE_TRANSFORM);
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_VIDEO meta_tag_video_quark
static GQuark meta_tag_video_quark;
/* Answer the allocation query downstream. */
static gboolean
gst_video_filter_propose_allocation (GstBaseTransform * trans,
@ -353,8 +357,7 @@ gst_video_filter_transform_meta (GstBaseTransform * trans, GstBuffer * inbuf,
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_VIDEO_STR))))
&& gst_meta_api_type_has_tag (info->api, META_TAG_VIDEO)))
return TRUE;
return GST_BASE_TRANSFORM_CLASS (parent_class)->transform_meta (trans, inbuf,
@ -386,6 +389,8 @@ gst_video_filter_class_init (GstVideoFilterClass * g_class)
GST_DEBUG_CATEGORY_INIT (gst_video_filter_debug, "videofilter", 0,
"videofilter");
meta_tag_video_quark = g_quark_from_static_string (GST_META_TAG_VIDEO_STR);
}
static void

View file

@ -184,6 +184,9 @@ GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_ALWAYS,
STATIC_CAPS);
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_AUDIO meta_tag_audio_quark
static GQuark meta_tag_audio_quark;
/*** TYPE FUNCTIONS ***********************************************************/
static void
@ -248,6 +251,8 @@ gst_audio_convert_class_init (GstAudioConvertClass * klass)
GST_DEBUG_FUNCPTR (gst_audio_convert_prepare_output_buffer);
basetransform_class->transform_ip_on_passthrough = FALSE;
meta_tag_audio_quark = g_quark_from_static_string (GST_META_TAG_AUDIO_STR);
}
static void
@ -897,8 +902,7 @@ gst_audio_convert_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf,
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_meta_api_type_has_tag (info->api, META_TAG_AUDIO)))
return TRUE;
return FALSE;

View file

@ -97,6 +97,10 @@ GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_ALWAYS,
GST_STATIC_CAPS (SUPPORTED_CAPS));
/* cached quark to avoid contention on the global quark table lock */
#define META_TAG_AUDIO meta_tag_audio_quark
static GQuark meta_tag_audio_quark;
static void gst_audio_resample_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_audio_resample_get_property (GObject * object,
@ -215,6 +219,8 @@ gst_audio_resample_class_init (GstAudioResampleClass * klass)
gst_type_mark_as_plugin_api (GST_TYPE_AUDIO_RESAMPLER_FILTER_INTERPOLATION,
0);
gst_type_mark_as_plugin_api (GST_TYPE_AUDIO_RESAMPLER_FILTER_MODE, 0);
meta_tag_audio_quark = g_quark_from_static_string (GST_META_TAG_AUDIO_STR);
}
static void
@ -943,8 +949,7 @@ gst_audio_resample_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf,
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_meta_api_type_has_tag (info->api, META_TAG_AUDIO)))
return TRUE;
return FALSE;