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

Side by Side 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: Addressing nit Created 6 years, 2 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 unified diff | Download patch
« no previous file with comments | « media/base/android/media_codec_bridge.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/base/android/media_codec_bridge.h" 5 #include "media/base/android/media_codec_bridge.h"
6 6
7 #include <jni.h> 7 #include <jni.h>
8 #include <string> 8 #include <string>
9 9
10 #include "base/android/build_info.h" 10 #include "base/android/build_info.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 return base::android::BuildInfo::GetInstance()->sdk_int() >= 16; 107 return base::android::BuildInfo::GetInstance()->sdk_int() >= 16;
108 } 108 }
109 109
110 // static 110 // static
111 bool MediaCodecBridge::SupportsSetParameters() { 111 bool MediaCodecBridge::SupportsSetParameters() {
112 // MediaCodec.setParameters() is only available starting with K. 112 // MediaCodec.setParameters() is only available starting with K.
113 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; 113 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19;
114 } 114 }
115 115
116 // static 116 // static
117 bool MediaCodecBridge::SupportsGetName() {
118 // MediaCodec.getName() is only available on JB MR2 and greater.
119 return base::android::BuildInfo::GetInstance()->sdk_int() >= 18;
120 }
121
122 // static
117 std::vector<MediaCodecBridge::CodecsInfo> MediaCodecBridge::GetCodecsInfo() { 123 std::vector<MediaCodecBridge::CodecsInfo> MediaCodecBridge::GetCodecsInfo() {
118 std::vector<CodecsInfo> codecs_info; 124 std::vector<CodecsInfo> codecs_info;
119 if (!IsAvailable()) 125 if (!IsAvailable())
120 return codecs_info; 126 return codecs_info;
121 127
122 JNIEnv* env = AttachCurrentThread(); 128 JNIEnv* env = AttachCurrentThread();
123 std::string mime_type; 129 std::string mime_type;
124 ScopedJavaLocalRef<jobjectArray> j_codec_info_array = 130 ScopedJavaLocalRef<jobjectArray> j_codec_info_array =
125 Java_MediaCodecBridge_getCodecsInfo(env); 131 Java_MediaCodecBridge_getCodecsInfo(env);
126 jsize len = env->GetArrayLength(j_codec_info_array.obj()); 132 jsize len = env->GetArrayLength(j_codec_info_array.obj());
127 for (jsize i = 0; i < len; ++i) { 133 for (jsize i = 0; i < len; ++i) {
128 ScopedJavaLocalRef<jobject> j_info( 134 ScopedJavaLocalRef<jobject> j_info(
129 env, env->GetObjectArrayElement(j_codec_info_array.obj(), i)); 135 env, env->GetObjectArrayElement(j_codec_info_array.obj(), i));
130 ScopedJavaLocalRef<jstring> j_codec_type = 136 ScopedJavaLocalRef<jstring> j_codec_type =
131 Java_CodecInfo_codecType(env, j_info.obj()); 137 Java_CodecInfo_codecType(env, j_info.obj());
132 ConvertJavaStringToUTF8(env, j_codec_type.obj(), &mime_type); 138 ConvertJavaStringToUTF8(env, j_codec_type.obj(), &mime_type);
133 ScopedJavaLocalRef<jstring> j_codec_name = 139 ScopedJavaLocalRef<jstring> j_codec_name =
134 Java_CodecInfo_codecName(env, j_info.obj()); 140 Java_CodecInfo_codecName(env, j_info.obj());
135 CodecsInfo info; 141 CodecsInfo info;
136 info.codecs = AndroidMimeTypeToCodecType(mime_type); 142 info.codecs = AndroidMimeTypeToCodecType(mime_type);
137 ConvertJavaStringToUTF8(env, j_codec_name.obj(), &info.name); 143 ConvertJavaStringToUTF8(env, j_codec_name.obj(), &info.name);
138 info.direction = static_cast<MediaCodecDirection>( 144 info.direction = static_cast<MediaCodecDirection>(
139 Java_CodecInfo_direction(env, j_info.obj())); 145 Java_CodecInfo_direction(env, j_info.obj()));
140 codecs_info.push_back(info); 146 codecs_info.push_back(info);
141 } 147 }
142 return codecs_info; 148 return codecs_info;
143 } 149 }
144 150
145 // static 151 // static
152 std::string MediaCodecBridge::GetDefaultCodecName(
153 const std::string& mime_type,
154 MediaCodecDirection direction) {
155 if (!IsAvailable())
156 return std::string();
157
158 JNIEnv* env = AttachCurrentThread();
159 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime_type);
160 ScopedJavaLocalRef<jstring> j_codec_name =
161 Java_MediaCodecBridge_getDefaultCodecName(env, j_mime.obj(), direction);
162 return ConvertJavaStringToUTF8(env, j_codec_name.obj());
163 }
164
165 // static
146 bool MediaCodecBridge::CanDecode(const std::string& codec, bool is_secure) { 166 bool MediaCodecBridge::CanDecode(const std::string& codec, bool is_secure) {
147 if (!IsAvailable()) 167 if (!IsAvailable())
148 return false; 168 return false;
149 169
150 JNIEnv* env = AttachCurrentThread(); 170 JNIEnv* env = AttachCurrentThread();
151 std::string mime = CodecTypeToAndroidMimeType(codec); 171 std::string mime = CodecTypeToAndroidMimeType(codec);
152 if (mime.empty()) 172 if (mime.empty())
153 return false; 173 return false;
154 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); 174 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime);
155 ScopedJavaLocalRef<jobject> j_media_codec_bridge = 175 ScopedJavaLocalRef<jobject> j_media_codec_bridge =
156 Java_MediaCodecBridge_create(env, j_mime.obj(), is_secure, false); 176 Java_MediaCodecBridge_create(env, j_mime.obj(), is_secure, false);
157 if (!j_media_codec_bridge.is_null()) { 177 if (!j_media_codec_bridge.is_null()) {
158 Java_MediaCodecBridge_release(env, j_media_codec_bridge.obj()); 178 Java_MediaCodecBridge_release(env, j_media_codec_bridge.obj());
159 return true; 179 return true;
160 } 180 }
161 return false; 181 return false;
162 } 182 }
163 183
164 // static 184 // static
165 bool MediaCodecBridge::IsKnownUnaccelerated(const std::string& mime_type, 185 bool MediaCodecBridge::IsKnownUnaccelerated(const std::string& mime_type,
166 MediaCodecDirection direction) { 186 MediaCodecDirection direction) {
167 if (!IsAvailable()) 187 if (!IsAvailable())
168 return true; 188 return true;
169 189
170 std::string codec_type = AndroidMimeTypeToCodecType(mime_type); 190 std::string codec_name;
171 std::vector<media::MediaCodecBridge::CodecsInfo> codecs_info = 191 if (SupportsGetName()) {
172 MediaCodecBridge::GetCodecsInfo(); 192 codec_name = GetDefaultCodecName(mime_type, direction);
173 for (size_t i = 0; i < codecs_info.size(); ++i) { 193 } else {
174 if (codecs_info[i].codecs == codec_type && 194 std::string codec_type = AndroidMimeTypeToCodecType(mime_type);
175 codecs_info[i].direction == direction) { 195 std::vector<media::MediaCodecBridge::CodecsInfo> codecs_info =
176 // It would be nice if MediaCodecInfo externalized some notion of 196 MediaCodecBridge::GetCodecsInfo();
177 // HW-acceleration but it doesn't. Android Media guidance is that the 197 for (size_t i = 0; i < codecs_info.size(); ++i) {
178 // prefix below is always used for SW decoders, so that's what we use. 198 if (codecs_info[i].codecs == codec_type &&
179 if (!StartsWithASCII(codecs_info[i].name, "OMX.google.", true)) 199 codecs_info[i].direction == direction) {
180 return false; 200 codec_name = codecs_info[i].name;
201 break;
202 }
181 } 203 }
182 } 204 }
205 DVLOG(1) << __PRETTY_FUNCTION__ << "Default codec for " << mime_type <<
206 " : " << codec_name;
207 // It would be nice if MediaCodecInfo externalized some notion of
208 // HW-acceleration but it doesn't. Android Media guidance is that the
209 // "OMX.google" prefix is always used for SW decoders, so that's what we
210 // use. "OMX.SEC.*" codec is Samsung software implementation - report it
211 // as unaccelerated as well.
212 if (codec_name.length() > 0) {
213 return (StartsWithASCII(codec_name, "OMX.google.", true) ||
214 StartsWithASCII(codec_name, "OMX.SEC.", true));
215 }
183 return true; 216 return true;
184 } 217 }
185 218
186 MediaCodecBridge::MediaCodecBridge(const std::string& mime, 219 MediaCodecBridge::MediaCodecBridge(const std::string& mime,
187 bool is_secure, 220 bool is_secure,
188 MediaCodecDirection direction) { 221 MediaCodecDirection direction) {
189 JNIEnv* env = AttachCurrentThread(); 222 JNIEnv* env = AttachCurrentThread();
190 CHECK(env); 223 CHECK(env);
191 DCHECK(!mime.empty()); 224 DCHECK(!mime.empty());
192 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); 225 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime);
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 JNIEnv* env = AttachCurrentThread(); 771 JNIEnv* env = AttachCurrentThread();
739 return Java_MediaCodecBridge_isAdaptivePlaybackSupported( 772 return Java_MediaCodecBridge_isAdaptivePlaybackSupported(
740 env, media_codec(), width, height); 773 env, media_codec(), width, height);
741 } 774 }
742 775
743 bool MediaCodecBridge::RegisterMediaCodecBridge(JNIEnv* env) { 776 bool MediaCodecBridge::RegisterMediaCodecBridge(JNIEnv* env) {
744 return RegisterNativesImpl(env); 777 return RegisterNativesImpl(env);
745 } 778 }
746 779
747 } // namespace media 780 } // namespace media
OLDNEW
« 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