add IN_CAPS buffer flag; add GST_TYPE_FIXED_LIST + functions
authorThomas Vander Stichele <thomas@apestaart.org>
Thu, 20 May 2004 17:03:02 +0000 (17:03 +0000)
committerThomas Vander Stichele <thomas@apestaart.org>
Thu, 20 May 2004 17:03:02 +0000 (17:03 +0000)
Original commit message from CVS:
add IN_CAPS buffer flag; add GST_TYPE_FIXED_LIST + functions

ChangeLog
gst/gstbuffer.h
gst/gststructure.c
gst/gstvalue.c
gst/gstvalue.h
tests/old/testsuite/caps/string-conversions.c
testsuite/caps/string-conversions.c

index 0052f73c36c827ee87fdaf64d22aaf415cdd17df..a1b91b516364c23225bad3423b07b642342d4593 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+2004-05-20  Thomas Vander Stichele  <thomas at apestaart dot org>
+
+       reviewed by: Wim Taymans <wim at fluendo dot com>
+
+       * gst/gstbuffer.h:
+          add GST_BUFFER_IN_CAPS buffer flag
+       * gst/gststructure.c: (gst_structure_value_get_generic_type),
+       (gst_structure_parse_any_list), (gst_structure_parse_list),
+       (gst_structure_parse_fixed_list), (gst_structure_parse_value):
+       * gst/gstvalue.c: (gst_value_serialize_any_list),
+       (gst_value_transform_any_list_string),
+       (gst_value_list_prepend_value), (gst_value_list_append_value),
+       (gst_value_list_get_size), (gst_value_list_get_value),
+       (gst_value_transform_list_string),
+       (gst_value_transform_fixed_list_string),
+       (gst_value_serialize_list), (gst_value_serialize_fixed_list),
+       (gst_value_deserialize_fixed_list), (gst_type_is_fixed),
+       (_gst_value_initialize):
+       * gst/gstvalue.h:
+          add a GST_TYPE_FIXED_LIST which is fixed by definition and uses
+          < , > as a format.
+       * testsuite/caps/string-conversions.c: (main):
+          add regression tests for < >
+
 2004-05-20  Johan Dahlin  <johan@gnome.org>
 
        * docs/gst/Makefile.am (all-local): Re-add
index 44d0569b1d27015d6fcfef0efb696e504259d9b6..31e9b035bda36425a2330726e4c1ebd075d5fdfc 100644 (file)
@@ -80,6 +80,7 @@ typedef enum {
   GST_BUFFER_DONTFREE,
   GST_BUFFER_KEY_UNIT,
   GST_BUFFER_DONTKEEP,
+  GST_BUFFER_IN_CAPS,
   GST_BUFFER_FLAG_LAST         = GST_DATA_FLAG_LAST + 8
 } GstBufferFlag;
 
