Selaa lähdekoodia

Merge "video: driver: encoder fix for frame qp and level"

qctecmdr 4 vuotta sitten
vanhempi
sitoutus
f87aa7d05d

+ 53 - 2
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -962,7 +962,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{0},
 		NULL, msm_vidc_set_u32_enum},
 
-	{LEVEL, ENC|DEC, H264,
+	{LEVEL, DEC, H264,
 		V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
 		V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
 		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
@@ -993,7 +993,36 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{0},
 		NULL, msm_vidc_set_u32_enum},
 
-	{LEVEL, ENC|DEC, HEVC|HEIC,
+	{LEVEL, ENC, H264,
+		V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
+		V4L2_MPEG_VIDEO_H264_LEVEL_6_0,
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_0) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_1) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_2) |
+		BIT(V4L2_MPEG_VIDEO_H264_LEVEL_6_0),
+		V4L2_MPEG_VIDEO_H264_LEVEL_5_0,
+		V4L2_CID_MPEG_VIDEO_H264_LEVEL,
+		HFI_PROP_LEVEL,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{0},
+		{0},
+		NULL, msm_vidc_set_u32_enum},
+
+	{LEVEL, DEC, HEVC|HEIC,
 		V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
 		V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
 		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
@@ -1017,6 +1046,28 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{0},
 		NULL, msm_vidc_set_u32_enum},
 
+	{LEVEL, ENC, HEVC|HEIC,
+		V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
+		V4L2_MPEG_VIDEO_HEVC_LEVEL_6,
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) |
+		BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6),
+		V4L2_MPEG_VIDEO_HEVC_LEVEL_5,
+		V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
+		HFI_PROP_LEVEL,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{0},
+		{0},
+		NULL, msm_vidc_set_u32_enum},
+
 	/* TODO: Bring the VP9 Level upstream GKI change, and level cap here:
 	 *	go/videogki
 	 */

+ 2 - 0
driver/vidc/inc/msm_vidc_control.h

@@ -97,6 +97,8 @@ int msm_vidc_set_session_priority(void* instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_seq_change_at_sync_frame(void* instance,
 	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_level(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_s32(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_q16(void *instance,

+ 59 - 24
driver/vidc/src/msm_vidc_control.c

@@ -2243,15 +2243,18 @@ int msm_vidc_set_min_qp(void *instance,
 	}
 	capability = inst->capabilities;
 
-	min_qp_enable =
-		capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
-
-	i_qp_enable = min_qp_enable ||
-		capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
-	p_qp_enable = min_qp_enable ||
-		capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
-	b_qp_enable = min_qp_enable ||
-		capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
+	if (capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
+		min_qp_enable = 1;
+
+	if (min_qp_enable ||
+		(capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
+		i_qp_enable = 1;
+	if (min_qp_enable ||
+		(capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
+		p_qp_enable = 1;
+	if (min_qp_enable ||
+		(capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
+		b_qp_enable = 1;
 
 	client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
 	if (!client_qp_enable) {
@@ -2305,15 +2308,18 @@ int msm_vidc_set_max_qp(void *instance,
 	}
 	capability = inst->capabilities;
 
-	max_qp_enable =
-		capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
+	if (capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
+		max_qp_enable = 1;
 
-	i_qp_enable = max_qp_enable ||
-		capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
-	p_qp_enable = max_qp_enable ||
-		capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
-	b_qp_enable = max_qp_enable ||
-		capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
+	if (max_qp_enable ||
+		(capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
+		i_qp_enable = 1;
+	if (max_qp_enable ||
+		(capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
+		p_qp_enable = 1;
+	if (max_qp_enable ||
+		(capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
+		b_qp_enable = 1;
 
 	client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
 	if (!client_qp_enable) {
@@ -2377,12 +2383,12 @@ int msm_vidc_set_frame_qp(void *instance,
 		i_qp_enable = p_qp_enable = b_qp_enable = 1;
 	} else {
 		/* Set only if client has set for NON rc off case */
-		i_qp_enable =
-			capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
-		p_qp_enable =
-			capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
-		b_qp_enable =
-			capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
+		if (capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
+			i_qp_enable = 1;
+		if (capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
+			p_qp_enable = 1;
+		if (capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
+			b_qp_enable = 1;
 	}
 
 	client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
@@ -3024,6 +3030,35 @@ int msm_vidc_set_csc_custom_matrix(void *instance,
 	return rc;
 }
 
+/*
+ * TODO: currently fw does not accept HFI_LEVEL_NONE.
+ * Use this function for encoder level setting once
+ * fw issue is fixed.
+ */
+int msm_vidc_set_level(void *instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
+	u32 hfi_value = 0;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	hfi_value = inst->capabilities->cap[cap_id].value;
+	if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET))
+		hfi_value = HFI_LEVEL_NONE;
+
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
+		&hfi_value, sizeof(u32), __func__);
+	if (rc)
+		return rc;
+
+	return rc;
+}
+
 int msm_vidc_set_q16(void *instance,
 	enum msm_vidc_inst_capability_type cap_id)
 {
@@ -3375,4 +3410,4 @@ int msm_vidc_set_seq_change_at_sync_frame(void* instance,
 		return rc;
 
 	return rc;
-}
+}