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

Side by Side Diff: media/base/android/media_codec_util.cc

Issue 2686963002: Fix and update MediaCodec blacklist. (Closed)
Patch Set: rebased. 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 unified diff | Download patch
« no previous file with comments | « media/base/android/media_codec_util.h ('k') | media/base/android/media_codec_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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_util.h" 5 #include "media/base/android/media_codec_util.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <vector>
10 11
11 #include "base/android/build_info.h" 12 #include "base/android/build_info.h"
12 #include "base/android/jni_android.h" 13 #include "base/android/jni_android.h"
13 #include "base/android/jni_array.h" 14 #include "base/android/jni_array.h"
14 #include "base/android/jni_string.h" 15 #include "base/android/jni_string.h"
15 #include "base/logging.h" 16 #include "base/logging.h"
17 #include "base/strings/string_piece.h"
16 #include "base/strings/string_util.h" 18 #include "base/strings/string_util.h"
17 #include "jni/CodecProfileLevelList_jni.h" 19 #include "jni/CodecProfileLevelList_jni.h"
18 #include "jni/MediaCodecUtil_jni.h" 20 #include "jni/MediaCodecUtil_jni.h"
19 #include "media/base/android/media_codec_bridge.h" 21 #include "media/base/android/media_codec_bridge.h"
20 #include "media/base/video_codecs.h" 22 #include "media/base/video_codecs.h"
21 #include "url/gurl.h" 23 #include "url/gurl.h"
22 24
23 using base::android::AttachCurrentThread; 25 using base::android::AttachCurrentThread;
24 using base::android::ConvertJavaStringToUTF8; 26 using base::android::ConvertJavaStringToUTF8;
25 using base::android::ConvertUTF8ToJavaString; 27 using base::android::ConvertUTF8ToJavaString;
26 using base::android::JavaIntArrayToIntVector; 28 using base::android::JavaIntArrayToIntVector;
27 using base::android::JavaRef; 29 using base::android::JavaRef;
28 using base::android::ScopedJavaLocalRef; 30 using base::android::ScopedJavaLocalRef;
31 using base::android::SDK_VERSION_JELLY_BEAN_MR2;
32 using base::android::SDK_VERSION_KITKAT;
33 using base::android::SDK_VERSION_LOLLIPOP_MR1;
29 34
30 namespace media { 35 namespace media {
31 36
32 namespace { 37 namespace {
33 38
34 const char kMp4aMimeType[] = "audio/mp4a-latm"; 39 const char kMp4aMimeType[] = "audio/mp4a-latm";
35 const char kOpusMimeType[] = "audio/opus"; 40 const char kOpusMimeType[] = "audio/opus";
36 const char kVorbisMimeType[] = "audio/vorbis"; 41 const char kVorbisMimeType[] = "audio/vorbis";
37 const char kAc3MimeType[] = "audio/ac3"; 42 const char kAc3MimeType[] = "audio/ac3";
38 const char kEac3MimeType[] = "audio/eac3"; 43 const char kEac3MimeType[] = "audio/eac3";
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 static bool IsEncoderSupportedByDevice(const std::string& android_mime_type) { 131 static bool IsEncoderSupportedByDevice(const std::string& android_mime_type) {
127 DCHECK(MediaCodecUtil::IsMediaCodecAvailable()); 132 DCHECK(MediaCodecUtil::IsMediaCodecAvailable());
128 JNIEnv* env = AttachCurrentThread(); 133 JNIEnv* env = AttachCurrentThread();
129 ScopedJavaLocalRef<jstring> j_mime = 134 ScopedJavaLocalRef<jstring> j_mime =
130 ConvertUTF8ToJavaString(env, android_mime_type); 135 ConvertUTF8ToJavaString(env, android_mime_type);
131 return Java_MediaCodecUtil_isEncoderSupportedByDevice(env, j_mime); 136 return Java_MediaCodecUtil_isEncoderSupportedByDevice(env, j_mime);
132 } 137 }
133 138
134 // static 139 // static
135 bool MediaCodecUtil::IsMediaCodecAvailable() { 140 bool MediaCodecUtil::IsMediaCodecAvailable() {
136 // Blacklist some devices on Jellybean as MediaCodec is buggy. 141 return IsMediaCodecAvailableFor(
137 // http://crbug.com/365494, http://crbug.com/615872 142 base::android::BuildInfo::GetInstance()->sdk_int(),
138 // Blacklist Lenovo A6600 / A6800 on KitKat, which tends to crash a lot. 143 base::android::BuildInfo::GetInstance()->model());
139 // See crbug.com/628059 . We include < K since they don't exist.
140 // Blacklist Samsung Galaxy Star Pro (GT-S7262) (crbug.com/634920).
141 // GT-S5282 and GT-I8552 are for crbug.com/634920 .
142 if (base::android::BuildInfo::GetInstance()->sdk_int() <= 19) {
143 std::string model(base::android::BuildInfo::GetInstance()->model());
144 return model != "GT-I9100" && model != "GT-I9300" && model != "GT-N7000" &&
145 model != "GT-N7100" && model != "A6600" && model != "A6800" &&
146 model != "GT-S7262" && model != "GT-S5282" && model != "GT-I8552";
147 } else if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) {
148 // For JB, these tend to fail often (crbug.com/654905), but not with K+.
149 std::string model(base::android::BuildInfo::GetInstance()->model());
150 return model != "GT-P3113" && model != "GT-P5110" && model != "GT-P5100" &&
151 model != "GT-P5113" && model != "GT-P3110" && model != "GT-N5110" &&
152 model != "e-tab4" && model != "GT-I8200Q";
153 }
154
155 return true;
156 } 144 }
157 145
158 // static 146 // static
147 bool MediaCodecUtil::IsMediaCodecAvailableFor(int sdk, const char* model) {
148 // We will blacklist the model on any sdk that is as old or older than
149 // |last_bad_sdk| for the given model.
150 struct BlacklistEntry {
151 BlacklistEntry(const char* m, int s) : model(m), last_bad_sdk(s) {}
152 base::StringPiece model;
153 int last_bad_sdk;
154 bool operator==(const BlacklistEntry& other) const {
155 // Search on name only. Ignore |last_bad_sdk|.
156 return model == other.model;
157 }
158 };
159 static const std::vector<BlacklistEntry> blacklist = {
160 // crbug.com/653905
161 {"LGMS330", SDK_VERSION_LOLLIPOP_MR1},
162
163 // crbug.com/615872
164 {"GT-I9100", SDK_VERSION_KITKAT},
165 {"GT-I9300", SDK_VERSION_KITKAT},
166 {"GT-N7000", SDK_VERSION_KITKAT},
167 {"GT-N7100", SDK_VERSION_KITKAT},
168
169 // crbug.com/628509
170 {"A6600", SDK_VERSION_KITKAT},
171 {"A6800", SDK_VERSION_KITKAT},
172
173 // crbug.com/634920
174 {"GT-S7262", SDK_VERSION_KITKAT},
175 {"GT-S5282", SDK_VERSION_KITKAT},
176 {"GT-I8552", SDK_VERSION_KITKAT},
177
178 // crbug.com/365494, crbug.com/615872
179 {"GT-P3113", SDK_VERSION_JELLY_BEAN_MR2},
180 {"GT-P5110", SDK_VERSION_JELLY_BEAN_MR2},
181 {"GT-P5100", SDK_VERSION_JELLY_BEAN_MR2},
182 {"GT-P5113", SDK_VERSION_JELLY_BEAN_MR2},
183 {"GT-P3110", SDK_VERSION_JELLY_BEAN_MR2},
184 {"GT-N5110", SDK_VERSION_JELLY_BEAN_MR2},
185 {"e-tab4", SDK_VERSION_JELLY_BEAN_MR2},
186 {"GT-I8200Q", SDK_VERSION_JELLY_BEAN_MR2},
187 };
188
189 const auto iter =
190 std::find(blacklist.begin(), blacklist.end(), BlacklistEntry(model, 0));
191 return iter == blacklist.end() || sdk > iter->last_bad_sdk;
192 }
193
194 // static
159 bool MediaCodecUtil::SupportsSetParameters() { 195 bool MediaCodecUtil::SupportsSetParameters() {
160 // MediaCodec.setParameters() is only available starting with K. 196 // MediaCodec.setParameters() is only available starting with K.
161 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; 197 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19;
162 } 198 }
163 199
164 // static 200 // static
165 std::set<int> MediaCodecUtil::GetEncoderColorFormats( 201 std::set<int> MediaCodecUtil::GetEncoderColorFormats(
166 const std::string& mime_type) { 202 const std::string& mime_type) {
167 std::set<int> color_formats; 203 std::set<int> color_formats;
168 if (!IsMediaCodecAvailable()) 204 if (!IsMediaCodecAvailable())
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 (sdk_int == 18 && ("OMX.SEC.avc.dec" == codec_name || 362 (sdk_int == 18 && ("OMX.SEC.avc.dec" == codec_name ||
327 "OMX.SEC.avc.dec.secure" == codec_name)) || 363 "OMX.SEC.avc.dec.secure" == codec_name)) ||
328 (sdk_int == 19 && 364 (sdk_int == 19 &&
329 base::StartsWith(base::android::BuildInfo::GetInstance()->model(), 365 base::StartsWith(base::android::BuildInfo::GetInstance()->model(),
330 "SM-G800", base::CompareCase::INSENSITIVE_ASCII) && 366 "SM-G800", base::CompareCase::INSENSITIVE_ASCII) &&
331 ("OMX.Exynos.avc.dec" == codec_name || 367 ("OMX.Exynos.avc.dec" == codec_name ||
332 "OMX.Exynos.avc.dec.secure" == codec_name)); 368 "OMX.Exynos.avc.dec.secure" == codec_name));
333 } 369 }
334 370
335 } // namespace media 371 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_codec_util.h ('k') | media/base/android/media_codec_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698