mozilla-gstreamer-803287.patch
changeset 573 71cf05d3ee57
equal deleted inserted replaced
572:edcb48108200 573:71cf05d3ee57
       
     1 # HG changeset patch
       
     2 # Parent 09328afa274e7cf6354f446ae37735218b796e7f
       
     3 # User Wolfgang Rosenauer <wr@rosenauer.org>
       
     4 Bug 803287 - Don't use GStreamer (when enabled) for Ogg/WebM if builtin backends present. (TM: 19)
       
     5 
       
     6 diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp
       
     7 --- a/content/base/src/nsContentUtils.cpp
       
     8 +++ b/content/base/src/nsContentUtils.cpp
       
     9 @@ -6676,71 +6676,55 @@ nsContentUtils::FindInternalContentViewe
       
    10        else
       
    11        *aLoaderType = TYPE_UNKNOWN;
       
    12      }
       
    13      return docFactory.forget();
       
    14    }
       
    15  
       
    16  #ifdef MOZ_MEDIA
       
    17  #ifdef MOZ_OGG
       
    18 -  if (nsHTMLMediaElement::IsOggEnabled()) {
       
    19 -    for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gOggTypes); ++i) {
       
    20 -      const char* type = nsHTMLMediaElement::gOggTypes[i];
       
    21 -      if (!strcmp(aType, type)) {
       
    22 -        docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    23 -        if (docFactory && aLoaderType) {
       
    24 -          *aLoaderType = TYPE_CONTENT;
       
    25 -        }
       
    26 -        return docFactory.forget();
       
    27 -      }
       
    28 +  if (nsHTMLMediaElement::IsOggType(nsDependentCString(aType))) {
       
    29 +    docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    30 +    if (docFactory && aLoaderType) {
       
    31 +      *aLoaderType = TYPE_CONTENT;
       
    32      }
       
    33 +    return docFactory.forget();
       
    34    }
       
    35  #endif
       
    36  
       
    37  #ifdef MOZ_WEBM
       
    38 -  if (nsHTMLMediaElement::IsWebMEnabled()) {
       
    39 -    for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gWebMTypes); ++i) {
       
    40 -      const char* type = nsHTMLMediaElement::gWebMTypes[i];
       
    41 -      if (!strcmp(aType, type)) {
       
    42 -        docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    43 -        if (docFactory && aLoaderType) {
       
    44 -          *aLoaderType = TYPE_CONTENT;
       
    45 -        }
       
    46 -        return docFactory.forget();
       
    47 -      }
       
    48 +  if (nsHTMLMediaElement::IsWebMType(nsDependentCString(aType))) {
       
    49 +    docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    50 +    if (docFactory && aLoaderType) {
       
    51 +      *aLoaderType = TYPE_CONTENT;
       
    52      }
       
    53 +    return docFactory.forget();
       
    54    }
       
    55  #endif
       
    56  
       
    57  #ifdef MOZ_GSTREAMER
       
    58 -  if (nsHTMLMediaElement::IsH264Enabled()) {
       
    59 -    for (unsigned int i = 0; i < ArrayLength(nsHTMLMediaElement::gH264Types); ++i) {
       
    60 -      const char* type = nsHTMLMediaElement::gH264Types[i];
       
    61 -      if (!strcmp(aType, type)) {
       
    62 -        docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    63 -        if (docFactory && aLoaderType) {
       
    64 -          *aLoaderType = TYPE_CONTENT;
       
    65 -        }
       
    66 -        return docFactory.forget();
       
    67 -      }
       
    68 +  if (nsHTMLMediaElement::IsGStreamerSupportedType(nsDependentCString(aType))) {
       
    69 +    docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    70 +    if (docFactory && aLoaderType) {
       
    71 +      *aLoaderType = TYPE_CONTENT;
       
    72      }
       
    73 +    return docFactory.forget();
       
    74    }
       
    75  #endif
       
    76  
       
    77  #ifdef MOZ_MEDIA_PLUGINS
       
    78    if (nsHTMLMediaElement::IsMediaPluginsEnabled() &&
       
    79        nsHTMLMediaElement::IsMediaPluginsType(nsDependentCString(aType))) {
       
    80      docFactory = do_GetService("@mozilla.org/content/document-loader-factory;1");
       
    81      if (docFactory && aLoaderType) {
       
    82        *aLoaderType = TYPE_CONTENT;
       
    83      }
       
    84      return docFactory.forget();
       
    85    }
       
    86  #endif // MOZ_MEDIA_PLUGINS
       
    87 -
       
    88  #endif // MOZ_MEDIA
       
    89  
       
    90    return NULL;
       
    91  }
       
    92  
       
    93  // static
       
    94  bool
       
    95  nsContentUtils::IsPatternMatching(nsAString& aValue, nsAString& aPattern,
       
    96 diff --git a/content/html/content/public/nsHTMLMediaElement.h b/content/html/content/public/nsHTMLMediaElement.h
       
    97 --- a/content/html/content/public/nsHTMLMediaElement.h
       
    98 +++ b/content/html/content/public/nsHTMLMediaElement.h
       
    99 @@ -303,17 +303,18 @@ public:
       
   100  #ifdef MOZ_WEBM
       
   101    static bool IsWebMEnabled();
       
   102    static bool IsWebMType(const nsACString& aType);
       
   103    static const char gWebMTypes[2][11];
       
   104    static char const *const gWebMCodecs[4];
       
   105  #endif
       
   106  
       
   107  #ifdef MOZ_GSTREAMER
       
   108 -  static bool IsH264Enabled();
       
   109 +  static bool IsGStreamerEnabled();
       
   110 +  static bool IsGStreamerSupportedType(const nsACString& aType);
       
   111    static bool IsH264Type(const nsACString& aType);
       
   112    static const char gH264Types[3][16];
       
   113    static char const *const gH264Codecs[7];
       
   114  #endif
       
   115  
       
   116  #ifdef MOZ_WIDGET_GONK
       
   117    static bool IsOmxEnabled();
       
   118    static bool IsOmxSupportedType(const nsACString& aType);
       
   119 diff --git a/content/html/content/src/nsHTMLMediaElement.cpp b/content/html/content/src/nsHTMLMediaElement.cpp
       
   120 --- a/content/html/content/src/nsHTMLMediaElement.cpp
       
   121 +++ b/content/html/content/src/nsHTMLMediaElement.cpp
       
   122 @@ -2148,34 +2148,29 @@ char const *const nsHTMLMediaElement::gH
       
   123  #ifdef MOZ_GSTREAMER
       
   124  const char nsHTMLMediaElement::gH264Types[3][16] = {
       
   125    "video/mp4",
       
   126    "video/3gpp",
       
   127    "video/quicktime",
       
   128  };
       
   129  
       
   130  bool
       
   131 -nsHTMLMediaElement::IsH264Enabled()
       
   132 +nsHTMLMediaElement::IsGStreamerEnabled()
       
   133  {
       
   134 -  return Preferences::GetBool("media.h264.enabled");
       
   135 +  return Preferences::GetBool("media.gstreamer.enabled");
       
   136  }
       
   137  
       
   138  bool
       
   139  nsHTMLMediaElement::IsH264Type(const nsACString& aType)
       
   140  {
       
   141 -  if (!IsH264Enabled()) {
       
   142 -    return false;
       
   143 -  }
       
   144 -
       
   145    for (uint32_t i = 0; i < ArrayLength(gH264Types); ++i) {
       
   146      if (aType.EqualsASCII(gH264Types[i])) {
       
   147        return true;
       
   148      }
       
   149    }
       
   150 -
       
   151    return false;
       
   152  }
       
   153  #endif
       
   154  
       
   155  #ifdef MOZ_WIDGET_GONK
       
   156  const char nsHTMLMediaElement::gOmxTypes[5][16] = {
       
   157    "audio/mpeg",
       
   158    "audio/mp4",
       
   159 @@ -2424,34 +2419,63 @@ nsHTMLMediaElement::CanPlayType(const ns
       
   160    default:
       
   161    case CANPLAY_MAYBE:
       
   162      aResult.AssignLiteral("maybe");
       
   163      break;
       
   164    }
       
   165    return NS_OK;
       
   166  }
       
   167  
       
   168 +#ifdef MOZ_GSTREAMER
       
   169 +bool
       
   170 +nsHTMLMediaElement::IsGStreamerSupportedType(const nsACString& aMimeType)
       
   171 +{
       
   172 +  if (!IsGStreamerEnabled())
       
   173 +    return false;
       
   174 +  if (IsH264Type(aMimeType))
       
   175 +    return true;
       
   176 +  if (!Preferences::GetBool("media.prefer-gstreamer", false))
       
   177 +    return false;
       
   178 +#ifdef MOZ_WEBM
       
   179 +  if (IsWebMType(aMimeType))
       
   180 +    return true;
       
   181 +#endif
       
   182 +#ifdef MOZ_OGG
       
   183 +  if (IsOggType(aMimeType))
       
   184 +    return true;
       
   185 +#endif
       
   186 +  return false;
       
   187 +}
       
   188 +#endif
       
   189 +
       
   190  already_AddRefed<nsMediaDecoder>
       
   191  nsHTMLMediaElement::CreateDecoder(const nsACString& aType)
       
   192  {
       
   193 +#ifdef MOZ_GSTREAMER
       
   194 +  // When enabled, use GStreamer for H.264, but not for codecs handled by our
       
   195 +  // bundled decoders, unless the "media.prefer-gstreamer" pref is set.
       
   196 +  if (IsGStreamerSupportedType(aType)) {
       
   197 +    nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
       
   198 +    if (decoder->Init(this)) {
       
   199 +      return decoder.forget();
       
   200 +    }
       
   201 +  }
       
   202 +#endif
       
   203 +
       
   204  #ifdef MOZ_RAW
       
   205    if (IsRawType(aType)) {
       
   206      nsRefPtr<nsRawDecoder> decoder = new nsRawDecoder();
       
   207      if (decoder->Init(this)) {
       
   208        return decoder.forget();
       
   209      }
       
   210    }
       
   211  #endif
       
   212  #ifdef MOZ_OGG
       
   213    if (IsOggType(aType)) {
       
   214 -#ifdef MOZ_GSTREAMER 
       
   215 -    nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
       
   216 -#else
       
   217      nsRefPtr<nsOggDecoder> decoder = new nsOggDecoder();
       
   218 -#endif
       
   219      if (decoder->Init(this)) {
       
   220        return decoder.forget();
       
   221      }
       
   222    }
       
   223  #endif
       
   224  #ifdef MOZ_WAVE
       
   225    if (IsWaveType(aType)) {
       
   226      nsRefPtr<nsWaveDecoder> decoder = new nsWaveDecoder();
       
   227 @@ -2473,44 +2497,32 @@ nsHTMLMediaElement::CreateDecoder(const 
       
   228      nsRefPtr<nsMediaPluginDecoder> decoder = new nsMediaPluginDecoder(aType);
       
   229      if (decoder->Init(this)) {
       
   230        return decoder.forget();
       
   231      }
       
   232    }
       
   233  #endif
       
   234  #ifdef MOZ_WEBM
       
   235    if (IsWebMType(aType)) {
       
   236 -#ifdef MOZ_GSTREAMER 
       
   237 -    nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
       
   238 -#else
       
   239      nsRefPtr<nsWebMDecoder> decoder = new nsWebMDecoder();
       
   240 -#endif
       
   241      if (decoder->Init(this)) {
       
   242        return decoder.forget();
       
   243      }
       
   244    }
       
   245  #endif
       
   246  
       
   247  #ifdef MOZ_DASH
       
   248    if (IsDASHMPDType(aType)) {
       
   249      nsRefPtr<nsDASHDecoder> decoder = new nsDASHDecoder();
       
   250      if (decoder->Init(this)) {
       
   251        return decoder.forget();
       
   252      }
       
   253    }
       
   254  #endif
       
   255  
       
   256 -#ifdef MOZ_GSTREAMER 
       
   257 -  if (IsH264Type(aType)) {
       
   258 -    nsRefPtr<nsGStreamerDecoder> decoder = new nsGStreamerDecoder();
       
   259 -    if (decoder->Init(this)) {
       
   260 -      return decoder.forget();
       
   261 -    }
       
   262 -  }
       
   263 -#endif
       
   264    return nullptr;
       
   265  }
       
   266  
       
   267  nsresult nsHTMLMediaElement::InitializeDecoderAsClone(nsMediaDecoder* aOriginal)
       
   268  {
       
   269    NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set");
       
   270    NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder");
       
   271  
       
   272 diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js
       
   273 --- a/modules/libpref/src/init/all.js
       
   274 +++ b/modules/libpref/src/init/all.js
       
   275 @@ -164,17 +164,17 @@ pref("media.wave.enabled", true);
       
   276  #endif
       
   277  #ifdef MOZ_WEBM
       
   278  pref("media.webm.enabled", true);
       
   279  #endif
       
   280  #ifdef MOZ_DASH
       
   281  pref("media.dash.enabled", true);
       
   282  #endif
       
   283  #ifdef MOZ_GSTREAMER
       
   284 -pref("media.h264.enabled", true);
       
   285 +pref("media.gstreamer.enabled", true);
       
   286  #endif
       
   287  #ifdef MOZ_WEBRTC
       
   288  pref("media.navigator.enabled", false);
       
   289  pref("media.peerconnection.enabled", false);
       
   290  pref("media.navigator.permission.disabled", false);
       
   291  #else
       
   292  #ifdef ANDROID
       
   293  pref("media.navigator.enabled", true);