Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cff610bf authored by Jayant Chowdhary's avatar Jayant Chowdhary
Browse files

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: default avatarJayant Chowdhary <jchowdhary@google.com>
parent 0de21da9
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -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) {
                          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) {
                          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) {
                          DoubleBuffer db =
                                  buffer.asDoubleBuffer().get(double[].class.cast(arr), 0, size);
                          buffer.position(buffer.position() + db.position() * Double.BYTES);
                      }
                };
            } else if (componentType == byte.class) {