diff options
-rw-r--r-- | gst/icydemux/gsticydemux.c | 5 | ||||
-rw-r--r-- | tests/check/elements/icydemux.c | 77 |
2 files changed, 81 insertions, 1 deletions
diff --git a/gst/icydemux/gsticydemux.c b/gst/icydemux/gsticydemux.c index dc0c266ab..12fdad24a 100644 --- a/gst/icydemux/gsticydemux.c +++ b/gst/icydemux/gsticydemux.c @@ -323,6 +323,7 @@ gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux) GstTagList *tags; const guint8 *data; int length, i; + gboolean tags_found = FALSE; gchar *buffer; gchar **strings; @@ -340,6 +341,7 @@ gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux) for (i = 0; strings[i]; i++) { if (!g_ascii_strncasecmp (strings[i], "StreamTitle=", 12)) { char *title = gst_icydemux_unicodify (strings[i] + 13); + tags_found = TRUE; if (title && *title) { gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, @@ -348,6 +350,7 @@ gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux) } } else if (!g_ascii_strncasecmp (strings[i], "StreamUrl=", 10)) { char *url = gst_icydemux_unicodify (strings[i] + 11); + tags_found = TRUE; if (url && *url) { gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_HOMEPAGE, @@ -362,7 +365,7 @@ gst_icydemux_parse_and_send_tags (GstICYDemux * icydemux) gst_adapter_unmap (icydemux->meta_adapter); gst_adapter_flush (icydemux->meta_adapter, length); - if (!gst_tag_list_is_empty (tags)) + if (tags_found) gst_icydemux_tag_found (icydemux, tags); else gst_tag_list_unref (tags); diff --git a/tests/check/elements/icydemux.c b/tests/check/elements/icydemux.c index 1a17e79b6..b5e43b434 100644 --- a/tests/check/elements/icydemux.c +++ b/tests/check/elements/icydemux.c @@ -31,12 +31,23 @@ #define ICY_METADATA \ "StreamTitle='" TEST_METADATA "';\0\0\0\0" +#define EMPTY_ICY_STREAM_TITLE_METADATA \ + "StreamTitle='';\0" + #define ICY_DATA \ "aaaaaaaa" \ "\x02" \ ICY_METADATA \ "bbbbbbbb" +#define ICY_DATA_EMPTY_METADATA \ + ICY_DATA \ + "\x00" \ + "dddddddd" \ + "\x01" \ + EMPTY_ICY_STREAM_TITLE_METADATA \ + "cccccccc" + #define ICYCAPS "application/x-icy, metadata-interval = (int)8" #define SRC_CAPS "application/x-icy, metadata-interval = (int)[0, MAX]" @@ -220,6 +231,71 @@ GST_START_TEST (test_demux) GST_END_TEST; +GST_START_TEST (test_demux_empty_data) +{ + GstMessage *message; + GstTagList *tags; + const GValue *tag_val; + const gchar *tag; + GstCaps *caps; + + fail_unless (gst_type_find_register (NULL, "success", GST_RANK_PRIMARY, + typefind_succeed, NULL, gst_static_caps_get (&typefind_caps), NULL, + NULL)); + + fake_typefind_caps = TRUE; + + caps = gst_caps_from_string (ICYCAPS); + + create_icydemux (); + gst_check_setup_events (srcpad, icydemux, caps, GST_FORMAT_TIME); + + push_data ((guint8 *) ICY_DATA_EMPTY_METADATA, + sizeof (ICY_DATA_EMPTY_METADATA), -1); + + message = gst_bus_poll (bus, GST_MESSAGE_TAG, -1); + fail_unless (message != NULL); + + gst_message_parse_tag (message, &tags); + fail_unless (tags != NULL); + + tag_val = gst_tag_list_get_value_index (tags, GST_TAG_TITLE, 0); + fail_unless (tag_val != NULL); + + tag = g_value_get_string (tag_val); + fail_unless (tag != NULL); + + fail_unless_equals_string (TEST_METADATA, (char *) tag); + + gst_tag_list_unref (tags); + gst_message_unref (message); + + message = gst_bus_poll (bus, GST_MESSAGE_TAG, -1); + fail_unless (message != NULL); + + gst_message_parse_tag (message, &tags); + fail_unless (tags != NULL); + + tag_val = gst_tag_list_get_value_index (tags, GST_TAG_TITLE, 0); + fail_unless (tag_val == NULL); + + gst_message_unref (message); + + /* Ensure that no further tag messages are received, i.e. the empty ICY tag + * is skipped */ + message = gst_bus_poll (bus, GST_MESSAGE_TAG, 100000000); + fail_unless (message == NULL); + + gst_tag_list_unref (tags); + gst_caps_unref (caps); + + cleanup_icydemux (); + + fake_typefind_caps = FALSE; +} + +GST_END_TEST; + /* run this test first before the custom typefind function is set up */ GST_START_TEST (test_first_buf_offset_when_merged_for_typefinding) { @@ -292,6 +368,7 @@ icydemux_suite (void) suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_demux); + tcase_add_test (tc_chain, test_demux_empty_data); tcase_add_test (tc_chain, test_first_buf_offset_when_merged_for_typefinding); tcase_add_test (tc_chain, test_not_negotiated); |