diff options
author | Henry Wilkes <hwilkes@igalia.com> | 2019-10-18 23:23:10 +0100 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-01-26 18:16:50 +0000 |
commit | a33a3b145daa740fe76f7a3d6035d885c6742e71 (patch) | |
tree | d02e8a921aa610ed36a83c8393adbfc68682cc48 | |
parent | 0d95d9258b9700d1d7da5cf562c30aef2b865a93 (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.c | 24 | ||||
-rw-r--r-- | tests/check/ges/markerlist.c | 83 |
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; |