summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Wilkes <hwilkes@igalia.com>2019-10-18 23:23:10 +0100
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-01-26 18:16:50 +0000
commita33a3b145daa740fe76f7a3d6035d885c6742e71 (patch)
treed02e8a921aa610ed36a83c8393adbfc68682cc48
parent0d95d9258b9700d1d7da5cf562c30aef2b865a93 (diff)
marker-list: made deserialize reverse of serialize
Changed deserialize method to actually reverse the serialize method by removing the edge quote marks and reversing g_strescape. See https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/452 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/123>
-rw-r--r--ges/ges-marker-list.c24
-rw-r--r--tests/check/ges/markerlist.c83
2 files changed, 103 insertions, 4 deletions
diff --git a/ges/ges-marker-list.c b/ges/ges-marker-list.c
index 7ce8a13f..fbab094e 100644
--- a/ges/ges-marker-list.c
+++ b/ges/ges-marker-list.c
@@ -395,8 +395,28 @@ ges_marker_list_deserialize (GValue * dest, const gchar * s)
GstCaps *caps = NULL;
GESMarkerList *list = ges_marker_list_new ();
guint i, l;
+ gsize len;
+ gchar *escaped, *caps_str;
+
+ len = strlen (s);
+ if (G_UNLIKELY (*s != '"' || len < 2 || s[len - 1] != '"')) {
+ /* "\"" is not an accepted string, so len must be at least 2 */
+ GST_ERROR ("Failed deserializing marker list: expected string to start "
+ "and end with '\"'");
+ goto done;
+ }
+ escaped = g_strdup (s + 1);
+ escaped[len - 2] = '\0';
+ /* removed trailing '"' */
+ caps_str = g_strcompress (escaped);
+ g_free (escaped);
- caps = gst_caps_from_string (s);
+ caps = gst_caps_from_string (caps_str);
+ g_free (caps_str);
+ if (G_UNLIKELY (caps == NULL)) {
+ GST_ERROR ("Failed deserializing marker list: could not extract caps");
+ goto done;
+ }
l = gst_caps_get_size (caps);
if (l == 0) {
@@ -405,7 +425,7 @@ ges_marker_list_deserialize (GValue * dest, const gchar * s)
goto done;
}
- if (l % 2) {
+ if (G_UNLIKELY (l % 2)) {
GST_ERROR ("Failed deserializing marker list: expected evenly-sized caps");
goto done;
}
diff --git a/tests/check/ges/markerlist.c b/tests/check/ges/markerlist.c
index d3e74004..7649e0ab 100644
--- a/tests/check/ges/markerlist.c
+++ b/tests/check/ges/markerlist.c
@@ -284,7 +284,7 @@ GST_START_TEST (test_move_marker)
GST_END_TEST;
-GST_START_TEST (test_serialize_deserialize)
+GST_START_TEST (test_serialize_deserialize_in_timeline)
{
GESMarkerList *markerlist1, *markerlist2;
gchar *metas1, *metas2;
@@ -343,6 +343,84 @@ GST_START_TEST (test_serialize_deserialize)
GST_END_TEST;
+GST_START_TEST (test_serialize_deserialize_in_value)
+{
+ GESMarkerList *markerlist1, *markerlist2;
+ GESMarker *marker;
+ gchar *serialized, *cmp;
+ const gchar *str_val;
+ guint uint_val;
+ const gchar *test_string = "test \" string";
+ GList *markers;
+ guint64 position;
+ GValue val1 = G_VALUE_INIT, val2 = G_VALUE_INIT;
+
+ ges_init ();
+
+ g_value_init (&val1, GES_TYPE_MARKER_LIST);
+ g_value_init (&val2, GES_TYPE_MARKER_LIST);
+
+ markerlist1 = ges_marker_list_new ();
+ marker = ges_marker_list_add (markerlist1, 0);
+ fail_unless (ges_meta_container_set_string (GES_META_CONTAINER (marker),
+ "str-val", test_string));
+ marker = ges_marker_list_add (markerlist1, 10);
+ fail_unless (ges_meta_container_set_string (GES_META_CONTAINER (marker),
+ "first", test_string));
+ fail_unless (ges_meta_container_set_uint (GES_META_CONTAINER (marker),
+ "second", 43));
+
+ ASSERT_OBJECT_REFCOUNT (markerlist1, "local ref", 1);
+
+ g_value_set_instance (&val1, markerlist1);
+ ASSERT_OBJECT_REFCOUNT (markerlist1, "GValue + local ref", 2);
+
+ serialized = gst_value_serialize (&val1);
+ fail_unless (serialized != NULL);
+ GST_DEBUG ("serialized to %s", serialized);
+ fail_unless (gst_value_deserialize (&val2, serialized));
+ cmp = gst_value_serialize (&val2);
+ fail_unless_equals_string (cmp, serialized);
+
+ markerlist2 = GES_MARKER_LIST (g_value_get_object (&val2));
+ ASSERT_OBJECT_REFCOUNT (markerlist2, "GValue", 1);
+
+ fail_unless_equals_int (ges_marker_list_size (markerlist2), 2);
+ markers = ges_marker_list_get_markers (markerlist2);
+ marker = GES_MARKER (markers->data);
+ fail_unless (marker != NULL);
+
+ g_object_get (marker, "position", &position, NULL);
+ fail_unless_equals_uint64 (position, 0);
+ str_val =
+ ges_meta_container_get_string (GES_META_CONTAINER (marker), "str-val");
+ fail_unless_equals_string (str_val, test_string);
+
+ marker = GES_MARKER (markers->next->data);
+ fail_unless (marker != NULL);
+ fail_unless (markers->next->next == NULL);
+
+ g_object_get (marker, "position", &position, NULL);
+ fail_unless_equals_uint64 (position, 10);
+ str_val =
+ ges_meta_container_get_string (GES_META_CONTAINER (marker), "first");
+ fail_unless_equals_string (str_val, test_string);
+ fail_unless (ges_meta_container_get_uint (GES_META_CONTAINER (marker),
+ "second", &uint_val));
+ fail_unless_equals_int (uint_val, 43);
+
+ g_list_free_full (markers, g_object_unref);
+ g_value_unset (&val1);
+ g_value_unset (&val2);
+ ASSERT_OBJECT_REFCOUNT (markerlist1, "local ref", 1);
+ g_object_unref (markerlist1);
+ g_free (serialized);
+ g_free (cmp);
+
+ ges_deinit ();
+}
+
+GST_END_TEST;
GST_START_TEST (test_marker_color)
{
@@ -391,7 +469,8 @@ ges_suite (void)
tcase_add_test (tc_chain, test_signal_marker_moved);
tcase_add_test (tc_chain, test_get_markers);
tcase_add_test (tc_chain, test_move_marker);
- tcase_add_test (tc_chain, test_serialize_deserialize);
+ tcase_add_test (tc_chain, test_serialize_deserialize_in_timeline);
+ tcase_add_test (tc_chain, test_serialize_deserialize_in_value);
tcase_add_test (tc_chain, test_marker_color);
return s;