index 1ba07fbb3af1067e6075e2392faeca4d868aa68f..a2323c98602b5451f589e8bc235656cb440d75c6 100644 (file)
@@ -1044,7 +1044,8 @@ gst_structure_to_abbr (GType type)
 static GType
 gst_structure_value_get_generic_type (GValue * val)
 {
-  if (G_VALUE_TYPE (val) == GST_TYPE_LIST) {
+  if (G_VALUE_TYPE (val) == GST_TYPE_LIST
+      || G_VALUE_TYPE (val) == GST_TYPE_FIXED_LIST) {
     GArray *array = g_value_peek_pointer (val);
 
     if (array->len > 0) {
@@ -1218,22 +1219,23 @@ gst_structure_parse_range (gchar * s, gchar ** after, GValue * value,
 }
 
 static gboolean
-gst_structure_parse_list (gchar * s, gchar ** after, GValue * value, GType type)
+gst_structure_parse_any_list (gchar * s, gchar ** after, GValue * value,
+    GType type, GType list_type, char begin, char end)
 {
   GValue list_value = { 0 };
   gboolean ret;
   GArray *array;
 
-  g_value_init (value, GST_TYPE_LIST);
+  g_value_init (value, list_type);
   array = g_value_peek_pointer (value);
 
-  if (*s != '{')
+  if (*s != begin)
     return FALSE;
   s++;
 
   while (g_ascii_isspace (*s))
     s++;
-  if (*s == '}') {
+  if (*s == end) {
     s++;
     *after = s;
     return TRUE;
@@ -1248,7 +1250,7 @@ gst_structure_parse_list (gchar * s, gchar ** after, GValue * value, GType type)
   while (g_ascii_isspace (*s))
     s++;
 
-  while (*s != '}') {
+  while (*s != end) {
     if (*s != ',')
       return FALSE;
     s++;
@@ -1272,6 +1274,21 @@ gst_structure_parse_list (gchar * s, gchar ** after, GValue * value, GType type)
   return TRUE;
 }
 
+static gboolean
+gst_structure_parse_list (gchar * s, gchar ** after, GValue * value, GType type)
+{
+  return gst_structure_parse_any_list (s, after, value, type, GST_TYPE_LIST,
+      '{', '}');
+}
+
+static gboolean
+gst_structure_parse_fixed_list (gchar * s, gchar ** after, GValue * value,
+    GType type)
+{
+  return gst_structure_parse_any_list (s, after, value, type,
+      GST_TYPE_FIXED_LIST, '<', '>');
+}
+
 static gboolean
 gst_structure_parse_simple_string (gchar * str, gchar ** end)
 {
@@ -1375,6 +1392,8 @@ gst_structure_parse_value (gchar * str,
     ret = gst_structure_parse_range (s, &s, value, type);
   } else if (*s == '{') {
     ret = gst_structure_parse_list (s, &s, value, type);
+  } else if (*s == '<') {
+    ret = gst_structure_parse_fixed_list (s, &s, value, type);
   } else {
     value_s = s;
     if (!gst_structure_parse_string (s, &value_end, &s))
index 5af1ed9e4181776674501c670d1a212f4b22d54f..93552c14273c38b145de331a6e535e95a5e7ecc8 100644 (file)
@@ -57,15 +57,73 @@ GType gst_type_fourcc;
 GType gst_type_int_range;
 GType gst_type_double_range;
 GType gst_type_list;
+GType gst_type_fixed_list;
 
 static GArray *gst_value_table;
 static GArray *gst_value_union_funcs;
 static GArray *gst_value_intersect_funcs;
 static GArray *gst_value_subtract_funcs;
 
-/*************************************/
+/********/
 /* list */
+/********/
+
+/* two helper functions to serialize/stringify any type of list
+ * regular lists are done with { }, fixed lists with < >
+ */
+static char *
+gst_value_serialize_any_list (const GValue * value, const char *begin,
+    const char *end)
+{
+  int i;
+  GArray *array = value->data[0].v_pointer;
+  GString *s;
+  GValue *v;
+  gchar *s_val;
+
+  s = g_string_new (begin);
+  for (i = 0; i < array->len; i++) {
+    v = &g_array_index (array, GValue, i);
+    s_val = gst_value_serialize (v);
+    g_string_append (s, s_val);
+    g_free (s_val);
+    if (i < array->len - 1) {
+      g_string_append (s, ", ");
+    }
+  }
+  g_string_append (s, end);
+  return g_string_free (s, FALSE);
+}
 
+static void
+gst_value_transform_any_list_string (const GValue * src_value,
+    GValue * dest_value, const char *begin, const char *end)
+{
+  GValue *list_value;
+  GArray *array;
+  GString *s;
+  int i;
+  char *list_s;
+
+  array = src_value->data[0].v_pointer;
+
+  s = g_string_new (begin);
+  for (i = 0; i < array->len; i++) {
+    list_value = &g_array_index (array, GValue, i);
+
+    if (i != 0) {
+      g_string_append (s, ", ");
+    }
+    list_s = g_strdup_value_contents (list_value);
+    g_string_append (s, list_s);
+    g_free (list_s);
+  }
+  g_string_append (s, end);
+
+  dest_value->data[0].v_pointer = g_string_free (s, FALSE);
+}
+
+/* GValue functions usable for both regular lists and fixed lists */
 static void
 gst_value_init_list (GValue * value)
 {
@@ -162,7 +220,8 @@ gst_value_list_prepend_value (GValue * value, const GValue * prepend_value)
 {
   GValue val = { 0, };
 
-  g_return_if_fail (GST_VALUE_HOLDS_LIST (value));
+  g_return_if_fail (GST_VALUE_HOLDS_LIST (value)
+      || GST_VALUE_HOLDS_FIXED_LIST (value));
 
   gst_value_init_and_copy (&val, prepend_value);
   g_array_prepend_vals ((GArray *) value->data[0].v_pointer, &val, 1);
@@ -180,7 +239,8 @@ gst_value_list_append_value (GValue * value, const GValue * append_value)
 {
   GValue val = { 0, };
 
-  g_return_if_fail (GST_VALUE_HOLDS_LIST (value));
+  g_return_if_fail (GST_VALUE_HOLDS_LIST (value)
+      || GST_VALUE_HOLDS_FIXED_LIST (value));
 
   gst_value_init_and_copy (&val, append_value);
   g_array_append_vals ((GArray *) value->data[0].v_pointer, &val, 1);
@@ -197,7 +257,8 @@ gst_value_list_append_value (GValue * value, const GValue * append_value)
 guint
 gst_value_list_get_size (const GValue * value)
 {
-  g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value), 0);
+  g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value)
+      || GST_VALUE_HOLDS_FIXED_LIST (value), 0);
 
   return ((GArray *) value->data[0].v_pointer)->len;
 }
@@ -215,7 +276,8 @@ gst_value_list_get_size (const GValue * value)
 const GValue *
 gst_value_list_get_value (const GValue * value, guint index)
 {
-  g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value), NULL);
+  g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value)
+      || GST_VALUE_HOLDS_FIXED_LIST (value), NULL);
   g_return_val_if_fail (index < gst_value_list_get_size (value), NULL);
 
   return (const GValue *) &g_array_index ((GArray *) value->data[0].v_pointer,
@@ -274,28 +336,14 @@ gst_value_list_concat (GValue * dest, const GValue * value1,
 static void
 gst_value_transform_list_string (const GValue * src_value, GValue * dest_value)
 {
-  GValue *list_value;
-  GArray *array;
-  GString *s;
-  int i;
-  char *list_s;
-
-  array = src_value->data[0].v_pointer;
-
-  s = g_string_new ("{ ");
-  for (i = 0; i < array->len; i++) {
-    list_value = &g_array_index (array, GValue, i);
-
-    if (i != 0) {
-      g_string_append (s, ", ");
-    }
-    list_s = g_strdup_value_contents (list_value);
-    g_string_append (s, list_s);
-    g_free (list_s);
-  }
-  g_string_append (s, " }");
+  gst_value_transform_any_list_string (src_value, dest_value, "{ ", " }");
+}
 
-  dest_value->data[0].v_pointer = g_string_free (s, FALSE);
+static void
+gst_value_transform_fixed_list_string (const GValue * src_value,
+    GValue * dest_value)
+{
+  gst_value_transform_any_list_string (src_value, dest_value, "< ", " >");
 }
 
 static int
@@ -328,24 +376,7 @@ gst_value_compare_list (const GValue * value1, const GValue * value2)
 static char *
 gst_value_serialize_list (const GValue * value)
 {
-  int i;
-  GArray *array = value->data[0].v_pointer;
-  GString *s;
-  GValue *v;
-  gchar *s_val;
-
-  s = g_string_new ("{ ");
-  for (i = 0; i < array->len; i++) {
-    v = &g_array_index (array, GValue, i);
-    s_val = gst_value_serialize (v);
-    g_string_append (s, s_val);
-    g_free (s_val);
-    if (i < array->len - 1) {
-      g_string_append (s, ", ");
-    }
-  }
-  g_string_append (s, " }");
-  return g_string_free (s, FALSE);
+  return gst_value_serialize_any_list (value, "{ ", " }");
 }
 
 static gboolean
@@ -355,6 +386,19 @@ gst_value_deserialize_list (GValue * dest, const char *s)
   return FALSE;
 }
 
+static char *
+gst_value_serialize_fixed_list (const GValue * value)
+{
+  return gst_value_serialize_any_list (value, "< ", " >");
+}
+
+static gboolean
+gst_value_deserialize_fixed_list (GValue * dest, const char *s)
+{
+  g_warning ("unimplemented");
+  return FALSE;
+}
+
 /*************************************/
 /* fourcc */
 
@@ -2209,9 +2253,11 @@ gst_type_is_fixed (GType type)
       type < G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
     return TRUE;
   }
-  if (type == GST_TYPE_BUFFER || type == GST_TYPE_FOURCC) {
+  if (type == GST_TYPE_BUFFER || type == GST_TYPE_FOURCC
+      || type == GST_TYPE_FIXED_LIST) {
     return TRUE;
   }
+
   return FALSE;
 }
 
@@ -2346,6 +2392,32 @@ _gst_value_initialize (void)
     gst_value_register (&gst_value);
   }
 
+  {
+    static const GTypeValueTable value_table = {
+      gst_value_init_list,
+      gst_value_free_list,
+      gst_value_copy_list,
+      gst_value_list_peek_pointer,
+      "p",
+      gst_value_collect_list,
+      "p",
+      gst_value_lcopy_list
+    };
+    static GstValueTable gst_value = {
+      0,
+      gst_value_compare_list,
+      gst_value_serialize_fixed_list,
+      gst_value_deserialize_fixed_list,
+    };
+
+    info.value_table = &value_table;
+    gst_type_fixed_list =
+        g_type_register_fundamental (g_type_fundamental_next (),
+        "GstValueFixedList", &info, &finfo, 0);
+    gst_value.type = gst_type_fixed_list;
+    gst_value_register (&gst_value);
+  }
+
   {
 #if 0
     static const GTypeValueTable value_table = {
@@ -2399,6 +2471,8 @@ _gst_value_initialize (void)
       gst_value_transform_double_range_string);
   g_value_register_transform_func (GST_TYPE_LIST, G_TYPE_STRING,
       gst_value_transform_list_string);
+  g_value_register_transform_func (GST_TYPE_FIXED_LIST, G_TYPE_STRING,
+      gst_value_transform_fixed_list_string);
 
   gst_value_register_intersect_func (G_TYPE_INT, GST_TYPE_INT_RANGE,
       gst_value_intersect_int_int_range);
index 4879cbeb2b7908a7a95568c541c30d6a3aba01db..885319573407c6afa69c7d6c80685fac45d72374 100644 (file)
@@ -39,12 +39,14 @@ G_BEGIN_DECLS
 #define GST_VALUE_HOLDS_INT_RANGE(x)    (G_VALUE_HOLDS(x, gst_type_int_range))
 #define GST_VALUE_HOLDS_DOUBLE_RANGE(x) (G_VALUE_HOLDS(x, gst_type_double_range))
 #define GST_VALUE_HOLDS_LIST(x)         (G_VALUE_HOLDS(x, gst_type_list))
+#define GST_VALUE_HOLDS_FIXED_LIST(x)   (G_VALUE_HOLDS(x, gst_type_fixed_list))
 #define GST_VALUE_HOLDS_CAPS(x)                (G_VALUE_HOLDS(x, GST_TYPE_CAPS))
 
 #define GST_TYPE_FOURCC                  gst_type_fourcc
 #define GST_TYPE_INT_RANGE               gst_type_int_range
 #define GST_TYPE_DOUBLE_RANGE            gst_type_double_range
 #define GST_TYPE_LIST                    gst_type_list
+#define GST_TYPE_FIXED_LIST              gst_type_fixed_list
 
 #define GST_VALUE_LESS_THAN              (-1)
 #define GST_VALUE_EQUAL                   0
@@ -80,6 +82,7 @@ extern GType gst_type_fourcc;
 extern GType gst_type_int_range;
 extern GType gst_type_double_range;
 extern GType gst_type_list;
+extern GType gst_type_fixed_list;
 
 void                     gst_value_register                (const GstValueTable   *table);
 void                     gst_value_init_and_copy           (GValue                *dest,
index c8e9c43759fa6b4689b295cefd8c025eb8dae359..5da8cd244045483f9ab569b1e5b70767f2d37b45 100644 (file)
@@ -135,9 +135,11 @@ bla:
   test_string ("audio/raw  ,test =(bool) trUE");
   test_string ("audio/raw  ,test=(b ) yes");
   test_string ("audio/raw  ,test =( boolean)no");
+  test_string ("audio/raw  ,test = < 1, 2, 3 >");
 
   /* buffers */
   test_string ("audio/raw  ,test=(buffer)0123456789abcdef");
+  test_string ("audio/raw  ,test= < (buffer)0123, (buffer)4567 >");
 
   /* unfixed props entries */
   test_string ("audio/raw, test= [ 1, 2 ]");
@@ -184,9 +186,11 @@ bla:
   test_string_fail ("audio/raw, test=(int) [1.0,2]");
   test_string_fail ("audio/raw, test=(int) [1 ,0.2]");
   test_string_fail ("audio/raw, test=(int) [1.0, 2.000]");
+  test_string_fail ("audio/raw, test=(int) <1.0, 2.000>");
   /* unmatched */
   test_string_fail ("audio/raw, test=(int = [");
   test_string_fail ("audio/raw, test= {");
+  test_string_fail ("audio/raw, test= <");
   test_string_fail ("audio/raw, test = \"dood'");
   test_string_fail ("audio/raw, test= '");
 
index c8e9c43759fa6b4689b295cefd8c025eb8dae359..5da8cd244045483f9ab569b1e5b70767f2d37b45 100644 (file)
@@ -135,9 +135,11 @@ bla:
   test_string ("audio/raw  ,test =(bool) trUE");
   test_string ("audio/raw  ,test=(b ) yes");
   test_string ("audio/raw  ,test =( boolean)no");
+  test_string ("audio/raw  ,test = < 1, 2, 3 >");
 
   /* buffers */
   test_string ("audio/raw  ,test=(buffer)0123456789abcdef");
+  test_string ("audio/raw  ,test= < (buffer)0123, (buffer)4567 >");
 
   /* unfixed props entries */
   test_string ("audio/raw, test= [ 1, 2 ]");
@@ -184,9 +186,11 @@ bla:
   test_string_fail ("audio/raw, test=(int) [1.0,2]");
   test_string_fail ("audio/raw, test=(int) [1 ,0.2]");
   test_string_fail ("audio/raw, test=(int) [1.0, 2.000]");
+  test_string_fail ("audio/raw, test=(int) <1.0, 2.000>");
   /* unmatched */
   test_string_fail ("audio/raw, test=(int = [");
   test_string_fail ("audio/raw, test= {");
+  test_string_fail ("audio/raw, test= <");
   test_string_fail ("audio/raw, test = \"dood'");
   test_string_fail ("audio/raw, test= '");