[libcamera-devel] [PATCH v2] libcamera: v4l2: Set colorspace flags
Umang Jain
umang.jain at ideasonboard.com
Fri Aug 5 06:52:20 CEST 2022
Hi Laurent,
On 8/4/22 23:09, Laurent Pinchart wrote:
> Hi Umang,
>
> Thank you for the patch.
>
> On Mon, Aug 01, 2022 at 01:54:20PM +0530, Umang Jain via libcamera-devel wrote:
>> The colorspace fields are read-only from an application point of view,
>> both on video devices and on subdevs, unless the
>> V4L2_PIX_FMT_FLAG_SET_CSC or V4L2_MBUS_FRAMEFMT_SET_CSC flags
>> (respectively) are set when calling the S_FMT ioctl.
>>
>> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
>> ---
>> changes in v2:
>> - Set V4L2_MBUS_FRAMEFMT_SET_CSC flag only on source pad of
>> media entity
>> - Set V4L2_PIX_FMT_FLAG_SET_CSC on video capture devices only
>> ---
>> src/libcamera/v4l2_subdevice.cpp | 6 ++++--
>> src/libcamera/v4l2_videodevice.cpp | 8 ++++++--
>> 2 files changed, 10 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
>> index 98a3911a..8f6b327f 100644
>> --- a/src/libcamera/v4l2_subdevice.cpp
>> +++ b/src/libcamera/v4l2_subdevice.cpp
>> @@ -459,9 +459,11 @@ int V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
>> subdevFmt.format.height = format->size.height;
>> subdevFmt.format.code = format->mbus_code;
>> subdevFmt.format.field = V4L2_FIELD_NONE;
>> - fromColorSpace(format->colorSpace, subdevFmt.format);
>> + int ret = fromColorSpace(format->colorSpace, subdevFmt.format);
>> + if (ret == 0 && (entity_->pads()[pad]->flags() & MEDIA_PAD_FL_SOURCE))
>> + subdevFmt.format.flags |= V4L2_MBUS_FRAMEFMT_SET_CSC;
> I don't think that's the right condition, as from ColorSpace returns 0
> if colorSpace is nullopt. I'd write it as
When colorSpace is nullopt, v4l2Format colorspace identifiers set to
*_DEFAULT. Doesn't that count?
/me *grins*
>
> if (format->colorSpace) {
> fromColorSpace(format->colorSpace, subdevFmt.format);
>
> /* The CSC flag is only applicable to source pads. */
> if (entity_->pads()[pad]->flags() & MEDIA_PAD_FL_SOURCE)
> subdevFmt.format.flags |= V4L2_MBUS_FRAMEFMT_SET_CSC;
> }
>
> You could possibly move the fromColorSpace() call outside of the if (),
> as colorSpace is checked in the function itself, but given that an if ()
> is needed anyway, I'd leave it in there.
>
> Same below.
>
>>
>> - int ret = ioctl(VIDIOC_SUBDEV_S_FMT, &subdevFmt);
>> + ret = ioctl(VIDIOC_SUBDEV_S_FMT, &subdevFmt);
>> if (ret) {
>> LOG(V4L2, Error)
>> << "Unable to set format on pad " << pad
>> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
>> index 63911339..f3651740 100644
>> --- a/src/libcamera/v4l2_videodevice.cpp
>> +++ b/src/libcamera/v4l2_videodevice.cpp
>> @@ -940,7 +940,9 @@ int V4L2VideoDevice::trySetFormatMultiplane(V4L2DeviceFormat *format, bool set)
>> pix->pixelformat = format->fourcc;
>> pix->num_planes = format->planesCount;
>> pix->field = V4L2_FIELD_NONE;
>> - fromColorSpace(format->colorSpace, *pix);
>> + ret = fromColorSpace(format->colorSpace, *pix);
>> + if (ret == 0 && caps_.isVideoCapture())
>> + pix->flags |= V4L2_PIX_FMT_FLAG_SET_CSC;
>>
>> ASSERT(pix->num_planes <= std::size(pix->plane_fmt));
>>
>> @@ -1010,7 +1012,9 @@ int V4L2VideoDevice::trySetFormatSingleplane(V4L2DeviceFormat *format, bool set)
>> pix->pixelformat = format->fourcc;
>> pix->bytesperline = format->planes[0].bpl;
>> pix->field = V4L2_FIELD_NONE;
>> - fromColorSpace(format->colorSpace, *pix);
>> + ret = fromColorSpace(format->colorSpace, *pix);
>> + if (ret == 0 && caps_.isVideoCapture())
>> + pix->flags |= V4L2_PIX_FMT_FLAG_SET_CSC;
>>
>> ret = ioctl(set ? VIDIOC_S_FMT : VIDIOC_TRY_FMT, &v4l2Format);
>> if (ret) {
More information about the libcamera-devel
mailing list