mirror of https://gitee.com/openkylin/linux.git
media: coda: add RC enable controls
Currently the encoder enables the rate control algorithms if the bitrate control is non-zero. Implement the V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE and V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE controls to allow userspace to choose frame-level or macroblock-level rate control updates, or to explicitly disable rate control. Both controls are initially enabled to keep the current behavior. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
1d3ac27801
commit
66f92c4e17
|
@ -1215,7 +1215,8 @@ static int coda_start_encoding(struct coda_ctx *ctx)
|
|||
coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE);
|
||||
}
|
||||
|
||||
if (ctx->params.bitrate) {
|
||||
if (ctx->params.bitrate && (ctx->params.frame_rc_enable ||
|
||||
ctx->params.mb_rc_enable)) {
|
||||
ctx->params.bitrate_changed = false;
|
||||
ctx->params.h264_intra_qp_changed = false;
|
||||
|
||||
|
@ -1276,7 +1277,11 @@ static int coda_start_encoding(struct coda_ctx *ctx)
|
|||
}
|
||||
coda_write(dev, value, CODA_CMD_ENC_SEQ_OPTION);
|
||||
|
||||
coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE);
|
||||
if (ctx->params.frame_rc_enable && !ctx->params.mb_rc_enable)
|
||||
value = 1;
|
||||
else
|
||||
value = 0;
|
||||
coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE);
|
||||
|
||||
coda_setup_iram(ctx);
|
||||
|
||||
|
|
|
@ -2223,6 +2223,12 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl)
|
|||
case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION:
|
||||
ctx->params.h264_constrained_intra_pred_flag = ctrl->val;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
|
||||
ctx->params.frame_rc_enable = ctrl->val;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
|
||||
ctx->params.mb_rc_enable = ctrl->val;
|
||||
break;
|
||||
case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET:
|
||||
ctx->params.h264_chroma_qp_index_offset = ctrl->val;
|
||||
break;
|
||||
|
@ -2321,6 +2327,10 @@ static void coda_encode_ctrls(struct coda_ctx *ctx)
|
|||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION, 0, 1, 1,
|
||||
0);
|
||||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, 0, 1, 1, 1);
|
||||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE, 0, 1, 1, 1);
|
||||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||
V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, -12, 12, 1, 0);
|
||||
v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
|
||||
|
|
|
@ -148,6 +148,8 @@ struct coda_params {
|
|||
bool h264_intra_qp_changed;
|
||||
bool intra_refresh_changed;
|
||||
bool slice_mode_changed;
|
||||
bool frame_rc_enable;
|
||||
bool mb_rc_enable;
|
||||
};
|
||||
|
||||
struct coda_buffer_meta {
|
||||
|
|
Loading…
Reference in New Issue