mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-30 04:39:38 +00:00
media: venus: venc: Add support for frame-skip mode v4l2 control
This adds support for frame-skip-mode standard v4l2 control in encoder driver. The control is implemented based on the combination of client selected bitrate-mode and frame-skip-mode. Once The client selected bitrate-mode (constant or variable) and the frame-skip-mode is not disabled we set variable framerate for rate controller. Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
44f5b2fffc
commit
94dfb1689c
3 changed files with 16 additions and 3 deletions
|
@ -207,6 +207,7 @@ struct venc_controls {
|
||||||
u32 bitrate_peak;
|
u32 bitrate_peak;
|
||||||
u32 rc_enable;
|
u32 rc_enable;
|
||||||
u32 const_quality;
|
u32 const_quality;
|
||||||
|
u32 frame_skip_mode;
|
||||||
|
|
||||||
u32 h264_i_period;
|
u32 h264_i_period;
|
||||||
u32 h264_entropy_mode;
|
u32 h264_entropy_mode;
|
||||||
|
|
|
@ -745,9 +745,11 @@ static int venc_set_properties(struct venus_inst *inst)
|
||||||
if (!ctr->rc_enable)
|
if (!ctr->rc_enable)
|
||||||
rate_control = HFI_RATE_CONTROL_OFF;
|
rate_control = HFI_RATE_CONTROL_OFF;
|
||||||
else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
|
else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
|
||||||
rate_control = HFI_RATE_CONTROL_VBR_CFR;
|
rate_control = ctr->frame_skip_mode ? HFI_RATE_CONTROL_VBR_VFR :
|
||||||
|
HFI_RATE_CONTROL_VBR_CFR;
|
||||||
else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
|
else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
|
||||||
rate_control = HFI_RATE_CONTROL_CBR_CFR;
|
rate_control = ctr->frame_skip_mode ? HFI_RATE_CONTROL_CBR_VFR :
|
||||||
|
HFI_RATE_CONTROL_CBR_CFR;
|
||||||
else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ)
|
else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ)
|
||||||
rate_control = HFI_RATE_CONTROL_CQ;
|
rate_control = HFI_RATE_CONTROL_CQ;
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,9 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
case V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY:
|
case V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY:
|
||||||
ctr->const_quality = ctrl->val;
|
ctr->const_quality = ctrl->val;
|
||||||
break;
|
break;
|
||||||
|
case V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE:
|
||||||
|
ctr->frame_skip_mode = ctrl->val;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -220,7 +223,7 @@ int venc_ctrl_init(struct venus_inst *inst)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 32);
|
ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 33);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -364,6 +367,13 @@ int venc_ctrl_init(struct venus_inst *inst)
|
||||||
v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
|
v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
|
||||||
V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY, 0, 100, 1, 0);
|
V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY, 0, 100, 1, 0);
|
||||||
|
|
||||||
|
v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
|
||||||
|
V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE,
|
||||||
|
V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT,
|
||||||
|
~((1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED) |
|
||||||
|
(1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT)),
|
||||||
|
V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED);
|
||||||
|
|
||||||
ret = inst->ctrl_handler.error;
|
ret = inst->ctrl_handler.error;
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
Loading…
Reference in a new issue