[{"id":22838,"web_url":"https://patchwork.libcamera.org/comment/22838/","msgid":"<165165529643.4076486.14503570523998321439@Monstersaurus>","date":"2022-05-04T09:08:16","subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: Replace toString with\n\toperator<<() for format classes","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart via libcamera-devel (2022-04-29 22:23:48)\n> Now that format classes implement the stream formatting operator<<(),\n> use it instead of the toString() function.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/android/camera_capabilities.cpp           |  6 ++---\n>  src/android/camera_device.cpp                 |  4 ++--\n>  src/android/jpeg/encoder_libjpeg.cpp          |  2 +-\n>  src/android/jpeg/thumbnailer.cpp              |  2 +-\n>  src/android/mm/generic_camera_buffer.cpp      |  3 +--\n>  src/android/yuv/post_processor_yuv.cpp        |  4 ++--\n>  src/cam/camera_session.cpp                    |  2 +-\n>  src/cam/kms_sink.cpp                          |  2 +-\n>  src/libcamera/pipeline/ipu3/cio2.cpp          |  2 +-\n>  src/libcamera/pipeline/ipu3/imgu.cpp          |  6 ++---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 20 ++++++++--------\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 10 ++++----\n>  src/libcamera/pipeline/rkisp1/rkisp1_path.cpp |  6 ++---\n>  src/libcamera/pipeline/simple/converter.cpp   |  4 ++--\n>  src/libcamera/pipeline/simple/simple.cpp      |  9 ++++---\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  5 ++--\n>  src/libcamera/pipeline/vimc/vimc.cpp          |  2 +-\n>  src/libcamera/v4l2_subdevice.cpp              |  2 +-\n>  src/qcam/viewfinder_qt.cpp                    |  3 +--\n>  src/v4l2/v4l2_camera_proxy.cpp                |  2 +-\n>  test/bayer-format.cpp                         | 24 +++++++++----------\n>  test/camera-sensor.cpp                        |  2 +-\n>  22 files changed, 59 insertions(+), 63 deletions(-)\n> \n> diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\n> index e06a517d84b8..6f197eb80195 100644\n> --- a/src/android/camera_capabilities.cpp\n> +++ b/src/android/camera_capabilities.cpp\n> @@ -554,7 +554,7 @@ int CameraCapabilities::initializeStreamConfigurations()\n>                         formatsMap_[androidFormat] = formats::MJPEG;\n>                         LOG(HAL, Debug) << \"Mapped Android format \"\n>                                         << camera3Format.name << \" to \"\n> -                                       << formats::MJPEG.toString()\n> +                                       << formats::MJPEG\n>                                         << \" (fixed mapping)\";\n>                         continue;\n>                 }\n> @@ -566,7 +566,7 @@ int CameraCapabilities::initializeStreamConfigurations()\n>                 PixelFormat mappedFormat;\n>                 for (const PixelFormat &pixelFormat : libcameraFormats) {\n>  \n> -                       LOG(HAL, Debug) << \"Testing \" << pixelFormat.toString();\n> +                       LOG(HAL, Debug) << \"Testing \" << pixelFormat;\n>  \n>                         /*\n>                          * The stream configuration size can be adjusted,\n> @@ -605,7 +605,7 @@ int CameraCapabilities::initializeStreamConfigurations()\n>                 formatsMap_[androidFormat] = mappedFormat;\n>                 LOG(HAL, Debug) << \"Mapped Android format \"\n>                                 << camera3Format.name << \" to \"\n> -                               << mappedFormat.toString();\n> +                               << mappedFormat;\n>  \n>                 std::vector<Size> resolutions;\n>                 const PixelFormatInfo &info = PixelFormatInfo::info(mappedFormat);\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index f7ec95eb720e..8e804d4d5aed 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -575,7 +575,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>                                << \", crop_rotate_scale_degrees: \"\n>                                << rotationToString(stream->crop_rotate_scale_degrees)\n>  #endif\n> -                              << \" (\" << format.toString() << \")\";\n> +                              << \" (\" << format << \")\";\n>  \n>                 if (!format.isValid())\n>                         return -EINVAL;\n> @@ -926,7 +926,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques\n>                    << camera3Stream->height << \")\"\n>                    << \"[\" << utils::hex(camera3Stream->format) << \"] -> \"\n>                    << \"(\" << cameraStream->configuration().size << \")[\"\n> -                  << cameraStream->configuration().pixelFormat.toString() << \"]\";\n> +                  << cameraStream->configuration().pixelFormat << \"]\";\n>  \n>                 /*\n>                  * Inspect the camera stream type, create buffers opportunely\n> diff --git a/src/android/jpeg/encoder_libjpeg.cpp b/src/android/jpeg/encoder_libjpeg.cpp\n> index 21a3b33dd92c..fd62bd9c7c5b 100644\n> --- a/src/android/jpeg/encoder_libjpeg.cpp\n> +++ b/src/android/jpeg/encoder_libjpeg.cpp\n> @@ -59,7 +59,7 @@ const struct JPEGPixelFormatInfo &findPixelInfo(const PixelFormat &format)\n>         const auto iter = pixelInfo.find(format);\n>         if (iter == pixelInfo.end()) {\n>                 LOG(JPEG, Error) << \"Unsupported pixel format for JPEG encoder: \"\n> -                                << format.toString();\n> +                                << format;\n>                 return invalidPixelFormat;\n>         }\n>  \n> diff --git a/src/android/jpeg/thumbnailer.cpp b/src/android/jpeg/thumbnailer.cpp\n> index 1fab80724f3c..41c71c76e9ce 100644\n> --- a/src/android/jpeg/thumbnailer.cpp\n> +++ b/src/android/jpeg/thumbnailer.cpp\n> @@ -30,7 +30,7 @@ void Thumbnailer::configure(const Size &sourceSize, PixelFormat pixelFormat)\n>         if (pixelFormat_ != formats::NV12) {\n>                 LOG(Thumbnailer, Error)\n>                         << \"Failed to configure: Pixel Format \"\n> -                       << pixelFormat_.toString() << \" unsupported.\";\n> +                       << pixelFormat_ << \" unsupported.\";\n>                 return;\n>         }\n>  \n> diff --git a/src/android/mm/generic_camera_buffer.cpp b/src/android/mm/generic_camera_buffer.cpp\n> index a4349f89cb13..1bd7090d634f 100644\n> --- a/src/android/mm/generic_camera_buffer.cpp\n> +++ b/src/android/mm/generic_camera_buffer.cpp\n> @@ -66,8 +66,7 @@ CameraBuffer::Private::Private([[maybe_unused]] CameraBuffer *cameraBuffer,\n>         const auto &info = PixelFormatInfo::info(pixelFormat);\n>         if (!info.isValid()) {\n>                 error_ = -EINVAL;\n> -               LOG(HAL, Error) << \"Invalid pixel format: \"\n> -                               << pixelFormat.toString();\n> +               LOG(HAL, Error) << \"Invalid pixel format: \" << pixelFormat;\n>                 return;\n>         }\n>  \n> diff --git a/src/android/yuv/post_processor_yuv.cpp b/src/android/yuv/post_processor_yuv.cpp\n> index 513c6ef86153..ed44e6fe02da 100644\n> --- a/src/android/yuv/post_processor_yuv.cpp\n> +++ b/src/android/yuv/post_processor_yuv.cpp\n> @@ -27,8 +27,8 @@ int PostProcessorYuv::configure(const StreamConfiguration &inCfg,\n>  {\n>         if (inCfg.pixelFormat != outCfg.pixelFormat) {\n>                 LOG(YUV, Error) << \"Pixel format conversion is not supported\"\n> -                               << \" (from \" << inCfg.pixelFormat.toString()\n> -                               << \" to \" << outCfg.pixelFormat.toString() << \")\";\n> +                               << \" (from \" << inCfg.pixelFormat\n> +                               << \" to \" << outCfg.pixelFormat << \")\";\n>                 return -EINVAL;\n>         }\n>  \n> diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp\n> index bacb42561560..efffafbf9e9a 100644\n> --- a/src/cam/camera_session.cpp\n> +++ b/src/cam/camera_session.cpp\n> @@ -145,7 +145,7 @@ void CameraSession::infoConfiguration() const\n>                 const StreamFormats &formats = cfg.formats();\n>                 for (PixelFormat pixelformat : formats.pixelformats()) {\n>                         std::cout << \" * Pixelformat: \"\n> -                                 << pixelformat.toString() << \" \"\n> +                                 << pixelformat << \" \"\n>                                   << formats.range(pixelformat).toString()\n>                                   << std::endl;\n>  \n> diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> index 29be5623cb17..7add81a64334 100644\n> --- a/src/cam/kms_sink.cpp\n> +++ b/src/cam/kms_sink.cpp\n> @@ -194,7 +194,7 @@ int KMSSink::configurePipeline(const libcamera::PixelFormat &format)\n>         if (ret) {\n>                 std::cerr\n>                         << \"Unable to find display pipeline for format \"\n> -                       << format.toString() << std::endl;\n> +                       << format << std::endl;\n>  \n>                 return ret;\n>         }\n> diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp\n> index f4e8c6632c2f..a4e4d302f841 100644\n> --- a/src/libcamera/pipeline/ipu3/cio2.cpp\n> +++ b/src/libcamera/pipeline/ipu3/cio2.cpp\n> @@ -211,7 +211,7 @@ int CIO2Device::configure(const Size &size, V4L2DeviceFormat *outputFormat)\n>         if (ret)\n>                 return ret;\n>  \n> -       LOG(IPU3, Debug) << \"CIO2 output format \" << outputFormat->toString();\n> +       LOG(IPU3, Debug) << \"CIO2 output format \" << outputFormat;\n>  \n>         return 0;\n>  }\n> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp\n> index 3ac997cc1acf..34613feb8130 100644\n> --- a/src/libcamera/pipeline/ipu3/imgu.cpp\n> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp\n> @@ -479,7 +479,7 @@ int ImgUDevice::configure(const PipeConfig &pipeConfig, V4L2DeviceFormat *inputF\n>         if (ret)\n>                 return ret;\n>  \n> -       LOG(IPU3, Debug) << \"ImgU input format = \" << inputFormat->toString();\n> +       LOG(IPU3, Debug) << \"ImgU input format = \" << inputFormat;\n>  \n>         /*\n>          * \\todo The IPU3 driver implementation shall be changed to use the\n> @@ -511,7 +511,7 @@ int ImgUDevice::configure(const PipeConfig &pipeConfig, V4L2DeviceFormat *inputF\n>         if (ret)\n>                 return ret;\n>  \n> -       LOG(IPU3, Debug) << \"ImgU GDC format = \" << gdcFormat.toString();\n> +       LOG(IPU3, Debug) << \"ImgU GDC format = \" << gdcFormat;\n>  \n>         StreamConfiguration paramCfg = {};\n>         paramCfg.size = inputFormat->size;\n> @@ -568,7 +568,7 @@ int ImgUDevice::configureVideoDevice(V4L2VideoDevice *dev, unsigned int pad,\n>  \n>         const char *name = dev == output_.get() ? \"output\" : \"viewfinder\";\n>         LOG(IPU3, Debug) << \"ImgU \" << name << \" format = \"\n> -                        << outputFormat->toString();\n> +                        << outputFormat;\n>  \n>         return 0;\n>  }\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index d8c709b7a503..e2ee7f1ace21 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -167,7 +167,7 @@ V4L2SubdeviceFormat findBestFormat(const SensorFormats &formatsMap, const Size &\n>                         }\n>  \n>                         LOG(RPI, Debug) << \"Format: \" << size\n> -                                       << \" fmt \" << format.toString()\n> +                                       << \" fmt \" << format\n>                                         << \" Score: \" << score\n>                                         << \" (best \" << bestScore << \")\";\n>                 }\n> @@ -758,8 +758,8 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 return ret;\n>  \n>         LOG(RPI, Info) << \"Sensor: \" << camera->id()\n> -                      << \" - Selected sensor format: \" << sensorFormat.toString()\n> -                      << \" - Selected unicam format: \" << unicamFormat.toString();\n> +                      << \" - Selected sensor format: \" << sensorFormat\n> +                      << \" - Selected unicam format: \" << unicamFormat;\n>  \n>         ret = data->isp_[Isp::Input].dev()->setFormat(&unicamFormat);\n>         if (ret)\n> @@ -790,7 +790,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 format.colorSpace = cfg.colorSpace;\n>  \n>                 LOG(RPI, Debug) << \"Setting \" << stream->name() << \" to \"\n> -                               << format.toString();\n> +                               << format;\n>  \n>                 ret = stream->dev()->setFormat(&format);\n>                 if (ret)\n> @@ -799,7 +799,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 if (format.size != cfg.size || format.fourcc != fourcc) {\n>                         LOG(RPI, Error)\n>                                 << \"Failed to set requested format on \" << stream->name()\n> -                               << \", returned \" << format.toString();\n> +                               << \", returned \" << format;\n>                         return -EINVAL;\n>                 }\n>  \n> @@ -842,7 +842,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 }\n>  \n>                 LOG(RPI, Debug) << \"Defaulting ISP Output0 format to \"\n> -                               << format.toString();\n> +                               << format;\n>         }\n>  \n>         /*\n> @@ -866,7 +866,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 output1Format.fourcc = V4L2PixelFormat::fromPixelFormat(formats::YUV420);\n>  \n>                 LOG(RPI, Debug) << \"Setting ISP Output1 (internal) to \"\n> -                               << output1Format.toString();\n> +                               << output1Format;\n>  \n>                 ret = data->isp_[Isp::Output1].dev()->setFormat(&output1Format);\n>                 if (ret) {\n> @@ -882,7 +882,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>         ret = data->isp_[Isp::Stats].dev()->setFormat(&format);\n>         if (ret) {\n>                 LOG(RPI, Error) << \"Failed to set format on ISP stats stream: \"\n> -                               << format.toString();\n> +                               << format;\n>                 return ret;\n>         }\n>  \n> @@ -923,7 +923,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 ret = data->unicam_[Unicam::Embedded].dev()->setFormat(&format);\n>                 if (ret) {\n>                         LOG(RPI, Error) << \"Failed to set format on Unicam embedded: \"\n> -                                       << format.toString();\n> +                                       << format;\n>                         return ret;\n>                 }\n>         }\n> @@ -965,7 +965,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>                 if (ret) {\n>                         LOG(RPI, Error) << \"Failed to set format on \" << device->entity()->name()\n>                                         << \" pad \" << sinkPad->index()\n> -                                       << \" with format  \" << format.toString()\n> +                                       << \" with format  \" << format\n>                                         << \": \" << ret;\n>                         return ret;\n>                 }\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 1c53495c97cc..7cf36524ccc4 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -573,13 +573,13 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>          * the pipeline.\n>          */\n>         V4L2SubdeviceFormat format = config->sensorFormat();\n> -       LOG(RkISP1, Debug) << \"Configuring sensor with \" << format.toString();\n> +       LOG(RkISP1, Debug) << \"Configuring sensor with \" << format;\n>  \n>         ret = sensor->setFormat(&format);\n>         if (ret < 0)\n>                 return ret;\n>  \n> -       LOG(RkISP1, Debug) << \"Sensor configured with \" << format.toString();\n> +       LOG(RkISP1, Debug) << \"Sensor configured with \" << format;\n>  \n>         ret = isp_->setFormat(0, &format);\n>         if (ret < 0)\n> @@ -591,13 +591,13 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>                 return ret;\n>  \n>         LOG(RkISP1, Debug)\n> -               << \"ISP input pad configured with \" << format.toString()\n> +               << \"ISP input pad configured with \" << format\n>                 << \" crop \" << rect;\n>  \n>         /* YUYV8_2X8 is required on the ISP source path pad for YUV output. */\n>         format.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8;\n>         LOG(RkISP1, Debug)\n> -               << \"Configuring ISP output pad with \" << format.toString()\n> +               << \"Configuring ISP output pad with \" << format\n>                 << \" crop \" << rect;\n>  \n>         ret = isp_->setSelection(2, V4L2_SEL_TGT_CROP, &rect);\n> @@ -609,7 +609,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>                 return ret;\n>  \n>         LOG(RkISP1, Debug)\n> -               << \"ISP output pad configured with \" << format.toString()\n> +               << \"ISP output pad configured with \" << format\n>                 << \" crop \" << rect;\n>  \n>         std::map<unsigned int, IPAStream> streamConfig;\n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n> index f195f91ead1f..07a6566d308c 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n> @@ -119,13 +119,13 @@ int RkISP1Path::configure(const StreamConfiguration &config,\n>  \n>         LOG(RkISP1, Debug)\n>                 << \"Configured \" << name_ << \" resizer input pad with \"\n> -               << ispFormat.toString() << \" crop \" << rect.toString();\n> +               << ispFormat << \" crop \" << rect.toString();\n>  \n>         ispFormat.size = config.size;\n>  \n>         LOG(RkISP1, Debug)\n>                 << \"Configuring \" << name_ << \" resizer output pad with \"\n> -               << ispFormat.toString();\n> +               << ispFormat;\n>  \n>         switch (config.pixelFormat) {\n>         case formats::NV12:\n> @@ -143,7 +143,7 @@ int RkISP1Path::configure(const StreamConfiguration &config,\n>  \n>         LOG(RkISP1, Debug)\n>                 << \"Configured \" << name_ << \" resizer output pad with \"\n> -               << ispFormat.toString();\n> +               << ispFormat;\n>  \n>         const PixelFormatInfo &info = PixelFormatInfo::info(config.pixelFormat);\n>         V4L2DeviceFormat outputFormat;\n> diff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp\n> index ee8376dea1e0..77c44fc8714f 100644\n> --- a/src/libcamera/pipeline/simple/converter.cpp\n> +++ b/src/libcamera/pipeline/simple/converter.cpp\n> @@ -65,8 +65,8 @@ int SimpleConverter::Stream::configure(const StreamConfiguration &inputCfg,\n>             format.planes[0].bpl != inputCfg.stride) {\n>                 LOG(SimplePipeline, Error)\n>                         << \"Input format not supported (requested \"\n> -                       << inputCfg.size << \"-\" << videoFormat.toString()\n> -                       << \", got \" << format.toString() << \")\";\n> +                       << inputCfg.size << \"-\" << videoFormat\n> +                       << \", got \" << format << \")\";\n>                 return -EINVAL;\n>         }\n>  \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index e76bf01261b0..76bd228b5aba 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -607,10 +607,10 @@ int SimpleCameraData::setupFormats(V4L2SubdeviceFormat *format,\n>                                 LOG(SimplePipeline, Debug)\n>                                         << \"Source '\" << source->entity()->name()\n>                                         << \"':\" << source->index()\n> -                                       << \" produces \" << sourceFormat.toString()\n> +                                       << \" produces \" << sourceFormat\n>                                         << \", sink '\" << sink->entity()->name()\n>                                         << \"':\" << sink->index()\n> -                                       << \" requires \" << format->toString();\n> +                                       << \" requires \" << format;\n>                                 return -EINVAL;\n>                         }\n>                 }\n> @@ -620,7 +620,7 @@ int SimpleCameraData::setupFormats(V4L2SubdeviceFormat *format,\n>                         << \"':\" << source->index()\n>                         << \" -> '\" << sink->entity()->name()\n>                         << \"':\" << sink->index()\n> -                       << \" configured with format \" << format->toString();\n> +                       << \" configured with format \" << format;\n>         }\n>  \n>         return 0;\n> @@ -939,8 +939,7 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n>             captureFormat.size != pipeConfig->captureSize) {\n>                 LOG(SimplePipeline, Error)\n>                         << \"Unable to configure capture in \"\n> -                       << pipeConfig->captureSize << \"-\"\n> -                       << videoFormat.toString();\n> +                       << pipeConfig->captureSize << \"-\" << videoFormat;\n>                 return -EINVAL;\n>         }\n>  \n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index e5a79417f923..2ebf2788c3b4 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -126,9 +126,8 @@ CameraConfiguration::Status UVCCameraConfiguration::validate()\n>         if (iter == pixelFormats.end()) {\n>                 cfg.pixelFormat = pixelFormats.front();\n>                 LOG(UVC, Debug)\n> -                       << \"Adjusting pixel format from \"\n> -                       << pixelFormat.toString() << \" to \"\n> -                       << cfg.pixelFormat.toString();\n> +                       << \"Adjusting pixel format from \" << pixelFormat\n> +                       << \" to \" << cfg.pixelFormat;\n>                 status = Adjusted;\n>         }\n>  \n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index 3db0ffe58c39..3379ac5cd47d 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -209,7 +209,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,\n>                         if (pixelformat.first != formats::BGR888) {\n>                                 LOG(VIMC, Info)\n>                                         << \"Skipping unsupported pixel format \"\n> -                                       << pixelformat.first.toString();\n> +                                       << pixelformat.first;\n>                                 continue;\n>                         }\n>                 }\n> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> index b3d0ddad83db..ca6b43cea5f1 100644\n> --- a/src/libcamera/v4l2_subdevice.cpp\n> +++ b/src/libcamera/v4l2_subdevice.cpp\n> @@ -206,7 +206,7 @@ uint8_t V4L2SubdeviceFormat::bitsPerPixel() const\n>         const auto it = formatInfoMap.find(mbus_code);\n>         if (it == formatInfoMap.end()) {\n>                 LOG(V4L2, Error) << \"No information available for format '\"\n> -                                << toString() << \"'\";\n> +                                << *this << \"'\";\n\nThis is probably the one time I'd prefer to see toString() rather than\n*this, but I don't care too much.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>                 return 0;\n>         }\n>  \n> diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp\n> index a05c75ed9e12..6844f998bbe0 100644\n> --- a/src/qcam/viewfinder_qt.cpp\n> +++ b/src/qcam/viewfinder_qt.cpp\n> @@ -67,8 +67,7 @@ int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n>  \n>                 image_ = QImage(size, QImage::Format_RGB32);\n>  \n> -               qInfo() << \"Using software format conversion from\"\n> -                       << format.toString().c_str();\n> +               qInfo() << \"Using software format conversion from\" << format;\n\nI like the simplification here that we don't then need to call .c_str()\non this. Was that actually required for qInfo() before?\n\n\n>         } else {\n>                 qInfo() << \"Zero-copy enabled\";\n>         }\n> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\n> index 4913e44a6f5f..26a227da6db2 100644\n> --- a/src/v4l2/v4l2_camera_proxy.cpp\n> +++ b/src/v4l2/v4l2_camera_proxy.cpp\n> @@ -327,7 +327,7 @@ int V4L2CameraProxy::tryFormat(struct v4l2_format *arg)\n>         if (ret < 0) {\n>                 LOG(V4L2Compat, Error)\n>                         << \"Failed to negotiate a valid format: \"\n> -                       << format.toString();\n> +                       << format;\n>                 return -EINVAL;\n>         }\n>  \n> diff --git a/test/bayer-format.cpp b/test/bayer-format.cpp\n> index 135bcb5214c8..54f03487fa0e 100644\n> --- a/test/bayer-format.cpp\n> +++ b/test/bayer-format.cpp\n> @@ -72,8 +72,8 @@ protected:\n>                 bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtExpect);\n>                 V4L2PixelFormat v4l2Fmt = bayerFmt.toV4L2PixelFormat();\n>                 if (v4l2Fmt != v4l2FmtExpect) {\n> -                       cerr << \"Expected: '\" << v4l2FmtExpect.toString()\n> -                            << \"' got: '\" << v4l2Fmt.toString() << \"'\" << endl;\n> +                       cerr << \"Expected: '\" << v4l2FmtExpect\n> +                            << \"' got: '\" << v4l2Fmt << \"'\" << endl;\n>                         return TestFail;\n>                 }\n>  \n> @@ -86,7 +86,7 @@ protected:\n>                 v4l2Fmt = bayerFmt.toV4L2PixelFormat();\n>                 if (v4l2Fmt != v4l2FmtExpect) {\n>                         cerr << \"Expected: empty V4L2PixelFormat got: '\"\n> -                            << v4l2Fmt.toString() << \"'\" << endl;\n> +                            << v4l2Fmt << \"'\" << endl;\n>                         return TestFail;\n>                 }\n>  \n> @@ -101,8 +101,8 @@ protected:\n>                 bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2Fmt);\n>                 if (bayerFmt != bayerFmtExpect) {\n>                         cerr << \"Expected BayerFormat '\"\n> -                            << bayerFmtExpect.toString() << \"', got: '\"\n> -                            << bayerFmt.toString() << \"'\" << endl;\n> +                            << bayerFmtExpect << \"', got: '\"\n> +                            << bayerFmt << \"'\" << endl;\n>                         return TestFail;\n>                 }\n>  \n> @@ -115,7 +115,7 @@ protected:\n>                 bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtUnknown);\n>                 if (bayerFmt.isValid()) {\n>                         cerr << \"Expected empty BayerFormat got: '\"\n> -                            << bayerFmt.toString() << \"'\" << endl;\n> +                            << bayerFmt << \"'\" << endl;\n>                         return TestFail;\n>                 }\n>  \n> @@ -151,8 +151,8 @@ protected:\n>                 BayerFormat hFlipFmt = bayerFmt.transform(Transform::HFlip);\n>                 if (hFlipFmt != bayerFmtExpect) {\n>                         cerr << \"Horizontal flip of 'BGGR-8' should result in '\"\n> -                            << bayerFmtExpect.toString() << \"', got: '\"\n> -                            << hFlipFmt.toString() << \"'\" << endl;\n> +                            << bayerFmtExpect << \"', got: '\"\n> +                            << hFlipFmt << \"'\" << endl;\n>                         return TestFail;\n>                 }\n>  \n> @@ -166,8 +166,8 @@ protected:\n>                 BayerFormat vFlipFmt = bayerFmt.transform(Transform::VFlip);\n>                 if (vFlipFmt != bayerFmtExpect) {\n>                         cerr << \"Vertical flip of 'BGGR-8' should result in '\"\n> -                            << bayerFmtExpect.toString() << \"', got: '\"\n> -                            << vFlipFmt.toString() << \"'\" << endl;\n> +                            << bayerFmtExpect << \"', got: '\"\n> +                            << vFlipFmt << \"'\" << endl;\n>                         return TestFail;\n>                 }\n>  \n> @@ -182,7 +182,7 @@ protected:\n>                 if (transposeFmt != bayerFmt) {\n>                         cerr << \"Transpose with both green pixels on the \"\n>                              << \"antidiagonal should not change the order \"\n> -                            << \"(got '\" << transposeFmt.toString() << \"')\"\n> +                            << \"(got '\" << transposeFmt << \"')\"\n>                              << endl;\n>                         return TestFail;\n>                 }\n> @@ -199,7 +199,7 @@ protected:\n>                 if (transposeFmt != bayerFmtExpect) {\n>                         cerr << \"Transpose with the red & blue pixels on the \"\n>                              << \"antidiagonal should switch their position \"\n> -                            << \"(got '\" << transposeFmt.toString() << \"')\"\n> +                            << \"(got '\" << transposeFmt << \"')\"\n>                              << endl;\n>                         return TestFail;\n>                 }\n> diff --git a/test/camera-sensor.cpp b/test/camera-sensor.cpp\n> index 9b06a60e7695..d3dcb51056f1 100644\n> --- a/test/camera-sensor.cpp\n> +++ b/test/camera-sensor.cpp\n> @@ -99,7 +99,7 @@ protected:\n>                     format.size != Size(4096, 2160)) {\n>                         cerr << \"Failed to get a suitable format, expected 4096x2160-0x\"\n>                              << utils::hex(MEDIA_BUS_FMT_SBGGR10_1X10)\n> -                            << \", got \" << format.toString() << endl;\n> +                            << \", got \" << format << endl;\n>                         return TestFail;\n>                 }\n>  \n> -- \n> Regards,\n> \n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 8703BC3256\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  4 May 2022 09:08:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0A65965645;\n\tWed,  4 May 2022 11:08:21 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C120865641\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 May 2022 11:08:18 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 57767E5;\n\tWed,  4 May 2022 11:08:18 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1651655301;\n\tbh=LgWEslItWjrnLk38JkHqYv7//smwK5izLh5LwpdmPr0=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=xTwKXzvjC5jILSBRDV8O7Rlsc4F6Ydyn91eiDnFK2Gy88L1gvWz8qZYnmvQL94m2G\n\tuBROhMUc5nAHGZLgJTDyExTqiya+zwx/Tyz72NPfZc5Ag3WDQh0zM00Anwr8NoHVQM\n\tiVT5TmIEv6UEL7BuRPq0hElw0zElwqqdru7DQws+c1fiEgEpTDu2un9XbCuitigaTL\n\tK8yp8f9CR+X4mtT54wxqZjo+t10obCQm/v1G1Dq2y+I3Q9fIQxrwljEGFNO7d0xOSc\n\tcz4oY5HhX/3kbNSBdw+LIl7P4fF9cbX+FMwbPAaR+EIvvrIK13+HWwgV1AmBg3szXF\n\tnM6Qkc4qlPAiQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1651655298;\n\tbh=LgWEslItWjrnLk38JkHqYv7//smwK5izLh5LwpdmPr0=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=QMFY/i5iEgp9Wq9Km7CPOatDLd+N9Lzpw62TCPlx2KHyQQHLu+xmpsdctbko0uw9H\n\th1t2hC+vIIgaycX9x1TgH30aWwXr0+u826ZcphCGibik+RiIj3EWgs6nZ7fjn7FxVz\n\tZejGXQ1sZGaT0c5BTteGAhjzXichep90i7xdp5Ug="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"QMFY/i5i\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20220429212348.18063-6-laurent.pinchart@ideasonboard.com>","References":"<20220429212348.18063-1-laurent.pinchart@ideasonboard.com>\n\t<20220429212348.18063-6-laurent.pinchart@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Wed, 04 May 2022 10:08:16 +0100","Message-ID":"<165165529643.4076486.14503570523998321439@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: Replace toString with\n\toperator<<() for format classes","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":22842,"web_url":"https://patchwork.libcamera.org/comment/22842/","msgid":"<YnJJobbaLmQ2SP9S@pendragon.ideasonboard.com>","date":"2022-05-04T09:38:41","subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: Replace toString with\n\toperator<<() for format classes","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nOn Wed, May 04, 2022 at 10:08:16AM +0100, Kieran Bingham wrote:\n> Quoting Laurent Pinchart via libcamera-devel (2022-04-29 22:23:48)\n> > Now that format classes implement the stream formatting operator<<(),\n> > use it instead of the toString() function.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/android/camera_capabilities.cpp           |  6 ++---\n> >  src/android/camera_device.cpp                 |  4 ++--\n> >  src/android/jpeg/encoder_libjpeg.cpp          |  2 +-\n> >  src/android/jpeg/thumbnailer.cpp              |  2 +-\n> >  src/android/mm/generic_camera_buffer.cpp      |  3 +--\n> >  src/android/yuv/post_processor_yuv.cpp        |  4 ++--\n> >  src/cam/camera_session.cpp                    |  2 +-\n> >  src/cam/kms_sink.cpp                          |  2 +-\n> >  src/libcamera/pipeline/ipu3/cio2.cpp          |  2 +-\n> >  src/libcamera/pipeline/ipu3/imgu.cpp          |  6 ++---\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 20 ++++++++--------\n> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 10 ++++----\n> >  src/libcamera/pipeline/rkisp1/rkisp1_path.cpp |  6 ++---\n> >  src/libcamera/pipeline/simple/converter.cpp   |  4 ++--\n> >  src/libcamera/pipeline/simple/simple.cpp      |  9 ++++---\n> >  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  5 ++--\n> >  src/libcamera/pipeline/vimc/vimc.cpp          |  2 +-\n> >  src/libcamera/v4l2_subdevice.cpp              |  2 +-\n> >  src/qcam/viewfinder_qt.cpp                    |  3 +--\n> >  src/v4l2/v4l2_camera_proxy.cpp                |  2 +-\n> >  test/bayer-format.cpp                         | 24 +++++++++----------\n> >  test/camera-sensor.cpp                        |  2 +-\n> >  22 files changed, 59 insertions(+), 63 deletions(-)\n\n[snip]\n\n> > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> > index b3d0ddad83db..ca6b43cea5f1 100644\n> > --- a/src/libcamera/v4l2_subdevice.cpp\n> > +++ b/src/libcamera/v4l2_subdevice.cpp\n> > @@ -206,7 +206,7 @@ uint8_t V4L2SubdeviceFormat::bitsPerPixel() const\n> >         const auto it = formatInfoMap.find(mbus_code);\n> >         if (it == formatInfoMap.end()) {\n> >                 LOG(V4L2, Error) << \"No information available for format '\"\n> > -                                << toString() << \"'\";\n> > +                                << *this << \"'\";\n> \n> This is probably the one time I'd prefer to see toString() rather than\n> *this, but I don't care too much.\n\n'*this* always feels a bit weird, mostly because it's not often\nencountered I suppose. I went for it to try and remove as many usages of\ntoString() as possible, to see what would remain.\n\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> \n> >                 return 0;\n> >         }\n> >  \n> > diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp\n> > index a05c75ed9e12..6844f998bbe0 100644\n> > --- a/src/qcam/viewfinder_qt.cpp\n> > +++ b/src/qcam/viewfinder_qt.cpp\n> > @@ -67,8 +67,7 @@ int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n> >  \n> >                 image_ = QImage(size, QImage::Format_RGB32);\n> >  \n> > -               qInfo() << \"Using software format conversion from\"\n> > -                       << format.toString().c_str();\n> > +               qInfo() << \"Using software format conversion from\" << format;\n> \n> I like the simplification here that we don't then need to call .c_str()\n> on this. Was that actually required for qInfo() before?\n\nYes, qInfo() returns a QDebug object which has no operator<<(const\nstd::string &).\n\n> >         } else {\n> >                 qInfo() << \"Zero-copy enabled\";\n> >         }\n\n[snip]","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D9BEFC0F2A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  4 May 2022 09:38:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4908965641;\n\tWed,  4 May 2022 11:38:45 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B7AA6604A3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 May 2022 11:38:43 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 20FBCE5;\n\tWed,  4 May 2022 11:38:43 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1651657125;\n\tbh=9Kc1A8PXlVthHoPLdmQnHi5DTD32Sl1+MurFlni2DzE=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=j+ybEFTfXroU17yf3v6bU7TqHdnYNkKzrL0KYgcXiMlVJj0dRBaKWARivj0psQcfa\n\tgCViTBNr0LAWeuuhh9ZTBgGZSN4NV7imyj3pbfMJVYf1hey8Sh1uA0w0jRty3NbGOs\n\tK++j1Lxu37Dqwe/JUK4I3ngKx+6/uiZNN86DS2h5Q6GLrowQhXACDLHYy3W6wJaZPs\n\twnFsaEoUFbE6DU7tzjF7lI/Tw4iIFy5iu1mfdx1lak4h064vKKdTWlJZWATHkxKfAJ\n\tP8kZelCqTlFNnGgTVOC2FD9SN0h+GkHNOvxxFpI+bzykfCDeZoihBVKLSRjdYG9g/n\n\tADJqBl56ehJTA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1651657123;\n\tbh=9Kc1A8PXlVthHoPLdmQnHi5DTD32Sl1+MurFlni2DzE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=hSxY0+aSnir0VJbpn5eGui74MOvDFNJsIMStpf+RjLqNkCIAo0uwmnjlp/51+zDX9\n\tYlo+Z8JwTc34pbc7+HbzGlWudaqqOvTQehz1burGLy2sJnJCKE+wHM/MKA4n6EyG8F\n\tTuehqgQo3quiAfLV4qP+1eY5O/k2Pwv9BecWOYE8="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"hSxY0+aS\"; dkim-atps=neutral","Date":"Wed, 4 May 2022 12:38:41 +0300","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<YnJJobbaLmQ2SP9S@pendragon.ideasonboard.com>","References":"<20220429212348.18063-1-laurent.pinchart@ideasonboard.com>\n\t<20220429212348.18063-6-laurent.pinchart@ideasonboard.com>\n\t<165165529643.4076486.14503570523998321439@Monstersaurus>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<165165529643.4076486.14503570523998321439@Monstersaurus>","Subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: Replace toString with\n\toperator<<() for format classes","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]