diff -r edcb48108200 -r 71cf05d3ee57 mozilla-gstreamer-803287.patch --- /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 +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 + 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 decoder = new nsGStreamerDecoder(); ++ if (decoder->Init(this)) { ++ return decoder.forget(); ++ } ++ } ++#endif ++ + #ifdef MOZ_RAW + if (IsRawType(aType)) { + nsRefPtr decoder = new nsRawDecoder(); + if (decoder->Init(this)) { + return decoder.forget(); + } + } + #endif + #ifdef MOZ_OGG + if (IsOggType(aType)) { +-#ifdef MOZ_GSTREAMER +- nsRefPtr decoder = new nsGStreamerDecoder(); +-#else + nsRefPtr decoder = new nsOggDecoder(); +-#endif + if (decoder->Init(this)) { + return decoder.forget(); + } + } + #endif + #ifdef MOZ_WAVE + if (IsWaveType(aType)) { + nsRefPtr decoder = new nsWaveDecoder(); +@@ -2473,44 +2497,32 @@ nsHTMLMediaElement::CreateDecoder(const + nsRefPtr decoder = new nsMediaPluginDecoder(aType); + if (decoder->Init(this)) { + return decoder.forget(); + } + } + #endif + #ifdef MOZ_WEBM + if (IsWebMType(aType)) { +-#ifdef MOZ_GSTREAMER +- nsRefPtr decoder = new nsGStreamerDecoder(); +-#else + nsRefPtr decoder = new nsWebMDecoder(); +-#endif + if (decoder->Init(this)) { + return decoder.forget(); + } + } + #endif + + #ifdef MOZ_DASH + if (IsDASHMPDType(aType)) { + nsRefPtr decoder = new nsDASHDecoder(); + if (decoder->Init(this)) { + return decoder.forget(); + } + } + #endif + +-#ifdef MOZ_GSTREAMER +- if (IsH264Type(aType)) { +- nsRefPtr 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);