Browse Source

video: driver: handle dynamic qp setting

- make B and P frame QP controls as dynamic.
- enable I/P/B QP to fw as and when these
  controls are set to the driver.
- remove HEIC qp support.

Change-Id: I7f45ab0bda75df8128bbbdfcebe66c2cae208b06
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil 4 năm trước cách đây
mục cha
commit
bd41af8c21

+ 35 - 15
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -138,8 +138,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 0,
 		CAP_FLAG_ROOT,
 		{0},
-		{PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, META_ROI_INFO,
-			BLUR_TYPES, MIN_QUALITY}},
+		{PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, P_FRAME_QP,
+			B_FRAME_QP, META_ROI_INFO, BLUR_TYPES, MIN_QUALITY}},
 
 	{PIX_FMTS, DEC, HEVC|HEIC,
 		MSM_VIDC_FMT_NV12,
@@ -363,10 +363,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
-			ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING,
-			BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE,
-			SLICE_MODE, META_ROI_INFO, BLUR_TYPES,
-			LOWLATENCY_MODE},
+			P_FRAME_QP, B_FRAME_QP, ENH_LAYER_COUNT, BIT_RATE,
+			CONTENT_ADAPTIVE_CODING, BITRATE_BOOST, MIN_QUALITY,
+			VBV_DELAY, PEAK_BITRATE,SLICE_MODE, META_ROI_INFO,
+			BLUR_TYPES, LOWLATENCY_MODE},
 		msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
 
 	{BITRATE_MODE, ENC, HEVC,
@@ -381,7 +381,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
-			CONSTANT_QUALITY, ENH_LAYER_COUNT,
+			P_FRAME_QP, B_FRAME_QP, CONSTANT_QUALITY, ENH_LAYER_COUNT,
 			CONTENT_ADAPTIVE_CODING, BIT_RATE,
 			BITRATE_BOOST, MIN_QUALITY, VBV_DELAY,
 			PEAK_BITRATE, SLICE_MODE, META_ROI_INFO, BLUR_TYPES,
@@ -711,14 +711,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		MIN_QP_10BIT, MAX_QP, 1, MAX_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP},
 
-	{I_FRAME_QP, ENC, HEVC|HEIC,
+	{I_FRAME_QP, ENC, HEVC,
 		MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
 			CAP_FLAG_DYNAMIC_ALLOWED,
 		{PIX_FMTS, BITRATE_MODE}, {0},
-		msm_vidc_adjust_hevc_frame_qp, msm_vidc_set_frame_qp},
+		msm_vidc_adjust_hevc_i_frame_qp, msm_vidc_set_frame_qp},
 
 	{I_FRAME_QP, ENC, H264,
 		MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
@@ -729,21 +729,41 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{BITRATE_MODE}, {0},
 		NULL, msm_vidc_set_frame_qp},
 
-	{P_FRAME_QP, ENC, HEVC|HEIC,
+	{P_FRAME_QP, ENC, HEVC,
 		MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
-		V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP},
+		V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
+		HFI_PROP_QP_PACKED,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+			CAP_FLAG_DYNAMIC_ALLOWED,
+		{PIX_FMTS, BITRATE_MODE}, {0},
+		msm_vidc_adjust_hevc_p_frame_qp, msm_vidc_set_frame_qp},
 
 	{P_FRAME_QP, ENC, H264,
 		MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
-		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP},
+		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP,
+		HFI_PROP_QP_PACKED,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+			CAP_FLAG_DYNAMIC_ALLOWED,
+		{BITRATE_MODE}, {0},
+		NULL, msm_vidc_set_frame_qp},
 
-	{B_FRAME_QP, ENC, HEVC|HEIC,
+	{B_FRAME_QP, ENC, HEVC,
 		MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP,
-		V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP},
+		V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
+		HFI_PROP_QP_PACKED,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+			CAP_FLAG_DYNAMIC_ALLOWED,
+		{PIX_FMTS, BITRATE_MODE}, {0},
+		msm_vidc_adjust_hevc_b_frame_qp, msm_vidc_set_frame_qp},
 
 	{B_FRAME_QP, ENC, H264,
 		MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
-		V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP},
+		V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP,
+		HFI_PROP_QP_PACKED,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+			CAP_FLAG_DYNAMIC_ALLOWED,
+		{BITRATE_MODE}, {0},
+		NULL, msm_vidc_set_frame_qp},
 
 	{LAYER_TYPE, ENC, HEVC,
 		V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B,

+ 3 - 1
driver/vidc/inc/msm_vidc_control.h

@@ -31,7 +31,9 @@ int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl);
-int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_hevc_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_hevc_p_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_hevc_b_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_cac(void *instance, struct v4l2_ctrl *ctrl);

+ 2 - 2
driver/vidc/inc/msm_vidc_internal.h

@@ -40,8 +40,8 @@
 #define MAX_SUPPORTED_INSTANCES  16
 #define MAX_BSE_VPP_DELAY        6
 #define DEFAULT_BSE_VPP_DELAY    2
-#define MAX_CAP_PARENTS          16
-#define MAX_CAP_CHILDREN         16
+#define MAX_CAP_PARENTS          20
+#define MAX_CAP_CHILDREN         20
 #define DEFAULT_BITSTREM_ALIGNMENT  16
 #define H265_BITSTREM_ALIGNMENT     32
 #define DEFAULT_MAX_HOST_BUF_COUNT  64

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

@@ -363,9 +363,6 @@ static int msm_vidc_adjust_hevc_qp(struct msm_vidc_inst *inst,
 		CAP_TO_8BIT_QP(capability->cap[I_FRAME_MAX_QP].value);
 		CAP_TO_8BIT_QP(capability->cap[P_FRAME_MAX_QP].value);
 		CAP_TO_8BIT_QP(capability->cap[B_FRAME_MAX_QP].value);
-	} else if (cap_id == I_FRAME_QP) {
-		CAP_TO_8BIT_QP(capability->cap[P_FRAME_QP].value);
-		CAP_TO_8BIT_QP(capability->cap[B_FRAME_QP].value);
 	}
 
 exit:
@@ -1751,7 +1748,7 @@ int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl)
 	return rc;
 }
 
-int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
+int msm_vidc_adjust_hevc_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
 {
 	int rc = 0;
 	struct msm_vidc_inst_capability *capability;
@@ -1768,6 +1765,54 @@ int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
 			ctrl->val, __func__);
 
 	rc = msm_vidc_adjust_hevc_qp(inst, I_FRAME_QP);
+	if (rc)
+		return rc;
+
+	return rc;
+}
+
+int msm_vidc_adjust_hevc_p_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
+{
+	int rc = 0;
+	struct msm_vidc_inst_capability *capability;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	capability = inst->capabilities;
+
+	if (ctrl)
+		msm_vidc_update_cap_value(inst, P_FRAME_QP,
+			ctrl->val, __func__);
+
+	rc = msm_vidc_adjust_hevc_qp(inst, P_FRAME_QP);
+	if (rc)
+		return rc;
+
+	return rc;
+}
+
+int msm_vidc_adjust_hevc_b_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
+{
+	int rc = 0;
+	struct msm_vidc_inst_capability *capability;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	capability = inst->capabilities;
+
+	if (ctrl)
+		msm_vidc_update_cap_value(inst, B_FRAME_QP,
+			ctrl->val, __func__);
+
+	rc = msm_vidc_adjust_hevc_qp(inst, B_FRAME_QP);
+	if (rc)
+		return rc;
 
 	return rc;
 }
@@ -2578,10 +2623,19 @@ int msm_vidc_set_frame_qp(void *instance,
 	}
 	capab = inst->capabilities;
 
-	if (msm_vidc_get_parent_value(inst, I_FRAME_QP,
+	if (msm_vidc_get_parent_value(inst, cap_id,
 		BITRATE_MODE, &rc_type, __func__))
 		return -EINVAL;
 
+	if (inst->vb2q[OUTPUT_PORT].streaming) {
+		if (rc_type != HFI_RC_OFF) {
+			i_vpr_h(inst,
+				"%s: dynamic qp not allowed for rc type %d\n",
+				__func__, rc_type);
+			return 0;
+		}
+	}
+
 	if (rc_type == HFI_RC_OFF) {
 		/* Mandatorily set for rc off case */
 		i_qp_enable = p_qp_enable = b_qp_enable = 1;

+ 6 - 1
driver/vidc/src/msm_vidc_driver.c

@@ -1222,6 +1222,11 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
 			case V4L2_CID_HFLIP:
 			case V4L2_CID_VFLIP:
 			case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:
+			case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:
+			case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
+			case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
+			case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
+			case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:
 			case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:
 			case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:
 			case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR:
@@ -1255,7 +1260,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
 
 exit:
 	if (!allow)
-		i_vpr_e(inst, "%s: id %d not allowed in state %s\n",
+		i_vpr_e(inst, "%s: id %#x not allowed in state %s\n",
 			__func__, id, state_name(inst->state));
 	return allow;
 }