From 77353dad21203d3007d9588ae35ef818a0103fa8 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Thu, 22 Dec 2011 07:53:39 -0300 Subject: [PATCH] tag: xmp: Keep compatibility with our old generated xmp We used to add a trailing \n to the end of generated xmp packets. Windows viewer was unhappy with it and we fixed it in 96d2120c2bb0b29e1849098198f5fbef81939cdd The problem is that this caused xmp generated before this fix to not be recognized and parsed anymore. This patch makes it recognize xmp with the trailing \n and without, fixing the regression. Also adds tests for it. --- gst-libs/gst/tag/gstxmptag.c | 5 ++- tests/check/libs/tag.c | 62 +++++++++++++++++++++--------------- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/gst-libs/gst/tag/gstxmptag.c b/gst-libs/gst/tag/gstxmptag.c index abe359724e..1fb7f3945b 100644 --- a/gst-libs/gst/tag/gstxmptag.c +++ b/gst-libs/gst/tag/gstxmptag.c @@ -1317,7 +1317,10 @@ gst_tag_list_from_xmp_buffer (const GstBuffer * buffer) if (*xp1 != '>') goto missing_header; - max_ft_len = 1 + strlen (""); + /* Use 2 here to count for an extra trailing \n that was added + * in old versions, this makes it able to parse xmp packets with + * and without this trailing char */ + max_ft_len = 2 + strlen (""); if (len < max_ft_len) goto missing_footer; diff --git a/tests/check/libs/tag.c b/tests/check/libs/tag.c index 17401c37ee..db5932360a 100644 --- a/tests/check/libs/tag.c +++ b/tests/check/libs/tag.c @@ -975,13 +975,21 @@ GST_START_TEST (test_xmp_parsing) { GstTagList *list; GstBuffer *buf; - guint i, result_size; + guint i, j, result_size; gchar *text; const gchar *xmp_header = "" "" ""; - const gchar *xmp_footer = "" "" ""; + + /* We used to write an extra trailing \n after the footer, keep compatibility + * with our old generated media by checking that it still can be parsed */ + const gchar *xmp_footers[] = { + "" "" "", + "" "" "\n", + NULL + }; + struct { const gchar *xmp_data; @@ -1003,36 +1011,40 @@ GST_START_TEST (test_xmp_parsing) /* test data */ buf = gst_buffer_new (); + j = 0; i = 0; - while (test_data[i].xmp_data) { - GST_DEBUG ("trying test-data %u", i); + while (xmp_footers[j]) { + while (test_data[i].xmp_data) { + GST_DEBUG ("trying test-data %u", i); - text = g_strconcat (xmp_header, test_data[i].xmp_data, xmp_footer, NULL); - GST_BUFFER_DATA (buf) = (guint8 *) text; - GST_BUFFER_SIZE (buf) = strlen (text) + 1; + text = + g_strconcat (xmp_header, test_data[i].xmp_data, xmp_footers[j], NULL); + GST_BUFFER_DATA (buf) = (guint8 *) text; + GST_BUFFER_SIZE (buf) = strlen (text) + 1; + list = gst_tag_list_from_xmp_buffer (buf); + if (test_data[i].result_size >= 0) { + fail_unless (list != NULL); - list = gst_tag_list_from_xmp_buffer (buf); - if (test_data[i].result_size >= 0) { - fail_unless (list != NULL); + result_size = gst_structure_n_fields ((GstStructure *) list); + fail_unless (result_size == test_data[i].result_size); - result_size = gst_structure_n_fields ((GstStructure *) list); - fail_unless (result_size == test_data[i].result_size); - - /* check the taglist content */ - switch (test_data[i].result_test) { - case 0: - ASSERT_TAG_LIST_HAS_STRING (list, "description", "test"); - break; - default: - break; + /* check the taglist content */ + switch (test_data[i].result_test) { + case 0: + ASSERT_TAG_LIST_HAS_STRING (list, "description", "test"); + break; + default: + break; + } } - } - if (list) - gst_tag_list_free (list); + if (list) + gst_tag_list_free (list); - g_free (text); - i++; + g_free (text); + i++; + } + j++; } gst_buffer_unref (buf);