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

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

Issue 2697643003: media: Clean up MediaCodecBridge and remove subclasses (Closed)
Patch Set: Remove static initializers (thanks to dale's suggestion) 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
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

Powered by Google App Engine
This is Rietveld 408576698