Chromium Code Reviews| 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 b2d5f82ad46dea885013e1409e2254611b22796b..8f02b30b67c48aa1d994fdea8dce21a75f9e0a3b 100644 |
| --- a/media/base/android/media_codec_util.cc |
| +++ b/media/base/android/media_codec_util.cc |
| @@ -29,75 +29,35 @@ using base::android::ScopedJavaLocalRef; |
| namespace media { |
| -namespace { |
| - |
| -const char kMp4aMimeType[] = "audio/mp4a-latm"; |
| -const char kOpusMimeType[] = "audio/opus"; |
| -const char kVorbisMimeType[] = "audio/vorbis"; |
| -const char kAc3MimeType[] = "audio/ac3"; |
| -const char kEac3MimeType[] = "audio/eac3"; |
| -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; |
| -} |
| +namespace mime_type { |
|
liberato (no reviews please)
2017/02/14 17:44:11
these seem to be alternately named "android mime t
DaleCurtis
2017/02/14 18:10:32
I feel like these should share the values we have
watk
2017/02/14 23:28:57
I agree, but didn't see an obvious way to share, s
|
| +const char kMp3[] = "audio/mpeg"; |
| +const char kAac[] = "audio/mp4a-latm"; |
| +const char kOpus[] = "audio/opus"; |
| +const char kVorbis[] = "audio/vorbis"; |
| +const char kAc3[] = "audio/ac3"; |
| +const char kEac3[] = "audio/eac3"; |
| +const char kAvc[] = "video/avc"; |
| +const char kHevc[] = "video/hevc"; |
| +const char kVp8[] = "video/x-vnd.on2.vp8"; |
| +const char kVp9[] = "video/x-vnd.on2.vp9"; |
| +} // namespace mime_type |
| 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}; |
| + mime_type::kMp3, mime_type::kAac, mime_type::kOpus, mime_type::kVorbis, |
|
watk
2017/02/14 23:35:56
I added mp3 here, because I didn't know why it wou
DaleCurtis
2017/02/14 23:44:43
Probably because there are no protected content mp
|
| + mime_type::kAvc, mime_type::kHevc, mime_type::kVp8, mime_type::kVp9}; |
| return std::find(supported.begin(), supported.end(), mime_type) != |
| supported.end(); |
| } |
| @@ -109,8 +69,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()); |
| } |
| @@ -132,6 +92,42 @@ static bool IsEncoderSupportedByDevice(const std::string& android_mime_type) { |
| } |
| // static |
| +std::string MediaCodecUtil::CodecToAndroidMimeType(AudioCodec codec) { |
| + switch (codec) { |
| + case kCodecMP3: |
| + return mime_type::kMp3; |
| + case kCodecVorbis: |
| + return mime_type::kVorbis; |
| + case kCodecOpus: |
| + return mime_type::kOpus; |
| + case kCodecAAC: |
| + return mime_type::kAac; |
| + case kCodecAC3: |
| + return mime_type::kAc3; |
| + case kCodecEAC3: |
| + return mime_type::kEac3; |
| + default: |
| + return std::string(); |
| + } |
| +} |
| + |
| +// static |
| +std::string MediaCodecUtil::CodecToAndroidMimeType(VideoCodec codec) { |
| + switch (codec) { |
| + case kCodecH264: |
| + return mime_type::kAvc; |
| + case kCodecHEVC: |
| + return mime_type::kHevc; |
| + case kCodecVP8: |
| + return mime_type::kVp8; |
| + case kCodecVP9: |
| + return mime_type::kVp9; |
| + default: |
| + return std::string(); |
| + } |
| +} |
| + |
| +// static |
| bool MediaCodecUtil::IsMediaCodecAvailable() { |
| // Blacklist some devices on Jellybean as MediaCodec is buggy. |
| // http://crbug.com/365494, http://crbug.com/615872 |
| @@ -183,14 +179,13 @@ std::set<int> MediaCodecUtil::GetEncoderColorFormats( |
| } |
| // static |
| -bool MediaCodecUtil::CanDecode(const std::string& codec, bool is_secure) { |
| +bool MediaCodecUtil::CanDecode(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); |
| } |
| @@ -215,16 +210,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; |
| @@ -232,10 +226,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; |
| @@ -266,7 +260,7 @@ bool MediaCodecUtil::IsHLSURL(const GURL& url) { |
| // static |
| bool MediaCodecUtil::IsVp8DecoderAvailable() { |
| - return IsMediaCodecAvailable() && IsDecoderSupportedByDevice(kVp8MimeType); |
| + return IsMediaCodecAvailable() && IsDecoderSupportedByDevice(mime_type::kVp8); |
| } |
| // static |
| @@ -278,12 +272,12 @@ bool MediaCodecUtil::IsVp8EncoderAvailable() { |
| // static |
| bool MediaCodecUtil::IsVp9DecoderAvailable() { |
| - return IsMediaCodecAvailable() && IsDecoderSupportedByDevice(kVp9MimeType); |
| + return IsMediaCodecAvailable() && IsDecoderSupportedByDevice(mime_type::kVp9); |
| } |
| // static |
| bool MediaCodecUtil::IsH264EncoderAvailable() { |
| - return IsMediaCodecAvailable() && IsEncoderSupportedByDevice(kAvcMimeType); |
| + return IsMediaCodecAvailable() && IsEncoderSupportedByDevice(mime_type::kAvc); |
| } |
| // static |