Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2171b285 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: HDR10 PQ SEI generation for HEVC encoder"

parents 1f370d52 3224e809
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -1877,6 +1877,22 @@ int create_pkt_cmd_session_set_property(
		pkt->size += sizeof(u32) + sizeof(*work_mode);
		break;
	}
	case HAL_PARAM_VENC_HDR10_PQ_SEI:
	{
		struct hfi_hdr10_pq_sei *hfi;
		struct hal_hdr10_pq_sei *prop =
			(struct hal_hdr10_pq_sei *) pdata;

		pkt->rg_property_data[0] =
			HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI;
		hfi = (struct hfi_hdr10_pq_sei *)
			&pkt->rg_property_data[1];

		memcpy(hfi, prop, sizeof(*hfi));
		pkt->size += sizeof(u32) +
			sizeof(struct hfi_hdr10_pq_sei);
		break;
	}
	/* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */
	case HAL_CONFIG_BUFFER_REQUIREMENTS:
	case HAL_CONFIG_PRIORITY:
+216 −0
Original line number Diff line number Diff line
@@ -1068,6 +1068,135 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
		),
		.qmenu = mpeg_video_flip,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_HDR_INFO,
		.name = "Enable/Disable HDR INFO",
		.type = V4L2_CTRL_TYPE_BOOLEAN,
		.minimum = V4L2_MPEG_VIDC_VENC_HDR_INFO_DISABLED,
		.maximum = V4L2_MPEG_VIDC_VENC_HDR_INFO_ENABLED,
		.default_value = V4L2_MPEG_VIDC_VENC_HDR_INFO_DISABLED,
		.step = 1,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_00,
		.name = "RGB PRIMARIES[0][0]",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_01,
		.name = "RGB PRIMARIES[0][1]",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_10,
		.name = "RGB PRIMARIES[1][0]",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_11,
		.name = "RGB PRIMARIES[1][1]",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_20,
		.name = "RGB PRIMARIES[2][0]",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_21,
		.name = "RGB PRIMARIES[2][1]",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_WHITEPOINT_X,
		.name = "WHITE POINT X",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_WHITEPOINT_Y,
		.name = "WHITE POINT Y",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_MAX_DISP_LUM,
		.name = "MAX DISPLAY LUMINANCE",
		.type =  V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_MIN_DISP_LUM,
		.name = "MIN DISPLAY LUMINANCE",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_MAX_CLL,
		.name = "MAX CLL",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VENC_MAX_FLL,
		.name = "MAX FLL",
		.type = V4L2_CTRL_TYPE_U32,
		.minimum = 0,
		.maximum = UINT_MAX,
		.default_value = 0,
		.step = 1,
		.qmenu = NULL,
	},

};

@@ -2095,6 +2224,19 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
	case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX:
	case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX:
	case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX:
	case V4L2_CID_MPEG_VIDC_VENC_HDR_INFO:
	case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_00:
	case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_01:
	case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_10:
	case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_11:
	case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_20:
	case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_21:
	case V4L2_CID_MPEG_VIDC_VENC_WHITEPOINT_X:
	case V4L2_CID_MPEG_VIDC_VENC_WHITEPOINT_Y:
	case V4L2_CID_MPEG_VIDC_VENC_MAX_DISP_LUM:
	case V4L2_CID_MPEG_VIDC_VENC_MIN_DISP_LUM:
	case V4L2_CID_MPEG_VIDC_VENC_MAX_CLL:
	case V4L2_CID_MPEG_VIDC_VENC_MAX_FLL:
		dprintk(VIDC_DBG, "Set the control : %#x using ext ctrl\n",
			ctrl->id);
		break;
