diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-dv-timings.c')
-rw-r--r-- | drivers/media/v4l2-core/v4l2-dv-timings.c | 156 |
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 | ||
31 | MODULE_AUTHOR("Hans Verkuil"); | 19 | MODULE_AUTHOR("Hans Verkuil"); |
32 | MODULE_DESCRIPTION("V4L2 DV Timings Helper Functions"); | 20 | MODULE_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 | } |
816 | EXPORT_SYMBOL_GPL(v4l2_calc_aspect_ratio); | 804 | EXPORT_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 | */ | ||
819 | struct v4l2_hdmi_colorimetry | ||
820 | v4l2_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 | } | ||
944 | EXPORT_SYMBOL_GPL(v4l2_hdmi_rx_colorimetry); | ||