From patchwork Thu May 25 00:29:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Longerbeam X-Patchwork-Id: 9747389 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 40566601E9 for ; Thu, 25 May 2017 00:36:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2EEF726E4E for ; Thu, 25 May 2017 00:36:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2279926E97; Thu, 25 May 2017 00:36:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6786826E4E for ; Thu, 25 May 2017 00:36:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=wvPvmlIx4Z+ontBNUmOE29dvyCtJ9pDF4vjsIoGrkAc=; b=U9ErUJBoDf7VHZQYXCmvRQY2oI 7TaQnfNHdj97PDttd8dYjE1jbZ2UMrqB5n1pFJ9CHA0W/z9kakzwRGQj1BAY01mAecXFEJWx4u+gB BFWEmA1w4OcuYTQ8Hua1b+OOUVQ2KrxJYXVYStnTC9edTrdKtJXD+tl8UtwmRy5fBN18D37Q54JQc 6KeZQVwODu/qcY3s8UjhCLCLwOHFSA8JkqASNJPhbKhPeNL6TatheN6K5B+9i9vmQD0rlqw2UybQ1 0No7eeWKg8XK589X0YZdFoJS8UUiRYEgzNP/0Zcoynti9tVZRCbH7pfX8+EF2EjH2qpc2wK3THiIg NFelpGLg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1dDglh-0006Mk-Js; Thu, 25 May 2017 00:36:45 +0000 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dDggu-0000g8-51 for linux-arm-kernel@lists.infradead.org; Thu, 25 May 2017 00:32:30 +0000 Received: by mail-pf0-x242.google.com with SMTP id f27so35385050pfe.0 for ; Wed, 24 May 2017 17:31:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FnmxMr669LZ4uo0lDvJdkhiqjTLHeWINPJ1NoXKQmMw=; b=fXz7iiP6X8VVQUjBrcZ02igGOw/70AcxBLjSBKIT26RCtBJqeYrWZO5C+B3VYjFCGi 8qHN/PCPLn19Is9wFRZwySFJb+LSk8hwLfxkMJ/cQ48nhSdFA3v8fPgTNrrtLQTJsVD/ Bd/QUynFk6GwW1cs4/qBYwf77Hazaf6fFK9mzK/4k4aQJzGyM3YR6CRG5uwyJZNX5Ntn KaxjPjpJsNaeW4cqU4hlnl5OZVu0FSK6g67QdVUwZyUA0p/SGNeiy0XR0/CqoP8nElOQ OAQwwboLZ/iRbzsunjVKSKfl6z1FDqfWgL5mBw1xxaj9MIQ7FjJV+bSn4SyI57eAiWpU AE7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FnmxMr669LZ4uo0lDvJdkhiqjTLHeWINPJ1NoXKQmMw=; b=NzvD+z6clgNff9N14byAk8EJ3ylKtblE/cXwGd0JO++vt0h0vdtkhTxmJ7L5Eg3MyS geXfX8bjBABVUcvHOOtXaeE8JXtncIh6qxWeSmrwPHG+6n21IAcnmJDVV4c8AchVEmKi dzXnr1ZmNtpQLPMmtOVhKAiQ90xsYN4bgmERFBn+NEplVBiF5s0Ff4Nr34Oo+2ofUxbR 01PmeQKHXMnNhqmQLl6cLJOgZAQFGg31kdrCGMKgTbG37xo+KxlFO0sJxXbwKN/WEh8+ KM+MgzK6lge27mUMPKfZkMoTyVSeD1cxwV4oVNIsg7rAsf/VKAOXtarEifD8xvVDSfqv sleg== X-Gm-Message-State: AODbwcB9yCdIPiTzRMvX4/8bqJvo3eU8PBc17BmUqUeMP5Lxv8CwMmUT C3MA3jRcnGzNbg== X-Received: by 10.99.62.67 with SMTP id l64mr41168993pga.172.1495672287468; Wed, 24 May 2017 17:31:27 -0700 (PDT) Received: from mappy.sklembedded.com (c-98-210-181-167.hsd1.ca.comcast.net. [98.210.181.167]) by smtp.googlemail.com with ESMTPSA id q27sm10605716pfk.4.2017.05.24.17.31.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 24 May 2017 17:31:26 -0700 (PDT) From: Steve Longerbeam X-Google-Original-From: Steve Longerbeam To: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, kernel@pengutronix.de, fabio.estevam@nxp.com, linux@armlinux.org.uk, mchehab@kernel.org, hverkuil@xs4all.nl, nick@shmanahar.org, markus.heiser@darmarIT.de, p.zabel@pengutronix.de, laurent.pinchart+renesas@ideasonboard.com, bparrot@ti.com, geert@linux-m68k.org, arnd@arndb.de, sudipm.mukherjee@gmail.com, minghsiu.tsai@mediatek.com, tiffany.lin@mediatek.com, jean-christophe.trotin@st.com, horms+renesas@verge.net.au, niklas.soderlund+renesas@ragnatech.se, robert.jarzmik@free.fr, songjun.wu@microchip.com, andrew-ct.chen@mediatek.com, gregkh@linuxfoundation.org, shuah@kernel.org, sakari.ailus@linux.intel.com, pavel@ucw.cz Subject: [PATCH v7 33/34] media: imx: set and propagate default field, colorimetry Date: Wed, 24 May 2017 17:29:48 -0700 Message-Id: <1495672189-29164-34-git-send-email-steve_longerbeam@mentor.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495672189-29164-1-git-send-email-steve_longerbeam@mentor.com> References: <1495672189-29164-1-git-send-email-steve_longerbeam@mentor.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170524_173148_665120_1F974CDF X-CRM114-Status: GOOD ( 18.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, devicetree@vger.kernel.org, Steve Longerbeam , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds a call to imx_media_fill_default_mbus_fields() in the *_try_fmt() functions at the sink pads, to set empty field order and colorimetry parameters. If the field order is set to ANY, choose the currently set field order at the sink pad. If the colorspace is set to DEFAULT, choose the current colorspace at the sink pad. If any of xfer_func, ycbcr_enc or quantization are set to DEFAULT, either choose the current sink pad setting, or the default setting for the new colorspace, if non-DEFAULT colorspace was given. If a format is destined to be routed through the Image Converter, fixed quantization and Y`CbCr encoding must be set. Colorimetry is also propagated from sink to source pads anywhere this has not already been done. Signed-off-by: Steve Longerbeam Signed-off-by: Philipp Zabel --- drivers/staging/media/imx/imx-ic-prp.c | 10 +++-- drivers/staging/media/imx/imx-ic-prpencvf.c | 17 ++++++-- drivers/staging/media/imx/imx-media-csi.c | 14 ++++++- drivers/staging/media/imx/imx-media-utils.c | 62 +++++++++++++++++++++++++++++ drivers/staging/media/imx/imx-media-vdic.c | 8 +++- drivers/staging/media/imx/imx-media.h | 4 +- 6 files changed, 103 insertions(+), 12 deletions(-) diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media/imx/imx-ic-prp.c index 3fc2a4e..7bc293a 100644 --- a/drivers/staging/media/imx/imx-ic-prp.c +++ b/drivers/staging/media/imx/imx-ic-prp.c @@ -166,8 +166,8 @@ static int prp_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *sdformat) { struct prp_priv *priv = sd_to_priv(sd); + struct v4l2_mbus_framefmt *fmt, *infmt; const struct imx_media_pixfmt *cc; - struct v4l2_mbus_framefmt *fmt; int ret = 0; u32 code; @@ -181,6 +181,8 @@ static int prp_set_fmt(struct v4l2_subdev *sd, goto out; } + infmt = __prp_get_fmt(priv, cfg, PRP_SINK_PAD, sdformat->which); + switch (sdformat->pad) { case PRP_SINK_PAD: v4l_bound_align_image(&sdformat->format.width, MIN_W, MAX_W, @@ -194,12 +196,14 @@ static int prp_set_fmt(struct v4l2_subdev *sd, cc = imx_media_find_ipu_format(code, CS_SEL_ANY); sdformat->format.code = cc->codes[0]; } + + imx_media_fill_default_mbus_fields(&sdformat->format, infmt, + true); break; case PRP_SRC_PAD_PRPENC: case PRP_SRC_PAD_PRPVF: /* Output pads mirror input pad */ - fmt = __prp_get_fmt(priv, cfg, PRP_SINK_PAD, sdformat->which); - sdformat->format = *fmt; + sdformat->format = *infmt; break; } diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c index aef0387..5e9c817 100644 --- a/drivers/staging/media/imx/imx-ic-prpencvf.c +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c @@ -805,6 +805,8 @@ static void prp_try_fmt(struct prp_priv *priv, struct v4l2_subdev_format *sdformat, const struct imx_media_pixfmt **cc) { + struct v4l2_mbus_framefmt *infmt; + *cc = imx_media_find_ipu_format(sdformat->format.code, CS_SEL_ANY); if (!*cc) { u32 code; @@ -814,22 +816,29 @@ static void prp_try_fmt(struct prp_priv *priv, sdformat->format.code = (*cc)->codes[0]; } - if (sdformat->pad == PRPENCVF_SRC_PAD) { - struct v4l2_mbus_framefmt *infmt = - __prp_get_fmt(priv, cfg, PRPENCVF_SINK_PAD, - sdformat->which); + infmt = __prp_get_fmt(priv, cfg, PRPENCVF_SINK_PAD, sdformat->which); + if (sdformat->pad == PRPENCVF_SRC_PAD) { if (sdformat->format.field != V4L2_FIELD_NONE) sdformat->format.field = infmt->field; prp_bound_align_output(&sdformat->format, infmt, priv->rot_mode); + + /* propagate colorimetry from sink */ + sdformat->format.colorspace = infmt->colorspace; + sdformat->format.xfer_func = infmt->xfer_func; + sdformat->format.quantization = infmt->quantization; + sdformat->format.ycbcr_enc = infmt->ycbcr_enc; } else { v4l_bound_align_image(&sdformat->format.width, MIN_W_SINK, MAX_W_SINK, W_ALIGN_SINK, &sdformat->format.height, MIN_H_SINK, MAX_H_SINK, H_ALIGN_SINK, S_ALIGN); + + imx_media_fill_default_mbus_fields(&sdformat->format, infmt, + true); } } diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c index b8b3630..4ab401d 100644 --- a/drivers/staging/media/imx/imx-media-csi.c +++ b/drivers/staging/media/imx/imx-media-csi.c @@ -1268,11 +1268,11 @@ static void csi_try_fmt(struct csi_priv *priv, struct v4l2_mbus_framefmt *infmt; u32 code; + infmt = __csi_get_fmt(priv, cfg, CSI_SINK_PAD, sdformat->which); + switch (sdformat->pad) { case CSI_SRC_PAD_DIRECT: case CSI_SRC_PAD_IDMAC: - infmt = __csi_get_fmt(priv, cfg, CSI_SINK_PAD, - sdformat->which); incc = imx_media_find_mbus_format(infmt->code, CS_SEL_ANY, true); @@ -1308,6 +1308,12 @@ static void csi_try_fmt(struct csi_priv *priv, sdformat->format.field = (infmt->height == 480) ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_SEQ_BT; } + + /* propagate colorimetry from sink */ + sdformat->format.colorspace = infmt->colorspace; + sdformat->format.xfer_func = infmt->xfer_func; + sdformat->format.quantization = infmt->quantization; + sdformat->format.ycbcr_enc = infmt->ycbcr_enc; break; case CSI_SINK_PAD: v4l_bound_align_image(&sdformat->format.width, MIN_W, MAX_W, @@ -1334,6 +1340,10 @@ static void csi_try_fmt(struct csi_priv *priv, CS_SEL_ANY, false); sdformat->format.code = (*cc)->codes[0]; } + + imx_media_fill_default_mbus_fields( + &sdformat->format, infmt, + priv->active_output_pad == CSI_SRC_PAD_DIRECT); break; } } diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c index f718422..5952387 100644 --- a/drivers/staging/media/imx/imx-media-utils.c +++ b/drivers/staging/media/imx/imx-media-utils.c @@ -464,6 +464,68 @@ int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus, } EXPORT_SYMBOL_GPL(imx_media_init_mbus_fmt); +/* + * Check whether the field and colorimetry parameters in tryfmt are + * uninitialized, and if so fill them with the values from fmt, + * or if tryfmt->colorspace has been initialized, all the default + * colorimetry params can be derived from tryfmt->colorspace. + * + * tryfmt->code must be set on entry. + * + * If this format is destined to be routed through the Image Converter, + * quantization and Y`CbCr encoding must be fixed. The IC expects and + * produces fixed quantization and Y`CbCr encoding at its input and output + * (full range for RGB, limited range for YUV, and V4L2_YCBCR_ENC_601). + */ +void imx_media_fill_default_mbus_fields(struct v4l2_mbus_framefmt *tryfmt, + struct v4l2_mbus_framefmt *fmt, + bool ic_route) +{ + const struct imx_media_pixfmt *cc; + bool is_rgb = false; + + cc = imx_media_find_mbus_format(tryfmt->code, CS_SEL_ANY, true); + if (!cc) + cc = imx_media_find_ipu_format(tryfmt->code, CS_SEL_ANY); + if (cc && cc->cs != IPUV3_COLORSPACE_YUV) + is_rgb = true; + + /* fill field if necessary */ + if (tryfmt->field == V4L2_FIELD_ANY) + tryfmt->field = fmt->field; + + /* fill colorimetry if necessary */ + if (tryfmt->colorspace == V4L2_COLORSPACE_DEFAULT) { + tryfmt->colorspace = fmt->colorspace; + tryfmt->xfer_func = fmt->xfer_func; + tryfmt->ycbcr_enc = fmt->ycbcr_enc; + tryfmt->quantization = fmt->quantization; + } else { + if (tryfmt->xfer_func == V4L2_XFER_FUNC_DEFAULT) { + tryfmt->xfer_func = + V4L2_MAP_XFER_FUNC_DEFAULT(tryfmt->colorspace); + } + if (tryfmt->ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT) { + tryfmt->ycbcr_enc = + V4L2_MAP_YCBCR_ENC_DEFAULT(tryfmt->colorspace); + } + if (tryfmt->quantization == V4L2_QUANTIZATION_DEFAULT) { + tryfmt->quantization = + V4L2_MAP_QUANTIZATION_DEFAULT( + is_rgb, tryfmt->colorspace, + tryfmt->ycbcr_enc); + } + } + + if (ic_route) { + tryfmt->quantization = is_rgb ? + V4L2_QUANTIZATION_FULL_RANGE : + V4L2_QUANTIZATION_LIM_RANGE; + tryfmt->ycbcr_enc = V4L2_YCBCR_ENC_601; + } +} +EXPORT_SYMBOL_GPL(imx_media_fill_default_mbus_fields); + int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix, struct v4l2_mbus_framefmt *mbus, const struct imx_media_pixfmt *cc) diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c index 3dedc47..c0b6d7f 100644 --- a/drivers/staging/media/imx/imx-media-vdic.c +++ b/drivers/staging/media/imx/imx-media-vdic.c @@ -603,10 +603,11 @@ static void vdic_try_fmt(struct vdic_priv *priv, sdformat->format.code = (*cc)->codes[0]; } + infmt = __vdic_get_fmt(priv, cfg, priv->active_input_pad, + sdformat->which); + switch (sdformat->pad) { case VDIC_SRC_PAD_DIRECT: - infmt = __vdic_get_fmt(priv, cfg, priv->active_input_pad, - sdformat->which); sdformat->format = *infmt; /* output is always progressive! */ sdformat->format.field = V4L2_FIELD_NONE; @@ -618,6 +619,9 @@ static void vdic_try_fmt(struct vdic_priv *priv, &sdformat->format.height, MIN_H, MAX_H_VDIC, H_ALIGN, S_ALIGN); + imx_media_fill_default_mbus_fields(&sdformat->format, infmt, + true); + /* input must be interlaced! Choose SEQ_TB if not */ if (!V4L2_FIELD_HAS_BOTH(sdformat->format.field)) sdformat->format.field = V4L2_FIELD_SEQ_TB; diff --git a/drivers/staging/media/imx/imx-media.h b/drivers/staging/media/imx/imx-media.h index 6cebbd3..2cbf8e7 100644 --- a/drivers/staging/media/imx/imx-media.h +++ b/drivers/staging/media/imx/imx-media.h @@ -209,7 +209,9 @@ int imx_media_enum_ipu_format(u32 *code, u32 index, enum codespace_sel cs_sel); int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus, u32 width, u32 height, u32 code, u32 field, const struct imx_media_pixfmt **cc); - +void imx_media_fill_default_mbus_fields(struct v4l2_mbus_framefmt *tryfmt, + struct v4l2_mbus_framefmt *fmt, + bool ic_route); int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix, struct v4l2_mbus_framefmt *mbus, const struct imx_media_pixfmt *cc);