mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
cddabasesrc: fix posting of discid tags after MERGE_MODE_REPLACE_ALL changes in core
Don't use REPLACE_ALL merge mode when that's not really what we want, as now that REPLACE_ALL actually does what it's supposed to do in core, we drop tags we wanted to keep, such as the various disc id tags. Add unit test for this as well. Fixes #579463.
This commit is contained in:
parent
418760cf74
commit
8efe6108c4
2 changed files with 60 additions and 7 deletions
|
@ -1271,7 +1271,7 @@ gst_cdda_base_src_add_tags (GstCddaBaseSrc * src)
|
|||
GST_FORMAT_TIME, &duration);
|
||||
|
||||
gst_tag_list_add (src->tracks[i].tags,
|
||||
GST_TAG_MERGE_REPLACE_ALL,
|
||||
GST_TAG_MERGE_REPLACE,
|
||||
GST_TAG_TRACK_NUMBER, i + 1,
|
||||
GST_TAG_TRACK_COUNT, src->num_tracks, GST_TAG_DURATION, duration, NULL);
|
||||
}
|
||||
|
@ -1285,7 +1285,7 @@ gst_cdda_base_src_add_tags (GstCddaBaseSrc * src)
|
|||
* gst_tag_list_get_value_index() rather than use tag names incl.
|
||||
* the track number ?? *////////////////////////////////////////
|
||||
|
||||
gst_tag_list_add (src->tags, GST_TAG_MERGE_REPLACE_ALL,
|
||||
gst_tag_list_add (src->tags, GST_TAG_MERGE_REPLACE,
|
||||
GST_TAG_TRACK_COUNT, src->num_tracks, NULL);
|
||||
#if 0
|
||||
for (i = 0; i < src->num_tracks; ++i) {
|
||||
|
|
|
@ -270,25 +270,78 @@ gst_cd_foo_src_read_sector (GstCddaBaseSrc * cddabasesrc, gint sector)
|
|||
return buf;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
tag_list_has_tag (GstTagList * list, const gchar * tag, GType type)
|
||||
{
|
||||
const GValue *val = gst_tag_list_get_value_index (list, tag, 0);
|
||||
|
||||
if (val == NULL) {
|
||||
GST_LOG ("no tag '%s' in taglist %" GST_PTR_FORMAT, tag, list);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!G_VALUE_HOLDS (val, type)) {
|
||||
GST_LOG ("tag '%s' in taglist %" GST_PTR_FORMAT " is not of type %s",
|
||||
tag, list, g_type_name (type));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GST_START_TEST (test_discid_calculations)
|
||||
{
|
||||
GstElement *foosrc;
|
||||
GstElement *foosrc, *pipeline, *sink;
|
||||
gint i;
|
||||
|
||||
fail_unless (gst_element_register (NULL, "cdfoosrc", GST_RANK_SECONDARY,
|
||||
GST_TYPE_CD_FOO_SRC));
|
||||
|
||||
pipeline = gst_pipeline_new ("pipeline");
|
||||
|
||||
sink = gst_element_factory_make ("fakesink", "sink");
|
||||
fail_unless (sink != NULL, "couldn't create fakesink");
|
||||
|
||||
foosrc = gst_element_factory_make ("cdfoosrc", "cdfoosrc");
|
||||
fail_unless (foosrc != NULL, "couldn't create cdfoosrc");
|
||||
|
||||
gst_bin_add (GST_BIN (pipeline), foosrc);
|
||||
gst_bin_add (GST_BIN (pipeline), sink);
|
||||
fail_unless (gst_element_link (foosrc, sink));
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (test_discs); ++i) {
|
||||
GstTagList *tags = NULL;
|
||||
GstMessage *msg;
|
||||
|
||||
GST_LOG ("Testing disc layout %u ...", i);
|
||||
GST_CD_FOO_SRC (foosrc)->cur_disc = i;
|
||||
gst_element_set_state (foosrc, GST_STATE_PLAYING);
|
||||
gst_element_get_state (foosrc, NULL, NULL, -1);
|
||||
gst_element_set_state (foosrc, GST_STATE_NULL);
|
||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||
|
||||
msg =
|
||||
gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipeline),
|
||||
GST_CLOCK_TIME_NONE, GST_MESSAGE_TAG);
|
||||
gst_message_parse_tag (msg, &tags);
|
||||
fail_unless (tags != NULL);
|
||||
fail_unless (tag_list_has_tag (tags, "track-count", G_TYPE_UINT));
|
||||
fail_unless (tag_list_has_tag (tags, "track-number", G_TYPE_UINT));
|
||||
fail_unless (tag_list_has_tag (tags, "duration", G_TYPE_UINT64));
|
||||
fail_unless (tag_list_has_tag (tags, "discid", G_TYPE_STRING));
|
||||
fail_unless (tag_list_has_tag (tags, "discid-full", G_TYPE_STRING));
|
||||
fail_unless (tag_list_has_tag (tags, "musicbrainz-discid", G_TYPE_STRING));
|
||||
fail_unless (tag_list_has_tag (tags, "musicbrainz-discid-full",
|
||||
G_TYPE_STRING));
|
||||
gst_tag_list_free (tags);
|
||||
gst_message_unref (msg);
|
||||
|
||||
msg =
|
||||
gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipeline),
|
||||
GST_CLOCK_TIME_NONE, GST_MESSAGE_ASYNC_DONE);
|
||||
gst_message_unref (msg);
|
||||
|
||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
||||
}
|
||||
|
||||
gst_object_unref (foosrc);
|
||||
gst_object_unref (pipeline);
|
||||
|
||||
gst_task_cleanup_all ();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue