[libcamera-devel] [PATCH RFC 3/7] android: yuv: prepare support for other pixel formats
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Fri Sep 22 12:58:21 CEST 2023
Hi Mattijs
On Fri, Sep 15, 2023 at 09:57:27AM +0200, Mattijs Korpershoek via libcamera-devel wrote:
> PostProcessorYuv assumes that both source and destination pixel formats
> will always be formats::NV12.
> This might change in the future, for example when doing pixel format
> conversion via libyuv.
>
> Add the necessary plumbing so that other formats can be added easily in
> the future.
>
> Also increase plane number to 3, since some YUV format [1] are
> fully planar (and thus have 3 planes).
>
> [1] https://docs.kernel.org/userspace-api/media/v4l/pixfmt-yuv-planar.html#fully-planar-yuv-formats
> Signed-off-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
> ---
> src/android/yuv/post_processor_yuv.cpp | 26 +++++++++++++++-----------
> src/android/yuv/post_processor_yuv.h | 12 ++++++++----
> 2 files changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp
> index d58090db14ee..734bb85b7351 100644
> --- a/src/android/yuv/post_processor_yuv.cpp
> +++ b/src/android/yuv/post_processor_yuv.cpp
> @@ -90,18 +90,18 @@ void PostProcessorYuv::process(Camera3RequestDescriptor::StreamBuffer *streamBuf
> bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,
> const CameraBuffer &destination) const
> {
> - if (source.planes().size() != 2) {
> + if (source.planes().size() != sourceNumPlanes_) {
> LOG(YUV, Error) << "Invalid number of source planes: "
> << source.planes().size();
> return false;
> }
> - if (destination.numPlanes() != 2) {
> + if (destination.numPlanes() != destinationNumPlanes_) {
> LOG(YUV, Error) << "Invalid number of destination planes: "
> << destination.numPlanes();
> return false;
> }
>
> - for (unsigned int i = 0; i < 2; i++) {
> + for (unsigned int i = 0; i < sourceNumPlanes_; i++) {
> if (source.planes()[i].length < sourceLength_[i]) {
> LOG(YUV, Error)
> << "The source planes lengths are too small, "
> @@ -112,7 +112,7 @@ bool PostProcessorYuv::isValidBuffers(const FrameBuffer &source,
> return false;
> }
> }
> - for (unsigned int i = 0; i < 2; i++) {
> + for (unsigned int i = 0; i < destinationNumPlanes_; i++) {
> if (destination.plane(i).size() < destinationLength_[i]) {
> LOG(YUV, Error)
> << "The destination planes lengths are too small, "
> @@ -132,18 +132,22 @@ void PostProcessorYuv::calculateLengths(const StreamConfiguration &inCfg,
> {
> sourceSize_ = inCfg.size;
> destinationSize_ = outCfg.size;
> + sourceFormat_ = inCfg.pixelFormat;
> + destinationFormat_ = outCfg.pixelFormat;
>
> - const PixelFormatInfo &sourceInfo = PixelFormatInfo::info(formats::NV12);
> - for (unsigned int i = 0; i < 2; i++) {
> + const PixelFormatInfo &sourceInfo = PixelFormatInfo::info(sourceFormat_);
> + sourceNumPlanes_ = sourceInfo.numPlanes();
> + for (unsigned int i = 0; i < sourceInfo.numPlanes(); i++) {
Can't you use the just assigned sourceNumPlanes_ ?
> sourceStride_[i] = inCfg.stride;
> sourceLength_[i] = sourceInfo.planeSize(sourceSize_.height, i,
> sourceStride_[i]);
> }
>
> - const PixelFormatInfo &destinationInfo = PixelFormatInfo::info(formats::NV12);
> - for (unsigned int i = 0; i < 2; i++) {
> - destinationStride_[i] = sourceInfo.stride(destinationSize_.width, i, 1);
> - destinationLength_[i] = sourceInfo.planeSize(destinationSize_.height, i,
> - destinationStride_[i]);
> + const PixelFormatInfo &destinationInfo = PixelFormatInfo::info(destinationFormat_);
> + destinationNumPlanes_ = destinationInfo.numPlanes();
> + for (unsigned int i = 0; i < destinationInfo.numPlanes(); i++) {
ditto
> + destinationStride_[i] = destinationInfo.stride(destinationSize_.width, i, 1);
> + destinationLength_[i] = destinationInfo.planeSize(destinationSize_.height, i,
> + destinationStride_[i]);
> }
> }
> diff --git a/src/android/yuv/post_processor_yuv.h b/src/android/yuv/post_processor_yuv.h
> index a7ac17c564b6..bfe35f46c6dc 100644
> --- a/src/android/yuv/post_processor_yuv.h
> +++ b/src/android/yuv/post_processor_yuv.h
> @@ -28,8 +28,12 @@ private:
>
> libcamera::Size sourceSize_;
> libcamera::Size destinationSize_;
> - unsigned int sourceLength_[2] = {};
> - unsigned int destinationLength_[2] = {};
> - unsigned int sourceStride_[2] = {};
> - unsigned int destinationStride_[2] = {};
> + libcamera::PixelFormat sourceFormat_;
> + libcamera::PixelFormat destinationFormat_;
> + unsigned int sourceLength_[3] = {};
> + unsigned int destinationLength_[3] = {};
> + unsigned int sourceStride_[3] = {};
> + unsigned int destinationStride_[3] = {};
> + unsigned int sourceNumPlanes_;
> + unsigned int destinationNumPlanes_;
The rest looks good.
Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> };
>
> --
> 2.41.0
>
More information about the libcamera-devel
mailing list