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 0433a471ab7761edb371034623150fee010660fd..c9ae5ce9fcf30e13e5e9018f0521f42cee651289 100644 |
| --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java |
| +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java |
| @@ -74,6 +74,7 @@ class MediaCodecBridge { |
| private MediaCodec mMediaCodec; |
| private AudioTrack mAudioTrack; |
| + private byte[] mPendingAudioBuffer; |
| private boolean mFlushed; |
| private long mLastPresentationTimeUs; |
| private String mMime; |
| @@ -302,6 +303,7 @@ class MediaCodecBridge { |
| MediaCodec mediaCodec, String mime, boolean adaptivePlaybackSupported) { |
| assert mediaCodec != null; |
| mMediaCodec = mediaCodec; |
| + mPendingAudioBuffer = null; |
| mMime = mime; |
| mLastPresentationTimeUs = 0; |
| mFlushed = true; |
| @@ -366,6 +368,7 @@ class MediaCodecBridge { |
| if (mAudioTrack != null) { |
| mAudioTrack.release(); |
| } |
| + mPendingAudioBuffer = null; |
| } |
| @SuppressWarnings("deprecation") |
| @@ -413,6 +416,7 @@ class MediaCodecBridge { |
| // Need to call pause() here, or otherwise flush() is a no-op. |
| mAudioTrack.pause(); |
| mAudioTrack.flush(); |
| + mPendingAudioBuffer = null; |
| } |
| mMediaCodec.flush(); |
| } catch (IllegalStateException e) { |
| @@ -726,7 +730,14 @@ class MediaCodecBridge { |
| * hardware. This number resets to 0 after each flush call. |
| */ |
| @CalledByNative |
| - private long playOutputBuffer(byte[] buf) { |
| + private long playOutputBuffer(byte[] buf, boolean postpone) { |
| + if (postpone) { |
| + Log.v(TAG, "Saving pending buffer"); |
|
wolenetz
2015/08/20 20:37:36
nit: Is Log.v too spammy/verbose? I defer to qinmi
Tima Vaisburd
2015/08/20 22:36:36
I agree, deleted the two Log.v() lines.
|
| + assert mPendingAudioBuffer == null; |
|
wolenetz
2015/08/20 20:37:36
What protects (including any bridge java or .h met
Tima Vaisburd
2015/08/20 22:36:36
I added the documentation. Only the convention tha
|
| + mPendingAudioBuffer = buf; |
| + return 0; |
| + } |
| + |
| if (mAudioTrack == null) { |
|
wolenetz
2015/08/20 20:37:36
Is there really a case where we should allow cachi
Tima Vaisburd
2015/08/20 22:36:36
Done. I agree that mAudioTrack check is better be
|
| return 0; |
| } |
| @@ -734,7 +745,19 @@ class MediaCodecBridge { |
| if (AudioTrack.PLAYSTATE_PLAYING != mAudioTrack.getPlayState()) { |
| mAudioTrack.play(); |
| } |
| - int size = mAudioTrack.write(buf, 0, buf.length); |
| + |
| + int size = 0; |
| + if (mPendingAudioBuffer != null) { |
| + Log.v(TAG, "Writing pending buffer"); |
| + size = mAudioTrack.write(mPendingAudioBuffer, 0, mPendingAudioBuffer.length); |
| + if (mPendingAudioBuffer.length != size) { |
| + Log.i(TAG, "Failed to send all data to audio output, expected size: " |
| + + mPendingAudioBuffer.length + ", actual size: " + size); |
| + } |
| + mPendingAudioBuffer = null; |
| + } |
| + |
| + size = mAudioTrack.write(buf, 0, buf.length); |
| if (buf.length != size) { |
| Log.i(TAG, "Failed to send all data to audio output, expected size: " |
| + buf.length + ", actual size: " + size); |