camera2: use bulk get methods while unmarshalling primitives.

Bug: 239167817

Test: GCA (validity)
Test: Camera CTS
Test: profiling results mentioned in b/239167817

Change-Id: I6954a81d49be6d8a0746301e544b1772444ee746
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
This commit is contained in:
Jayant Chowdhary
2020-12-29 18:03:45 -08:00
parent 5337f51327
commit f0f7a7cabf

View File

@@ -45,46 +45,41 @@ public class MarshalQueryableArray<T> implements MarshalQueryable<T> {
private static final boolean DEBUG = false;
private static interface PrimitiveArrayFiller {
public void fillPosition(Object arr, int index, ByteBuffer buffer);
public void fillArray(Object arr, int size, ByteBuffer buffer);
static PrimitiveArrayFiller getPrimitiveArrayFiller(Class<?> componentType) {
if (componentType == int.class) {
return new PrimitiveArrayFiller() {
@Override
public void fillPosition(Object arr, int index, ByteBuffer buffer) {
int i = buffer.getInt();
Array.setInt(arr, index, i);
public void fillArray(Object arr, int size, ByteBuffer buffer) {
buffer.asIntBuffer().get(int[].class.cast(arr), 0, size);
}
};
} else if (componentType == float.class) {
return new PrimitiveArrayFiller() {
@Override
public void fillPosition(Object arr, int index, ByteBuffer buffer) {
float i = buffer.getFloat();
Array.setFloat(arr, index, i);
public void fillArray(Object arr, int size, ByteBuffer buffer) {
buffer.asFloatBuffer().get(float[].class.cast(arr), 0, size);
}
};
} else if (componentType == long.class) {
return new PrimitiveArrayFiller() {
@Override
public void fillPosition(Object arr, int index, ByteBuffer buffer) {
long i = buffer.getLong();
Array.setLong(arr, index, i);
public void fillArray(Object arr, int size, ByteBuffer buffer) {
buffer.asLongBuffer().get(long[].class.cast(arr), 0, size);
}
};
} else if (componentType == double.class) {
return new PrimitiveArrayFiller() {
@Override
public void fillPosition(Object arr, int index, ByteBuffer buffer) {
double i = buffer.getDouble();
Array.setDouble(arr, index, i);
public void fillArray(Object arr, int size, ByteBuffer buffer) {
buffer.asDoubleBuffer().get(double[].class.cast(arr), 0, size);
}
};
} else if (componentType == byte.class) {
return new PrimitiveArrayFiller() {
@Override
public void fillPosition(Object arr, int index, ByteBuffer buffer) {
byte i = buffer.get();
Array.setByte(arr, index, i);
public void fillArray(Object arr, int size, ByteBuffer buffer) {
buffer.get(byte[].class.cast(arr), 0, size);
}
};
}
@@ -93,13 +88,6 @@ public class MarshalQueryableArray<T> implements MarshalQueryable<T> {
}
};
static void unmarshalPrimitiveArray(Object arr, int size, ByteBuffer buffer,
PrimitiveArrayFiller filler) {
for (int i = 0; i < size; i++) {
filler.fillPosition(arr, i, buffer);
}
}
private class MarshalerArray extends Marshaler<T> {
private final Class<T> mClass;
private final Marshaler<?> mComponentMarshaler;
@@ -150,8 +138,8 @@ public class MarshalQueryableArray<T> implements MarshalQueryable<T> {
array = Array.newInstance(mComponentClass, arraySize);
if (isUnwrappedPrimitiveClass(mComponentClass) &&
mComponentClass == getPrimitiveTypeClass(mNativeType)) {
unmarshalPrimitiveArray(array, arraySize, buffer,
PrimitiveArrayFiller.getPrimitiveArrayFiller(mComponentClass));
PrimitiveArrayFiller.getPrimitiveArrayFiller(mComponentClass).fillArray(array,
arraySize, buffer);
} else {
for (int i = 0; i < arraySize; ++i) {
Object elem = mComponentMarshaler.unmarshal(buffer);