Index: webrtc/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java |
diff --git a/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java b/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java |
index 13ccedc26d8165c7333f89fe2355a3167e8d9085..b7aae2a33865e02f66e9a84f9c1a67bb54ed049d 100644 |
--- a/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java |
+++ b/webrtc/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java |
@@ -417,12 +417,11 @@ class HardwareVideoDecoder |
@Override |
public void onTextureFrameAvailable(int oesTextureId, float[] transformMatrix, long timestampNs) { |
VideoFrame.TextureBuffer oesBuffer = surfaceTextureHelper.createTextureBuffer( |
- renderedTextureMetadata.width, renderedTextureMetadata.height, transformMatrix); |
- |
- Matrix matrix = RendererCommon.convertMatrixToAndroidGraphicsMatrix(transformMatrix); |
+ renderedTextureMetadata.width, renderedTextureMetadata.height, |
+ RendererCommon.convertMatrixToAndroidGraphicsMatrix(transformMatrix)); |
VideoFrame frame = new VideoFrame(oesBuffer, renderedTextureMetadata.rotation, |
- renderedTextureMetadata.presentationTimestampUs * 1000, matrix); |
+ renderedTextureMetadata.presentationTimestampUs * 1000); |
callback.onDecodedFrame(frame, renderedTextureMetadata.decodeTimeMs, null /* qp */); |
frame.release(); |
} |
@@ -477,7 +476,7 @@ class HardwareVideoDecoder |
} |
long presentationTimeNs = info.presentationTimeUs * 1000; |
- VideoFrame frame = new VideoFrame(frameBuffer, rotation, presentationTimeNs, new Matrix()); |
+ VideoFrame frame = new VideoFrame(frameBuffer, rotation, presentationTimeNs); |
// Note that qp is parsed on the C++ side. |
callback.onDecodedFrame(frame, decodeTimeMs, null /* qp */); |
@@ -605,9 +604,9 @@ class HardwareVideoDecoder |
activeOutputBuffers++; |
} |
- I420BufferImpl.ReleaseCallback callback = new I420BufferImpl.ReleaseCallback() { |
+ Runnable callback = new Runnable() { |
@Override |
- public void onRelease() { |
+ public void run() { |
codec.releaseOutputBuffer(outputBufferIndex, false); |
synchronized (activeOutputBuffersLock) { |
activeOutputBuffers--; |
@@ -616,8 +615,20 @@ class HardwareVideoDecoder |
} |
}; |
+ buffer.position(yPos); |
+ buffer.limit(uPos); |
+ ByteBuffer dataY = buffer.slice(); |
+ |
+ buffer.position(uPos); |
+ buffer.limit(vPos); |
+ ByteBuffer dataU = buffer.slice(); |
+ |
+ buffer.position(vPos); |
+ buffer.limit(vPos + uvStride * sliceHeight / 2); |
+ ByteBuffer dataV = buffer.slice(); |
+ |
return new I420BufferImpl( |
- buffer, width, height, yPos, stride, uPos, uvStride, vPos, uvStride, callback); |
+ width, height, dataY, stride, dataU, uvStride, dataV, uvStride, callback); |
} |
private static void copyI420(ByteBuffer src, int offset, VideoFrame.I420Buffer frameBuffer, |