mozilla-gstreamer-803287.patch
changeset 573 71cf05d3ee57
--- /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);