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 }
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; }