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..6d74769e26257e3c894ce9c1490a43b2870b052d 100644 |
--- a/media/base/android/media_codec_util.cc |
+++ b/media/base/android/media_codec_util.cc |
@@ -28,10 +28,10 @@ using base::android::JavaRef; |
using base::android::ScopedJavaLocalRef; |
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"; |
@@ -43,31 +43,6 @@ 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; |
@@ -96,8 +71,8 @@ static CodecProfileLevel MediaCodecProfileLevelToChromiumProfileLevel( |
static bool IsSupportedAndroidMimeType(const std::string& mime_type) { |
std::vector<std::string> supported{ |
- kMp4aMimeType, kOpusMimeType, kVorbisMimeType, kAvcMimeType, |
- kHevcMimeType, kVp8MimeType, kVp9MimeType}; |
+ kMp3MimeType, kAacMimeType, kOpusMimeType, kVorbisMimeType, |
watk
2017/02/14 01:40:51
I added mp3 here. Seems like it was missing before
|
+ kAvcMimeType, kHevcMimeType, kVp8MimeType, kVp9MimeType}; |
return std::find(supported.begin(), supported.end(), mime_type) != |
supported.end(); |
} |
@@ -109,8 +84,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 +107,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() { |
// Blacklist some devices on Jellybean as MediaCodec is buggy. |
// http://crbug.com/365494, http://crbug.com/615872 |
@@ -183,14 +194,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 +225,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 +241,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; |