aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-dv-timings.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-dv-timings.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-dv-timings.c156
1 files changed, 142 insertions, 14 deletions
diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c
index e2ee5f00c445..c81faea96fba 100644
--- a/drivers/media/v4l2-core/v4l2-dv-timings.c
+++ b/drivers/media/v4l2-core/v4l2-dv-timings.c
@@ -1,21 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/* 2/*
2 * v4l2-dv-timings - dv-timings helper functions 3 * v4l2-dv-timings - dv-timings helper functions
3 * 4 *
4 * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved. 5 * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
5 *
6 * This program is free software; you may redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
11 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
13 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
14 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
15 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
16 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17 * SOFTWARE.
18 *
19 */ 6 */
20 7
21#include <linux/module.h> 8#include <linux/module.h>
@@ -27,6 +14,7 @@
27#include <linux/v4l2-dv-timings.h> 14#include <linux/v4l2-dv-timings.h>
28#include <media/v4l2-dv-timings.h> 15#include <media/v4l2-dv-timings.h>
29#include <linux/math64.h> 16#include <linux/math64.h>
17#include <linux/hdmi.h>
30 18
31MODULE_AUTHOR("Hans Verkuil"); 19MODULE_AUTHOR("Hans Verkuil");
32MODULE_DESCRIPTION("V4L2 DV Timings Helper Functions"); 20MODULE_DESCRIPTION("V4L2 DV Timings Helper Functions");
@@ -814,3 +802,143 @@ struct v4l2_fract v4l2_calc_aspect_ratio(u8 hor_landscape, u8 vert_portrait)
814 return aspect; 802 return aspect;
815} 803}
816EXPORT_SYMBOL_GPL(v4l2_calc_aspect_ratio); 804EXPORT_SYMBOL_GPL(v4l2_calc_aspect_ratio);
805
806/** v4l2_hdmi_rx_colorimetry - determine HDMI colorimetry information
807 * based on various InfoFrames.
808 * @avi: the AVI InfoFrame
809 * @hdmi: the HDMI Vendor InfoFrame, may be NULL
810 * @height: the frame height
811 *
812 * Determines the HDMI colorimetry information, i.e. how the HDMI
813 * pixel color data should be interpreted.
814 *
815 * Note that some of the newer features (DCI-P3, HDR) are not yet
816 * implemented: the hdmi.h header needs to be updated to the HDMI 2.0
817 * and CTA-861-G standards.
818 */
819struct v4l2_hdmi_colorimetry
820v4l2_hdmi_rx_colorimetry(const struct hdmi_avi_infoframe *avi,
821 const struct hdmi_vendor_infoframe *hdmi,
822 unsigned int height)
823{
824 struct v4l2_hdmi_colorimetry c = {
825 V4L2_COLORSPACE_SRGB,
826 V4L2_YCBCR_ENC_DEFAULT,
827 V4L2_QUANTIZATION_FULL_RANGE,
828 V4L2_XFER_FUNC_SRGB
829 };
830 bool is_ce = avi->video_code || (hdmi && hdmi->vic);
831 bool is_sdtv = height <= 576;
832 bool default_is_lim_range_rgb = avi->video_code > 1;
833
834 switch (avi->colorspace) {
835 case HDMI_COLORSPACE_RGB:
836 /* RGB pixel encoding */
837 switch (avi->colorimetry) {
838 case HDMI_COLORIMETRY_EXTENDED:
839 switch (avi->extended_colorimetry) {
840 case HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB:
841 c.colorspace = V4L2_COLORSPACE_ADOBERGB;
842 c.xfer_func = V4L2_XFER_FUNC_ADOBERGB;
843 break;
844 case HDMI_EXTENDED_COLORIMETRY_BT2020:
845 c.colorspace = V4L2_COLORSPACE_BT2020;
846 c.xfer_func = V4L2_XFER_FUNC_709;
847 break;
848 default:
849 break;
850 }
851 break;
852 default:
853 break;
854 }
855 switch (avi->quantization_range) {
856 case HDMI_QUANTIZATION_RANGE_LIMITED:
857 c.quantization = V4L2_QUANTIZATION_LIM_RANGE;
858 break;
859 case HDMI_QUANTIZATION_RANGE_FULL:
860 break;
861 default:
862 if (default_is_lim_range_rgb)
863 c.quantization = V4L2_QUANTIZATION_LIM_RANGE;
864 break;
865 }
866 break;
867
868 default:
869 /* YCbCr pixel encoding */
870 c.quantization = V4L2_QUANTIZATION_LIM_RANGE;
871 switch (avi->colorimetry) {
872 case HDMI_COLORIMETRY_NONE:
873 if (!is_ce)
874 break;
875 if (is_sdtv) {
876 c.colorspace = V4L2_COLORSPACE_SMPTE170M;
877 c.ycbcr_enc = V4L2_YCBCR_ENC_601;
878 } else {
879 c.colorspace = V4L2_COLORSPACE_REC709;
880 c.ycbcr_enc = V4L2_YCBCR_ENC_709;
881 }
882 c.xfer_func = V4L2_XFER_FUNC_709;
883 break;
884 case HDMI_COLORIMETRY_ITU_601:
885 c.colorspace = V4L2_COLORSPACE_SMPTE170M;
886 c.ycbcr_enc = V4L2_YCBCR_ENC_601;
887 c.xfer_func = V4L2_XFER_FUNC_709;
888 break;
889 case HDMI_COLORIMETRY_ITU_709:
890 c.colorspace = V4L2_COLORSPACE_REC709;
891 c.ycbcr_enc = V4L2_YCBCR_ENC_709;
892 c.xfer_func = V4L2_XFER_FUNC_709;
893 break;
894 case HDMI_COLORIMETRY_EXTENDED:
895 switch (avi->extended_colorimetry) {
896 case HDMI_EXTENDED_COLORIMETRY_XV_YCC_601:
897 c.colorspace = V4L2_COLORSPACE_REC709;
898 c.ycbcr_enc = V4L2_YCBCR_ENC_XV709;
899 c.xfer_func = V4L2_XFER_FUNC_709;
900 break;
901 case HDMI_EXTENDED_COLORIMETRY_XV_YCC_709:
902 c.colorspace = V4L2_COLORSPACE_REC709;
903 c.ycbcr_enc = V4L2_YCBCR_ENC_XV601;
904 c.xfer_func = V4L2_XFER_FUNC_709;
905 break;
906 case HDMI_EXTENDED_COLORIMETRY_S_YCC_601:
907 c.colorspace = V4L2_COLORSPACE_SRGB;
908 c.ycbcr_enc = V4L2_YCBCR_ENC_601;
909 c.xfer_func = V4L2_XFER_FUNC_SRGB;
910 break;
911 case HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601:
912 c.colorspace = V4L2_COLORSPACE_ADOBERGB;
913 c.ycbcr_enc = V4L2_YCBCR_ENC_601;
914 c.xfer_func = V4L2_XFER_FUNC_ADOBERGB;
915 break;
916 case HDMI_EXTENDED_COLORIMETRY_BT2020:
917 c.colorspace = V4L2_COLORSPACE_BT2020;
918 c.ycbcr_enc = V4L2_YCBCR_ENC_BT2020;
919 c.xfer_func = V4L2_XFER_FUNC_709;
920 break;
921 case HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM:
922 c.colorspace = V4L2_COLORSPACE_BT2020;
923 c.ycbcr_enc = V4L2_YCBCR_ENC_BT2020_CONST_LUM;
924 c.xfer_func = V4L2_XFER_FUNC_709;
925 break;
926 default: /* fall back to ITU_709 */
927 c.colorspace = V4L2_COLORSPACE_REC709;
928 c.ycbcr_enc = V4L2_YCBCR_ENC_709;
929 c.xfer_func = V4L2_XFER_FUNC_709;
930 break;
931 }
932 break;
933 default:
934 break;
935 }
936 /*
937 * YCC Quantization Range signaling is more-or-less broken,
938 * let's just ignore this.
939 */
940 break;
941 }
942 return c;
943}
944EXPORT_SYMBOL_GPL(v4l2_hdmi_rx_colorimetry);