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

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

Issue 605883002: Fix wrong selection of VP8 video decoder on some Samsung devices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change IsKnownUnaccelerated to use default codec name instead of first codec in MediaCodecList. Created 6 years, 3 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_bridge.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/android/media_codec_bridge.cc
diff --git a/media/base/android/media_codec_bridge.cc b/media/base/android/media_codec_bridge.cc
index 7ece5d558e6fa03937e5efc3b6fb1a1d5cbcccfb..70409e5464041f569cbfbedf76a05d468a9dbd4f 100644
--- a/media/base/android/media_codec_bridge.cc
+++ b/media/base/android/media_codec_bridge.cc
@@ -114,6 +114,12 @@ bool MediaCodecBridge::SupportsSetParameters() {
}
// static
+bool MediaCodecBridge::SupportsGetName() {
+ // MediaCodec.getName() is only available on JB MR2 and greater.
+ return base::android::BuildInfo::GetInstance()->sdk_int() >= 18;
+}
+
+// static
std::vector<MediaCodecBridge::CodecsInfo> MediaCodecBridge::GetCodecsInfo() {
std::vector<CodecsInfo> codecs_info;
if (!IsAvailable())
@@ -143,6 +149,20 @@ std::vector<MediaCodecBridge::CodecsInfo> MediaCodecBridge::GetCodecsInfo() {
}
// static
+std::string MediaCodecBridge::GetDefaultCodecName(
+ const std::string& mime_type,
+ MediaCodecDirection direction) {
+ if (!IsAvailable())
+ return std::string();
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime_type);
+ ScopedJavaLocalRef<jstring> j_codec_name =
+ Java_MediaCodecBridge_getDefaultCodecName(env, j_mime.obj(), direction);
+ return ConvertJavaStringToUTF8(env, j_codec_name.obj());
+}
+
+// static
bool MediaCodecBridge::CanDecode(const std::string& codec, bool is_secure) {
if (!IsAvailable())
return false;
@@ -167,19 +187,31 @@ bool MediaCodecBridge::IsKnownUnaccelerated(const std::string& mime_type,
if (!IsAvailable())
return true;
- std::string codec_type = AndroidMimeTypeToCodecType(mime_type);
- std::vector<media::MediaCodecBridge::CodecsInfo> codecs_info =
- MediaCodecBridge::GetCodecsInfo();
- for (size_t i = 0; i < codecs_info.size(); ++i) {
- if (codecs_info[i].codecs == codec_type &&
- codecs_info[i].direction == direction) {
- // It would be nice if MediaCodecInfo externalized some notion of
- // HW-acceleration but it doesn't. Android Media guidance is that the
- // prefix below is always used for SW decoders, so that's what we use.
- if (!StartsWithASCII(codecs_info[i].name, "OMX.google.", true))
- return false;
+ std::string codec_name;
+ if (SupportsGetName()) {
+ codec_name = GetDefaultCodecName(mime_type, direction);
+ } else {
+ std::string codec_type = AndroidMimeTypeToCodecType(mime_type);
+ std::vector<media::MediaCodecBridge::CodecsInfo> codecs_info =
+ MediaCodecBridge::GetCodecsInfo();
+ for (size_t i = 0; i < codecs_info.size(); ++i) {
+ if (codecs_info[i].codecs == codec_type &&
+ codecs_info[i].direction == direction) {
+ codec_name = codecs_info[i].name;
+ break;
+ }
}
}
+ DVLOG(1) << __PRETTY_FUNCTION__ << "Default codec for " << mime_type <<
+ " : " << codec_name;
+ // It would be nice if MediaCodecInfo externalized some notion of
+ // HW-acceleration but it doesn't. Android Media guidance is that the
+ // "OMX.google" prefix is always used for SW decoders, so that's what we
+ // use. "OMX.SEC.*" codec is Samsung software implementation - report it
+ // as unaccelerated as well.
+ if (codec_name.length() > 0)
qinmin 2014/09/30 18:14:24 nit: {} needed for if statement that spans multipl
+ return (StartsWithASCII(codec_name, "OMX.google.", true) ||
+ StartsWithASCII(codec_name, "OMX.SEC.", true));
return true;
}
« no previous file with comments | « media/base/android/media_codec_bridge.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698