gststructure: Fix deserialization of GStrv
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8438>
This commit is contained in:
parent
e06e977304
commit
f25668a223
@ -42701,6 +42701,9 @@ Some types have special delimiters:
|
|||||||
`a-structure, a-int64-range=(gint64) [1, 5]`
|
`a-structure, a-int64-range=(gint64) [1, 5]`
|
||||||
- [GstValueList](GST_TYPE_LIST) are inside curly brackets (`{` and `}`).
|
- [GstValueList](GST_TYPE_LIST) are inside curly brackets (`{` and `}`).
|
||||||
For example `a-structure, list={1, 2, 3}`
|
For example `a-structure, list={1, 2, 3}`
|
||||||
|
- [GStrv](G_TYPE_STRV) are inside "less and greater than" (`<` and
|
||||||
|
`>`) and each string is double-quoted.
|
||||||
|
For example `a-structure, strv=(GStrv)<"foo", "bar">`. Since 1.26.0.
|
||||||
|
|
||||||
Structures are delimited either by a null character `\0` or a semicolon `;`
|
Structures are delimited either by a null character `\0` or a semicolon `;`
|
||||||
the latter allowing to store multiple structures in the same string (see
|
the latter allowing to store multiple structures in the same string (see
|
||||||
|
@ -98,6 +98,9 @@
|
|||||||
* `a-structure, a-int64-range=(gint64) [1, 5]`
|
* `a-structure, a-int64-range=(gint64) [1, 5]`
|
||||||
* - [GstValueList](GST_TYPE_LIST) are inside curly brackets (`{` and `}`).
|
* - [GstValueList](GST_TYPE_LIST) are inside curly brackets (`{` and `}`).
|
||||||
* For example `a-structure, list={1, 2, 3}`
|
* For example `a-structure, list={1, 2, 3}`
|
||||||
|
* - [GStrv](G_TYPE_STRV) are inside "less and greater than" (`<` and
|
||||||
|
* `>`) and each string is double-quoted.
|
||||||
|
* For example `a-structure, strv=(GStrv)<"foo", "bar">`. Since 1.26.0.
|
||||||
*
|
*
|
||||||
* Structures are delimited either by a null character `\0` or a semicolon `;`
|
* Structures are delimited either by a null character `\0` or a semicolon `;`
|
||||||
* the latter allowing to store multiple structures in the same string (see
|
* the latter allowing to store multiple structures in the same string (see
|
||||||
|
@ -100,6 +100,8 @@ static gboolean _priv_gst_value_parse_list (gchar * s, gchar ** after,
|
|||||||
GValue * value, GType type, GParamSpec * pspec);
|
GValue * value, GType type, GParamSpec * pspec);
|
||||||
static gboolean _priv_gst_value_parse_array (gchar * s, gchar ** after,
|
static gboolean _priv_gst_value_parse_array (gchar * s, gchar ** after,
|
||||||
GValue * value, GType type, GParamSpec * pspec);
|
GValue * value, GType type, GParamSpec * pspec);
|
||||||
|
static gboolean _priv_gst_value_parse_strv (const gchar * s,
|
||||||
|
const gchar ** after, GValue * dest);
|
||||||
|
|
||||||
typedef struct _GstValueUnionInfo GstValueUnionInfo;
|
typedef struct _GstValueUnionInfo GstValueUnionInfo;
|
||||||
struct _GstValueUnionInfo
|
struct _GstValueUnionInfo
|
||||||
@ -2811,8 +2813,13 @@ _priv_gst_value_parse_value (gchar * str,
|
|||||||
g_value_init (value, GST_TYPE_LIST);
|
g_value_init (value, GST_TYPE_LIST);
|
||||||
ret = _priv_gst_value_parse_list (s, &s, value, type, pspec);
|
ret = _priv_gst_value_parse_list (s, &s, value, type, pspec);
|
||||||
} else if (*s == '<') {
|
} else if (*s == '<') {
|
||||||
g_value_init (value, GST_TYPE_ARRAY);
|
if (type == G_TYPE_STRV) {
|
||||||
ret = _priv_gst_value_parse_array (s, &s, value, type, pspec);
|
g_value_init (value, G_TYPE_STRV);
|
||||||
|
ret = _priv_gst_value_parse_strv (s, (const gchar **) &s, value);
|
||||||
|
} else {
|
||||||
|
g_value_init (value, GST_TYPE_ARRAY);
|
||||||
|
ret = _priv_gst_value_parse_array (s, &s, value, type, pspec);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
value_s = s;
|
value_s = s;
|
||||||
|
|
||||||
@ -8171,15 +8178,13 @@ gst_value_serialize_strv (const GValue * value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_value_deserialize_strv (GValue * dest, const gchar * s)
|
_priv_gst_value_parse_strv (const gchar * s, const gchar ** after,
|
||||||
|
GValue * dest)
|
||||||
{
|
{
|
||||||
/* If it's not starting with '<' assume it's a simple comma separated list
|
/* Parse the format <"foo","bar"> with spaces allowed between delimiters,
|
||||||
* with no escaping. Otherwise assume the format <"foo","bar"> with spaces
|
* and \ for escaping. */
|
||||||
* allowed between delimiters and \ for escaping. */
|
if (*s != '<')
|
||||||
if (*s != '<') {
|
return FALSE;
|
||||||
g_value_take_boxed (dest, g_strsplit (s, ",", -1));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
s++;
|
s++;
|
||||||
|
|
||||||
while (g_ascii_isspace (*s))
|
while (g_ascii_isspace (*s))
|
||||||
@ -8235,6 +8240,8 @@ gst_value_deserialize_strv (GValue * dest, const gchar * s)
|
|||||||
g_ptr_array_add (strv, NULL);
|
g_ptr_array_add (strv, NULL);
|
||||||
g_value_take_boxed (dest, g_ptr_array_free (strv, FALSE));
|
g_value_take_boxed (dest, g_ptr_array_free (strv, FALSE));
|
||||||
|
|
||||||
|
*after = s + 1;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
@ -8242,6 +8249,18 @@ error:
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_value_deserialize_strv (GValue * dest, const gchar * s)
|
||||||
|
{
|
||||||
|
/* If it's not starting with '<' assume it's a simple comma separated list
|
||||||
|
* with no escaping. This makes usage in gst-launch-1.0 easier. */
|
||||||
|
if (*s != '<') {
|
||||||
|
g_value_take_boxed (dest, g_strsplit (s, ",", -1));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return _priv_gst_value_parse_strv (s, &s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
static GTypeInfo _info = {
|
static GTypeInfo _info = {
|
||||||
0, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL,
|
0, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL,
|
||||||
};
|
};
|
||||||
|
@ -1169,6 +1169,31 @@ GST_START_TEST (test_strict)
|
|||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
GST_START_TEST (test_strv)
|
||||||
|
{
|
||||||
|
GstStructure *s;
|
||||||
|
const gchar *strv[] = { "foo", " ,<>\" ", NULL };
|
||||||
|
|
||||||
|
s = gst_structure_new ("test-struct", "strv", G_TYPE_STRV, strv, NULL);
|
||||||
|
fail_unless (s);
|
||||||
|
|
||||||
|
gchar *serialized = gst_structure_serialize_full (s, GST_SERIALIZE_FLAG_NONE);
|
||||||
|
fail_unless (serialized);
|
||||||
|
gst_structure_free (s);
|
||||||
|
|
||||||
|
s = gst_structure_new_from_string (serialized);
|
||||||
|
fail_unless (s);
|
||||||
|
g_free (serialized);
|
||||||
|
|
||||||
|
gchar **out_strv = NULL;
|
||||||
|
fail_unless (gst_structure_get (s, "strv", G_TYPE_STRV, &out_strv, NULL));
|
||||||
|
fail_unless (g_strv_equal (strv, (const gchar * const *) out_strv));
|
||||||
|
gst_structure_free (s);
|
||||||
|
g_strfreev (out_strv);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
static Suite *
|
static Suite *
|
||||||
gst_structure_suite (void)
|
gst_structure_suite (void)
|
||||||
{
|
{
|
||||||
@ -1203,6 +1228,7 @@ gst_structure_suite (void)
|
|||||||
tcase_add_test (tc_chain, test_flagset);
|
tcase_add_test (tc_chain, test_flagset);
|
||||||
tcase_add_test (tc_chain, test_flags);
|
tcase_add_test (tc_chain, test_flags);
|
||||||
tcase_add_test (tc_chain, test_strict);
|
tcase_add_test (tc_chain, test_strict);
|
||||||
|
tcase_add_test (tc_chain, test_strv);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user