Received: by 10.223.185.116 with SMTP id b49csp2338999wrg; Thu, 15 Feb 2018 10:04:00 -0800 (PST) X-Google-Smtp-Source: AH8x224mUkTb7HBUaEQ74UWNKl2IHCgFIhHZYTs4jTVfmntnI2yoFKleBwXEIeSGWjmftm1791Af X-Received: by 2002:a17:902:7614:: with SMTP id k20-v6mr3262062pll.343.1518717839973; Thu, 15 Feb 2018 10:03:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518717839; cv=none; d=google.com; s=arc-20160816; b=Oq2RIdFrazSevkqqINxo3HWn/1PR53Bce0M0FdaMuLNqWUE2lTyN2kbgLclBfTsln6 znPm52t6CYTeao5qqztZ8tkkKpabPnDStG0uSlWEIaDdD3HK4uq7YI6SSoOkhNrHIYZN Ht3XWEUBp5dyxY090ig14pgXrV6nrO/gfy9WxQk7hsyNa457bbGTZCZ+Jk7zIhAcB+lz xouNnRH6UB2ya7Q87GiHEukIxgXk/dUnVerzwPs8Xv4nv0bR3HH7aqzxac3plgEUFAle eonvDz2GM56HwAtDIkh2WidGHkZ5XTY4b6/v02tq9z67me641xpuuNHT0FQ78HnLS9cv yLzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=fp4Gd555MpbInfEntEVFUpAzVpyKDgcQkoms1by9/WA=; b=RppCti46YTd6Z92rN4+vfYn+c8ixgz0sX/EuCJVv5GYpMmcCbWE377DwmJFx4wGDdS ocDFMYTyYZgZ35l9R3XWQSrR00kjcRU/EL9n3Bg4bXMHrR2Emn7Jj0cDLTm/9YHrGOZM qoQrq5tod79pqFue3nS1FagIJtINLo6cOW+hSFLx86+4t4dKjutrrBVSM4osYl/zP8pZ uKiM/y6kGScz1jTdiWcKxI3r14yRNmdZIxtetFvR1aM9TUuLCr+6PpYViVFz91+xidWA hXi34SO4RtE3RT4giwPNDLXsj4YoI64XEaDANo/cX932KFtYxf/GhHd07JV0BeLtmePZ W2mw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gateworks-com.20150623.gappssmtp.com header.s=20150623 header.b=Kq8VDPWN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l4-v6si4868705pln.121.2018.02.15.10.03.36; Thu, 15 Feb 2018 10:03:59 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gateworks-com.20150623.gappssmtp.com header.s=20150623 header.b=Kq8VDPWN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1165977AbeBOSAx (ORCPT + 99 others); Thu, 15 Feb 2018 13:00:53 -0500 Received: from mail-pl0-f67.google.com ([209.85.160.67]:37610 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1165926AbeBOR4M (ORCPT ); Thu, 15 Feb 2018 12:56:12 -0500 Received: by mail-pl0-f67.google.com with SMTP id ay8so246588plb.4 for ; Thu, 15 Feb 2018 09:56:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gateworks-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fp4Gd555MpbInfEntEVFUpAzVpyKDgcQkoms1by9/WA=; b=Kq8VDPWNBcMS+FEHXk2W+CkO6fqNeeYIC/DZclZe7ANsgslHRzyQahofxKDTdNRn5L oE2KtKPuN/0XcITOurP3nuYLS+PnH0AtRdisWUrVwh21yQSES1YdFwwerxmUuv6Mv5d6 F3z2FACcG7bEzq3EvUEutbvFQlZ4ZsmD87jqdr7SyOE9SSnpEeier6GaLwu0mjBhmm+Q AZSg9X1wUx9tMl3nrNfVyFtJS2U4jjSgpla8lrBM1KHLaHUPhvuCyA666Gkfa1V2IIrE GMCp6aVoGfGdqrlDMufPBAR2gE1gD8m2y1yClNAeKGym6CSUIEQrRX7X6TWl//jmnvwc 9rXw== 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=fp4Gd555MpbInfEntEVFUpAzVpyKDgcQkoms1by9/WA=; b=Yt1v6RzCgqUe9KdO6Gsgxw8WWKJMjrg9UBFlCi0qUH9+eNrzzrDdtuaOSCmEz2URoU x8F5AhhWts9QDj7AEHAyOzeC1vWLpZO0R6Z01QFEpUHLxx8JHEML+mXIFIN+mMp94ICd vnJEDxlCz7SToWdihW5uyXNU7HgaptozKCKuki/ylxhbSHgXs2vWGsKrxQJ5ZFk0dPUG 2A/Rf0eZ50FuxraZxd7Tmucz2cFH62oc5JglnK5HueeoJwhRhI0yBMDZxgGzM2EOUxtZ vDOi8+NtgRq30+BVH73ohPovRtbQO3ge3SUDB/Wze2Cefy7f/og/eC8T/xMuw8KvlekC YsAg== X-Gm-Message-State: APf1xPBTf80vewK9yq47xPb4wGMFOiha26a3UkysyHU0CUklQWxSEa5q BA4Hqi3jR9Eq8e3ldMW1ZL7bhg== X-Received: by 2002:a17:902:8e83:: with SMTP id bg3-v6mr3327813plb.246.1518717371661; Thu, 15 Feb 2018 09:56:11 -0800 (PST) Received: from tharvey.pdc.gateworks.com (68-189-91-139.static.snlo.ca.charter.com. [68.189.91.139]) by smtp.gmail.com with ESMTPSA id l84sm45807604pfb.153.2018.02.15.09.56.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 15 Feb 2018 09:56:10 -0800 (PST) From: Tim Harvey To: linux-media@vger.kernel.org, alsa-devel@alsa-project.org Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, shawnguo@kernel.org, Steve Longerbeam , Philipp Zabel , Hans Verkuil , Mauro Carvalho Chehab , Hans Verkuil , Randy Dunlap , Hans Verkuil Subject: [PATCH v13 1/8] v4l2-dv-timings: add v4l2_hdmi_colorimetry() Date: Thu, 15 Feb 2018 09:55:29 -0800 Message-Id: <1518717336-6271-2-git-send-email-tharvey@gateworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518717336-6271-1-git-send-email-tharvey@gateworks.com> References: <1518717336-6271-1-git-send-email-tharvey@gateworks.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hans Verkuil Add the v4l2_hdmi_colorimetry() function so we have a single function that determines the colorspace, YCbCr encoding, quantization range and transfer function from the InfoFrame data. Cc: Randy Dunlap Signed-off-by: Hans Verkuil --- v9: - fix kernel-doc format (Randy) drivers/media/v4l2-core/v4l2-dv-timings.c | 141 ++++++++++++++++++++++++++++++ include/media/v4l2-dv-timings.h | 21 +++++ 2 files changed, 162 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c index 930f9c5..5663d86 100644 --- a/drivers/media/v4l2-core/v4l2-dv-timings.c +++ b/drivers/media/v4l2-core/v4l2-dv-timings.c @@ -27,6 +27,7 @@ #include #include #include +#include MODULE_AUTHOR("Hans Verkuil"); MODULE_DESCRIPTION("V4L2 DV Timings Helper Functions"); @@ -814,3 +815,143 @@ struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait) return aspect; } EXPORT_SYMBOL_GPL(v4l2_calc_aspect_ratio); + +/** v4l2_hdmi_rx_colorimetry - determine HDMI colorimetry information + * based on various InfoFrames. + * @avi: the AVI InfoFrame + * @hdmi: the HDMI Vendor InfoFrame, may be NULL + * @height: the frame height + * + * Determines the HDMI colorimetry information, i.e. how the HDMI + * pixel color data should be interpreted. + * + * Note that some of the newer features (DCI-P3, HDR) are not yet + * implemented: the hdmi.h header needs to be updated to the HDMI 2.0 + * and CTA-861-G standards. + */ +struct v4l2_hdmi_colorimetry +v4l2_hdmi_rx_colorimetry(const struct hdmi_avi_infoframe *avi, + const struct hdmi_vendor_infoframe *hdmi, + unsigned int height) +{ + struct v4l2_hdmi_colorimetry c = { + V4L2_COLORSPACE_SRGB, + V4L2_YCBCR_ENC_DEFAULT, + V4L2_QUANTIZATION_FULL_RANGE, + V4L2_XFER_FUNC_SRGB + }; + bool is_ce = avi->video_code || (hdmi && hdmi->vic); + bool is_sdtv = height <= 576; + bool default_is_lim_range_rgb = avi->video_code > 1; + + switch (avi->colorspace) { + case HDMI_COLORSPACE_RGB: + /* RGB pixel encoding */ + switch (avi->colorimetry) { + case HDMI_COLORIMETRY_EXTENDED: + switch (avi->extended_colorimetry) { + case HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB: + c.colorspace = V4L2_COLORSPACE_ADOBERGB; + c.xfer_func = V4L2_XFER_FUNC_ADOBERGB; + break; + case HDMI_EXTENDED_COLORIMETRY_BT2020: + c.colorspace = V4L2_COLORSPACE_BT2020; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + default: + break; + } + break; + default: + break; + } + switch (avi->quantization_range) { + case HDMI_QUANTIZATION_RANGE_LIMITED: + c.quantization = V4L2_QUANTIZATION_LIM_RANGE; + break; + case HDMI_QUANTIZATION_RANGE_FULL: + break; + default: + if (default_is_lim_range_rgb) + c.quantization = V4L2_QUANTIZATION_LIM_RANGE; + break; + } + break; + + default: + /* YCbCr pixel encoding */ + c.quantization = V4L2_QUANTIZATION_LIM_RANGE; + switch (avi->colorimetry) { + case HDMI_COLORIMETRY_NONE: + if (!is_ce) + break; + if (is_sdtv) { + c.colorspace = V4L2_COLORSPACE_SMPTE170M; + c.ycbcr_enc = V4L2_YCBCR_ENC_601; + } else { + c.colorspace = V4L2_COLORSPACE_REC709; + c.ycbcr_enc = V4L2_YCBCR_ENC_709; + } + c.xfer_func = V4L2_XFER_FUNC_709; + break; + case HDMI_COLORIMETRY_ITU_601: + c.colorspace = V4L2_COLORSPACE_SMPTE170M; + c.ycbcr_enc = V4L2_YCBCR_ENC_601; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + case HDMI_COLORIMETRY_ITU_709: + c.colorspace = V4L2_COLORSPACE_REC709; + c.ycbcr_enc = V4L2_YCBCR_ENC_709; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + case HDMI_COLORIMETRY_EXTENDED: + switch (avi->extended_colorimetry) { + case HDMI_EXTENDED_COLORIMETRY_XV_YCC_601: + c.colorspace = V4L2_COLORSPACE_REC709; + c.ycbcr_enc = V4L2_YCBCR_ENC_XV709; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + case HDMI_EXTENDED_COLORIMETRY_XV_YCC_709: + c.colorspace = V4L2_COLORSPACE_REC709; + c.ycbcr_enc = V4L2_YCBCR_ENC_XV601; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + case HDMI_EXTENDED_COLORIMETRY_S_YCC_601: + c.colorspace = V4L2_COLORSPACE_SRGB; + c.ycbcr_enc = V4L2_YCBCR_ENC_601; + c.xfer_func = V4L2_XFER_FUNC_SRGB; + break; + case HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601: + c.colorspace = V4L2_COLORSPACE_ADOBERGB; + c.ycbcr_enc = V4L2_YCBCR_ENC_601; + c.xfer_func = V4L2_XFER_FUNC_ADOBERGB; + break; + case HDMI_EXTENDED_COLORIMETRY_BT2020: + c.colorspace = V4L2_COLORSPACE_BT2020; + c.ycbcr_enc = V4L2_YCBCR_ENC_BT2020; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + case HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM: + c.colorspace = V4L2_COLORSPACE_BT2020; + c.ycbcr_enc = V4L2_YCBCR_ENC_BT2020_CONST_LUM; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + default: /* fall back to ITU_709 */ + c.colorspace = V4L2_COLORSPACE_REC709; + c.ycbcr_enc = V4L2_YCBCR_ENC_709; + c.xfer_func = V4L2_XFER_FUNC_709; + break; + } + break; + default: + break; + } + /* + * YCC Quantization Range signaling is more-or-less broken, + * let's just ignore this. + */ + break; + } + return c; +} +EXPORT_SYMBOL_GPL(v4l2_hdmi_rx_colorimetry); diff --git a/include/media/v4l2-dv-timings.h b/include/media/v4l2-dv-timings.h index 61a1889..835aef7 100644 --- a/include/media/v4l2-dv-timings.h +++ b/include/media/v4l2-dv-timings.h @@ -223,5 +223,26 @@ static inline bool can_reduce_fps(struct v4l2_bt_timings *bt) return false; } +/** + * struct v4l2_hdmi_rx_colorimetry - describes the HDMI colorimetry information + * @colorspace: enum v4l2_colorspace, the colorspace + * @ycbcr_enc: enum v4l2_ycbcr_encoding, Y'CbCr encoding + * @quantization: enum v4l2_quantization, colorspace quantization + * @xfer_func: enum v4l2_xfer_func, colorspace transfer function + */ +struct v4l2_hdmi_colorimetry { + enum v4l2_colorspace colorspace; + enum v4l2_ycbcr_encoding ycbcr_enc; + enum v4l2_quantization quantization; + enum v4l2_xfer_func xfer_func; +}; + +struct hdmi_avi_infoframe; +struct hdmi_vendor_infoframe; + +struct v4l2_hdmi_colorimetry +v4l2_hdmi_rx_colorimetry(const struct hdmi_avi_infoframe *avi, + const struct hdmi_vendor_infoframe *hdmi, + unsigned int height); #endif -- 2.7.4