diff options
Diffstat (limited to 'media/java/android/media/MediaCodec.java')
| -rw-r--r-- | media/java/android/media/MediaCodec.java | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 5fb4f12..420510a 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -827,8 +827,13 @@ final public class MediaCodec { invalidateByteBuffer(mCachedInputBuffers, index); mDequeuedInputBuffers.remove(index); } - native_queueInputBuffer( - index, offset, size, presentationTimeUs, flags); + try { + native_queueInputBuffer( + index, offset, size, presentationTimeUs, flags); + } catch (CryptoException | IllegalStateException e) { + revalidateByteBuffer(mCachedInputBuffers, index); + throw e; + } } private native final void native_queueInputBuffer( @@ -947,8 +952,13 @@ final public class MediaCodec { invalidateByteBuffer(mCachedInputBuffers, index); mDequeuedInputBuffers.remove(index); } - native_queueSecureInputBuffer( - index, offset, info, presentationTimeUs, flags); + try { + native_queueSecureInputBuffer( + index, offset, info, presentationTimeUs, flags); + } catch (CryptoException | IllegalStateException e) { + revalidateByteBuffer(mCachedInputBuffers, index); + throw e; + } } private native final void native_queueSecureInputBuffer( @@ -1270,6 +1280,18 @@ final public class MediaCodec { } } + private final void revalidateByteBuffer( + ByteBuffer[] buffers, int index) { + synchronized(mBufferLock) { + if (buffers != null && index >= 0 && index < buffers.length) { + ByteBuffer buffer = buffers[index]; + if (buffer != null) { + buffer.setAccessible(true); + } + } + } + } + private final void validateOutputByteBuffer( ByteBuffer[] buffers, int index, BufferInfo info) { if (buffers != null && index >= 0 && index < buffers.length) { @@ -1307,7 +1329,7 @@ final public class MediaCodec { } private final void freeAllTrackedBuffers() { - synchronized (mBufferLock) { + synchronized(mBufferLock) { freeByteBuffers(mCachedInputBuffers); freeByteBuffers(mCachedOutputBuffers); mCachedInputBuffers = null; |
