Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Philipp Zabel and committed by
Mauro Carvalho Chehab
66f92c4e 1d3ac278

+19 -2
+7 -2
drivers/media/platform/coda/coda-bit.c
··· 1215 1215 coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE); 1216 1216 } 1217 1217 1218 - if (ctx->params.bitrate) { 1218 + if (ctx->params.bitrate && (ctx->params.frame_rc_enable || 1219 + ctx->params.mb_rc_enable)) { 1219 1220 ctx->params.bitrate_changed = false; 1220 1221 ctx->params.h264_intra_qp_changed = false; 1221 1222 ··· 1277 1276 } 1278 1277 coda_write(dev, value, CODA_CMD_ENC_SEQ_OPTION); 1279 1278 1280 - coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE); 1279 + if (ctx->params.frame_rc_enable && !ctx->params.mb_rc_enable) 1280 + value = 1; 1281 + else 1282 + value = 0; 1283 + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE); 1281 1284 1282 1285 coda_setup_iram(ctx); 1283 1286
+10
drivers/media/platform/coda/coda-common.c
··· 2223 2223 case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION: 2224 2224 ctx->params.h264_constrained_intra_pred_flag = ctrl->val; 2225 2225 break; 2226 + case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE: 2227 + ctx->params.frame_rc_enable = ctrl->val; 2228 + break; 2229 + case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE: 2230 + ctx->params.mb_rc_enable = ctrl->val; 2231 + break; 2226 2232 case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET: 2227 2233 ctx->params.h264_chroma_qp_index_offset = ctrl->val; 2228 2234 break; ··· 2327 2321 v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, 2328 2322 V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION, 0, 1, 1, 2329 2323 0); 2324 + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, 2325 + V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, 0, 1, 1, 1); 2326 + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, 2327 + V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE, 0, 1, 1, 1); 2330 2328 v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, 2331 2329 V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, -12, 12, 1, 0); 2332 2330 v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
+2
drivers/media/platform/coda/coda.h
··· 148 148 bool h264_intra_qp_changed; 149 149 bool intra_refresh_changed; 150 150 bool slice_mode_changed; 151 + bool frame_rc_enable; 152 + bool mb_rc_enable; 151 153 }; 152 154 153 155 struct coda_buffer_meta {