Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(726)

Unified Diff: media/base/android/media_codec_util.cc

Issue 2697643003: media: Clean up MediaCodecBridge and remove subclasses (Closed)
Patch Set: rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/android/media_codec_util.h ('k') | media/base/android/mock_media_codec_bridge.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « media/base/android/media_codec_util.h ('k') | media/base/android/mock_media_codec_bridge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698