From patchwork Mon Aug 1 08:24:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 16891 X-Patchwork-Delegate: umang.jain@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id BD77AC3275 for ; Mon, 1 Aug 2022 08:24:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2FD656330F; Mon, 1 Aug 2022 10:24:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1659342284; bh=8iNiWHVBZjzxPyE9kBPIcljXt+h4Fchu+VI/C3vW3Xs=; h=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=VTDypzHJkcm8t2r1qOVp/hzqrlmADkUIJNF0K1oGCLJ2DDyxztGPIIcU8rwhU16yW RNbDvWWmTlSOhPRrTWzku2ida1uKRDgTpEGPCfn2CirvhiRAoSpCrf0QRX5+UZq8mz J56Djw6hyhwa0rQF8rjsAev/orEVb5TufSpjO0LBqfjoVLVWfmGPIYbnI26vhXrRF+ 4MY4MH2GSlW/OFvC7baJGjcWEr3kHNhAyQwW7gMMaYE++tJF11c0alJ/MWpaTC0mXj lrVWY+X2lWFMPJaxit0GckG39yPYhKkX6Owr9srzgkmX+LPPlOYAe5Fisz3BiqJJjS DEIBmS/St3Qvw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 84A0C603E7 for ; Mon, 1 Aug 2022 10:24:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="QEWlVhQV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (unknown [IPv6:2401:4900:1f3e:f7a:bc8f:12ed:b45f:c35d]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 805982F3; Mon, 1 Aug 2022 10:24:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1659342282; bh=8iNiWHVBZjzxPyE9kBPIcljXt+h4Fchu+VI/C3vW3Xs=; h=From:To:Cc:Subject:Date:From; b=QEWlVhQVZMteipiyZcgkVGyzY4m021eRQaKL0S3vbD4tv7Zk5uZ+R4P4krF+bmcb3 BfEYd4Ex9d0ytjm6d4zBvnMfuwqFlD01zXM7QSsadeJxbuuNkezP6YzAWOjhx33y17 +uTokyTX5v1Q3jovWDwbPEWBY/jq5JYupe0RTcEc= To: libcamera-devel@lists.libcamera.org Date: Mon, 1 Aug 2022 13:54:20 +0530 Message-Id: <20220801082420.68120-1-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2] libcamera: v4l2: Set colorspace flags X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Umang Jain via libcamera-devel From: Umang Jain Reply-To: Umang Jain Cc: rishikeshdonadkar@gmail.com Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 --- 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; - 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) {