audioconvert: improve fixation
authorWim Taymans <wim.taymans@collabora.co.uk>
Mon, 27 Feb 2012 11:52:07 +0000 (12:52 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 27 Feb 2012 11:52:07 +0000 (12:52 +0100)
gst/audioconvert/gstaudioconvert.c

index 044b5b9..8d93013 100644 (file)
@@ -590,34 +590,30 @@ gst_audio_convert_fixate_caps (GstBaseTransform * base,
     GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
 {
   GstStructure *ins, *outs;
-  gint rate;
-  const gchar *fmt;
-
-  othercaps = gst_caps_make_writable (othercaps);
+  GstCaps *result;
 
   GST_DEBUG_OBJECT (base, "trying to fixate othercaps %" GST_PTR_FORMAT
       " based on caps %" GST_PTR_FORMAT, othercaps, caps);
 
-  ins = gst_caps_get_structure (caps, 0);
-  outs = gst_caps_get_structure (othercaps, 0);
+  result = gst_caps_intersect (othercaps, caps);
+  if (gst_caps_is_empty (result)) {
+    result = othercaps;
+  } else {
+    gst_caps_unref (othercaps);
+  }
 
-  gst_audio_convert_fixate_channels (base, ins, outs);
+  /* fixate remaining fields */
+  result = gst_caps_make_writable (result);
 
-  if ((fmt = gst_structure_get_string (ins, "format"))) {
-    /* FIXME, find the best format */
-    gst_structure_fixate_field_string (outs, "format", fmt);
-  }
+  ins = gst_caps_get_structure (caps, 0);
+  outs = gst_caps_get_structure (result, 0);
 
-  if (gst_structure_get_int (ins, "rate", &rate)) {
-    if (gst_structure_has_field (outs, "rate")) {
-      gst_structure_fixate_field_nearest_int (outs, "rate", rate);
-    }
-  }
+  gst_audio_convert_fixate_channels (base, ins, outs);
+  gst_caps_fixate (result);
 
-  gst_caps_truncate (othercaps);
-  GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps);
+  GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, result);
 
-  return othercaps;
+  return result;
 }
 
 static gboolean