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 <jchowdhary@google.com>
This commit is contained in:
Jayant Chowdhary
2022-07-19 23:51:40 -07:00
parent 0de21da966
commit cff610bf0e

View File

@@ -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<T> implements MarshalQueryable<T> {
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) {