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:
Родитель
44f5b2fffc
Коммит
94dfb1689c
|
@ -207,6 +207,7 @@ struct venc_controls {
|
|||
u32 bitrate_peak;
|
||||
u32 rc_enable;
|
||||
u32 const_quality;
|
||||
u32 frame_skip_mode;
|
||||
|
||||
u32 h264_i_period;
|
||||
u32 h264_entropy_mode;
|
||||
|
|
|
@ -745,9 +745,11 @@ static int venc_set_properties(struct venus_inst *inst)
|
|||
if (!ctr->rc_enable)
|
||||
rate_control = HFI_RATE_CONTROL_OFF;
|
||||
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)
|
||||
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)
|
||||
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:
|
||||
ctr->const_quality = ctrl->val;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE:
|
||||
ctr->frame_skip_mode = ctrl->val;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -220,7 +223,7 @@ int venc_ctrl_init(struct venus_inst *inst)
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 32);
|
||||
ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 33);
|
||||
if (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_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;
|
||||
if (ret)
|
||||
goto err;
|
||||
|
|
Загрузка…
Ссылка в новой задаче