--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-gstreamer-803287.patch Tue Oct 30 14:20:56 2012 +0100
@@ -0,0 +1,293 @@
+# HG changeset patch
+# Parent 09328afa274e7cf6354f446ae37735218b796e7f
+# User Wolfgang Rosenauer <wr@rosenauer.org>
+Bug 803287 - Don't use GStreamer (when enabled) for Ogg/WebM if builtin backends present. (TM: 19)
+
+diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp
+--- a/content/base/src/nsContentUtils.cpp
++++ b/content/base/src/nsContentUtils.cpp
+@@ -6676,71 +6676,55 @@ nsContentUtils::FindInternalContentViewe
+ else
+ *aLoaderType = TYPE_UNKNOWN;
+ }
+ return docFactory.forget();
+ }
+
+ #ifdef MOZ_MEDIA
+ #ifdef MOZ_OGG
+- if (nsHTMLMediaElement::IsOggEnabled()) {
+- for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gOggTypes); ++i) {
+- const char* type = nsHTMLMediaElement::gOggTypes[i];
+- if (!strcmp(aType, type)) {
+- docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
+- if (docFactory && aLoaderType) {
+- *aLoaderType = TYPE_CONTENT;
+- }
+- return docFactory.forget();
+- }
++ if (nsHTMLMediaElement::IsOggType(nsDependentCString(aType))) {
++ docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
++ if (docFactory && aLoaderType) {
++ *aLoaderType = TYPE_CONTENT;
+ }
++ return docFactory.forget();
+ }
+ #endif
+
+ #ifdef MOZ_WEBM
+- if (nsHTMLMediaElement::IsWebMEnabled()) {
+- for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gWebMTypes); ++i) {
+- const char* type = nsHTMLMediaElement::gWebMTypes[i];
+- if (!strcmp(aType, type)) {
+- docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
+- if (docFactory && aLoaderType) {
+- *aLoaderType = TYPE_CONTENT;
+- }
+- return docFactory.forget();
+- }
++ if (nsHTMLMediaElement::IsWebMType(nsDependentCString(aType))) {
++ docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
++ if (docFactory && aLoaderType) {
++ *aLoaderType = TYPE_CONTENT;
+ }
++ return docFactory.forget();
+ }
+ #endif
+
+ #ifdef MOZ_GSTREAMER
+- if (nsHTMLMediaElement::IsH264Enabled()) {
+- for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gH264Types); ++i) {
+- const char* type = nsHTMLMediaElement::gH264Types[i];
+- if (!strcmp(aType, type)) {
+- docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
+- if (docFactory && aLoaderType) {
+- *aLoaderType = TYPE_CONTENT;
+- }
+- return docFactory.forget();
+- }
++ if (nsHTMLMediaElement::IsGStreamerSupportedType(nsDependentCString(aType))) {
++ docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
++ if (docFactory && aLoaderType) {
++ *aLoaderType = TYPE_CONTENT;
+ }
++ return docFactory.forget();
+ }
+ #endif
+
+ #ifdef MOZ_MEDIA_PLUGINS
+ if (nsHTMLMediaElement::IsMediaPluginsEnabled() &&
+ nsHTMLMediaElement::IsMediaPluginsType(nsDependentCString(aType))) {
+ docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
+ if (docFactory && aLoaderType) {
+ *aLoaderType = TYPE_CONTENT;
+ }
+ return docFactory.forget();
+ }
+ #endif // MOZ_MEDIA_PLUGINS
+-
+ #endif // MOZ_MEDIA
+
+ return NULL;
+ }
+
+ // static
+ bool
+ nsContentUtils::IsPatternMatching(nsAString& aValue, nsAString& aPattern,
+diff --git a/content/html/content/public/nsHTMLMediaElement.h b/content/html/content/public/nsHTMLMediaElement.h
+--- a/content/html/content/public/nsHTMLMediaElement.h
++++ b/content/html/content/public/nsHTMLMediaElement.h
+@@ -303,17 +303,18 @@ public:
+ #ifdef MOZ_WEBM
+ static bool IsWebMEnabled();
+ static bool IsWebMType(const nsACString& aType);
+ static const char gWebMTypes[2][11];
+ static char const *const gWebMCodecs[4];
+ #endif
+
+ #ifdef MOZ_GSTREAMER
+- static bool IsH264Enabled();
++ static bool IsGStreamerEnabled();
++ static bool IsGStreamerSupportedType(const nsACString& aType);
+ static bool IsH264Type(const nsACString& aType);
+ static const char gH264Types[3][16];
+ static char const *const gH264Codecs[7];
+ #endif
+
+ #ifdef MOZ_WIDGET_GONK
+ static bool IsOmxEnabled();
+ static bool IsOmxSupportedType(const nsACString& aType);
+diff --git a/content/html/content/src/nsHTMLMediaElement.cpp b/content/html/content/src/nsHTMLMediaElement.cpp
+--- a/content/html/content/src/nsHTMLMediaElement.cpp
++++ b/content/html/content/src/nsHTMLMediaElement.cpp
+@@ -2148,34 +2148,29 @@ char const *const nsHTMLMediaElement::gH
+ #ifdef MOZ_GSTREAMER
+ const char nsHTMLMediaElement::gH264Types[3][16] = {
+ "video/mp4",
+ "video/3gpp",
+ "video/quicktime",
+ };
+
+ bool
+-nsHTMLMediaElement::IsH264Enabled()
++nsHTMLMediaElement::IsGStreamerEnabled()
+ {
+- return Preferences::GetBool("media.h264.enabled");
++ return Preferences::GetBool("media.gstreamer.enabled");
+ }
+
+ bool
+ nsHTMLMediaElement::IsH264Type(const nsACString& aType)
+ {
+- if (!IsH264Enabled()) {
+- return false;
+- }
+-
+ for (uint32_t i = 0; i < ArrayLength(gH264Types); ++i) {
+ if (aType.EqualsASCII(gH264Types[i])) {
+ return true;
+ }
+ }
+-
+ return false;
+ }
+ #endif
+
+ #ifdef MOZ_WIDGET_GONK
+ const char nsHTMLMediaElement::gOmxTypes[5][16] = {
+ "audio/mpeg",
+ "audio/mp4",
+@@ -2424,34 +2419,63 @@ nsHTMLMediaElement::CanPlayType(const ns
+ default:
+ case CANPLAY_MAYBE:
+ aResult.AssignLiteral("maybe");
+ break;
+ }
+ return NS_OK;
+ }
+
++#ifdef MOZ_GSTREAMER
++bool
++nsHTMLMediaElement::IsGStreamerSupportedType(const nsACString& aMimeType)
++{
++ if (!IsGStreamerEnabled())
++ return false;
++ if (IsH264Type(aMimeType))
++ return true;
++ if (!Preferences::GetBool("media.prefer-gstreamer", false))
++ return false;
++#ifdef MOZ_WEBM
++ if (IsWebMType(aMimeType))
++ return true;
++#endif
++#ifdef MOZ_OGG
++ if (IsOggType(aMimeType))
++ return true;
++#endif
++ return false;
++}
++#endif
++
+ already_AddRefed<nsMediaDecoder>
+ nsHTMLMediaElement::CreateDecoder(const nsACString& aType)
+ {
++#ifdef MOZ_GSTREAMER
++ // When enabled, use GStreamer for H.264, but not for codecs handled by our
++ // bundled decoders, unless the "media.prefer-gstreamer" pref is set.
++ if (IsGStreamerSupportedType(aType)) {
++ nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
++ if (decoder->Init(this)) {
++ return decoder.forget();
++ }
++ }
++#endif
++
+ #ifdef MOZ_RAW
+ if (IsRawType(aType)) {
+ nsRefPtr<nsRawDecoder> decoder = new nsRawDecoder();
+ if (decoder->Init(this)) {
+ return decoder.forget();
+ }
+ }
+ #endif
+ #ifdef MOZ_OGG
+ if (IsOggType(aType)) {
+-#ifdef MOZ_GSTREAMER
+- nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
+-#else
+ nsRefPtr<nsOggDecoder> decoder = new nsOggDecoder();
+-#endif
+ if (decoder->Init(this)) {
+ return decoder.forget();
+ }
+ }
+ #endif
+ #ifdef MOZ_WAVE
+ if (IsWaveType(aType)) {
+ nsRefPtr<nsWaveDecoder> decoder = new nsWaveDecoder();
+@@ -2473,44 +2497,32 @@ nsHTMLMediaElement::CreateDecoder(const
+ nsRefPtr<nsMediaPluginDecoder> decoder = new nsMediaPluginDecoder(aType);
+ if (decoder->Init(this)) {
+ return decoder.forget();
+ }
+ }
+ #endif
+ #ifdef MOZ_WEBM
+ if (IsWebMType(aType)) {
+-#ifdef MOZ_GSTREAMER
+- nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
+-#else
+ nsRefPtr<nsWebMDecoder> decoder = new nsWebMDecoder();
+-#endif
+ if (decoder->Init(this)) {
+ return decoder.forget();
+ }
+ }
+ #endif
+
+ #ifdef MOZ_DASH
+ if (IsDASHMPDType(aType)) {
+ nsRefPtr<nsDASHDecoder> decoder = new nsDASHDecoder();
+ if (decoder->Init(this)) {
+ return decoder.forget();
+ }
+ }
+ #endif
+
+-#ifdef MOZ_GSTREAMER
+- if (IsH264Type(aType)) {
+- nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
+- if (decoder->Init(this)) {
+- return decoder.forget();
+- }
+- }
+-#endif
+ return nullptr;
+ }
+
+ nsresult nsHTMLMediaElement::InitializeDecoderAsClone(nsMediaDecoder* aOriginal)
+ {
+ NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set");
+ NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder");
+
+diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js
+--- a/modules/libpref/src/init/all.js
++++ b/modules/libpref/src/init/all.js
+@@ -164,17 +164,17 @@ pref("media.wave.enabled", true);
+ #endif
+ #ifdef MOZ_WEBM
+ pref("media.webm.enabled", true);
+ #endif
+ #ifdef MOZ_DASH
+ pref("media.dash.enabled", true);
+ #endif
+ #ifdef MOZ_GSTREAMER
+-pref("media.h264.enabled", true);
++pref("media.gstreamer.enabled", true);
+ #endif
+ #ifdef MOZ_WEBRTC
+ pref("media.navigator.enabled", false);
+ pref("media.peerconnection.enabled", false);
+ pref("media.navigator.permission.disabled", false);
+ #else
+ #ifdef ANDROID
+ pref("media.navigator.enabled", true);