diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c index 8cd285871a..f88bb6c807 100644 --- a/ext/dash/gstmpdparser.c +++ b/ext/dash/gstmpdparser.c @@ -503,35 +503,14 @@ error: static void gst_mpdparser_parse_content_protection_node (GList ** list, xmlNode * a_node) { - gchar *value = NULL; - if (gst_xml_helper_get_prop_string (a_node, "value", &value)) { - if (!g_strcmp0 (value, "MSPR 2.0")) { - xmlNode *cur_node; - for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) { - if (cur_node->type == XML_ELEMENT_NODE) { - if (xmlStrcmp (cur_node->name, (xmlChar *) "pro") == 0) { - GstMPDDescriptorTypeNode *new_descriptor; - new_descriptor = gst_mpd_descriptor_type_node_new ((const gchar *) - cur_node->name); - *list = g_list_append (*list, new_descriptor); + GstMPDDescriptorTypeNode *new_descriptor; + new_descriptor = gst_mpd_descriptor_type_node_new ((const gchar *) + a_node->name); + *list = g_list_append (*list, new_descriptor); - gst_xml_helper_get_prop_string_stripped (a_node, "schemeIdUri", - &new_descriptor->schemeIdUri); - - gst_xml_helper_get_node_content (cur_node, &new_descriptor->value); - goto beach; - } - } - } - } else { - gst_mpdparser_parse_descriptor_type (list, a_node); - } - } else { - gst_mpdparser_parse_descriptor_type (list, a_node); - } -beach: - if (value) - g_free (value); + gst_xml_helper_get_prop_string_stripped (a_node, "schemeIdUri", + &new_descriptor->schemeIdUri); + gst_xml_helper_get_node_as_string (a_node, &new_descriptor->value); } static void diff --git a/tests/check/elements/dash_mpd.c b/tests/check/elements/dash_mpd.c index cc5596a08f..51448e69aa 100644 --- a/tests/check/elements/dash_mpd.c +++ b/tests/check/elements/dash_mpd.c @@ -1392,6 +1392,7 @@ GST_START_TEST gboolean ret; GstMPDClient *mpdclient = gst_mpd_client_new (); + gchar *str; ret = gst_mpd_client_parse (mpdclient, xml, (gint) strlen (xml)); assert_equals_int (ret, TRUE); @@ -1402,13 +1403,76 @@ GST_START_TEST contentProtection = (GstMPDDescriptorTypeNode *) representationBase->ContentProtection->data; assert_equals_string (contentProtection->schemeIdUri, "TestSchemeIdUri"); - assert_equals_string (contentProtection->value, "TestValue"); + + /* We can't do a simple compare of value (which should be an XML dump + of the ContentProtection element), because the whitespace + formatting from xmlDump might differ between versions of libxml */ + str = strstr (contentProtection->value, "value, "value=\"TestValue\""); + fail_if (str == NULL); + str = strstr (contentProtection->value, ""); + fail_if (str == NULL); gst_mpd_client_free (mpdclient); } GST_END_TEST; +/* + * Test parsing Period AdaptationSet RepresentationBase ContentProtection + * with custom ContentProtection content. + */ +GST_START_TEST + (dash_mpdparser_period_adaptationSet_representationBase_contentProtection_with_content) +{ + GstMPDPeriodNode *periodNode; + GstMPDAdaptationSetNode *adaptationSet; + GstMPDRepresentationBaseNode *representationBase; + GstMPDDescriptorTypeNode *contentProtection; + const gchar *xml = + "" + "" + " customns=\"foo\"" + " " + " " + " " + " Hello world" + " "; + + gboolean ret; + GstMPDClient *mpdclient = gst_mpd_client_new (); + gchar *str; + + ret = gst_mpd_client_parse (mpdclient, xml, (gint) strlen (xml)); + assert_equals_int (ret, TRUE); + + periodNode = (GstMPDPeriodNode *) mpdclient->mpd_root_node->Periods->data; + adaptationSet = (GstMPDAdaptationSetNode *) periodNode->AdaptationSets->data; + representationBase = GST_MPD_REPRESENTATION_BASE_NODE (adaptationSet); + contentProtection = + (GstMPDDescriptorTypeNode *) representationBase->ContentProtection->data; + assert_equals_string (contentProtection->schemeIdUri, "TestSchemeIdUri"); + + /* We can't do a simple compare of value (which should be an XML dump + of the ContentProtection element), because the whitespace + formatting from xmlDump might differ between versions of libxml */ + str = strstr (contentProtection->value, "value, + "Hello world"); + fail_if (str == NULL); + str = strstr (contentProtection->value, ""); + fail_if (str == NULL); + + gst_mpd_client_free (mpdclient); +} + +GST_END_TEST; + + /* * Test parsing ContentProtection element that has no value attribute */ @@ -6388,6 +6452,8 @@ dash_suite (void) tcase_add_test (tc_simpleMPD, dash_mpdparser_contentProtection_no_value); tcase_add_test (tc_simpleMPD, dash_mpdparser_contentProtection_no_value_no_encoding); + tcase_add_test (tc_simpleMPD, + dash_mpdparser_period_adaptationSet_representationBase_contentProtection_with_content); tcase_add_test (tc_simpleMPD, dash_mpdparser_period_adaptationSet_accessibility); tcase_add_test (tc_simpleMPD, dash_mpdparser_period_adaptationSet_role);