From: Havard Graff Date: Thu, 5 Apr 2018 09:59:52 +0000 (+0200) Subject: audio: add GstAudioLevelMeta X-Git-Tag: 1.19.3~511^2~283 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0f866832b164283c1b10307c47977d1586e54132;p=platform%2Fupstream%2Fgstreamer.git audio: add GstAudioLevelMeta Will be used to implement RTP extension https://tools.ietf.org/html/rfc6464 Co-authored-by: Guillaume Desmottes Part-of: --- diff --git a/gst-libs/gst/audio/gstaudiometa.c b/gst-libs/gst/audio/gstaudiometa.c index ec93744..b67f441 100644 --- a/gst-libs/gst/audio/gstaudiometa.c +++ b/gst-libs/gst/audio/gstaudiometa.c @@ -492,3 +492,131 @@ gst_audio_meta_get_info (void) } return audio_meta_info; } + +/** + * gst_audio_level_meta_api_get_type: + * + * Return the #GType associated with #GstAudioLevelMeta. + * + * Returns: a #GType + * + * Since: 1.20 + */ +GType +gst_audio_level_meta_api_get_type (void) +{ + static volatile GType type = 0; + static const gchar *tags[] = { NULL }; + + if (g_once_init_enter (&type)) { + GType _type = gst_meta_api_type_register ("GstAudioLevelMetaAPI", tags); + g_once_init_leave (&type, _type); + } + return type; +} + +static gboolean +gst_audio_level_meta_init (GstMeta * meta, gpointer params, GstBuffer * buffer) +{ + GstAudioLevelMeta *dmeta = (GstAudioLevelMeta *) meta; + + dmeta->level = 127; + dmeta->voice_activity = FALSE; + + return TRUE; +} + +static gboolean +gst_audio_level_meta_transform (GstBuffer * dst, GstMeta * meta, + GstBuffer * src, GQuark type, gpointer data) +{ + if (GST_META_TRANSFORM_IS_COPY (type)) { + GstAudioLevelMeta *smeta = (GstAudioLevelMeta *) meta; + GstAudioLevelMeta *dmeta; + + dmeta = gst_buffer_add_audio_level_meta (dst, smeta->level, + smeta->voice_activity); + if (dmeta == NULL) + return FALSE; + } else { + /* return FALSE, if transform type is not supported */ + return FALSE; + } + + return TRUE; +} + +/** + * gst_audio_level_meta_get_info: + * + * Return the #GstMetaInfo associated with #GstAudioLevelMeta. + * + * Returns: (transfer none): a #GstMetaInfo + * + * Since: 1.20 + */ +const GstMetaInfo * +gst_audio_level_meta_get_info (void) +{ + static const GstMetaInfo *audio_level_meta_info = NULL; + + if (g_once_init_enter (&audio_level_meta_info)) { + const GstMetaInfo *meta = gst_meta_register (GST_AUDIO_LEVEL_META_API_TYPE, + "GstAudioLevelMeta", + sizeof (GstAudioLevelMeta), + gst_audio_level_meta_init, + (GstMetaFreeFunction) NULL, + gst_audio_level_meta_transform); + g_once_init_leave (&audio_level_meta_info, meta); + } + return audio_level_meta_info; +} + +/** + * gst_buffer_add_audio_level_meta: + * @buffer: a #GstBuffer + * @level: the -dBov from 0-127 (127 is silence). + * @voice_activity: whether the buffer contains voice activity. + * + * Attaches audio level information to @buffer. (RFC 6464) + * + * Returns: (transfer none) (nullable): the #GstAudioLevelMeta on @buffer. + * + * Since: 1.20 + */ +GstAudioLevelMeta * +gst_buffer_add_audio_level_meta (GstBuffer * buffer, guint8 level, + gboolean voice_activity) +{ + GstAudioLevelMeta *meta; + + g_return_val_if_fail (buffer != NULL, NULL); + + meta = (GstAudioLevelMeta *) gst_buffer_add_meta (buffer, + GST_AUDIO_LEVEL_META_INFO, NULL); + if (!meta) + return NULL; + + meta->level = level; + meta->voice_activity = voice_activity; + + return meta; +} + +/** + * gst_buffer_get_audio_level_meta: + * @buffer: a #GstBuffer + * + * Find the #GstAudioLevelMeta on @buffer. + * + * Returns: (transfer none) (nullable): the #GstAudioLevelMeta or %NULL when + * there is no such metadata on @buffer. + * + * Since: 1.20 + */ +GstAudioLevelMeta * +gst_buffer_get_audio_level_meta (GstBuffer * buffer) +{ + return (GstAudioLevelMeta *) gst_buffer_get_meta (buffer, + gst_audio_level_meta_api_get_type ()); +} diff --git a/gst-libs/gst/audio/gstaudiometa.h b/gst-libs/gst/audio/gstaudiometa.h index 0b1b48b..94954d1 100644 --- a/gst-libs/gst/audio/gstaudiometa.h +++ b/gst-libs/gst/audio/gstaudiometa.h @@ -198,6 +198,55 @@ GstAudioMeta * gst_buffer_add_audio_meta (GstBuffer *buffer, const GstAudioInfo *info, gsize samples, gsize offsets[]); +/** + * GST_AUDIO_LEVEL_META_API_TYPE: + * + * The #GType associated with #GstAudioLevelMeta. + * + * Since: 1.20 + */ +#define GST_AUDIO_LEVEL_META_API_TYPE (gst_audio_level_meta_api_get_type()) +/** + * GST_AUDIO_LEVEL_META_INFO: + * + * The #GstMetaInfo associated with #GstAudioLevelMeta. + * + * Since: 1.20 + */ +#define GST_AUDIO_LEVEL_META_INFO (gst_audio_level_meta_get_info()) +typedef struct _GstAudioLevelMeta GstAudioLevelMeta; + +/** + * GstAudioLevelMeta: + * @meta: parent #GstMeta + * @level: the -dBov from 0-127 (127 is silence). + * @voice_activity: whether the buffer contains voice activity + * + * Meta containing Audio Level Indication: https://tools.ietf.org/html/rfc6464 + * + * Since: 1.20 + */ +struct _GstAudioLevelMeta +{ + GstMeta meta; + + guint8 level; + gboolean voice_activity; +}; + +GST_AUDIO_API +GType gst_audio_level_meta_api_get_type (void); + +GST_AUDIO_API +const GstMetaInfo * gst_audio_level_meta_get_info (void); + +GST_AUDIO_API +GstAudioLevelMeta * gst_buffer_add_audio_level_meta (GstBuffer * buffer, + guint8 level, + gboolean voice_activity); +GST_AUDIO_API +GstAudioLevelMeta * gst_buffer_get_audio_level_meta (GstBuffer * buffer); + G_END_DECLS #endif /* __GST_AUDIO_META_H__ */