camera2 imagem capturada - conversão de YUV_420_888 para NV21
Pela API camera2, estamos recebendo um objeto Image no formato YUV_420_888. Estamos usando a seguinte função para conversão para NV21:
private static byte[] YUV_420_888toNV21(Image image) {
byte[] nv21;
ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();
int ySize = yBuffer.remaining();
int uSize = uBuffer.remaining();
int vSize = vBuffer.remaining();
nv21 = new byte[ySize + uSize + vSize];
//U and V are swapped
yBuffer.get(nv21, 0, ySize);
vBuffer.get(nv21, ySize, vSize);
uBuffer.get(nv21, ySize + vSize, uSize);
return nv21;
}
Embora esta função funcione bem comcameraCaptureSessions.setRepeatingRequest
, obtemos um erro de segmentação em processamento adicional (no lado da JNI) ao chamarcameraCaptureSessions.capture
. Ambos solicitam o formato YUV_420_888 via ImageReader.
Por que o resultado é diferente para as duas chamadas de função enquanto o tipo solicitado é o mesmo?
Atualizar Conforme mencionado nos comentários, recebo esse comportamento devido a diferentes tamanhos de imagem (dimensão muito maior para a solicitação de captura). Porém, nossas operações de processamento adicionais no lado da JNI são iguais para ambas as solicitações e não dependem das dimensões da imagem (apenas na proporção, que é em ambos os casos a mesma).