Lectura de imágenes RGB con un ImageReader

Estoy tratando de usar un ImageReader para obtener imágenes RGB de la cámara. Estoy utilizando la API de Camera2 desde Android 5.0 "L" en un Nexus 5 que ejecuta la vista previa del desarrollador.

Ya tengo un SurfaceView configurado para imágenes RGB que está funcionando bien y sé que el hardware de la cámara produce datos RGB (porque todos los ajustes de mapeado de tono y color en Android se especifican para operar en canales RGB).

Puedo obtener YUV_420_888 imágenes de ImageReader creando el ImageReader de esta manera:

 imageReader = ImageReader.newInstance(W, H, ImageFormat.YUV_420_888, 4); 

Y luego convertir las imágenes YUV a RGB. Sin embargo, esto es introducir un error de cuantificación no deseado (ya que mi aplicación requiere imágenes RGB), y el tiempo de procesamiento innecesario.

Sin embargo, cuando intento crear el lector de imágenes de esta manera:

 imageReader = ImageReader.newInstance(W, H, PixelFormat.RGB_888, 4); 

La captura de imagen falla con la siguiente excepción:

 java.lang.UnsupportedOperationException: The producer output buffer format 0x22 doesn't match the ImageReader's configured buffer format 0x3. at android.media.ImageReader.nativeImageSetup(Native Method) at android.media.ImageReader.acquireNextSurfaceImage(ImageReader.java:293) at android.media.ImageReader.acquireNextImage(ImageReader.java:339) at android.media.ImageReader.acquireLatestImage(ImageReader.java:243) at <my code...> 

Estoy confundido en dos frentes. En primer lugar, el formato de salida mencionado, 0x22, no está en PixelFormat o ImageFormat. Parece ser algún tipo de modo sin documentar crudo, pero no puedo usar ImageReader.newInstance(W, H, 0x22, 4) para capturarlo (obtengo java.lang.UnsupportedOperationException: Invalid format specified 34 ). Me encantaría capturar en formato raw pero no puedo convencer a ImageFormat para aceptarlo (y el otro formato raw ImageFormat.RAW_SENSOR es increíblemente lento por alguna razón).

En segundo lugar, el SurfaceView ya está consumiendo RGB_888 imágenes RGB_888 (por lo que puedo decir), y ponerlas directamente en la pantalla. Entonces, ¿por qué ImageReader no acepta correctamente las imágenes RGB? ¿Qué hice mal?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.