[{"id":25157,"web_url":"https://patchwork.libcamera.org/comment/25157/","msgid":"<CAOgh=FwAXbNpJ64A8Ko_aik1hQQ9yxg6WrkXZYQj0a4KCbyYog@mail.gmail.com>","date":"2022-09-28T10:00:45","subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: Add color space support","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"On Wed, 28 Sept 2022 at 02:49, Laurent Pinchart via libcamera-devel\n<libcamera-devel@lists.libcamera.org> wrote:\n>\n> KMS defines YCbCr encoding and quantization properties for planes. When\n> supported by the device, set them to match the color space of the\n> stream to render colors accurately.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/kms_sink.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++\n>  src/cam/kms_sink.h   |  3 ++\n>  2 files changed, 83 insertions(+)\n>\n> diff --git a/src/cam/kms_sink.cpp b/src/cam/kms_sink.cpp\n> index 17e2fa69bff7..754b061eebf7 100644\n> --- a/src/cam/kms_sink.cpp\n> +++ b/src/cam/kms_sink.cpp\n> @@ -149,6 +149,81 @@ int KMSSink::configure(const libcamera::CameraConfiguration &config)\n>         size_ = cfg.size;\n>         stride_ = cfg.stride;\n>\n> +       /* Configure color space. */\n> +       colorEncoding_ = std::nullopt;\n> +       colorRange_ = std::nullopt;\n> +\n> +       if (cfg.colorSpace->ycbcrEncoding == libcamera::ColorSpace::YcbcrEncoding::None)\n> +               return 0;\n> +\n> +       /*\n> +        * The encoding and range enums are defined in the kernel but not\n> +        * exposed in public headers.\n> +        */\n> +       enum drm_color_encoding {\n> +               DRM_COLOR_YCBCR_BT601,\n> +               DRM_COLOR_YCBCR_BT709,\n> +               DRM_COLOR_YCBCR_BT2020,\n> +       };\n> +\n> +       enum drm_color_range {\n> +               DRM_COLOR_YCBCR_LIMITED_RANGE,\n> +               DRM_COLOR_YCBCR_FULL_RANGE,\n> +       };\n> +\n> +       const DRM::Property *colorEncoding = plane_->property(\"COLOR_ENCODING\");\n> +       const DRM::Property *colorRange = plane_->property(\"COLOR_RANGE\");\n> +\n> +       if (colorEncoding) {\n> +               drm_color_encoding encoding;\n> +\n> +               switch (cfg.colorSpace->ycbcrEncoding) {\n> +               case libcamera::ColorSpace::YcbcrEncoding::Rec601:\n> +               default:\n> +                       encoding = DRM_COLOR_YCBCR_BT601;\n> +                       break;\n> +               case libcamera::ColorSpace::YcbcrEncoding::Rec709:\n> +                       encoding = DRM_COLOR_YCBCR_BT709;\n> +                       break;\n> +               case libcamera::ColorSpace::YcbcrEncoding::Rec2020:\n> +                       encoding = DRM_COLOR_YCBCR_BT2020;\n> +                       break;\n> +               }\n> +\n> +               for (const auto &[id, name] : colorEncoding->enums()) {\n> +                       if (id == encoding) {\n> +                               colorEncoding_ = encoding;\n> +                               break;\n> +                       }\n> +               }\n> +       }\n> +\n> +       if (colorRange) {\n> +               drm_color_range range;\n> +\n> +               switch (cfg.colorSpace->range) {\n> +               case libcamera::ColorSpace::Range::Limited:\n> +               default:\n> +                       range = DRM_COLOR_YCBCR_LIMITED_RANGE;\n> +                       break;\n> +               case libcamera::ColorSpace::Range::Full:\n> +                       range = DRM_COLOR_YCBCR_FULL_RANGE;\n> +                       break;\n> +               }\n> +\n> +               for (const auto &[id, name] : colorRange->enums()) {\n> +                       if (id == range) {\n> +                               colorRange_ = range;\n> +                               break;\n> +                       }\n> +               }\n> +       }\n> +\n> +       if (!colorEncoding_ || !colorRange_)\n> +               std::cerr << \"Color space \" << cfg.colorSpace->toString()\n> +                         << \" not supported by the display device.\"\n> +                         << \" Colors may be wrong.\" << std::endl;\n> +\n>         return 0;\n>  }\n>\n> @@ -415,6 +490,11 @@ bool KMSSink::processRequest(libcamera::Request *camRequest)\n>                 drmRequest->addProperty(plane_, \"CRTC_W\", dst_.width);\n>                 drmRequest->addProperty(plane_, \"CRTC_H\", dst_.height);\n>\n> +               if (colorEncoding_)\n> +                       drmRequest->addProperty(plane_, \"COLOR_ENCODING\", *colorEncoding_);\n> +               if (colorRange_)\n> +                       drmRequest->addProperty(plane_, \"COLOR_RANGE\", *colorRange_);\n> +\n>                 flags |= DRM::AtomicRequest::FlagAllowModeset;\n>         }\n>\n> diff --git a/src/cam/kms_sink.h b/src/cam/kms_sink.h\n> index 76c4e611bf85..e2c618a19035 100644\n> --- a/src/cam/kms_sink.h\n> +++ b/src/cam/kms_sink.h\n> @@ -10,6 +10,7 @@\n>  #include <list>\n>  #include <memory>\n>  #include <mutex>\n> +#include <optional>\n>  #include <string>\n>  #include <utility>\n>\n> @@ -67,6 +68,8 @@ private:\n>         libcamera::PixelFormat format_;\n>         libcamera::Size size_;\n>         unsigned int stride_;\n> +       std::optional<unsigned int> colorEncoding_;\n> +       std::optional<unsigned int> colorRange_;\n>\n>         libcamera::Rectangle src_;\n>         libcamera::Rectangle dst_;\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n\nLGTM\n\nReviewed-by: Eric Curtin <ecurtin@redhat.com>","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 23657C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 28 Sep 2022 10:01:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BDE4F622A0;\n\tWed, 28 Sep 2022 12:01:06 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7F3286224C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 28 Sep 2022 12:01:04 +0200 (CEST)","from mail-vk1-f198.google.com (mail-vk1-f198.google.com\n\t[209.85.221.198]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id\n\tus-mta-352--XR7nqNUNv-8KigzSlipYg-1; Wed, 28 Sep 2022 06:01:02 -0400","by mail-vk1-f198.google.com with SMTP id\n\tx15-20020a1f7c0f000000b003a35ae05d38so4266742vkc.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 28 Sep 2022 03:01:02 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1664359266;\n\tbh=f369ea2rwcC9y0lK7ZEFQUp7WvJDKe9GDmQqvR6E7Ww=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=ptnKHnbU4nH5W7m/Y6Mjv0TuDFWBkWw4Mup1UnxxGrRiY9p6O89GBLkNAcfq85/5w\n\trQ2f5rYa73DBlt4T6o2JFVRKHFdgXvodvZMbOYRfGtlwnVIyOiDP/AX47PyOz7lrWy\n\t5GIsnd89mhQq993DCvt/LpngXOLKt+8CEwkCu/35nOtCNBoj8PQLZ0JSE6ZypEFnjA\n\tga6U2YWUHVT2pkMs5IR6Sx97cUwD4+I3cBIzh52vW8Mk3MnTv3fAh9pDfGluG1nsB/\n\t1d5CF0LgiJGPHRaDjHTBr6jqZVFlO8OcG2STNGIZI/sRVAzs+HdxgbidCRMxslzobG\n\tLTJI0e7kKe/tw==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1664359263;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=n+zok2yqJMPnzhY/Eeh9HF/RQWQsfDJ2b4BicS9XOfw=;\n\tb=UhfFT67iy8RS5SeZGPECLuF3hvViWggeklKuO/ksZhMbMwzT1J5rKxekeSxRl5MujuoABF\n\tVU3wUOtnq0FM5S5dgs6iKNNIxenzFJZ3oLiIxCg0kqBio31AIQmvIEhZJXnfEwqK25tR3q\n\tEfwLw0QVw/o4aimbma46B+QxpmVchQ4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=redhat.com\n\theader.i=@redhat.com header.b=\"UhfFT67i\"; \n\tdkim-atps=neutral","X-MC-Unique":"-XR7nqNUNv-8KigzSlipYg-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date;\n\tbh=n+zok2yqJMPnzhY/Eeh9HF/RQWQsfDJ2b4BicS9XOfw=;\n\tb=o2UjC5CfGmwUtz1ZUR2iZwNLrGvWaHeKRXM59tAOdJ+wvaqmcLc3EhL9QYkJwtlcQ5\n\tSkZzNdSv4ijZUTY4AFW5ShKjLTrHep5LB5oZRIYX2LOVtRvimwNE3ahISLq2GPk1G0wI\n\tuzmkUaRxBTscIbqYHcWdSrSbx2IaxPutYd8fsDbAvbgNRbAXpBkYYQRnUczYMCb+n7CP\n\tRkMr8nG05fz5uxQ5UscDf89E4QENqEdse9G5Q9gSEy/oHgFAAaAwYOyyqmMbnNnARIpf\n\tYqXmWeKE0mCLbRGMWpwap7k7KPQxAWEuaeSKpkT7Lhe8yNjrf1aAaQ7NNJUF6PJglMsv\n\tXBUg==","X-Gm-Message-State":"ACrzQf38NGfv2Mt2GCCS9lmR+fAJRfiPUL+661feYMng/VpgPuqFo3M2\n\tuASuGyu1sE4rCw5ro4iacOw2t1tJXQiyJ9yJWxr4ND0b3kRh+40qwqsDq6RlRYwmeoif5D4jy/n\n\tDAlNI2ykMqt+OGXnkLF/SktvlD3HjWmyQ5c/53Seeee/1tn8m5Q==","X-Received":["by 2002:a67:a202:0:b0:39b:181d:bd20 with SMTP id\n\tl2-20020a67a202000000b0039b181dbd20mr13298239vse.51.1664359261679; \n\tWed, 28 Sep 2022 03:01:01 -0700 (PDT)","by 2002:a67:a202:0:b0:39b:181d:bd20 with SMTP id\n\tl2-20020a67a202000000b0039b181dbd20mr13298235vse.51.1664359261458;\n\tWed, 28 Sep 2022 03:01:01 -0700 (PDT)"],"X-Google-Smtp-Source":"AMsMyM5J2q7sqNnjflhZogUClCLFS2hrVWaFyImX3Vn7f61v/tEIvTIuckZsQr0AYr3mh4j9UMZgr1gARFMqwEqkQQY=","MIME-Version":"1.0","References":"<20220928014934.22922-1-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220928014934.22922-1-laurent.pinchart@ideasonboard.com>","Date":"Wed, 28 Sep 2022 11:00:45 +0100","Message-ID":"<CAOgh=FwAXbNpJ64A8Ko_aik1hQQ9yxg6WrkXZYQj0a4KCbyYog@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] cam: kms_sink: Add color space support","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":"Eric Curtin via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Eric Curtin <ecurtin@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]