+2005-07-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ * gst/gstpad.c: (fixate_value), (gst_pad_default_fixate),
+ (gst_pad_fixate_caps):
+ Implement default fixation once again, so that gst_pad_fixate()
+ actually does anything at all. This probably needs to be some
+ sort of a last resort, and use profile-based fixation first, but
+ since that doesn't exist yet, this is the best we have. Fixes
+ visualization in Totem.
+
2005-07-22 Wim Taymans <wim@fluendo.com>
* docs/design/part-events.txt:
}
}
+static gboolean
+fixate_value (GValue * dest, const GValue * src)
+{
+ if (G_VALUE_TYPE (src) == GST_TYPE_INT_RANGE) {
+ g_value_init (dest, G_TYPE_INT);
+ g_value_set_int (dest, gst_value_get_int_range_min (src));
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_DOUBLE_RANGE) {
+ g_value_init (dest, G_TYPE_DOUBLE);
+ g_value_set_double (dest, gst_value_get_double_range_min (src));
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_LIST) {
+ GValue temp = { 0 };
+
+ gst_value_init_and_copy (&temp, gst_value_list_get_value (src, 0));
+ if (!fixate_value (dest, &temp))
+ gst_value_init_and_copy (dest, &temp);
+ g_value_unset (&temp);
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_ARRAY) {
+ gboolean res = FALSE;
+ gint n;
+
+ g_value_init (dest, GST_TYPE_ARRAY);
+ for (n = 0; n < gst_value_list_get_size (src); n++) {
+ GValue kid = { 0 };
+ const GValue *orig_kid = gst_value_list_get_value (src, n);
+
+ if (!fixate_value (&kid, orig_kid))
+ gst_value_init_and_copy (&kid, orig_kid);
+ else
+ res = TRUE;
+ gst_value_list_append_value (dest, &kid);
+ g_value_unset (&kid);
+ }
+
+ if (!res)
+ g_value_unset (dest);
+
+ return res;
+ } else {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_pad_default_fixate (GQuark field_id, const GValue * value, gpointer data)
+{
+ GstStructure *s = data;
+ GValue v = { 0 };
+
+ if (fixate_value (&v, value)) {
+ gst_structure_id_set_value (s, field_id, &v);
+ g_value_unset (&v);
+ }
+
+ return TRUE;
+}
+
/**
* gst_pad_fixate_caps:
* @pad: a #GstPad to fixate
gst_pad_fixate_caps (GstPad * pad, GstCaps * caps)
{
GstPadFixateCapsFunction fixatefunc;
+ gint n;
g_return_if_fail (GST_IS_PAD (pad));
g_return_if_fail (caps != NULL);
if (fixatefunc) {
fixatefunc (pad, caps);
}
+
+ /* default fixation */
+ for (n = 0; n < gst_caps_get_size (caps); n++) {
+ GstStructure *s = gst_caps_get_structure (caps, n);
+
+ gst_structure_foreach (s, gst_pad_default_fixate, s);
+ }
}
/**