audioaggregator: Consider converting for equal audio formats
authorJan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
Mon, 15 Mar 2021 14:33:47 +0000 (15:33 +0100)
committerJan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
Tue, 16 Mar 2021 12:46:56 +0000 (13:46 +0100)
The converter might have a non-passthrough mix-matrix. The converter
can determine whether it should pass through, so let it, then remove it
if it's indeed a passthrough.

FIXME: Not converting when we need to but the config is invalid (e.g.
because the mix-matrix is not the right size) produces garbage. An
invalid config should cause a GST_FLOW_NOT_NEGOTIATED.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1070>

gst-libs/gst/audio/gstaudioaggregator.c

index d2b9cbb..44fc7c6 100644 (file)
@@ -200,6 +200,7 @@ gst_audio_aggregator_convert_pad_update_converter (GstAudioAggregatorConvertPad
     * aaggcpad, GstAudioInfo * in_info, GstAudioInfo * out_info)
 {
   GstStructure *config = aaggcpad->priv->converter_config;
+  GstAudioConverter *converter;
 
   if (!aaggcpad->priv->converter_config_changed)
     return;
@@ -207,16 +208,27 @@ gst_audio_aggregator_convert_pad_update_converter (GstAudioAggregatorConvertPad
   g_clear_pointer (&aaggcpad->priv->converter, gst_audio_converter_free);
   aaggcpad->priv->converter_config_changed = FALSE;
 
-  if (gst_audio_info_is_equal (in_info, out_info) ||
-      in_info->finfo->format == GST_AUDIO_FORMAT_UNKNOWN) {
+  if (in_info->finfo->format == GST_AUDIO_FORMAT_UNKNOWN) {
     /* If we haven't received caps yet, this pad should not have
      * a buffer to convert anyway */
     return;
   }
 
-  aaggcpad->priv->converter =
+  converter =
       gst_audio_converter_new (GST_AUDIO_CONVERTER_FLAG_NONE, in_info, out_info,
       config ? gst_structure_copy (config) : NULL);
+
+  if (converter == NULL) {
+    /* FIXME: Not converting when we need to but the config is invalid (e.g.
+     * because the mix-matrix is not the right size) produces garbage. An
+     * invalid config should cause a GST_FLOW_NOT_NEGOTIATED. */
+    return;
+  }
+
+  if (!gst_audio_converter_is_passthrough (converter))
+    aaggcpad->priv->converter = converter;
+  else
+    gst_audio_converter_free (converter);
 }
 
 static void