From: Vladimir Yakovlev <vovchkir@xxxxxxxxx> We can use v4l2_ctrl (V4L2_CID_GAMMA) to set gamma for configuration h.264 encoder. Co-developed-by: Sergey Khimich <serghox@xxxxxxxxx> Signed-off-by: Sergey Khimich <serghox@xxxxxxxxx> Signed-off-by: Vladimir Yakovlev <vovchkir@xxxxxxxxx> --- .../platform/chips-media/coda/coda-bit.c | 28 ++++++------------- .../platform/chips-media/coda/coda-common.c | 7 +++++ .../media/platform/chips-media/coda/coda.h | 4 +++ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 50350d657f91..782b299e9b12 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -35,9 +35,6 @@ #define CODA7_PS_BUF_SIZE 0x28000 #define CODA9_PS_SAVE_SIZE (512 * 1024) -#define CODA_DEFAULT_GAMMA 4096 -#define CODA9_DEFAULT_GAMMA 24576 /* 0.75 * 32768 */ - static void coda_free_bitstream_buffer(struct coda_ctx *ctx); static inline int coda_is_initialized(struct coda_dev *dev) @@ -1065,7 +1062,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) struct coda_q_data *q_data_src, *q_data_dst; u32 bitstream_buf, bitstream_size; struct vb2_v4l2_buffer *buf; - int gamma, ret, value; + int ret, value; u32 dst_fourcc; int num_fb; u32 stride; @@ -1251,13 +1248,14 @@ static int coda_start_encoding(struct coda_ctx *ctx) value = 0; - if (dev->devtype->product == CODA_960) - gamma = CODA9_DEFAULT_GAMMA; - else - gamma = CODA_DEFAULT_GAMMA; - if (gamma > 0) { - coda_write(dev, (gamma & CODA_GAMMA_MASK) << CODA_GAMMA_OFFSET, - CODA_CMD_ENC_SEQ_RC_GAMMA); + if (ctx->params.gamma > 0) { + if (dev->devtype->product == CODA_960) + value |= 1 << CODA9_OPTION_GAMMA_OFFSET; + else if (dev->devtype->product == CODA_DX6) + value |= 1 << CODADX6_OPTION_GAMMA_OFFSET; + else + value |= 1 << CODA7_OPTION_GAMMA_OFFSET; + coda_write(dev, ctx->params.gamma, CODA_CMD_ENC_SEQ_RC_GAMMA); } if (ctx->params.h264_min_qp || ctx->params.h264_max_qp) { @@ -1269,15 +1267,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) if (dev->devtype->product == CODA_960) { if (ctx->params.h264_max_qp) value |= 1 << CODA9_OPTION_RCQPMAX_OFFSET; - if (CODA_DEFAULT_GAMMA > 0) - value |= 1 << CODA9_OPTION_GAMMA_OFFSET; } else { - if (CODA_DEFAULT_GAMMA > 0) { - if (dev->devtype->product == CODA_DX6) - value |= 1 << CODADX6_OPTION_GAMMA_OFFSET; - else - value |= 1 << CODA7_OPTION_GAMMA_OFFSET; - } if (ctx->params.h264_min_qp) value |= 1 << CODA7_OPTION_RCQPMIN_OFFSET; if (ctx->params.h264_max_qp) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 9b443ddabeab..9ca459793050 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2205,6 +2205,9 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl) ctx->params.bitrate = ctrl->val / 1000; ctx->params.bitrate_changed = true; break; + case V4L2_CID_GAMMA: + ctx->params.gamma = ctrl->val; + break; case V4L2_CID_MPEG_VIDEO_GOP_SIZE: ctx->params.gop_size = ctrl->val; break; @@ -2311,9 +2314,13 @@ static const struct v4l2_ctrl_ops coda_ctrl_ops = { static void coda_encode_ctrls(struct coda_ctx *ctx) { int max_gop_size = (ctx->dev->devtype->product == CODA_DX6) ? 60 : 99; + u32 def_gamma = (ctx->dev->devtype->product == CODA_960) ? + CODA9_DEFAULT_GAMMA : CODA_DEFAULT_GAMMA; v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_BITRATE, 0, 32767000, 1000, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_GAMMA, 0, 0x7FFFFFFF, 1, def_gamma); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, max_gop_size, 1, 16); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, diff --git a/drivers/media/platform/chips-media/coda/coda.h b/drivers/media/platform/chips-media/coda/coda.h index ddfd0a32c653..007f56b24c61 100644 --- a/drivers/media/platform/chips-media/coda/coda.h +++ b/drivers/media/platform/chips-media/coda/coda.h @@ -29,6 +29,9 @@ #define CODA_MAX_FRAMEBUFFERS 19 #define FMO_SLICE_SAVE_BUF_SIZE (32) +#define CODA_DEFAULT_GAMMA 4096 +#define CODA9_DEFAULT_GAMMA 24576 /* 0.75 * 32768 */ + /* * This control allows applications to read the per-stream * (i.e. per-context) Macroblocks Error Count. This value @@ -150,6 +153,7 @@ struct coda_params { u32 vbv_size; u32 slice_max_bits; u32 slice_max_mb; + u32 gamma; bool force_ipicture; bool gop_size_changed; bool bitrate_changed; -- 2.30.2