[media] coda: implement VBV delay and buffer size controls
The encoder allows to specify the VBV model reference decoder's initial delay and buffer size. Export the corresponding V4L2 controls. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
68aa7ee15c
commit
da2b3b3e11
@@ -922,6 +922,9 @@ static int coda_start_encoding(struct coda_ctx *ctx)
|
|||||||
value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK)
|
value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK)
|
||||||
<< CODA_RATECONTROL_BITRATE_OFFSET;
|
<< CODA_RATECONTROL_BITRATE_OFFSET;
|
||||||
value |= 1 & CODA_RATECONTROL_ENABLE_MASK;
|
value |= 1 & CODA_RATECONTROL_ENABLE_MASK;
|
||||||
|
value |= (ctx->params.vbv_delay &
|
||||||
|
CODA_RATECONTROL_INITIALDELAY_MASK)
|
||||||
|
<< CODA_RATECONTROL_INITIALDELAY_OFFSET;
|
||||||
if (dev->devtype->product == CODA_960)
|
if (dev->devtype->product == CODA_960)
|
||||||
value |= BIT(31); /* disable autoskip */
|
value |= BIT(31); /* disable autoskip */
|
||||||
} else {
|
} else {
|
||||||
@@ -929,7 +932,7 @@ static int coda_start_encoding(struct coda_ctx *ctx)
|
|||||||
}
|
}
|
||||||
coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA);
|
coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA);
|
||||||
|
|
||||||
coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_BUF_SIZE);
|
coda_write(dev, ctx->params.vbv_size, CODA_CMD_ENC_SEQ_RC_BUF_SIZE);
|
||||||
coda_write(dev, ctx->params.intra_refresh,
|
coda_write(dev, ctx->params.intra_refresh,
|
||||||
CODA_CMD_ENC_SEQ_INTRA_REFRESH);
|
CODA_CMD_ENC_SEQ_INTRA_REFRESH);
|
||||||
|
|
||||||
|
|||||||
@@ -1400,6 +1400,12 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl)
|
|||||||
case V4L2_CID_JPEG_RESTART_INTERVAL:
|
case V4L2_CID_JPEG_RESTART_INTERVAL:
|
||||||
ctx->params.jpeg_restart_interval = ctrl->val;
|
ctx->params.jpeg_restart_interval = ctrl->val;
|
||||||
break;
|
break;
|
||||||
|
case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
|
||||||
|
ctx->params.vbv_delay = ctrl->val;
|
||||||
|
break;
|
||||||
|
case V4L2_CID_MPEG_VIDEO_VBV_SIZE:
|
||||||
|
ctx->params.vbv_size = min(ctrl->val * 8192, 0x7fffffff);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
|
v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
|
||||||
"Invalid control, id=%d, val=%d\n",
|
"Invalid control, id=%d, val=%d\n",
|
||||||
@@ -1459,6 +1465,14 @@ static void coda_encode_ctrls(struct coda_ctx *ctx)
|
|||||||
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||||
V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0,
|
V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0,
|
||||||
1920 * 1088 / 256, 1, 0);
|
1920 * 1088 / 256, 1, 0);
|
||||||
|
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||||
|
V4L2_CID_MPEG_VIDEO_VBV_DELAY, 0, 0x7fff, 1, 0);
|
||||||
|
/*
|
||||||
|
* The maximum VBV size value is 0x7fffffff bits,
|
||||||
|
* one bit less than 262144 KiB
|
||||||
|
*/
|
||||||
|
v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
|
||||||
|
V4L2_CID_MPEG_VIDEO_VBV_SIZE, 0, 262144, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx)
|
static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx)
|
||||||
|
|||||||
@@ -128,6 +128,8 @@ struct coda_params {
|
|||||||
enum v4l2_mpeg_video_multi_slice_mode slice_mode;
|
enum v4l2_mpeg_video_multi_slice_mode slice_mode;
|
||||||
u32 framerate;
|
u32 framerate;
|
||||||
u16 bitrate;
|
u16 bitrate;
|
||||||
|
u16 vbv_delay;
|
||||||
|
u32 vbv_size;
|
||||||
u32 slice_max_bits;
|
u32 slice_max_bits;
|
||||||
u32 slice_max_mb;
|
u32 slice_max_mb;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user