added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch
authorWolfgang Rosenauer <wr@rosenauer.org>
Tue, 30 Oct 2012 14:20:56 +0100
changeset 573 71cf05d3ee57
parent 572 edcb48108200
child 575 d28dbaf20075
added mozilla-gstreamer-803287.patch (TM: mozilla19) as replacement for mozilla-gstreamer.patch - reworked mozilla-gstreamer-760140.patch on top of that
MozillaFirefox/MozillaFirefox.spec
MozillaFirefox/mozilla-gstreamer-803287.patch
MozillaFirefox/mozilla-gstreamer.patch
mozilla-gstreamer-760140.patch
mozilla-gstreamer-803287.patch
mozilla-gstreamer.patch
series
--- a/MozillaFirefox/MozillaFirefox.spec	Sat Oct 27 10:52:27 2012 +0200
+++ b/MozillaFirefox/MozillaFirefox.spec	Tue Oct 30 14:20:56 2012 +0100
@@ -95,7 +95,7 @@
 Patch10:        mozilla-sle11.patch
 Patch11:        mozilla-disable-neon-option.patch
 Patch12:        mozilla-arm-disable-edsp.patch
-Patch13:        mozilla-gstreamer.patch
+Patch13:        mozilla-gstreamer-803287.patch
 Patch14:        mozilla-ppc.patch
 Patch15:        mozilla-gstreamer-760140.patch
 Patch16:        mozilla-webrtc.patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-gstreamer-803287.patch	Tue Oct 30 14:20:56 2012 +0100
@@ -0,0 +1,1 @@
+../mozilla-gstreamer-803287.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-gstreamer.patch	Sat Oct 27 10:52:27 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-gstreamer.patch
\ No newline at end of file
--- a/mozilla-gstreamer-760140.patch	Sat Oct 27 10:52:27 2012 +0200
+++ b/mozilla-gstreamer-760140.patch	Tue Oct 30 14:20:56 2012 +0100
@@ -24,39 +24,6 @@
  #include "mozilla/Base64.h"
  #include "mozilla/Preferences.h"
  #include "nsDOMMutationObserver.h"
-@@ -6706,26 +6709,23 @@ nsContentUtils::FindInternalContentViewe
-         }
-         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::IsGStreamerEnabled()) {
-+    if (nsGStreamerDecoder::CanHandleMediaType(aType, nullptr)) {
-+      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");
 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
@@ -81,20 +48,18 @@
    // Returns true if we should handle this MIME type when it appears
    // as an <object> or as a toplevel page. If, in practice, our support
    // for the type is more limited than appears in the wild, we should return
-@@ -303,20 +305,17 @@ public:
- #ifdef MOZ_WEBM
-   static bool IsWebMEnabled();
+@@ -305,19 +307,16 @@ public:
    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];
-+  static bool IsGStreamerEnabled();
  #endif
  
  #ifdef MOZ_WIDGET_GONK
@@ -106,7 +71,7 @@
 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
-@@ -2128,55 +2128,32 @@ nsHTMLMediaElement::IsWebMType(const nsA
+@@ -2128,51 +2128,34 @@ nsHTMLMediaElement::IsWebMType(const nsA
        return true;
      }
    }
@@ -135,29 +100,22 @@
 -  "video/quicktime",
 -};
 -
--bool
--nsHTMLMediaElement::IsH264Enabled()
-+bool nsHTMLMediaElement::IsGStreamerEnabled()
+ bool
+ 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;
-+  return Preferences::GetBool("media.gstreamer.enabled");
- }
+-}
  #endif
  
  #ifdef MOZ_WIDGET_GONK
@@ -165,7 +123,8 @@
    "audio/mpeg",
    "audio/mp4",
    "video/mp4",
