На самом деле, это может быть сделано в Java с незначительными накладными расходами.
API camera2 мы получаем объект Image форматаYUV_420_888, Затем мы используем следующую функцию для преобразования в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;
}
Пока эта функция отлично работает сcameraCaptureSessions.setRepeatingRequest
мы получаем ошибку сегментации при дальнейшей обработке (на стороне JNI) при вызовеcameraCaptureSessions.capture
, Оба запрашивают формат YUV_420_888 через ImageReader.
Почему результат отличается для обоих вызовов функций, в то время как запрашиваемый тип одинаков?
Обновить: Как уже упоминалось в комментариях, я получаю это поведение из-за разного размера изображения (гораздо больший размер для запроса захвата). Но наши дальнейшие операции обработки на стороне JNI одинаковы для обоих запросов и не зависят от размеров изображения (только от соотношения сторон, которое в обоих случаях одинаково).