Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 package org.chromium.media; | 5 package org.chromium.media; |
| 6 | 6 |
| 7 import android.media.AudioFormat; | 7 import android.media.AudioFormat; |
| 8 import android.media.AudioManager; | 8 import android.media.AudioManager; |
| 9 import android.media.AudioTrack; | 9 import android.media.AudioTrack; |
| 10 import android.media.MediaCodec; | 10 import android.media.MediaCodec; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 55 private static final int MAX_ADAPTIVE_PLAYBACK_HEIGHT = 1080; | 55 private static final int MAX_ADAPTIVE_PLAYBACK_HEIGHT = 1080; |
| 56 | 56 |
| 57 // After a flush(), dequeueOutputBuffer() can often produce empty presentati on timestamps | 57 // After a flush(), dequeueOutputBuffer() can often produce empty presentati on timestamps |
| 58 // for several frames. As a result, the player may find that the time does n ot increase | 58 // for several frames. As a result, the player may find that the time does n ot increase |
| 59 // after decoding a frame. To detect this, we check whether the presentation timestamp from | 59 // after decoding a frame. To detect this, we check whether the presentation timestamp from |
| 60 // dequeueOutputBuffer() is larger than input_timestamp - MAX_PRESENTATION_T IMESTAMP_SHIFT_US | 60 // dequeueOutputBuffer() is larger than input_timestamp - MAX_PRESENTATION_T IMESTAMP_SHIFT_US |
| 61 // after a flush. And we set the presentation timestamp from dequeueOutputBu ffer() to be | 61 // after a flush. And we set the presentation timestamp from dequeueOutputBu ffer() to be |
| 62 // non-decreasing for the remaining frames. | 62 // non-decreasing for the remaining frames. |
| 63 private static final long MAX_PRESENTATION_TIMESTAMP_SHIFT_US = 100000; | 63 private static final long MAX_PRESENTATION_TIMESTAMP_SHIFT_US = 100000; |
| 64 | 64 |
| 65 // TODO(qinmin): Use MediaFormat constants when part of the public API. | |
| 66 private static final String KEY_CROP_LEFT = "crop-left"; | |
| 67 private static final String KEY_CROP_RIGHT = "crop-right"; | |
| 68 private static final String KEY_CROP_BOTTOM = "crop-bottom"; | |
| 69 private static final String KEY_CROP_TOP = "crop-top"; | |
| 70 | |
| 65 private ByteBuffer[] mInputBuffers; | 71 private ByteBuffer[] mInputBuffers; |
| 66 private ByteBuffer[] mOutputBuffers; | 72 private ByteBuffer[] mOutputBuffers; |
| 67 | 73 |
| 68 private MediaCodec mMediaCodec; | 74 private MediaCodec mMediaCodec; |
| 69 private AudioTrack mAudioTrack; | 75 private AudioTrack mAudioTrack; |
| 70 private boolean mFlushed; | 76 private boolean mFlushed; |
| 71 private long mLastPresentationTimeUs; | 77 private long mLastPresentationTimeUs; |
| 72 private String mMime; | 78 private String mMime; |
| 73 private boolean mAdaptivePlaybackSupported; | 79 private boolean mAdaptivePlaybackSupported; |
| 74 | 80 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 237 for (int i = 0; i < count; ++i) { | 243 for (int i = 0; i < count; ++i) { |
| 238 MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i); | 244 MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i); |
| 239 if (!info.isEncoder()) | 245 if (!info.isEncoder()) |
| 240 continue; | 246 continue; |
| 241 | 247 |
| 242 String[] supportedTypes = info.getSupportedTypes(); | 248 String[] supportedTypes = info.getSupportedTypes(); |
| 243 for (int j = 0; j < supportedTypes.length; ++j) { | 249 for (int j = 0; j < supportedTypes.length; ++j) { |
| 244 if (!supportedTypes[j].equalsIgnoreCase(mime)) | 250 if (!supportedTypes[j].equalsIgnoreCase(mime)) |
| 245 continue; | 251 continue; |
| 246 | 252 |
| 247 MediaCodecInfo.CodecCapabilities capabilities = | 253 MediaCodecInfo.CodecCapabilities capabilities = info.getCapabili tiesForType(mime); |
|
gunsch
2014/11/05 00:05:51
note: this change was due to a presubmit error, pr
qinmin
2014/11/05 00:28:00
this line is now more than 100 chars long, what is
gunsch
2014/11/05 00:31:44
Yes, indentation was the warning. This is only 98
| |
| 248 info.getCapabilitiesForType(mime); | |
| 249 return capabilities.colorFormats; | 254 return capabilities.colorFormats; |
| 250 } | 255 } |
| 251 } | 256 } |
| 252 return null; | 257 return null; |
| 253 } | 258 } |
| 254 | 259 |
| 255 @SuppressWarnings("deprecation") | 260 @SuppressWarnings("deprecation") |
| 256 private static String getDecoderNameForMime(String mime) { | 261 private static String getDecoderNameForMime(String mime) { |
| 257 int count = MediaCodecList.getCodecCount(); | 262 int count = MediaCodecList.getCodecCount(); |
| 258 for (int i = 0; i < count; ++i) { | 263 for (int i = 0; i < count; ++i) { |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 } | 399 } |
| 395 | 400 |
| 396 @CalledByNative | 401 @CalledByNative |
| 397 private void stop() { | 402 private void stop() { |
| 398 mMediaCodec.stop(); | 403 mMediaCodec.stop(); |
| 399 if (mAudioTrack != null) { | 404 if (mAudioTrack != null) { |
| 400 mAudioTrack.pause(); | 405 mAudioTrack.pause(); |
| 401 } | 406 } |
| 402 } | 407 } |
| 403 | 408 |
| 409 private boolean outputFormatHasCropValues(MediaFormat format) { | |
| 410 return format.containsKey(KEY_CROP_RIGHT) && format.containsKey(KEY_CROP _LEFT) | |
| 411 && format.containsKey(KEY_CROP_BOTTOM) && format.containsKey(KEY _CROP_TOP); | |
| 412 } | |
| 413 | |
| 404 @CalledByNative | 414 @CalledByNative |
| 405 private int getOutputHeight() { | 415 private int getOutputHeight() { |
| 406 return mMediaCodec.getOutputFormat().getInteger(MediaFormat.KEY_HEIGHT); | 416 MediaFormat format = mMediaCodec.getOutputFormat(); |
| 417 return outputFormatHasCropValues(format) | |
| 418 ? format.getInteger(KEY_CROP_BOTTOM) - format.getInteger(KEY_CRO P_TOP) + 1 | |
| 419 : format.getInteger(MediaFormat.KEY_HEIGHT); | |
| 407 } | 420 } |
| 408 | 421 |
| 409 @CalledByNative | 422 @CalledByNative |
| 410 private int getOutputWidth() { | 423 private int getOutputWidth() { |
| 411 return mMediaCodec.getOutputFormat().getInteger(MediaFormat.KEY_WIDTH); | 424 MediaFormat format = mMediaCodec.getOutputFormat(); |
| 425 return outputFormatHasCropValues(format) | |
| 426 ? format.getInteger(KEY_CROP_RIGHT) - format.getInteger(KEY_CROP _LEFT) + 1 | |
| 427 : format.getInteger(MediaFormat.KEY_WIDTH); | |
| 412 } | 428 } |
| 413 | 429 |
| 414 @CalledByNative | 430 @CalledByNative |
| 415 private ByteBuffer getInputBuffer(int index) { | 431 private ByteBuffer getInputBuffer(int index) { |
| 416 return mInputBuffers[index]; | 432 return mInputBuffers[index]; |
| 417 } | 433 } |
| 418 | 434 |
| 419 @CalledByNative | 435 @CalledByNative |
| 420 private ByteBuffer getOutputBuffer(int index) { | 436 private ByteBuffer getOutputBuffer(int index) { |
| 421 return mOutputBuffers[index]; | 437 return mOutputBuffers[index]; |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 712 return AudioFormat.CHANNEL_OUT_QUAD; | 728 return AudioFormat.CHANNEL_OUT_QUAD; |
| 713 case 6: | 729 case 6: |
| 714 return AudioFormat.CHANNEL_OUT_5POINT1; | 730 return AudioFormat.CHANNEL_OUT_5POINT1; |
| 715 case 8: | 731 case 8: |
| 716 return AudioFormat.CHANNEL_OUT_7POINT1; | 732 return AudioFormat.CHANNEL_OUT_7POINT1; |
| 717 default: | 733 default: |
| 718 return AudioFormat.CHANNEL_OUT_DEFAULT; | 734 return AudioFormat.CHANNEL_OUT_DEFAULT; |
| 719 } | 735 } |
| 720 } | 736 } |
| 721 } | 737 } |
| OLD | NEW |