Explorar o código

video: driver: amend colorspace info setting

v4l2 enums for color space info are not one to one
mappings with hevc spec values. Hence, introduce and
use corresponding mapper functions.

Change-Id: I37a79a9b34b66184ece9a284ae98c9fa4efd248f
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar %!s(int64=4) %!d(string=hai) anos
pai
achega
20d30c5dd2

+ 12 - 0
driver/vidc/inc/msm_vidc_driver.h

@@ -195,6 +195,18 @@ enum msm_vidc_colorformat_type v4l2_colorformat_to_driver(u32 colorformat,
 	const char *func);
 u32 v4l2_colorformat_from_driver(enum msm_vidc_colorformat_type colorformat,
 	const char *func);
+u32 v4l2_color_primaries_to_driver(struct msm_vidc_inst *inst,
+	u32 v4l2_primaries);
+u32 v4l2_color_primaries_from_driver(struct msm_vidc_inst *inst,
+	u32 vidc_color_primaries);
+u32 v4l2_transfer_char_to_driver(struct msm_vidc_inst *inst,
+	u32 v4l2_transfer_char);
+u32 v4l2_transfer_char_from_driver(struct msm_vidc_inst *inst,
+	u32 vidc_transfer_char);
+u32 v4l2_matrix_coeff_to_driver(struct msm_vidc_inst *inst,
+	u32 v4l2_matrix_coeff);
+u32 v4l2_matrix_coeff_from_driver(struct msm_vidc_inst *inst,
+	u32 vidc_matrix_coeff);
 int v4l2_type_to_driver_port(struct msm_vidc_inst *inst, u32 type,
 	const char *func);
 const char *state_name(enum msm_vidc_inst_state state);

+ 55 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -198,6 +198,61 @@ enum msm_vidc_quality_mode {
 	MSM_VIDC_POWER_SAVE_MODE = 0x2,
 };
 
