audio: add GstAudioLevelMeta
authorHavard Graff <havard.graff@gmail.com>
Thu, 5 Apr 2018 09:59:52 +0000 (11:59 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.com>
Thu, 4 Feb 2021 09:25:24 +0000 (10:25 +0100)
Will be used to implement RTP extension https://tools.ietf.org/html/rfc6464

Co-authored-by: Guillaume Desmottes <guillaume.desmottes@collabora.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/706>

gst-libs/gst/audio/gstaudiometa.c
gst-libs/gst/audio/gstaudiometa.h

index ec93744..b67f441 100644 (file)
@@ -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 ());
+}
index 0b1b48b..94954d1 100644 (file)
@@ -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__ */