From cff610bf0e7270de1ca220f09c828a08ceb9417e Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Tue, 19 Jul 2022 23:51:40 -0700 Subject: [PATCH] camera2: update original ByteBuffer using bulk get on 'viewed' ByteBuffer for correct position When we use any of the viewed methods from ByteBuffer such as asFloatBuffer, the returned buffer's position and the original ByteBuffer's positions are independent. So update the original ByteBuffer's position as well, for correct accounting. Bug: 239639757 Test: Camera CTS; GCA Test: MarshalQueryableArray error logs don't appear in logcat while using GCA Change-Id: I488a23c278ee5d044c2423a616e598a93cbbad0b Signed-off-by: Jayant Chowdhary --- .../marshal/impl/MarshalQueryableArray.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java index cbd806617a693..598170dfcb252 100644 --- a/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java +++ b/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java @@ -26,6 +26,10 @@ import static android.hardware.camera2.marshal.MarshalHelpers.getPrimitiveTypeCl import java.lang.reflect.Array; import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; import java.util.ArrayList; /** @@ -51,28 +55,36 @@ public class MarshalQueryableArray implements MarshalQueryable { return new PrimitiveArrayFiller() { @Override public void fillArray(Object arr, int size, ByteBuffer buffer) { - buffer.asIntBuffer().get(int[].class.cast(arr), 0, size); + IntBuffer ib = buffer.asIntBuffer().get(int[].class.cast(arr), 0, size); + // Update buffer position since the IntBuffer has independent position. + buffer.position(buffer.position() + ib.position() * Integer.BYTES); } }; } else if (componentType == float.class) { return new PrimitiveArrayFiller() { @Override public void fillArray(Object arr, int size, ByteBuffer buffer) { - buffer.asFloatBuffer().get(float[].class.cast(arr), 0, size); + FloatBuffer fb = + buffer.asFloatBuffer().get(float[].class.cast(arr), 0, size); + buffer.position(buffer.position() + fb.position() * Float.BYTES); } }; } else if (componentType == long.class) { return new PrimitiveArrayFiller() { @Override public void fillArray(Object arr, int size, ByteBuffer buffer) { - buffer.asLongBuffer().get(long[].class.cast(arr), 0, size); + LongBuffer lb = + buffer.asLongBuffer().get(long[].class.cast(arr), 0, size); + buffer.position(buffer.position() + lb.position() * Long.BYTES); } }; } else if (componentType == double.class) { return new PrimitiveArrayFiller() { @Override public void fillArray(Object arr, int size, ByteBuffer buffer) { - buffer.asDoubleBuffer().get(double[].class.cast(arr), 0, size); + DoubleBuffer db = + buffer.asDoubleBuffer().get(double[].class.cast(arr), 0, size); + buffer.position(buffer.position() + db.position() * Double.BYTES); } }; } else if (componentType == byte.class) {