diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c index 98ef978249..e800d6b1f5 100644 --- a/ext/dash/gstmpdparser.c +++ b/ext/dash/gstmpdparser.c @@ -971,17 +971,45 @@ static gboolean gst_mpdparser_get_xml_node_as_string (xmlNode * a_node, gchar ** content) { gboolean exists = FALSE; - xmlBufferPtr buffer = xmlBufferCreate (); - int size; + const char *txt_encoding; + xmlCharEncodingHandlerPtr conv_hdlr = NULL; + xmlOutputBufferPtr out_buf; - size = xmlNodeDump (buffer, a_node->doc, a_node, 0, /* indent */ - 0 /* format */ ); - if (size > 0) { - *content = (gchar *) xmlBufferDetach (buffer); + txt_encoding = (const char *) a_node->doc->encoding; + if (txt_encoding != NULL) { + conv_hdlr = xmlFindCharEncodingHandler (txt_encoding); + if (conv_hdlr == NULL) { + GST_ERROR ("Unable to find encoder for encoding: %s", txt_encoding); + return FALSE; + } + } + out_buf = xmlAllocOutputBuffer (conv_hdlr); + g_assert (out_buf != NULL); + xmlNodeDumpOutput (out_buf, a_node->doc, a_node, 0, 0, txt_encoding); + xmlOutputBufferFlush (out_buf); +#ifdef LIBXML2_NEW_BUFFER + if (xmlOutputBufferGetSize (out_buf) > 0) { + *content = + (gchar *) xmlStrndup (xmlOutputBufferGetContent (out_buf), + xmlOutputBufferGetSize (out_buf)); exists = TRUE; + } +#else + if (out_buf->conv && out_buf->conv->use > 0) { + *content = + (gchar *) xmlStrndup (out_buf->conv->content, out_buf->conv->use); + exists = TRUE; + } else if (out_buf->buffer && out_buf->buffer->use > 0) { + *content = + (gchar *) xmlStrndup (out_buf->buffer->content, out_buf->buffer->use); + exists = TRUE; + } +#endif // LIBXML2_NEW_BUFFER + (void) xmlOutputBufferClose (out_buf); + + if (exists) { GST_LOG (" - %s: %s", a_node->name, *content); } - xmlBufferFree (buffer); return exists; } diff --git a/tests/check/elements/dash_mpd.c b/tests/check/elements/dash_mpd.c index ee5b6cbbd2..bbf27aa983 100644 --- a/tests/check/elements/dash_mpd.c +++ b/tests/check/elements/dash_mpd.c @@ -1271,6 +1271,66 @@ GST_START_TEST GST_END_TEST; +/* + * Test parsing ContentProtection element that has no value attribute + */ +GST_START_TEST (dash_mpdparser_contentProtection_no_value) +{ + GstPeriodNode *periodNode; + GstAdaptationSetNode *adaptationSet; + GstRepresentationBaseType *representationBase; + GstDescriptorType *contentProtection; + const gchar *xml = + "" + "" + " " + " " + " " + " " + " " + " urn:marlin:kid:02020202020202020202020202020202" + " " + " " ""; + + gboolean ret; + GstMpdClient *mpdclient = gst_mpd_client_new (); + gchar *str; + + ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml)); + assert_equals_int (ret, TRUE); + + periodNode = (GstPeriodNode *) mpdclient->mpd_node->Periods->data; + adaptationSet = (GstAdaptationSetNode *) periodNode->AdaptationSets->data; + representationBase = adaptationSet->RepresentationBase; + assert_equals_int (g_list_length (representationBase->ContentProtection), 2); + contentProtection = + (GstDescriptorType *) g_list_nth (representationBase->ContentProtection, + 1)->data; + assert_equals_string (contentProtection->schemeIdUri, + "urn:uuid:5e629af5-38da-4063-8977-97ffbd9902d4"); + fail_if (contentProtection->value == NULL); + g_print ("%s\n", contentProtection->value); + /* 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, ""); + fail_if (str == NULL); + str = strstr (contentProtection->value, ""); + fail_if (str == NULL); + str = + strstr (contentProtection->value, + "urn:marlin:kid:02020202020202020202020202020202"); + fail_if (str == NULL); + str = strstr (contentProtection->value, ""); + fail_if (str == NULL); + gst_mpd_client_free (mpdclient); +} + +GST_END_TEST; + /* * Test parsing Period AdaptationSet Accessibility attributes * @@ -4344,6 +4404,7 @@ dash_suite (void) dash_mpdparser_period_adaptationSet_representationBase_audioChannelConfiguration); tcase_add_test (tc_simpleMPD, dash_mpdparser_period_adaptationSet_representationBase_contentProtection); + tcase_add_test (tc_simpleMPD, dash_mpdparser_contentProtection_no_value); tcase_add_test (tc_simpleMPD, dash_mpdparser_period_adaptationSet_accessibility); tcase_add_test (tc_simpleMPD, dash_mpdparser_period_adaptationSet_role);