msm: vidc: Add support for setting packed QP range

Add support for setting packed QP range for clients
to set different QP Range for I, P, B frames.

CRs-Fixed: 1043369
Change-Id: I3765506f1d703f47e481719296ab890b1f3dc106
Signed-off-by: Deepak Kushwah <dkushwah@codeaurora.org>
This commit is contained in:
Deepak Kushwah 2016-06-28 11:45:39 +05:30 committed by Gerrit - the friendly Code Review server
parent 816c3cbc37
commit 12d028e02f
4 changed files with 87 additions and 0 deletions

View file

@ -1565,6 +1565,25 @@ int create_pkt_cmd_session_set_property(
sizeof(struct hfi_quantization_range);
break;
}
case HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED:
{
struct hfi_quantization_range *hfi;
struct hfi_quantization_range *hal_range =
(struct hfi_quantization_range *) pdata;
pkt->rg_property_data[0] =
HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
hfi = (struct hfi_quantization_range *)
&pkt->rg_property_data[1];
hfi->min_qp = hal_range->min_qp;
hfi->max_qp = hal_range->max_qp;
hfi->layer_id = hal_range->layer_id;
pkt->size += sizeof(u32) +
sizeof(struct hfi_quantization_range);
break;
}
case HAL_PARAM_VENC_SEARCH_RANGE:
{
struct hfi_vc1e_perf_cfg_type *hfi;

View file

@ -532,6 +532,28 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
.default_value = 128,
.step = 1,
},
{
.id = V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED,
.name = "H264 Minimum QP PACKED",
.type = V4L2_CTRL_TYPE_INTEGER,
.minimum = 0x00010101,
.maximum = 0x00333333,
.default_value = 0x00010101,
.step = 1,
.menu_skip_mask = 0,
.qmenu = NULL,
},
{
.id = V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED,
.name = "H264 Maximum QP PACKED",
.type = V4L2_CTRL_TYPE_INTEGER,
.minimum = 0x00010101,
.maximum = 0x00333333,
.default_value = 0x00333333,
.step = 1,
.menu_skip_mask = 0,
.qmenu = NULL,
},
{
.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
.name = "Slice Mode",
@ -2516,6 +2538,46 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
pdata = &qp_range;
break;
}
case V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED: {
struct v4l2_ctrl *qp_max;
qp_max = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED);
if (ctrl->val >= qp_max->val) {
dprintk(VIDC_ERR,
"Bad range: Min QP PACKED (0x%x) > Max QP PACKED (0x%x)\n",
ctrl->val, qp_max->val);
rc = -ERANGE;
break;
}
property_id = HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED;
qp_range.layer_id = 0;
qp_range.max_qp = qp_max->val;
qp_range.min_qp = ctrl->val;
pdata = &qp_range;
break;
}
case V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED: {
struct v4l2_ctrl *qp_min;
qp_min = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED);
if (ctrl->val <= qp_min->val) {
dprintk(VIDC_ERR,
"Bad range: Max QP PACKED (%d) < Min QP PACKED (%d)\n",
ctrl->val, qp_min->val);
rc = -ERANGE;
break;
}
property_id = HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED;
qp_range.layer_id = 0;
qp_range.max_qp = ctrl->val;
qp_range.min_qp = qp_min->val;
pdata = &qp_range;
break;
}
case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: {
int temp = 0;

View file

@ -236,6 +236,7 @@ enum hal_property {
HAL_PARAM_VENC_LOW_LATENCY,
HAL_PARAM_VENC_CONSTRAINED_INTRA_PRED,
HAL_CONFIG_VENC_BLUR_RESOLUTION,
HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED,
};
enum hal_domain {

View file

@ -1161,6 +1161,11 @@ enum v4l2_mpeg_vidc_video_lowlatency_mode {
#define V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 90)
#define V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 91)
#define V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 92)
/* Camera class control IDs */
#define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900)