[libcamera-devel] [PATCH RFC 0/7] android: add YUYV->NV12 conversion via libyuv

Mattijs Korpershoek mkorpershoek at baylibre.com
Fri Sep 15 09:57:24 CEST 2023


On some platforms, it's possible that the gralloc implementation
and the CSI receiver cannot agree on a pixel format.
When that happens, there is usually a m2m converter in the pipeline
which handles pixel format conversion.

On platforms without pixel format converters, such as the AM62x,
we need to do software conversion.

The AM62x platform:
* uses a CSI receiver (j721e-csi2rx), that only supports
  packed YUV422 formats such as YUYV, YVYU, UYVY and VYUY.
* Has a gralloc implementation that only supports of semi-planar
  YUV420 formats such as NV12.

This series add support for software conversion using libyuv.
Right now, only YUYV->NV12 is supported.

This has been send as an RFC because:

1. I don't have much media knowledge, nor C++ knowledge so this is
   probably not good enough for libcamera's high quality codebase.

2. I'm not sure that transforming the "main Type::Direct" stream into
   an Internal stream has no side effects.

3. I'm unsure what to do with the gralloc size in case of conversion.
   Right now, we always allocate HAL_PIXEL_FORMAT_YCBCR_420_888 in
   CameraStream::getBuffer(). This should be adapted both on:
   - the gralloc capabilities of the platform
   - the conversion (if any)

This has been tested on a AM62x SK EVM board with an Alinx
AN5641 (ov5640) sensor. In Android 13.
It might work on BeaglePlay with the same sensor, but I have not
tested that.

Both preview and still capture are functional with the
default com.android.camera2 app.
Note that video recording is not supported, because that would require
a similar conversion from YUYV->MJPEG which I did not investigate yet.

I would appreciate some feedback. Thanks a lot in advance if you
have a look!

Depends on:
- https://patchwork.libcamera.org/cover/18995/

Signed-off-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
---
Mattijs Korpershoek (7):
      android: yuv: separate source destination in length check
      android: yuv: loop over each plane for size check
      android: yuv: prepare support for other pixel formats
      android: camera_device: support when no Direct stream is found
      android: camera_stream: add add explicit input configuration
      android: yuv: add YUYV -> NV12 conversion
      WIP: android: add YUYV->NV12 format conversion via libyuv

 src/android/camera_capabilities.cpp    |  90 ++++++++++++++++++-
 src/android/camera_capabilities.h      |   4 +
 src/android/camera_device.cpp          |   9 +-
 src/android/camera_stream.cpp          |  57 +++++++++++-
 src/android/camera_stream.h            |   5 ++
 src/android/yuv/post_processor_yuv.cpp | 156 ++++++++++++++++++++++-----------
 src/android/yuv/post_processor_yuv.h   |  12 ++-
 7 files changed, 270 insertions(+), 63 deletions(-)
---
base-commit: 58e501c71c47e57f02afde1bd296a037038cd6d5
change-id: 20230914-libyuv-convert-fec7082343e4

Cheers,
-- 
Mattijs



More information about the libcamera-devel mailing list