+enum msm_vidc_color_primaries {
+	MSM_VIDC_PRIMARIES_RESERVED                         = 0,
+	MSM_VIDC_PRIMARIES_BT709                            = 1,
+	MSM_VIDC_PRIMARIES_UNSPECIFIED                      = 2,
+	MSM_VIDC_PRIMARIES_BT470_SYSTEM_M                   = 4,
+	MSM_VIDC_PRIMARIES_BT470_SYSTEM_BG                  = 5,
+	MSM_VIDC_PRIMARIES_BT601_525                        = 6,
+	MSM_VIDC_PRIMARIES_SMPTE_ST240M                     = 7,
+	MSM_VIDC_PRIMARIES_GENERIC_FILM                     = 8,
+	MSM_VIDC_PRIMARIES_BT2020                           = 9,
+	MSM_VIDC_PRIMARIES_SMPTE_ST428_1                    = 10,
+	MSM_VIDC_PRIMARIES_SMPTE_RP431_2                    = 11,
+	MSM_VIDC_PRIMARIES_SMPTE_EG431_1                    = 12,
+	MSM_VIDC_PRIMARIES_SMPTE_EBU_TECH                   = 22,
+};
+
+enum msm_vidc_transfer_characteristics {
+	MSM_VIDC_TRANSFER_RESERVED                          = 0,
+	MSM_VIDC_TRANSFER_BT709                             = 1,
+	MSM_VIDC_TRANSFER_UNSPECIFIED                       = 2,
+	MSM_VIDC_TRANSFER_BT470_SYSTEM_M                    = 4,
+	MSM_VIDC_TRANSFER_BT470_SYSTEM_BG                   = 5,
+	MSM_VIDC_TRANSFER_BT601_525_OR_625                  = 6,
+	MSM_VIDC_TRANSFER_SMPTE_ST240M                      = 7,
+	MSM_VIDC_TRANSFER_LINEAR                            = 8,
+	MSM_VIDC_TRANSFER_LOG_100_1                         = 9,
+	MSM_VIDC_TRANSFER_LOG_SQRT                          = 10,
+	MSM_VIDC_TRANSFER_XVYCC                             = 11,
+	MSM_VIDC_TRANSFER_BT1361_0                          = 12,
+	MSM_VIDC_TRANSFER_SRGB_SYCC                         = 13,
+	MSM_VIDC_TRANSFER_BT2020_14                         = 14,
+	MSM_VIDC_TRANSFER_BT2020_15                         = 15,
+	MSM_VIDC_TRANSFER_SMPTE_ST2084_PQ                   = 16,
+	MSM_VIDC_TRANSFER_SMPTE_ST428_1                     = 17,
+	MSM_VIDC_TRANSFER_BT2100_2_HLG                      = 18,
+};
+
+enum msm_vidc_matrix_coefficients {
+	MSM_VIDC_MATRIX_COEFF_SRGB_SMPTE_ST428_1             = 0,
+	MSM_VIDC_MATRIX_COEFF_BT709                          = 1,
+	MSM_VIDC_MATRIX_COEFF_UNSPECIFIED                    = 2,
+	MSM_VIDC_MATRIX_COEFF_RESERVED                       = 3,
+	MSM_VIDC_MATRIX_COEFF_FCC_TITLE_47                   = 4,
+	MSM_VIDC_MATRIX_COEFF_BT470_SYS_BG_OR_BT601_625      = 5,
+	MSM_VIDC_MATRIX_COEFF_BT601_525_BT1358_525_OR_625    = 6,
+	MSM_VIDC_MATRIX_COEFF_SMPTE_ST240                    = 7,
+	MSM_VIDC_MATRIX_COEFF_YCGCO                          = 8,
+	MSM_VIDC_MATRIX_COEFF_BT2020_NON_CONSTANT            = 9,
+	MSM_VIDC_MATRIX_COEFF_BT2020_CONSTANT                = 10,
+	MSM_VIDC_MATRIX_COEFF_SMPTE_ST2085                   = 11,
+	MSM_VIDC_MATRIX_COEFF_SMPTE_CHROM_DERV_NON_CONSTANT  = 12,
+	MSM_VIDC_MATRIX_COEFF_SMPTE_CHROM_DERV_CONSTANT      = 13,
+	MSM_VIDC_MATRIX_COEFF_BT2100                         = 14,
+};
+
 enum msm_vidc_core_capability_type {
 	CORE_CAP_NONE = 0,
 	ENC_CODECS,

+ 16 - 12
driver/vidc/src/msm_vdec.c

@@ -334,8 +334,10 @@ static int msm_vdec_set_colorspace(struct msm_vidc_inst *inst,
 	enum msm_vidc_port_type port)
 {
 	int rc = 0;
-	u32 primaries, matrix_coeff, transfer_char;
-	u32 full_range = 0;
+	u32 primaries = MSM_VIDC_PRIMARIES_RESERVED;
+	u32 matrix_coeff = MSM_VIDC_MATRIX_COEFF_RESERVED;
+	u32 transfer_char = MSM_VIDC_TRANSFER_RESERVED;
+	u32 full_range = V4L2_QUANTIZATION_DEFAULT;
 	u32 colour_description_present_flag = 0;
 	u32 video_signal_type_present_flag = 0, color_info = 0;
 	/* Unspecified video format */
@@ -349,15 +351,17 @@ static int msm_vdec_set_colorspace(struct msm_vidc_inst *inst,
 	if (inst->codec != MSM_VIDC_H264 && inst->codec != MSM_VIDC_HEVC)
 		return 0;
 
-	primaries = inst->fmts[port].fmt.pix_mp.colorspace;
-	matrix_coeff = inst->fmts[port].fmt.pix_mp.ycbcr_enc;
-	transfer_char = inst->fmts[port].fmt.pix_mp.xfer_func;
-
-	if (primaries != V4L2_COLORSPACE_DEFAULT ||
-	    transfer_char != V4L2_XFER_FUNC_DEFAULT ||
-	    matrix_coeff != V4L2_YCBCR_ENC_DEFAULT) {
+	if (inst->fmts[port].fmt.pix_mp.colorspace != V4L2_COLORSPACE_DEFAULT ||
+	    inst->fmts[port].fmt.pix_mp.ycbcr_enc != V4L2_XFER_FUNC_DEFAULT ||
+	    inst->fmts[port].fmt.pix_mp.xfer_func != V4L2_YCBCR_ENC_DEFAULT) {
 		colour_description_present_flag = 1;
 		video_signal_type_present_flag = 1;
+		primaries = v4l2_color_primaries_to_driver(inst,
+			inst->fmts[port].fmt.pix_mp.colorspace);
+		matrix_coeff = v4l2_matrix_coeff_to_driver(inst,
+			inst->fmts[port].fmt.pix_mp.ycbcr_enc);
+		transfer_char = v4l2_transfer_char_to_driver(inst,
+			inst->fmts[port].fmt.pix_mp.xfer_func);
 	}
 
 	if (inst->fmts[port].fmt.pix_mp.quantization !=
@@ -1291,11 +1295,11 @@ static int msm_vdec_update_properties(struct msm_vidc_inst *inst)
 			V4L2_QUANTIZATION_LIM_RANGE;
 		if (colour_description_present_flag) {
 			inst->fmts[OUTPUT_PORT].fmt.pix_mp.colorspace =
-				primaries;
+				v4l2_color_primaries_from_driver(inst, primaries);
 			inst->fmts[OUTPUT_PORT].fmt.pix_mp.xfer_func =
-				transfer_char;
+				v4l2_transfer_char_from_driver(inst, transfer_char);
 			inst->fmts[OUTPUT_PORT].fmt.pix_mp.ycbcr_enc =
-				matrix_coeff;
+				v4l2_matrix_coeff_from_driver(inst, matrix_coeff);
 		} else {
 			i_vpr_h(inst,
 				"%s: color description flag is not present\n",

+ 13 - 9
driver/vidc/src/msm_venc.c

@@ -272,8 +272,10 @@ static int msm_venc_set_colorspace(struct msm_vidc_inst* inst,
 	enum msm_vidc_port_type port)
 {
 	int rc = 0;
-	u32 primaries, matrix_coeff, transfer_char;
-	u32 full_range = 0;
+	u32 primaries = MSM_VIDC_PRIMARIES_RESERVED;
+	u32 matrix_coeff = MSM_VIDC_MATRIX_COEFF_RESERVED;
+	u32 transfer_char = MSM_VIDC_TRANSFER_RESERVED;
+	u32 full_range = V4L2_QUANTIZATION_DEFAULT;
 	u32 colour_description_present_flag = 0;
 	u32 video_signal_type_present_flag = 0, payload = 0;
 	/* Unspecified video format */
@@ -284,15 +286,17 @@ static int msm_venc_set_colorspace(struct msm_vidc_inst* inst,
 		return -EINVAL;
 	}
 
-	primaries = inst->fmts[port].fmt.pix_mp.colorspace;
-	matrix_coeff = inst->fmts[port].fmt.pix_mp.ycbcr_enc;
-	transfer_char = inst->fmts[port].fmt.pix_mp.xfer_func;
-
-	if (primaries != V4L2_COLORSPACE_DEFAULT ||
-	    transfer_char != V4L2_XFER_FUNC_DEFAULT ||
-	    matrix_coeff != V4L2_YCBCR_ENC_DEFAULT) {
+	if (inst->fmts[port].fmt.pix_mp.colorspace != V4L2_COLORSPACE_DEFAULT ||
+	    inst->fmts[port].fmt.pix_mp.ycbcr_enc != V4L2_XFER_FUNC_DEFAULT ||
+	    inst->fmts[port].fmt.pix_mp.xfer_func != V4L2_YCBCR_ENC_DEFAULT) {
 		colour_description_present_flag = 1;
 		video_signal_type_present_flag = 1;
+		primaries = v4l2_color_primaries_to_driver(inst,
+			inst->fmts[port].fmt.pix_mp.colorspace);
+		matrix_coeff = v4l2_matrix_coeff_to_driver(inst,
+			inst->fmts[port].fmt.pix_mp.ycbcr_enc);
+		transfer_char = v4l2_transfer_char_to_driver(inst,
+			inst->fmts[port].fmt.pix_mp.xfer_func);
 	}
 
 	if (inst->fmts[port].fmt.pix_mp.quantization !=

+ 291 - 0
driver/vidc/src/msm_vidc_driver.c

@@ -227,6 +227,297 @@ u32 v4l2_colorformat_from_driver(enum msm_vidc_colorformat_type colorformat,
 	return v4l2_colorformat;
 }
 
+u32 v4l2_color_primaries_to_driver(struct msm_vidc_inst *inst,
+	u32 v4l2_primaries)
+{
+	u32 vidc_color_primaries = MSM_VIDC_PRIMARIES_RESERVED;
+
+	switch(v4l2_primaries) {
+	case V4L2_COLORSPACE_DEFAULT:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_RESERVED;
+		break;
+	case V4L2_COLORSPACE_REC709:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_BT709;
+		break;
+	case V4L2_COLORSPACE_470_SYSTEM_M:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_BT470_SYSTEM_M;
+		break;
+	case V4L2_COLORSPACE_470_SYSTEM_BG:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_BT470_SYSTEM_BG;
+		break;
+	case V4L2_COLORSPACE_SMPTE170M:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_BT601_525;
+		break;
+	case V4L2_COLORSPACE_SMPTE240M:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_SMPTE_ST240M;
+		break;
+	case V4L2_COLORSPACE_VIDC_GENERIC_FILM:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_GENERIC_FILM;
+		break;
+	case V4L2_COLORSPACE_BT2020:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_BT2020;
+		break;
+	case V4L2_COLORSPACE_DCI_P3:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_SMPTE_RP431_2;
+		break;
+	case V4L2_COLORSPACE_VIDC_EG431:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_SMPTE_EG431_1;
+		break;
+	case V4L2_COLORSPACE_VIDC_EBU_TECH:
+		vidc_color_primaries = MSM_VIDC_PRIMARIES_SMPTE_EBU_TECH;
+		break;
+	default:
+		i_vpr_e(inst, "%s: invalid color primaries %d\n",
+			__func__, v4l2_primaries);
+		break;
+	}
+
+	return vidc_color_primaries;
+}
+
+u32 v4l2_color_primaries_from_driver(struct msm_vidc_inst *inst,
+	u32 vidc_color_primaries)
+{
+	u32 v4l2_primaries = V4L2_COLORSPACE_DEFAULT;
+
+	switch(vidc_color_primaries) {
+	case MSM_VIDC_PRIMARIES_UNSPECIFIED:
+		v4l2_primaries = V4L2_COLORSPACE_DEFAULT;
+		break;
+	case MSM_VIDC_PRIMARIES_BT709:
+		v4l2_primaries = V4L2_COLORSPACE_REC709;
+		break;
+	case MSM_VIDC_PRIMARIES_BT470_SYSTEM_M:
+		v4l2_primaries = V4L2_COLORSPACE_470_SYSTEM_M;
+		break;
+	case MSM_VIDC_PRIMARIES_BT470_SYSTEM_BG:
+		v4l2_primaries = V4L2_COLORSPACE_470_SYSTEM_BG;
+		break;
+	case MSM_VIDC_PRIMARIES_BT601_525:
+		v4l2_primaries = V4L2_COLORSPACE_SMPTE170M;
+		break;
+	case MSM_VIDC_PRIMARIES_SMPTE_ST240M:
+		v4l2_primaries = V4L2_COLORSPACE_SMPTE240M;
+		break;
+	case MSM_VIDC_PRIMARIES_GENERIC_FILM:
+		v4l2_primaries = V4L2_COLORSPACE_VIDC_GENERIC_FILM;
+		break;
+	case MSM_VIDC_PRIMARIES_BT2020:
+		v4l2_primaries = V4L2_COLORSPACE_BT2020;
+		break;
+	case MSM_VIDC_PRIMARIES_SMPTE_RP431_2:
+		v4l2_primaries = V4L2_COLORSPACE_DCI_P3;
+		break;
+	case MSM_VIDC_PRIMARIES_SMPTE_EG431_1:
+		v4l2_primaries = V4L2_COLORSPACE_VIDC_EG431;
+		break;
+	case MSM_VIDC_PRIMARIES_SMPTE_EBU_TECH:
+		v4l2_primaries = V4L2_COLORSPACE_VIDC_EBU_TECH;
+		break;
+	default:
+		i_vpr_e(inst, "%s: invalid hfi color primaries %d\n",
+			__func__, vidc_color_primaries);
+		v4l2_primaries = V4L2_COLORSPACE_DEFAULT;
+		break;
+	}
+
+	return v4l2_primaries;
+}
+
+u32 v4l2_transfer_char_to_driver(struct msm_vidc_inst *inst,
+	u32 v4l2_transfer_char)
+{
+	u32 vidc_transfer_char = MSM_VIDC_TRANSFER_RESERVED;
+
+	switch(v4l2_transfer_char) {
+	case V4L2_XFER_FUNC_DEFAULT:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_RESERVED;
+		break;
+	case V4L2_XFER_FUNC_709:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT709;
+		break;
+	case V4L2_XFER_FUNC_VIDC_BT470_SYSTEM_M:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT470_SYSTEM_M;
+		break;
+	case V4L2_XFER_FUNC_VIDC_BT470_SYSTEM_BG:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT470_SYSTEM_BG;
+		break;
+	case V4L2_XFER_FUNC_VIDC_BT601_525_OR_625:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT601_525_OR_625;
+		break;
+	case V4L2_XFER_FUNC_SMPTE240M:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_SMPTE_ST240M;
+		break;
+	case V4L2_XFER_FUNC_VIDC_LINEAR:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_LINEAR;
+		break;
+	case V4L2_XFER_FUNC_VIDC_XVYCC:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_XVYCC;
+		break;
+	case V4L2_XFER_FUNC_VIDC_BT1361:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT1361_0;
+		break;
+	case V4L2_XFER_FUNC_SRGB:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_SRGB_SYCC;
+		break;
+	case V4L2_XFER_FUNC_VIDC_BT2020:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT2020_14;
+		break;
+	case V4L2_XFER_FUNC_SMPTE2084:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_SMPTE_ST2084_PQ;
+		break;
+	case V4L2_XFER_FUNC_VIDC_ST428:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_SMPTE_ST428_1;
+		break;
+	case V4L2_XFER_FUNC_VIDC_HLG:
+		vidc_transfer_char = MSM_VIDC_TRANSFER_BT2100_2_HLG;
+		break;
+	default:
+		i_vpr_e(inst, "%s: invalid transfer char %d\n",
+			__func__, v4l2_transfer_char);
+		break;
+	}
+
+	return vidc_transfer_char;
+}
+
+u32 v4l2_transfer_char_from_driver(struct msm_vidc_inst *inst,
+	u32 vidc_transfer_char)
+{
+	u32  v4l2_transfer_char = V4L2_XFER_FUNC_DEFAULT;
+
+	switch(vidc_transfer_char) {
+	case MSM_VIDC_TRANSFER_UNSPECIFIED:
+		v4l2_transfer_char = V4L2_XFER_FUNC_DEFAULT;
+		break;
+	case MSM_VIDC_TRANSFER_BT709:
+		v4l2_transfer_char = V4L2_XFER_FUNC_709;
+		break;
+	case MSM_VIDC_TRANSFER_BT470_SYSTEM_M:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_BT470_SYSTEM_M;
+		break;
+	case MSM_VIDC_TRANSFER_BT470_SYSTEM_BG:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_BT470_SYSTEM_BG;
+		break;
+	case MSM_VIDC_TRANSFER_BT601_525_OR_625:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_BT601_525_OR_625;
+		break;
+	case MSM_VIDC_TRANSFER_SMPTE_ST240M:
+		v4l2_transfer_char = V4L2_XFER_FUNC_SMPTE240M;
+		break;
+	case MSM_VIDC_TRANSFER_LINEAR:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_LINEAR;
+		break;
+	case MSM_VIDC_TRANSFER_XVYCC:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_XVYCC;
+		break;
+	case MSM_VIDC_TRANSFER_BT1361_0:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_BT1361;
+		break;
+	case MSM_VIDC_TRANSFER_SRGB_SYCC:
+		v4l2_transfer_char = V4L2_XFER_FUNC_SRGB;
+		break;
+	case MSM_VIDC_TRANSFER_BT2020_14:
+	case MSM_VIDC_TRANSFER_BT2020_15:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_BT2020;
+		break;
+	case MSM_VIDC_TRANSFER_SMPTE_ST2084_PQ:
+		v4l2_transfer_char = V4L2_XFER_FUNC_SMPTE2084;
+		break;
+	case MSM_VIDC_TRANSFER_SMPTE_ST428_1:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_ST428;
+		break;
+	case MSM_VIDC_TRANSFER_BT2100_2_HLG:
+		v4l2_transfer_char = V4L2_XFER_FUNC_VIDC_HLG;
+		break;
+	default:
+		i_vpr_e(inst, "%s: invalid transfer char %d\n",
+			__func__, vidc_transfer_char);
+		break;
+	}
+
+	return v4l2_transfer_char;
+}
+
+u32 v4l2_matrix_coeff_to_driver(struct msm_vidc_inst *inst,
+	u32 v4l2_matrix_coeff)
+{
+	u32 vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_RESERVED;
+
+	switch(v4l2_matrix_coeff) {
+	case V4L2_YCBCR_VIDC_SRGB_OR_SMPTE_ST428:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_SRGB_SMPTE_ST428_1;
+		break;
+	case V4L2_YCBCR_ENC_709:
+	case V4L2_YCBCR_ENC_XV709:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_BT709;
+		break;
+	case V4L2_YCBCR_VIDC_FCC47_73_682:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_FCC_TITLE_47;
+		break;
+	case V4L2_YCBCR_ENC_XV601:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_BT470_SYS_BG_OR_BT601_625;
+		break;
+	case V4L2_YCBCR_ENC_601:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_BT601_525_BT1358_525_OR_625;
+		break;
+	case V4L2_YCBCR_ENC_SMPTE240M:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_SMPTE_ST240;
+		break;
+	case V4L2_YCBCR_ENC_BT2020:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_BT2020_NON_CONSTANT;
+		break;
+	case V4L2_YCBCR_ENC_BT2020_CONST_LUM:
+		vidc_matrix_coeff = MSM_VIDC_MATRIX_COEFF_BT2020_CONSTANT;
+		break;
+	default:
+		i_vpr_e(inst, "%s: invalid matrix coeff %d\n",
+			__func__, v4l2_matrix_coeff);
+		break;
+	}
+
+	return vidc_matrix_coeff;
+}
+
+u32 v4l2_matrix_coeff_from_driver(struct msm_vidc_inst *inst,
+	u32 vidc_matrix_coeff)
+{
+	u32 v4l2_matrix_coeff = V4L2_YCBCR_ENC_DEFAULT;
+
+	switch(vidc_matrix_coeff) {
+	case MSM_VIDC_MATRIX_COEFF_SRGB_SMPTE_ST428_1:
+		v4l2_matrix_coeff = V4L2_YCBCR_VIDC_SRGB_OR_SMPTE_ST428;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_BT709:
+		v4l2_matrix_coeff = V4L2_YCBCR_ENC_709;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_FCC_TITLE_47:
+		v4l2_matrix_coeff = V4L2_YCBCR_VIDC_FCC47_73_682;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_BT470_SYS_BG_OR_BT601_625:
+		v4l2_matrix_coeff = V4L2_YCBCR_ENC_XV601;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_BT601_525_BT1358_525_OR_625:
+		v4l2_matrix_coeff = V4L2_YCBCR_ENC_601;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_SMPTE_ST240:
+		v4l2_matrix_coeff = V4L2_YCBCR_ENC_SMPTE240M;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_BT2020_NON_CONSTANT:
+		v4l2_matrix_coeff = V4L2_YCBCR_ENC_BT2020;
+		break;
+	case MSM_VIDC_MATRIX_COEFF_BT2020_CONSTANT:
+		v4l2_matrix_coeff = V4L2_YCBCR_ENC_BT2020_CONST_LUM;
+		break;
+	default:
+		i_vpr_e(inst, "%s: invalid matrix coeff %d\n",
+			__func__, vidc_matrix_coeff);
+		break;
+	}
+
+	return v4l2_matrix_coeff;
+}
+
 int v4l2_type_to_driver_port(struct msm_vidc_inst *inst, u32 type,
 	const char *func)
 {

+ 20 - 0
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -26,6 +26,26 @@
 #define V4L2_PIX_FMT_VIDC_ARGB32C               v4l2_fourcc('Q', '2', '4', 'C')
 #define V4L2_META_FMT_VIDC                      v4l2_fourcc('Q', 'M', 'E', 'T')
 
+/* start of vidc specific colorspace definitions */
+#define V4L2_COLORSPACE_VIDC_GENERIC_FILM    101
+#define V4L2_COLORSPACE_VIDC_EG431           102
+#define V4L2_COLORSPACE_VIDC_EBU_TECH        103
+
+#define V4L2_XFER_FUNC_VIDC_BT470_SYSTEM_M   201
+#define V4L2_XFER_FUNC_VIDC_BT470_SYSTEM_BG  202
+#define V4L2_XFER_FUNC_VIDC_BT601_525_OR_625 203
+#define V4L2_XFER_FUNC_VIDC_LINEAR           204
+#define V4L2_XFER_FUNC_VIDC_XVYCC            205
+#define V4L2_XFER_FUNC_VIDC_BT1361           206
+#define V4L2_XFER_FUNC_VIDC_BT2020           207
+#define V4L2_XFER_FUNC_VIDC_ST428            208
+#define V4L2_XFER_FUNC_VIDC_HLG              209
+
+#define V4L2_YCBCR_VIDC_SRGB_OR_SMPTE_ST428  301
+#define V4L2_YCBCR_VIDC_FCC47_73_682         302
+
+/* end of vidc specific colorspace definitions */
+
 /* vendor controls start */
 #define V4L2_CID_MPEG_VIDC_BASE                 (V4L2_CTRL_CLASS_MPEG | 0x2000)