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

Commit 2c072537 authored by Vaibhav Deshu Venkatesh's avatar Vaibhav Deshu Venkatesh Committed by Gerrit - the friendly Code Review server
Browse files

msm: vidc: venc: Layer bitrate setting bug fix



In ext controls we cannot have multiple controls with same
ID. If we have multiple controls with same ID, then the
value of these controls is overwritten with last value.
To prevent this happening for layered bitrate we now only
set bitrate for only layer per s_ext_ctrl call.

CRs-Fixed: 2012385
Change-Id: I58914e5026bb40c0a37f502d34302a65935a2b2d
Signed-off-by: default avatarVaibhav Deshu Venkatesh <vdeshuve@codeaurora.org>
parent fd8f40e6
Loading
Loading
Loading
Loading
+78 −113
Original line number Diff line number Diff line
@@ -1353,7 +1353,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
	{
		property_id = HAL_CONFIG_VENC_TARGET_BITRATE;
		bitrate.bit_rate = ctrl->val;
		bitrate.layer_id = 0;
		bitrate.layer_id = MSM_VIDC_ALL_LAYER_ID;
		pdata = &bitrate;
		inst->bitrate = ctrl->val;
		break;
@@ -1976,7 +1976,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
	struct v4l2_ext_controls *ctrl)
{
	int rc = 0, i, j = 0;
	int rc = 0, i;
	struct v4l2_ext_control *control;
	struct hfi_device *hdev;
	struct hal_ltr_mode ltr_mode;
@@ -2044,32 +2044,6 @@ int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
			property_id = HAL_PROPERTY_PARAM_VENC_ASPECT_RATIO;
			pdata = &sar;
			break;
		case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
		{
			if (control[i].value) {
				bitrate.layer_id = i;
				bitrate.bit_rate = control[i].value;
				property_id = HAL_CONFIG_VENC_TARGET_BITRATE;
				pdata = &bitrate;
				dprintk(VIDC_DBG, "bitrate for layer(%d)=%d\n",
					i, bitrate.bit_rate);
				rc = call_hfi_op(hdev, session_set_property,
					(void *)inst->session, property_id,
					 pdata);
				if (rc) {
					dprintk(VIDC_DBG, "prop %x failed\n",
						property_id);
					return rc;
				}
				if (i == MAX_HYBRID_HIER_P_LAYERS - 1) {
					dprintk(VIDC_DBG, "HAL property=%x\n",
						property_id);
					property_id = 0;
					rc = 0;
				}
			}
			break;
		}
		case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH:
			property_id = HAL_CONFIG_VENC_BLUR_RESOLUTION;
			blur_res.width = control[i].value;
@@ -2084,92 +2058,83 @@ int msm_venc_s_ext_ctrl(struct msm_vidc_inst *inst,
			pdata = &blur_res;
			break;
		case V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID:
			j = i;
			layer_id = control[j].value;
			do {
				switch (control[j].id) {
			layer_id = control[i].value;
			i++;
			while (i < ctrl->count) {
			switch (control[i].id) {
			case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP:
					qp.qpi = control[j].value;
				qp.qpi = control[i].value;
				qp.layer_id = layer_id;
				property_id =
					HAL_CONFIG_VENC_FRAME_QP;
				pdata = &qp;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP:
					qp.qpp = control[j].value;
				qp.qpp = control[i].value;
				qp.layer_id = layer_id;
				property_id =
					HAL_CONFIG_VENC_FRAME_QP;
				pdata = &qp;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP:
					qp.qpb = control[j].value;
				qp.qpb = control[i].value;
				qp.layer_id = layer_id;
				property_id =
					HAL_CONFIG_VENC_FRAME_QP;
				pdata = &qp;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MIN:
					qp_range.qpi_min = control[j].value;
				qp_range.qpi_min = control[i].value;
				qp_range.layer_id = layer_id;
				property_id =
					HAL_PARAM_VENC_SESSION_QP_RANGE;
				pdata = &qp_range;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MIN:
					qp_range.qpp_min = control[j].value;
				qp_range.qpp_min = control[i].value;
				qp_range.layer_id = layer_id;
				property_id =
				HAL_PARAM_VENC_SESSION_QP_RANGE;
				pdata = &qp_range;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MIN:
					qp_range.qpb_min = control[j].value;
				qp_range.qpb_min = control[i].value;
				qp_range.layer_id = layer_id;
				property_id =
					HAL_PARAM_VENC_SESSION_QP_RANGE;
				pdata = &qp_range;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP_MAX:
					qp_range.qpi_max = control[j].value;
				qp_range.qpi_max = control[i].value;
				qp_range.layer_id = layer_id;
				property_id =
					HAL_PARAM_VENC_SESSION_QP_RANGE;
				pdata = &qp_range;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP_MAX:
					qp_range.qpp_max = control[j].value;
				qp_range.qpp_max = control[i].value;
				qp_range.layer_id = layer_id;
				property_id =
					HAL_PARAM_VENC_SESSION_QP_RANGE;
				pdata = &qp_range;
				break;
			case V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP_MAX:
					qp_range.qpb_max = control[j].value;
				qp_range.qpb_max = control[i].value;
				qp_range.layer_id = layer_id;
				property_id =
					HAL_PARAM_VENC_SESSION_QP_RANGE;
				pdata = &qp_range;
				break;
			case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
				bitrate.bit_rate = control[i].value;
				bitrate.layer_id = layer_id;
				property_id =
					HAL_CONFIG_VENC_TARGET_BITRATE;
				pdata = &bitrate;
				break;
			}
				j++;
			} while ((j < ctrl->count) &&
				control[j].id !=
					V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID);
			if (!rc && property_id) {
				dprintk(VIDC_DBG, "Control: HAL property=%x\n",
					 property_id);
				rc = call_hfi_op(hdev, session_set_property,
						(void *)inst->session,
						property_id, pdata);
				if (rc) {
					dprintk(VIDC_ERR, "prop %x failed\n",
						property_id);
					return rc;
				}
				property_id = 0;
			i++;
			}
			i = j - 1;
			break;
		default:
			dprintk(VIDC_ERR, "Invalid id set: %d\n",
+1 −0
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@ int msm_vidc_query_ctrl(void *instance, struct v4l2_queryctrl *ctrl)
	case V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS:
		msm_vidc_ctrl_get_range(ctrl, &inst->capability.hier_p);
		break;
	case V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE:
	case  V4L2_CID_MPEG_VIDEO_BITRATE:
		msm_vidc_ctrl_get_range(ctrl, &inst->capability.bitrate);
		break;
+3 −0
Original line number Diff line number Diff line
@@ -1185,6 +1185,9 @@ static void msm_vidc_comm_update_ctrl_limits(struct msm_vidc_inst *inst)
			&inst->capability.hier_p);
	msm_vidc_comm_update_ctrl(inst, V4L2_CID_MPEG_VIDEO_BITRATE,
			&inst->capability.bitrate);
	msm_vidc_comm_update_ctrl(inst,
			V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE,
			&inst->capability.bitrate);
	msm_vidc_comm_update_ctrl(inst, V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
			&inst->capability.peakbitrate);
	msm_vidc_comm_update_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP,