| Index: media/base/android/media_codec_util.cc
|
| diff --git a/media/base/android/media_codec_util.cc b/media/base/android/media_codec_util.cc
|
| index 1949b72855ff84f82ae84c6729ecc78144445d77..3bb4fc7d39b02243dcf7fa9194457dcee9235f35 100644
|
| --- a/media/base/android/media_codec_util.cc
|
| +++ b/media/base/android/media_codec_util.cc
|
| @@ -35,8 +35,8 @@ using base::android::SDK_VERSION_LOLLIPOP_MR1;
|
| namespace media {
|
|
|
| namespace {
|
| -
|
| -const char kMp4aMimeType[] = "audio/mp4a-latm";
|
| +const char kMp3MimeType[] = "audio/mpeg";
|
| +const char kAacMimeType[] = "audio/mp4a-latm";
|
| const char kOpusMimeType[] = "audio/opus";
|
| const char kVorbisMimeType[] = "audio/vorbis";
|
| const char kAc3MimeType[] = "audio/ac3";
|
| @@ -45,64 +45,24 @@ const char kAvcMimeType[] = "video/avc";
|
| const char kHevcMimeType[] = "video/hevc";
|
| const char kVp8MimeType[] = "video/x-vnd.on2.vp8";
|
| const char kVp9MimeType[] = "video/x-vnd.on2.vp9";
|
| -
|
| } // namespace
|
|
|
| -static std::string CodecTypeToAndroidMimeType(const std::string& codec) {
|
| - // TODO(xhwang): Shall we handle more detailed strings like "mp4a.40.2"?
|
| - if (codec == "avc1")
|
| - return kAvcMimeType;
|
| - if (codec == "hvc1")
|
| - return kHevcMimeType;
|
| - if (codec == "mp4a")
|
| - return kMp4aMimeType;
|
| - if (codec == "vp8" || codec == "vp8.0")
|
| - return kVp8MimeType;
|
| - if (codec == "vp9" || codec == "vp9.0")
|
| - return kVp9MimeType;
|
| - if (codec == "vorbis")
|
| - return kVorbisMimeType;
|
| - if (codec == "opus")
|
| - return kOpusMimeType;
|
| - if (codec == "ac3")
|
| - return kAc3MimeType;
|
| - if (codec == "eac3")
|
| - return kEac3MimeType;
|
| -
|
| - DLOG(WARNING) << "Cannot convert codec to Android MIME type: " << codec;
|
| - return std::string();
|
| -}
|
| -
|
| -static VideoCodec AndroidCodecToCodecEnum(const std::string& codec) {
|
| - if (codec == "AVC")
|
| - return kCodecH264;
|
| - if (codec == "VP8")
|
| - return kCodecVP8;
|
| - if (codec == "VP9")
|
| - return kCodecVP9;
|
| - if (codec == "HEVC")
|
| - return kCodecHEVC;
|
| - DLOG(WARNING) << "Unknown video codec name \"" << codec << "\"";
|
| - return kUnknownVideoCodec;
|
| -}
|
| -
|
| static CodecProfileLevel MediaCodecProfileLevelToChromiumProfileLevel(
|
| JNIEnv* env,
|
| const jobject& j_codec_profile_level) {
|
| - ScopedJavaLocalRef<jstring> codec =
|
| - Java_CodecProfileLevelAdapter_getCodec(env, j_codec_profile_level);
|
| - int profile =
|
| - Java_CodecProfileLevelAdapter_getProfile(env, j_codec_profile_level);
|
| + VideoCodec codec = static_cast<VideoCodec>(
|
| + Java_CodecProfileLevelAdapter_getCodec(env, j_codec_profile_level));
|
| + VideoCodecProfile profile = static_cast<VideoCodecProfile>(
|
| + Java_CodecProfileLevelAdapter_getProfile(env, j_codec_profile_level));
|
| int level =
|
| Java_CodecProfileLevelAdapter_getLevel(env, j_codec_profile_level);
|
| - return {AndroidCodecToCodecEnum(ConvertJavaStringToUTF8(codec)),
|
| - static_cast<VideoCodecProfile>(profile), level};
|
| + return {codec, profile, level};
|
| }
|
|
|
| static bool IsSupportedAndroidMimeType(const std::string& mime_type) {
|
| std::vector<std::string> supported{
|
| - kMp4aMimeType, kOpusMimeType, kVorbisMimeType, kAvcMimeType,
|
| - kHevcMimeType, kVp8MimeType, kVp9MimeType};
|
| + kMp3MimeType, kAacMimeType, kOpusMimeType, kVorbisMimeType,
|
| + kAvcMimeType, kHevcMimeType, kVp8MimeType, kVp9MimeType};
|
| return std::find(supported.begin(), supported.end(), mime_type) !=
|
| supported.end();
|
| }
|
| @@ -114,8 +74,8 @@ static std::string GetDefaultCodecName(const std::string& mime_type,
|
| JNIEnv* env = AttachCurrentThread();
|
| ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime_type);
|
| ScopedJavaLocalRef<jstring> j_codec_name =
|
| - Java_MediaCodecUtil_getDefaultCodecName(env, j_mime, direction,
|
| - require_software_codec);
|
| + Java_MediaCodecUtil_getDefaultCodecName(
|
| + env, j_mime, static_cast<int>(direction), require_software_codec);
|
| return ConvertJavaStringToUTF8(env, j_codec_name.obj());
|
| }
|
|
|
| @@ -137,6 +97,42 @@ static bool IsEncoderSupportedByDevice(const std::string& android_mime_type) {
|
| }
|
|
|
| // static
|
| +std::string MediaCodecUtil::CodecToAndroidMimeType(AudioCodec codec) {
|
| + switch (codec) {
|
| + case kCodecMP3:
|
| + return kMp3MimeType;
|
| + case kCodecVorbis:
|
| + return kVorbisMimeType;
|
| + case kCodecOpus:
|
| + return kOpusMimeType;
|
| + case kCodecAAC:
|
| + return kAacMimeType;
|
| + case kCodecAC3:
|
| + return kAc3MimeType;
|
| + case kCodecEAC3:
|
| + return kEac3MimeType;
|
| + default:
|
| + return std::string();
|
| + }
|
| +}
|
| +
|
| +// static
|
| +std::string MediaCodecUtil::CodecToAndroidMimeType(VideoCodec codec) {
|
| + switch (codec) {
|
| + case kCodecH264:
|
| + return kAvcMimeType;
|
| + case kCodecHEVC:
|
| + return kHevcMimeType;
|
| + case kCodecVP8:
|
| + return kVp8MimeType;
|
| + case kCodecVP9:
|
| + return kVp9MimeType;
|
| + default:
|
| + return std::string();
|
| + }
|
| +}
|
| +
|
| +// static
|
| bool MediaCodecUtil::IsMediaCodecAvailable() {
|
| return IsMediaCodecAvailableFor(
|
| base::android::BuildInfo::GetInstance()->sdk_int(),
|
| @@ -219,14 +215,24 @@ std::set<int> MediaCodecUtil::GetEncoderColorFormats(
|
| }
|
|
|
| // static
|
| -bool MediaCodecUtil::CanDecode(const std::string& codec, bool is_secure) {
|
| +bool MediaCodecUtil::CanDecode(VideoCodec codec, bool is_secure) {
|
| + return CanDecodeInternal(CodecToAndroidMimeType(codec), is_secure);
|
| +}
|
| +
|
| +// static
|
| +bool MediaCodecUtil::CanDecode(AudioCodec codec) {
|
| + return CanDecodeInternal(CodecToAndroidMimeType(codec), false);
|
| +}
|
| +
|
| +// static
|
| +bool MediaCodecUtil::CanDecodeInternal(const std::string& mime,
|
| + bool is_secure) {
|
| if (!IsMediaCodecAvailable())
|
| return false;
|
| -
|
| - JNIEnv* env = AttachCurrentThread();
|
| - std::string mime = CodecTypeToAndroidMimeType(codec);
|
| if (mime.empty())
|
| return false;
|
| +
|
| + JNIEnv* env = AttachCurrentThread();
|
| ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime);
|
| return Java_MediaCodecUtil_canDecode(env, j_mime, is_secure);
|
| }
|
| @@ -251,16 +257,15 @@ bool MediaCodecUtil::AddSupportedCodecProfileLevels(
|
| }
|
|
|
| // static
|
| -bool MediaCodecUtil::IsKnownUnaccelerated(const std::string& android_mime_type,
|
| +bool MediaCodecUtil::IsKnownUnaccelerated(VideoCodec codec,
|
| MediaCodecDirection direction) {
|
| - DCHECK(IsSupportedAndroidMimeType(android_mime_type));
|
| if (!IsMediaCodecAvailable())
|
| return true;
|
|
|
| std::string codec_name =
|
| - GetDefaultCodecName(android_mime_type, direction, false);
|
| - DVLOG(1) << __func__ << "Default codec for " << android_mime_type << " : "
|
| - << codec_name << ", direction: " << direction;
|
| + GetDefaultCodecName(CodecToAndroidMimeType(codec), direction, false);
|
| + DVLOG(1) << __func__ << "Default codec for " << GetCodecName(codec) << " : "
|
| + << codec_name << ", direction: " << static_cast<int>(direction);
|
| if (codec_name.empty())
|
| return true;
|
|
|
| @@ -268,10 +273,10 @@ bool MediaCodecUtil::IsKnownUnaccelerated(const std::string& android_mime_type,
|
| // MediaTek hardware vp9 is known crashy, see http://crbug.com/446974 and
|
| // http://crbug.com/597836.
|
| if (base::StartsWith(codec_name, "OMX.MTK.", base::CompareCase::SENSITIVE)) {
|
| - if (android_mime_type == kVp8MimeType)
|
| + if (codec == kCodecVP8)
|
| return true;
|
|
|
| - if (android_mime_type == kVp9MimeType)
|
| + if (codec == kCodecVP9)
|
| return base::android::BuildInfo::GetInstance()->sdk_int() < 21;
|
|
|
| return false;
|
|
|