-@@ -2262,18 +2239,22 @@ nsHTMLMediaElement::IsDASHMPDType(const 
+   "video/3gpp",
+@@ -2257,18 +2240,22 @@ nsHTMLMediaElement::IsDASHMPDType(const 
  
    return false;
  }
@@ -189,7 +148,7 @@
  #endif
  #ifdef MOZ_OGG
    if (IsOggType(nsDependentCString(aMIMEType))) {
-@@ -2297,20 +2278,22 @@ nsHTMLMediaElement::CanHandleMediaType(c
+@@ -2292,20 +2279,22 @@ nsHTMLMediaElement::CanHandleMediaType(c
    if (IsDASHMPDType(nsDependentCString(aMIMEType))) {
      // DASH manifest uses WebM codecs only.
      *aCodecList = gWebMCodecs;
@@ -216,7 +175,7 @@
    }
  #endif
  #ifdef MOZ_MEDIA_PLUGINS
-@@ -2331,17 +2314,17 @@ bool nsHTMLMediaElement::ShouldHandleMed
+@@ -2326,17 +2315,17 @@ bool nsHTMLMediaElement::ShouldHandleMed
    if (IsOggType(nsDependentCString(aMIMEType)))
      return true;
  #endif
@@ -235,7 +194,7 @@
    }
  #endif
  #ifdef MOZ_MEDIA_PLUGINS
-@@ -2372,26 +2355,31 @@ nsHTMLMediaElement::GetCanPlay(const nsA
+@@ -2367,26 +2356,31 @@ nsHTMLMediaElement::GetCanPlay(const nsA
  {
    nsContentTypeParser parser(aType);
    nsAutoString mimeType;
@@ -272,27 +231,99 @@
    // of the 'codecs' parameter
    nsCharSeparatedTokenizer tokenizer(codecs, ',');
    bool expectMoreTokens = false;
-@@ -2486,17 +2474,19 @@ nsHTMLMediaElement::CreateDecoder(const 
+@@ -2425,46 +2419,41 @@ nsHTMLMediaElement::CanPlayType(const ns
+ }
+ 
+ #ifdef MOZ_GSTREAMER
+ bool
+ nsHTMLMediaElement::IsGStreamerSupportedType(const nsACString& aMimeType)
+ {
+   if (!IsGStreamerEnabled())
+     return false;
+-  if (IsH264Type(aMimeType))
++
++  const char *type;
++  NS_CStringGetData(aMimeType, &type, nullptr);
++  if (nsGStreamerDecoder::CanHandleMediaType(type, nullptr))
+     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();
++  if (!Preferences::GetBool("media.prefer-gstreamer", false)) {
++    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
+@@ -2503,25 +2492,33 @@ nsHTMLMediaElement::CreateDecoder(const 
+ #ifdef MOZ_WEBM
+   if (IsWebMType(aType)) {
+     nsRefPtr<nsWebMDecoder> decoder = new nsWebMDecoder();
+     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
++  // use GStreamer as fallback if not preferred
++  if (IsGStreamerSupportedType(aType)) {
++    nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
++    if (decoder->Init(this)) {
++      return decoder.forget();
++    }
++  }
++#endif
  
- #ifdef MOZ_GSTREAMER 
--  if (IsH264Type(aType)) {
-+  const char *type;
-+  NS_CStringGetData(aType, &type, NULL);
-+  if (nsGStreamerDecoder::CanHandleMediaType(type, NULL)) {
-     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/content/media/gstreamer/Makefile.in b/content/media/gstreamer/Makefile.in
 --- a/content/media/gstreamer/Makefile.in
 +++ b/content/media/gstreamer/Makefile.in
@@ -371,11 +402,11 @@
 +#define ENTRY_FORMAT(entry) entry[0]
 +#define ENTRY_CAPS(entry) entry[1]
 +
-+nsGStreamerFormatHelper* nsGStreamerFormatHelper::gInstance = NULL;
++nsGStreamerFormatHelper* nsGStreamerFormatHelper::gInstance = nullptr;
 +
 +nsGStreamerFormatHelper *nsGStreamerFormatHelper::Instance() {
 +  if (!gInstance) {
-+    gst_init(NULL, NULL);
++    gst_init(nullptr, nullptr);
 +    gInstance = new nsGStreamerFormatHelper();
 +  }
 +
@@ -383,7 +414,7 @@
 +}
 +
 +nsGStreamerFormatHelper::nsGStreamerFormatHelper()
-+  : mFactories(NULL),
++  : mFactories(nullptr),
 +    mCookie(0)
 +{
 +  const char *containers[3][2] = {
@@ -428,7 +459,7 @@
 +  unsigned int i;
 +
 +  /* convert aMIMEType to gst container caps */
-+  const char *capsString = NULL;
++  const char *capsString = nullptr;
 +  for (i = 0; i < G_N_ELEMENTS(mContainers); i++) {
 +    if (!strcmp(ENTRY_FORMAT(mContainers[i]), aMIMEType)) {
 +      capsString = ENTRY_CAPS(mContainers[i]);
@@ -438,7 +469,7 @@
 +
 +  if (!capsString) {
 +    /* we couldn't find any matching caps */
-+    return NULL;
++    return nullptr;
 +  }
 +
 +  GstCaps *caps = gst_caps_from_string(capsString);
@@ -451,7 +482,7 @@
 +  nsCCharSeparatedTokenizer tokenizer(codecs, ',');
 +  while (tokenizer.hasMoreTokens()) {
 +    const nsCSubstring& codec = tokenizer.nextToken();
-+    capsString = NULL;
++    capsString = nullptr;
 +
 +    for (i = 0; i < G_N_ELEMENTS(mCodecs); i++) {
 +      if (codec.Equals(ENTRY_FORMAT(mCodecs[i]))) {
@@ -462,7 +493,7 @@
 +
 +    if (!capsString) {
 +      gst_caps_unref(caps);
-+      return NULL;
++      return nullptr;
 +    }
 +
 +    GstCaps *tmp = gst_caps_from_string(capsString);
@@ -483,7 +514,7 @@
 +   * structure */
 +  for (unsigned int i = 0; i < gst_caps_get_size(aCaps); i++) {
 +    GstStructure *s = gst_caps_get_structure(aCaps, i);
-+    GstCaps *caps = gst_caps_new_full(gst_structure_copy(s), NULL);
++    GstCaps *caps = gst_caps_new_full(gst_structure_copy(s), nullptr);
 +    list = gst_element_factory_list_filter (factories, caps, GST_PAD_SINK, FALSE);
 +    gst_caps_unref(caps);
 +    if (!list) {
@@ -549,25 +580,3 @@
 +};
 +
 +#endif
-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);
--- /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);
--- a/mozilla-gstreamer.patch	Sat Oct 27 10:52:27 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-# HG changeset patch
-# Parent b6b96c933ed1acd86ee0201165f696a8c2ebd8eb
-# User Wolfgang Rosenauer <wr@rosenauer.org>
-No Bug - use GStreamer _only_ for MP4 (not WebM/OGG)
-
-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
-@@ -2437,21 +2437,17 @@ nsHTMLMediaElement::CreateDecoder(const 
-     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,21 +2469,17 @@ 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)) {
--- a/series	Sat Oct 27 10:52:27 2012 +0200
+++ b/series	Tue Oct 30 14:20:56 2012 +0100
@@ -14,7 +14,7 @@
 mozilla-repo.patch
 mozilla-sle11.patch
 mozilla-arm-disable-edsp.patch
-mozilla-gstreamer.patch
+mozilla-gstreamer-803287.patch
 mozilla-gstreamer-760140.patch
 mozilla-ppc.patch
 mozilla-idldir.patch