Loading drivers/media/platform/msm/vidc/msm_venc.c +115 −35 Original line number Diff line number Diff line Loading @@ -482,8 +482,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, .name = "I Frame Quantization", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = I_FRAME_QP, .step = 1, .menu_skip_mask = 0, Loading @@ -493,8 +493,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, .name = "P Frame Quantization", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = P_FRAME_QP, .step = 1, .menu_skip_mask = 0, Loading @@ -504,8 +504,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, .name = "B Frame Quantization", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = B_FRAME_QP, .step = 1, .menu_skip_mask = 0, Loading @@ -515,7 +515,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_MIN_QP, .name = "H264 Minimum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .minimum = 0, .maximum = 51, .default_value = 1, .step = 1, Loading @@ -526,7 +526,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_MAX_QP, .name = "H264 Maximum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .minimum = 0, .maximum = 51, .default_value = 51, .step = 1, Loading @@ -537,8 +537,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MIN_QP, .name = "VP8 Minimum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 128, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, }, Loading @@ -546,9 +546,27 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MAX_QP, .name = "VP8 Maximum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 0, .maximum = 127, .default_value = 127, .step = 1, }, { .id = V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MIN_QP, .name = "MPEG4 Minimum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 128, .default_value = 128, .maximum = 31, .default_value = 1, .step = 1, }, { .id = V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MAX_QP, .name = "MPEG4 Maximum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 31, .default_value = 31, .step = 1, }, { Loading Loading @@ -932,8 +950,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP, .name = "Iframe initial QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading @@ -942,8 +960,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP, .name = "Pframe initial QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading @@ -952,8 +970,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP, .name = "Bframe initial QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading Loading @@ -1111,7 +1129,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .name = "Set frame level QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading Loading @@ -1213,6 +1231,26 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { }, }; static struct v4l2_ctrl *get_ctrl_from_cluster(int id, struct v4l2_ctrl **cluster, int ncontrols); /* Small helper macro for quickly getting a control and err checking */ #define TRY_GET_CTRL(__ctrl_id) ({ \ struct v4l2_ctrl *__temp; \ __temp = get_ctrl_from_cluster( \ __ctrl_id, \ ctrl->cluster, ctrl->ncontrols); \ if (!__temp) { \ dprintk(VIDC_ERR, "Can't find %s (%x) in cluster\n", \ #__ctrl_id, __ctrl_id); \ /* Clusters are hardcoded, if we can't find */ \ /* something then things are massively screwed up */ \ BUG_ON(1); \ } \ __temp; \ }) #define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls) static u32 get_frame_size_nv12(int plane, u32 height, u32 width) Loading Loading @@ -2085,6 +2123,52 @@ unknown_value: return -EINVAL; } static int msm_venc_validate_qp_value(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) { int rc = 0, min, max; struct v4l2_ctrl *temp_ctrl = NULL; int qp_value = ctrl->val; #define VALIDATE_BOUNDARIES(__min, __max, __val) ({\ int __rc = __val >= __min && \ __val <= __max; \ if (!__rc) \ dprintk(VIDC_ERR, "QP beyond range: min(%d) max(%d) val(%d)", \ __min, __max, __val); \ __rc; \ }) switch (inst->fmts[CAPTURE_PORT]->fourcc) { case V4L2_PIX_FMT_VP8: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_VP8_MAX_QP); max = temp_ctrl->maximum; temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_VP8_MIN_QP); min = temp_ctrl->minimum; if (!VALIDATE_BOUNDARIES(min, max, qp_value)) rc = -EINVAL; break; case V4L2_PIX_FMT_H263: case V4L2_PIX_FMT_MPEG4: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MAX_QP); max = temp_ctrl->maximum; temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MIN_QP); min = temp_ctrl->minimum; if (!VALIDATE_BOUNDARIES(min, max, qp_value)) rc = -EINVAL; break; default: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_MAX_QP); max = temp_ctrl->maximum; temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_MIN_QP); min = temp_ctrl->minimum; if (!VALIDATE_BOUNDARIES(min, max, qp_value)) rc = -EINVAL; break; } return rc; } static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) { int rc = 0; Loading Loading @@ -2126,22 +2210,6 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) } hdev = inst->core->device; /* Small helper macro for quickly getting a control and err checking */ #define TRY_GET_CTRL(__ctrl_id) ({ \ struct v4l2_ctrl *__temp; \ __temp = get_ctrl_from_cluster( \ __ctrl_id, \ ctrl->cluster, ctrl->ncontrols); \ if (!__temp) { \ dprintk(VIDC_ERR, "Can't find %s (%x) in cluster\n", \ #__ctrl_id, __ctrl_id); \ /* Clusters are hardcoded, if we can't find */ \ /* something then things are massively screwed up */ \ BUG_ON(1); \ } \ __temp; \ }) /* * Unlock the control prior to setting to the hardware. Otherwise * lower level code that attempts to do a get_ctrl() will end up Loading Loading @@ -2473,6 +2541,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: { struct v4l2_ctrl *qpp, *qpb; rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP); qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP); Loading @@ -2488,6 +2559,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: { struct v4l2_ctrl *qpi, *qpb; rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP); qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP); Loading @@ -2503,6 +2577,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: { struct v4l2_ctrl *qpi, *qpp; rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP); qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP); Loading Loading @@ -3023,6 +3100,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) pdata = &baselayerid; break; case V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP: rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; property_id = HAL_CONFIG_VENC_FRAME_QP; frameqp = ctrl->val; pdata = &frameqp; Loading include/uapi/linux/v4l2-controls.h +5 −0 Original line number Diff line number Diff line Loading @@ -1135,6 +1135,11 @@ enum v4l2_mpeg_vidc_video_lowlatency_mode { V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE = 1, }; #define V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MAX_QP \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 89) #define V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MIN_QP \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 90) /* Camera class control IDs */ Loading Loading
drivers/media/platform/msm/vidc/msm_venc.c +115 −35 Original line number Diff line number Diff line Loading @@ -482,8 +482,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, .name = "I Frame Quantization", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = I_FRAME_QP, .step = 1, .menu_skip_mask = 0, Loading @@ -493,8 +493,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, .name = "P Frame Quantization", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = P_FRAME_QP, .step = 1, .menu_skip_mask = 0, Loading @@ -504,8 +504,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, .name = "B Frame Quantization", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = B_FRAME_QP, .step = 1, .menu_skip_mask = 0, Loading @@ -515,7 +515,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_MIN_QP, .name = "H264 Minimum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .minimum = 0, .maximum = 51, .default_value = 1, .step = 1, Loading @@ -526,7 +526,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDEO_H264_MAX_QP, .name = "H264 Maximum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .minimum = 0, .maximum = 51, .default_value = 51, .step = 1, Loading @@ -537,8 +537,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MIN_QP, .name = "VP8 Minimum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 128, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, }, Loading @@ -546,9 +546,27 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MAX_QP, .name = "VP8 Maximum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 0, .maximum = 127, .default_value = 127, .step = 1, }, { .id = V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MIN_QP, .name = "MPEG4 Minimum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 128, .default_value = 128, .maximum = 31, .default_value = 1, .step = 1, }, { .id = V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MAX_QP, .name = "MPEG4 Maximum QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 31, .default_value = 31, .step = 1, }, { Loading Loading @@ -932,8 +950,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP, .name = "Iframe initial QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading @@ -942,8 +960,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP, .name = "Pframe initial QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading @@ -952,8 +970,8 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP, .name = "Bframe initial QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .minimum = 0, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading Loading @@ -1111,7 +1129,7 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .name = "Set frame level QP", .type = V4L2_CTRL_TYPE_INTEGER, .minimum = 1, .maximum = 51, .maximum = 127, .default_value = 1, .step = 1, .qmenu = NULL, Loading Loading @@ -1213,6 +1231,26 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { }, }; static struct v4l2_ctrl *get_ctrl_from_cluster(int id, struct v4l2_ctrl **cluster, int ncontrols); /* Small helper macro for quickly getting a control and err checking */ #define TRY_GET_CTRL(__ctrl_id) ({ \ struct v4l2_ctrl *__temp; \ __temp = get_ctrl_from_cluster( \ __ctrl_id, \ ctrl->cluster, ctrl->ncontrols); \ if (!__temp) { \ dprintk(VIDC_ERR, "Can't find %s (%x) in cluster\n", \ #__ctrl_id, __ctrl_id); \ /* Clusters are hardcoded, if we can't find */ \ /* something then things are massively screwed up */ \ BUG_ON(1); \ } \ __temp; \ }) #define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls) static u32 get_frame_size_nv12(int plane, u32 height, u32 width) Loading Loading @@ -2085,6 +2123,52 @@ unknown_value: return -EINVAL; } static int msm_venc_validate_qp_value(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) { int rc = 0, min, max; struct v4l2_ctrl *temp_ctrl = NULL; int qp_value = ctrl->val; #define VALIDATE_BOUNDARIES(__min, __max, __val) ({\ int __rc = __val >= __min && \ __val <= __max; \ if (!__rc) \ dprintk(VIDC_ERR, "QP beyond range: min(%d) max(%d) val(%d)", \ __min, __max, __val); \ __rc; \ }) switch (inst->fmts[CAPTURE_PORT]->fourcc) { case V4L2_PIX_FMT_VP8: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_VP8_MAX_QP); max = temp_ctrl->maximum; temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_VP8_MIN_QP); min = temp_ctrl->minimum; if (!VALIDATE_BOUNDARIES(min, max, qp_value)) rc = -EINVAL; break; case V4L2_PIX_FMT_H263: case V4L2_PIX_FMT_MPEG4: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MAX_QP); max = temp_ctrl->maximum; temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MIN_QP); min = temp_ctrl->minimum; if (!VALIDATE_BOUNDARIES(min, max, qp_value)) rc = -EINVAL; break; default: temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_MAX_QP); max = temp_ctrl->maximum; temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_MIN_QP); min = temp_ctrl->minimum; if (!VALIDATE_BOUNDARIES(min, max, qp_value)) rc = -EINVAL; break; } return rc; } static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) { int rc = 0; Loading Loading @@ -2126,22 +2210,6 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) } hdev = inst->core->device; /* Small helper macro for quickly getting a control and err checking */ #define TRY_GET_CTRL(__ctrl_id) ({ \ struct v4l2_ctrl *__temp; \ __temp = get_ctrl_from_cluster( \ __ctrl_id, \ ctrl->cluster, ctrl->ncontrols); \ if (!__temp) { \ dprintk(VIDC_ERR, "Can't find %s (%x) in cluster\n", \ #__ctrl_id, __ctrl_id); \ /* Clusters are hardcoded, if we can't find */ \ /* something then things are massively screwed up */ \ BUG_ON(1); \ } \ __temp; \ }) /* * Unlock the control prior to setting to the hardware. Otherwise * lower level code that attempts to do a get_ctrl() will end up Loading Loading @@ -2473,6 +2541,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: { struct v4l2_ctrl *qpp, *qpb; rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP); qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP); Loading @@ -2488,6 +2559,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: { struct v4l2_ctrl *qpi, *qpb; rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP); qpb = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP); Loading @@ -2503,6 +2577,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: { struct v4l2_ctrl *qpi, *qpp; rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; qpi = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP); qpp = TRY_GET_CTRL(V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP); Loading Loading @@ -3023,6 +3100,9 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) pdata = &baselayerid; break; case V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP: rc = msm_venc_validate_qp_value(inst, ctrl); if (rc) break; property_id = HAL_CONFIG_VENC_FRAME_QP; frameqp = ctrl->val; pdata = &frameqp; Loading
include/uapi/linux/v4l2-controls.h +5 −0 Original line number Diff line number Diff line Loading @@ -1135,6 +1135,11 @@ enum v4l2_mpeg_vidc_video_lowlatency_mode { V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE = 1, }; #define V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MAX_QP \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 89) #define V4L2_CID_MPEG_VIDC_VIDEO_MPEG4_MIN_QP \ (V4L2_CID_MPEG_MSM_VIDC_BASE + 90) /* Camera class control IDs */ Loading