Chromium Code Reviews| Index: media/base/android/java/src/org/chromium/media/MediaCodecBridge.java |
| diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java |
| index 6834ed806c4b1dc44de79124f4f67e4e5921e9d4..e2e58d02cf0010320b2c6279a6ddcb5d2e6044aa 100644 |
| --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java |
| +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java |
| @@ -77,6 +77,7 @@ class MediaCodecBridge { |
| private long mLastPresentationTimeUs; |
| private String mMime; |
| private boolean mAdaptivePlaybackSupported; |
| + private int mSampleRate; |
| private static class DequeueInputResult { |
| private final int mStatus; |
| @@ -565,6 +566,15 @@ class MediaCodecBridge { |
| status = MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED; |
| } else if (indexOrStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { |
| status = MEDIA_CODEC_OUTPUT_FORMAT_CHANGED; |
| + MediaFormat newFormat = mMediaCodec.getOutputFormat(); |
| + if (newFormat.containsKey(MediaFormat.KEY_SAMPLE_RATE)) { |
| + int newSampleRate = newFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); |
| + if (newSampleRate != mSampleRate) { |
| + if (!reconfigureAudioTrack(newFormat)) { |
|
qinmin
2014/12/17 18:12:54
nit: simply combine this if statement with the abo
gunsch
2014/12/17 19:48:12
Done.
|
| + status = MEDIA_CODEC_ERROR; |
| + } |
| + } |
| + } |
| } else if (indexOrStatus == MediaCodec.INFO_TRY_AGAIN_LATER) { |
| status = MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER; |
| } else { |
| @@ -664,20 +674,8 @@ class MediaCodecBridge { |
| boolean playAudio) { |
| try { |
| mMediaCodec.configure(format, null, crypto, flags); |
| - if (playAudio) { |
| - int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE); |
| - int channelCount = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT); |
| - int channelConfig = getAudioFormat(channelCount); |
| - // Using 16bit PCM for output. Keep this value in sync with |
| - // kBytesPerAudioOutputSample in media_codec_bridge.cc. |
| - int minBufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, |
| - AudioFormat.ENCODING_PCM_16BIT); |
| - mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig, |
| - AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); |
| - if (mAudioTrack.getState() == AudioTrack.STATE_UNINITIALIZED) { |
| - mAudioTrack = null; |
| - return false; |
| - } |
| + if (playAudio && !reconfigureAudioTrack(format)) { |
| + return false; |
| } |
| return true; |
| } catch (IllegalStateException e) { |
| @@ -687,6 +685,35 @@ class MediaCodecBridge { |
| } |
| /** |
| + * Resets the AudioTrack instance, configured according to the given format. |
| + * If a previous AudioTrack instance already exists, release it. |
| + * |
| + * @param format The format from which to get sample rate and channel count. |
| + * @return Whether or not creating the AudioTrack succeeded. |
| + */ |
| + private boolean reconfigureAudioTrack(MediaFormat format) { |
| + if (mAudioTrack != null) { |
| + mAudioTrack.release(); |
| + } |
| + |
| + mSampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE); |
| + int channelCount = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT); |
| + int channelConfig = getAudioFormat(channelCount); |
| + // Using 16bit PCM for output. Keep this value in sync with |
| + // kBytesPerAudioOutputSample in media_codec_bridge.cc. |
| + int minBufferSize = AudioTrack.getMinBufferSize(mSampleRate, channelConfig, |
| + AudioFormat.ENCODING_PCM_16BIT); |
| + mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, mSampleRate, channelConfig, |
| + AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); |
| + if (mAudioTrack.getState() == AudioTrack.STATE_UNINITIALIZED) { |
| + mAudioTrack = null; |
| + Log.e(TAG, "Failed to initialize AudioTrack"); |
| + return false; |
| + } |
| + return true; |
| + } |
| + |
| + /** |
| * Play the audio buffer that is passed in. |
| * |
| * @param buf Audio buffer to be rendered. |