--- /dev/null
+From 43667763dd6e5aa95fea97651a3355981d3bce8e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= <tim.muller@collabora.co.uk>
+Date: Fri, 22 May 2009 20:10:00 +0100
+Subject: [PATCH] playback: make uridecodebin and decodebin2 implement the
+ tagreader interface
+
+.. so they can proxy the configured tag reading mode to any elements they
+auto-plug. Tagreadbin will use this.
+---
+ gst/playback/Makefile.am | 1 +
+ gst/playback/gstdecodebin2.c | 16 ++++++++++++++++
+ gst/playback/gsturidecodebin.c | 13 ++++++++++++-
+ 3 files changed, 29 insertions(+), 1 deletions(-)
+
+diff --git a/gst/playback/Makefile.am b/gst/playback/Makefile.am
+index 3adb56d..2c336f3 100644
+--- a/gst/playback/Makefile.am
++++ b/gst/playback/Makefile.am
+@@ -44,6 +44,7 @@ nodist_libgstdecodebin2_la_SOURCES = $(built_sources)
+ libgstdecodebin2_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
+ libgstdecodebin2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+ libgstdecodebin2_la_LIBADD = \
++ $(top_builddir)/gst-libs/gst/tag/libgsttag-@GST_MAJORMINOR@.la \
+ $(top_builddir)/gst-libs/gst/pbutils/libgstpbutils-@GST_MAJORMINOR@.la \
+ $(GST_LIBS)
+ libgstdecodebin2_la_LIBTOOLFLAGS = --tag=disable-static
+diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c
+index 31b5ebb..e73d3b7 100644
+--- a/gst/playback/gstdecodebin2.c
++++ b/gst/playback/gstdecodebin2.c
+@@ -88,6 +88,7 @@
+ #include <string.h>
+ #include <gst/gst.h>
+ #include <gst/pbutils/pbutils.h>
++#include <gst/tag/gsttagreader.h>
+
+ #include "gstplay-marshal.h"
+ #include "gstplay-enum.h"
+@@ -170,6 +171,7 @@ struct _GstDecodeBin
+ GList *blocked_pads; /* pads that have set to block */
+
+ gboolean expose_allstreams; /* Whether to expose unknow type streams or not */
++ GstTagReadingMode tag_mode;
+ };
+
+ struct _GstDecodeBinClass
+@@ -510,6 +512,8 @@ gst_decode_bin_get_type (void)
+ gst_decode_bin_type =
+ g_type_register_static (GST_TYPE_BIN, "GstDecodeBin2",
+ &gst_decode_bin_info, 0);
++
++ gst_tag_reader_add_interface_to_type (gst_decode_bin_type);
+ }
+
+ return gst_decode_bin_type;
+@@ -1742,6 +1746,15 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad,
+ continue;
+ }
+
++ /* if it's a tag reader, configure the tag reading mode */
++ if (dbin->tag_mode != GST_TAG_READING_MODE_DEFAULT &&
++ GST_IS_TAG_READER (element)) {
++ GST_DEBUG_OBJECT (dbin, "setting tag reading mode %d on element %s",
++ dbin->tag_mode, GST_ELEMENT_NAME (element));
++ gst_tag_reader_set_tag_reading_mode (GST_TAG_READER (element),
++ dbin->tag_mode);
++ }
++
+ /* ... activate it ... We do this before adding it to the bin so that we
+ * don't accidentally make it post error messages that will stop
+ * everything. */
+@@ -3645,6 +3658,9 @@ gst_decode_bin_change_state (GstElement * element, GstStateChange transition)
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
++ dbin->tag_mode =
++ gst_tag_reader_get_tag_reading_mode (GST_TAG_READER (dbin));
++ GST_LOG_OBJECT (dbin, "tag reading mode: %d", dbin->tag_mode);
+ if (dbin->typefind == NULL)
+ goto missing_typefind;
+ break;
+diff --git a/gst/playback/gsturidecodebin.c b/gst/playback/gsturidecodebin.c
+index bf10583..8c4e3f2 100644
+--- a/gst/playback/gsturidecodebin.c
++++ b/gst/playback/gsturidecodebin.c
+@@ -33,6 +33,7 @@
+ #include <gst/gst.h>
+ #include <gst/gst-i18n-plugin.h>
+ #include <gst/pbutils/missing-plugins.h>
++#include <gst/tag/gsttagreader.h>
+
+ #include "gstplay-marshal.h"
+ #include "gstplay-enum.h"
+@@ -104,6 +105,8 @@ struct _GstURIDecodeBin
+ gboolean expose_allstreams; /* Whether to expose unknow type streams or not */
+
+ guint64 ring_buffer_max_size; /* 0 means disabled */
++
++ GstTagReadingMode tag_mode;
+ };
+
+ struct _GstURIDecodeBinClass
+@@ -186,7 +189,8 @@ enum
+ static guint gst_uri_decode_bin_signals[LAST_SIGNAL] = { 0 };
+
+ GType gst_uri_decode_bin_get_type (void);
+-GST_BOILERPLATE (GstURIDecodeBin, gst_uri_decode_bin, GstBin, GST_TYPE_BIN);
++GST_BOILERPLATE_FULL (GstURIDecodeBin, gst_uri_decode_bin, GstBin,
++ GST_TYPE_BIN, gst_tag_reader_add_interface_to_type);
+
+ static void remove_decoders (GstURIDecodeBin * bin, gboolean force);
+ static void gst_uri_decode_bin_set_property (GObject * object, guint prop_id,
+@@ -1544,6 +1548,10 @@ make_decoder (GstURIDecodeBin * decoder)
+ if (decodebin->numsinkpads == 0)
+ goto no_typefind;
+
++ /* configure tag reading mode */
++ gst_tag_reader_set_tag_reading_mode (GST_TAG_READER (decodebin),
++ decoder->tag_mode);
++
+ /* connect signals to proxy */
+ g_signal_connect (decodebin, "unknown-type",
+ G_CALLBACK (proxy_unknown_type_signal), decoder);
+@@ -2385,6 +2393,9 @@ gst_uri_decode_bin_change_state (GstElement * element,
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
++ decoder->tag_mode =
++ gst_tag_reader_get_tag_reading_mode (GST_TAG_READER (decoder));
++ GST_LOG_OBJECT (decoder, "tag reading mode: %d", decoder->tag_mode);
+ if (!setup_source (decoder))
+ goto source_failed;
+ break;