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

Side by Side Diff: media/base/android/java/src/org/chromium/media/MediaCodecUtil.java

Issue 2697643003: media: Clean up MediaCodecBridge and remove subclasses (Closed)
Patch Set: rebase Created 3 years, 9 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
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 package org.chromium.media; 5 package org.chromium.media;
6 6
7 import android.annotation.TargetApi; 7 import android.annotation.TargetApi;
8 import android.media.MediaCodec; 8 import android.media.MediaCodec;
9 import android.media.MediaCodec.CryptoInfo; 9 import android.media.MediaCodec.CryptoInfo;
10 import android.media.MediaCodecInfo; 10 import android.media.MediaCodecInfo;
(...skipping 15 matching lines...) Expand all
26 import java.util.NoSuchElementException; 26 import java.util.NoSuchElementException;
27 27
28 /** 28 /**
29 * A collection of MediaCodec utility functions. 29 * A collection of MediaCodec utility functions.
30 */ 30 */
31 @JNINamespace("media") 31 @JNINamespace("media")
32 @MainDex 32 @MainDex
33 class MediaCodecUtil { 33 class MediaCodecUtil {
34 private static final String TAG = "cr_MediaCodecUtil"; 34 private static final String TAG = "cr_MediaCodecUtil";
35 35
36 // Codec direction. Keep this in sync with media_codec_direction.h.
37 static final int MEDIA_CODEC_DECODER = 0;
38 static final int MEDIA_CODEC_ENCODER = 1;
39
40 /** 36 /**
41 * Class to pass parameters from createDecoder() 37 * Class to pass parameters from createDecoder()
42 */ 38 */
43 public static class CodecCreationInfo { 39 public static class CodecCreationInfo {
44 public MediaCodec mediaCodec; 40 public MediaCodec mediaCodec;
45 public boolean supportsAdaptivePlayback; 41 public boolean supportsAdaptivePlayback;
46 public BitrateAdjustmentTypes bitrateAdjustmentType = BitrateAdjustmentT ypes.NO_ADJUSTMENT; 42 public BitrateAdjustmentTypes bitrateAdjustmentType = BitrateAdjustmentT ypes.NO_ADJUSTMENT;
47 } 43 }
48 44
49 public static final class MimeTypes { 45 public static final class MimeTypes {
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 * @param mime MIME type of the media. 137 * @param mime MIME type of the media.
142 * @param direction Whether this is encoder or decoder. 138 * @param direction Whether this is encoder or decoder.
143 * @param requireSoftwareCodec Whether we require a software codec. 139 * @param requireSoftwareCodec Whether we require a software codec.
144 * @return name of the codec. 140 * @return name of the codec.
145 */ 141 */
146 @CalledByNative 142 @CalledByNative
147 private static String getDefaultCodecName( 143 private static String getDefaultCodecName(
148 String mime, int direction, boolean requireSoftwareCodec) { 144 String mime, int direction, boolean requireSoftwareCodec) {
149 MediaCodecListHelper codecListHelper = new MediaCodecListHelper(); 145 MediaCodecListHelper codecListHelper = new MediaCodecListHelper();
150 for (MediaCodecInfo info : codecListHelper) { 146 for (MediaCodecInfo info : codecListHelper) {
151 int codecDirection = info.isEncoder() ? MEDIA_CODEC_ENCODER : MEDIA_ CODEC_DECODER; 147 int codecDirection =
148 info.isEncoder() ? MediaCodecDirection.ENCODER : MediaCodecD irection.DECODER;
152 if (codecDirection != direction) continue; 149 if (codecDirection != direction) continue;
153 150
154 if (requireSoftwareCodec && !isSoftwareCodec(info.getName())) contin ue; 151 if (requireSoftwareCodec && !isSoftwareCodec(info.getName())) contin ue;
155 152
156 for (String supportedType : info.getSupportedTypes()) { 153 for (String supportedType : info.getSupportedTypes()) {
157 if (supportedType.equalsIgnoreCase(mime)) return info.getName(); 154 if (supportedType.equalsIgnoreCase(mime)) return info.getName();
158 } 155 }
159 } 156 }
160 157
161 Log.e(TAG, "Decoder for type %s is not supported on this device", mime); 158 Log.e(TAG, "Decoder for type %s is not supported on this device", mime);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 final int[][] bitrateMapping = { 211 final int[][] bitrateMapping = {
215 {200, 10}, {800, 11}, {1800, 20}, {3600, 21}, {7200, 30}, {12000 , 31}, {18000, 40}, 212 {200, 10}, {800, 11}, {1800, 20}, {3600, 21}, {7200, 30}, {12000 , 31}, {18000, 40},
216 {30000, 41}, {60000, 50}, {120000, 51}, {180000, 52}, 213 {30000, 41}, {60000, 50}, {120000, 51}, {180000, 52},
217 }; 214 };
218 VideoCapabilities videoCapabilities = codecCapabilities.getVideoCapabili ties(); 215 VideoCapabilities videoCapabilities = codecCapabilities.getVideoCapabili ties();
219 for (int[] entry : bitrateMapping) { 216 for (int[] entry : bitrateMapping) {
220 int bitrate = entry[0]; 217 int bitrate = entry[0];
221 int level = entry[1]; 218 int level = entry[1];
222 if (videoCapabilities.getBitrateRange().contains(bitrate)) { 219 if (videoCapabilities.getBitrateRange().contains(bitrate)) {
223 // Assume all platforms before N only support VP9 profile 0. 220 // Assume all platforms before N only support VP9 profile 0.
224 profileLevels.addCodecProfileLevel("VP9", 12 /* VP9PROFILE_PROFI LE0 */, level); 221 profileLevels.addCodecProfileLevel(
222 VideoCodec.kCodecVP9, VideoCodecProfile.VP9PROFILE_PROFI LE0, level);
225 } 223 }
226 } 224 }
227 } 225 }
228 226
229 /** 227 /**
230 * Return an array of supported codecs and profiles. 228 * Return an array of supported codecs and profiles.
231 */ 229 */
232 @CalledByNative 230 @CalledByNative
233 private static Object[] getSupportedCodecProfileLevels() { 231 private static Object[] getSupportedCodecProfileLevels() {
234 CodecProfileLevelList profileLevels = new CodecProfileLevelList(); 232 CodecProfileLevelList profileLevels = new CodecProfileLevelList();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 272
275 // Do not create codec for blacklisted devices. 273 // Do not create codec for blacklisted devices.
276 if (!isDecoderSupportedForDevice(mime)) { 274 if (!isDecoderSupportedForDevice(mime)) {
277 Log.e(TAG, "Decoder for type %s is not supported on this device", mi me); 275 Log.e(TAG, "Decoder for type %s is not supported on this device", mi me);
278 return result; 276 return result;
279 } 277 }
280 278
281 try { 279 try {
282 // |isSecure| only applies to video decoders. 280 // |isSecure| only applies to video decoders.
283 if (mime.startsWith("video") && isSecure) { 281 if (mime.startsWith("video") && isSecure) {
284 String decoderName = 282 String decoderName = getDefaultCodecName(
285 getDefaultCodecName(mime, MEDIA_CODEC_DECODER, requireSo ftwareCodec); 283 mime, MediaCodecDirection.DECODER, requireSoftwareCodec) ;
286 if (decoderName.equals("")) return null; 284 if (decoderName.equals("")) return null;
287 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 285 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
288 // To work around an issue that we cannot get the codec info from the secure 286 // To work around an issue that we cannot get the codec info from the secure
289 // decoder, create an insecure decoder first so that we can query its codec 287 // decoder, create an insecure decoder first so that we can query its codec
290 // info. http://b/15587335. 288 // info. http://b/15587335.
291 // Futhermore, it is impossible to create an insecure decode r if the secure 289 // Futhermore, it is impossible to create an insecure decode r if the secure
292 // one is already created. 290 // one is already created.
293 MediaCodec insecureCodec = MediaCodec.createByCodecName(deco derName); 291 MediaCodec insecureCodec = MediaCodec.createByCodecName(deco derName);
294 result.supportsAdaptivePlayback = 292 result.supportsAdaptivePlayback =
295 codecSupportsAdaptivePlayback(insecureCodec, mime); 293 codecSupportsAdaptivePlayback(insecureCodec, mime);
296 insecureCodec.release(); 294 insecureCodec.release();
297 } 295 }
298 result.mediaCodec = MediaCodec.createByCodecName(decoderName + " .secure"); 296 result.mediaCodec = MediaCodec.createByCodecName(decoderName + " .secure");
299 } else { 297 } else {
300 if (requireSoftwareCodec) { 298 if (requireSoftwareCodec) {
301 String decoderName = 299 String decoderName = getDefaultCodecName(
302 getDefaultCodecName(mime, MEDIA_CODEC_DECODER, requi reSoftwareCodec); 300 mime, MediaCodecDirection.DECODER, requireSoftwareCo dec);
303 result.mediaCodec = MediaCodec.createByCodecName(decoderName ); 301 result.mediaCodec = MediaCodec.createByCodecName(decoderName );
304 } else { 302 } else {
305 result.mediaCodec = MediaCodec.createDecoderByType(mime); 303 result.mediaCodec = MediaCodec.createDecoderByType(mime);
306 } 304 }
307 result.supportsAdaptivePlayback = 305 result.supportsAdaptivePlayback =
308 codecSupportsAdaptivePlayback(result.mediaCodec, mime); 306 codecSupportsAdaptivePlayback(result.mediaCodec, mime);
309 } 307 }
310 } catch (Exception e) { 308 } catch (Exception e) {
311 Log.e(TAG, "Failed to create MediaCodec: %s, isSecure: %s, requireSo ftwareCodec: %s", 309 Log.e(TAG, "Failed to create MediaCodec: %s, isSecure: %s, requireSo ftwareCodec: %s",
312 mime, isSecure, requireSoftwareCodec ? "yes" : "no", e); 310 mime, isSecure, requireSoftwareCodec ? "yes" : "no", e);
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 * supported. 624 * supported.
627 * This method was introduced in Android N. Note that if platformSupportsCbc sEncryption 625 * This method was introduced in Android N. Note that if platformSupportsCbc sEncryption
628 * returns true, then this function will set the pattern. 626 * returns true, then this function will set the pattern.
629 */ 627 */
630 static void setPatternIfSupported(CryptoInfo cryptoInfo, int encrypt, int sk ip) { 628 static void setPatternIfSupported(CryptoInfo cryptoInfo, int encrypt, int sk ip) {
631 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 629 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
632 cryptoInfo.setPattern(new CryptoInfo.Pattern(encrypt, skip)); 630 cryptoInfo.setPattern(new CryptoInfo.Pattern(encrypt, skip));
633 } 631 }
634 } 632 }
635 } 633 }
OLDNEW
« no previous file with comments | « media/base/android/java/src/org/chromium/media/MediaCodecBridge.java ('k') | media/base/android/media_codec_bridge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698