/* static */ bool MP4Decoder::CanHandleMediaType(const nsACString& aType, const nsAString& aCodecs, bool& aOutContainsAAC, bool& aOutContainsH264, bool& aOutContainsMP3) { if (!IsEnabled()) { return false; } if (aType.EqualsASCII("audio/mp4") || aType.EqualsASCII("audio/x-m4a")) { return MP4Decoder::CanCreateAACDecoder() && (aCodecs.IsEmpty() || IsSupportedAudioCodec(aCodecs, aOutContainsAAC, aOutContainsMP3)); } #ifdef MOZ_GONK_MEDIACODEC if (aType.EqualsASCII(VIDEO_3GPP)) { return Preferences::GetBool("media.fragmented-mp4.gonk.enabled", false); } #endif if ((!aType.EqualsASCII("video/mp4") && !aType.EqualsASCII("video/x-m4v")) || !MP4Decoder::CanCreateH264Decoder()) { return false; } // Verify that all the codecs specifed are ones that we expect that // we can play. nsCharSeparatedTokenizer tokenizer(aCodecs, ','); bool expectMoreTokens = false; while (tokenizer.hasMoreTokens()) { const nsSubstring& token = tokenizer.nextToken(); expectMoreTokens = tokenizer.separatorAfterCurrentToken(); if (IsSupportedAudioCodec(token, aOutContainsAAC, aOutContainsMP3)) { continue; } if (IsSupportedH264Codec(token)) { aOutContainsH264 = true; continue; } return false; } if (expectMoreTokens) { // Last codec name was empty return false; } return true; }
bool WMFDecoder::CanPlayType(const nsACString& aType, const nsAString& aCodecs) { if (!MediaDecoder::IsWMFEnabled() || NS_FAILED(LoadDLLs())) { return false; } // Assume that if LoadDLLs() didn't fail, we can playback the types that // we know should be supported by Windows Media Foundation. if ((aType.EqualsASCII("audio/mpeg") || aType.EqualsASCII("audio/mp3")) && IsMP3Supported()) { // Note: We block MP3 playback on Window 7 SP0 since it seems to crash // in some circumstances. return !aCodecs.Length() || aCodecs.EqualsASCII("mp3"); } // AAC-LC or MP3 in M4A. if (aType.EqualsASCII("audio/mp4") || aType.EqualsASCII("audio/x-m4a")) { return !aCodecs.Length() || aCodecs.EqualsASCII("mp4a.40.2") || aCodecs.EqualsASCII("mp3"); } if (!aType.EqualsASCII("video/mp4")) { return false; } // H.264 + AAC in MP4. Verify that all the codecs specifed are ones that // we expect that we can play. nsCharSeparatedTokenizer tokenizer(aCodecs, ','); bool expectMoreTokens = false; while (tokenizer.hasMoreTokens()) { const nsSubstring& token = tokenizer.nextToken(); expectMoreTokens = tokenizer.separatorAfterCurrentToken(); if (token.EqualsASCII("mp4a.40.2") || // AAC-LC token.EqualsASCII("mp3") || IsSupportedH264Codec(token)) { continue; } return false; } if (expectMoreTokens) { // Last codec name was empty return false; } return true; }
/* static */ bool MP4Decoder::CanHandleMediaType(const nsACString& aType, const nsAString& aCodecs, bool& aOutContainsAAC, bool& aOutContainsH264, bool& aOutContainsMP3) { if (!IsEnabled()) { return false; } if (aType.EqualsASCII("audio/mp4") || aType.EqualsASCII("audio/x-m4a")) { return aCodecs.IsEmpty() || IsSupportedAudioCodec(aCodecs, aOutContainsAAC, aOutContainsMP3); } if (!aType.EqualsASCII("video/mp4")) { return false; } // Verify that all the codecs specifed are ones that we expect that // we can play. nsCharSeparatedTokenizer tokenizer(aCodecs, ','); bool expectMoreTokens = false; while (tokenizer.hasMoreTokens()) { const nsSubstring& token = tokenizer.nextToken(); expectMoreTokens = tokenizer.separatorAfterCurrentToken(); if (IsSupportedAudioCodec(token, aOutContainsAAC, aOutContainsMP3)) { continue; } if (IsSupportedH264Codec(token)) { aOutContainsH264 = true; continue; } return false; } if (expectMoreTokens) { // Last codec name was empty return false; } return true; }