videorate: Fixate color-matrix and chroma-site fields if necessary
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 22 May 2010 07:48:01 +0000 (09:48 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 22 May 2010 07:53:22 +0000 (09:53 +0200)
gst/videorate/gstvideorate.c

index 29f72f0..29bc347 100644 (file)
@@ -269,6 +269,45 @@ gst_video_rate_getcaps (GstPad * pad)
 }
 
 static gboolean
+_gst_structure_fixate_field_string (GstStructure * structure,
+    const char *field_name, const gchar * target)
+{
+  const GValue *value;
+
+  value = gst_structure_get_value (structure, field_name);
+
+  if (G_VALUE_TYPE (value) == G_TYPE_STRING) {
+    /* already fixed */
+    return FALSE;
+  } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+    const GValue *list_value;
+    int i, n;
+    const gchar *best = NULL;
+    int best_index = -1;
+
+    n = gst_value_list_get_size (value);
+    for (i = 0; i < n; i++) {
+      list_value = gst_value_list_get_value (value, i);
+      if (G_VALUE_TYPE (list_value) == G_TYPE_STRING) {
+        const gchar *x = g_value_get_string (list_value);
+
+        if (best_index == -1 || g_str_equal (x, target)) {
+          best_index = i;
+          best = x;
+        }
+      }
+    }
+    if (best_index != -1) {
+      gst_structure_set (structure, field_name, G_TYPE_STRING, best, NULL);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  return FALSE;
+}
+
+static gboolean
 gst_video_rate_setcaps (GstPad * pad, GstCaps * caps)
 {
   GstVideoRate *videorate;
@@ -348,6 +387,10 @@ gst_video_rate_setcaps (GstPad * pad, GstCaps * caps)
 
       if (gst_structure_has_field (structure, "interlaced"))
         gst_structure_fixate_field_boolean (structure, "interlaced", FALSE);
+      if (gst_structure_has_field (structure, "color-matrix"))
+        _gst_structure_fixate_field_string (structure, "color-matrix", "sdtv");
+      if (gst_structure_has_field (structure, "chroma-site"))
+        _gst_structure_fixate_field_string (structure, "chroma-site", "mpeg2");
 
       gst_pad_set_caps (otherpad, caps);
       gst_caps_unref (caps);