static bool
IsPlayableWithGMP(mozIGeckoMediaPluginService* aGMPS,
                  const nsAString& aKeySystem,
                  const nsAString& aContentType)
{
#ifdef MOZ_FMP4
  nsContentTypeParser parser(aContentType);
  nsAutoString mimeType;
  nsresult rv = parser.GetType(mimeType);
  if (NS_FAILED(rv)) {
    return false;
  }

  if (!mimeType.EqualsLiteral("audio/mp4") &&
      !mimeType.EqualsLiteral("audio/x-m4a") &&
      !mimeType.EqualsLiteral("video/mp4")) {
    return false;
  }

  nsAutoString codecs;
  parser.GetParameter("codecs", codecs);

  NS_ConvertUTF16toUTF8 mimeTypeUTF8(mimeType);
  bool hasAAC = false;
  bool hasH264 = false;
  bool hasMP3 = false;
  if (!MP4Decoder::CanHandleMediaType(mimeTypeUTF8,
                                      codecs,
                                      hasAAC,
                                      hasH264,
                                      hasMP3) ||
      hasMP3) {
    return false;
  }
  return (!hasAAC ||
          !(HaveGMPFor(aGMPS,
                       NS_ConvertUTF16toUTF8(aKeySystem),
                       NS_LITERAL_CSTRING(GMP_API_DECRYPTOR),
                       NS_LITERAL_CSTRING("aac")) ||
            // XXX remove later in bug 1147692
            HaveGMPFor(aGMPS,
                       NS_ConvertUTF16toUTF8(aKeySystem),
                       NS_LITERAL_CSTRING(GMP_API_DECRYPTOR_COMPAT),
                       NS_LITERAL_CSTRING("aac")))) &&
         (!hasH264 ||
          !(HaveGMPFor(aGMPS,
                       NS_ConvertUTF16toUTF8(aKeySystem),
                       NS_LITERAL_CSTRING(GMP_API_DECRYPTOR),
                       NS_LITERAL_CSTRING("h264")) ||
            // XXX remove later in bug 1147692
            HaveGMPFor(aGMPS,
                       NS_ConvertUTF16toUTF8(aKeySystem),
                       NS_LITERAL_CSTRING(GMP_API_DECRYPTOR_COMPAT),
                       NS_LITERAL_CSTRING("h264"))));
#else
  return false;
#endif
}
Example #2
0
static nsresult
IsTypeSupported(const nsAString& aType)
{
  if (aType.IsEmpty()) {
    return NS_ERROR_DOM_INVALID_ACCESS_ERR;
  }
  nsContentTypeParser parser(aType);
  nsAutoString mimeType;
  nsresult rv = parser.GetType(mimeType);
  if (NS_FAILED(rv)) {
    return NS_ERROR_DOM_INVALID_STATE_ERR;
  }
  NS_ConvertUTF16toUTF8 mimeTypeUTF8(mimeType);

  nsAutoString codecs;
  bool hasCodecs = NS_SUCCEEDED(parser.GetParameter("codecs", codecs));

  for (uint32_t i = 0; gMediaSourceTypes[i]; ++i) {
    if (mimeType.EqualsASCII(gMediaSourceTypes[i])) {
      if (DecoderTraits::IsMP4TypeAndEnabled(mimeTypeUTF8)) {
        if (!Preferences::GetBool("media.mediasource.mp4.enabled", false)) {
          return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
        }
        if (hasCodecs &&
            DecoderTraits::CanHandleCodecsType(mimeTypeUTF8.get(),
                                               codecs) == CANPLAY_NO) {
          return NS_ERROR_DOM_INVALID_STATE_ERR;
        }
        return NS_OK;
      } else if (DecoderTraits::IsWebMTypeAndEnabled(mimeTypeUTF8)) {
        if (!(Preferences::GetBool("media.mediasource.webm.enabled", false) ||
              (Preferences::GetBool("media.mediasource.webm.audio.enabled", true) &&
               DecoderTraits::IsWebMAudioType(mimeTypeUTF8)) ||
              IsWebMForced())) {
          return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
        }
        if (hasCodecs &&
            DecoderTraits::CanHandleCodecsType(mimeTypeUTF8.get(),
                                               codecs) == CANPLAY_NO) {
          return NS_ERROR_DOM_INVALID_STATE_ERR;
        }
        return NS_OK;
      }
    }
  }

  return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
}