@@ -2133,6 +2275,11 @@ int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
	struct hal_frame_size blur_res;
	struct hal_quantization_range qp_range;
	struct hal_quantization qp;
	struct hal_hdr10_pq_sei hdr10_sei_params;
	struct msm_vidc_mastering_display_colour_sei_payload *mdisp_sei
		= &(hdr10_sei_params.disp_color_sei);
	struct msm_vidc_content_light_level_sei_payload *cll_sei
		= &(hdr10_sei_params.cll_sei);

	if (!inst || !inst->core || !inst->core->device || !ctrl) {
		dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
@@ -2281,6 +2428,75 @@ int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
			i++;
			}
			break;
		case V4L2_CID_MPEG_VIDC_VENC_HDR_INFO:
			if (control[i].value ==
				V4L2_MPEG_VIDC_VENC_HDR_INFO_DISABLED)
				break;
			memset(&hdr10_sei_params, 0, sizeof(hdr10_sei_params));
			i++;
			while (i < ctrl->count) {
				switch (control[i].id) {
				case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_00:
					mdisp_sei->nDisplayPrimariesX[0] =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_01:
					mdisp_sei->nDisplayPrimariesY[0] =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_10:
					mdisp_sei->nDisplayPrimariesX[1] =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_11:
					mdisp_sei->nDisplayPrimariesY[1] =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_20:
					mdisp_sei->nDisplayPrimariesX[2] =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_RGB_PRIMARY_21:
					mdisp_sei->nDisplayPrimariesY[2] =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_WHITEPOINT_X:
					mdisp_sei->nWhitePointX =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_WHITEPOINT_Y:
					mdisp_sei->nWhitePointY =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_MAX_DISP_LUM:
					mdisp_sei->
						nMaxDisplayMasteringLuminance =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_MIN_DISP_LUM:
					mdisp_sei->
						nMinDisplayMasteringLuminance =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_MAX_CLL:
					cll_sei->nMaxContentLight =
						control[i].value;
					break;
				case V4L2_CID_MPEG_VIDC_VENC_MAX_FLL:
					cll_sei->nMaxPicAverageLight =
						control[i].value;
					break;
				default:
					dprintk(VIDC_ERR,
							"Unknown Ctrl:%d, not part of HDR Info",
							control[i].id);
				}
				i++;
			}
			property_id =
				HAL_PARAM_VENC_HDR10_PQ_SEI;
			pdata = &hdr10_sei_params;
			break;
		default:
			dprintk(VIDC_ERR, "Invalid id set: %d\n",
				control[i].id);
+3 −3
Original line number Diff line number Diff line
@@ -423,9 +423,9 @@ struct msm_vidc_ctrl {
	u32 id;
	char name[MAX_NAME_LENGTH];
	enum v4l2_ctrl_type type;
	s32 minimum;
	s32 maximum;
	s32 default_value;
	s64 minimum;
	s64 maximum;
	s64 default_value;
	u32 step;
	u32 menu_skip_mask;
	u32 flags;
+6 −0
Original line number Diff line number Diff line
@@ -226,6 +226,7 @@ enum hal_property {
	HAL_PARAM_VIDEO_CORES_USAGE,
	HAL_PARAM_VIDEO_WORK_MODE,
	HAL_PARAM_SECURE,
	HAL_PARAM_VENC_HDR10_PQ_SEI,
};

enum hal_domain {
@@ -1398,6 +1399,11 @@ struct hal_cmd_sys_get_property_packet {
	u32 rg_property_data[1];
};

struct hal_hdr10_pq_sei {
	struct msm_vidc_mastering_display_colour_sei_payload disp_color_sei;
	struct msm_vidc_content_light_level_sei_payload cll_sei;
};

#define call_hfi_op(q, op, args...)			\
	(((q) && (q)->op) ? ((q)->op(args)) : 0)

+24 −0
Original line number Diff line number Diff line
@@ -321,6 +321,10 @@ struct hfi_buffer_info {
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x033)
#define  HFI_PROPERTY_PARAM_VENC_IFRAMESIZE			\
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x034)
#define  HFI_PROPERTY_PARAM_VENC_SEND_OUTPUT_FOR_SKIPPED_FRAMES	\
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x035)
#define  HFI_PROPERTY_PARAM_VENC_HDR10_PQ_SEI			\
	(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x036)

#define HFI_PROPERTY_CONFIG_VENC_COMMON_START				\
	(HFI_DOMAIN_BASE_VENC + HFI_ARCH_COMMON_OFFSET + 0x6000)
@@ -1058,4 +1062,24 @@ struct hfi_cmd_sys_test_ssr_packet {
	u32 packet_type;
	u32 trigger_type;
};

struct hfi_mastering_display_colour_sei_payload {
	u32 display_primariesX[3];
	u32 display_primariesY[3];
	u32 white_pointX;
	u32 white_pointY;
	u32 max_display_mastering_luminance;
	u32 min_display_mastering_luminance;
};

struct hfi_content_light_level_sei_payload {
	u32 max_content_light;
	u32 max_pic_average_light;
};

struct hfi_hdr10_pq_sei {
	struct hfi_mastering_display_colour_sei_payload mdisp_info;
	struct hfi_content_light_level_sei_payload cll_info;
};

#endif
Loading