diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2015-07-10 09:37:52 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-07-17 10:24:05 -0400 |
commit | da2b3b3e115d2793b5475039ca4d7f364135fcf4 (patch) | |
tree | 077fd3984f6cffe1fc6a83efabe58837e1509820 /drivers/media/platform/coda | |
parent | 68aa7ee15cd683006ec1ac91ad60c019bf62d978 (diff) |
[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>
Diffstat (limited to 'drivers/media/platform/coda')
-rw-r--r-- | drivers/media/platform/coda/coda-bit.c | 5 | ||||
-rw-r--r-- | drivers/media/platform/coda/coda-common.c | 14 | ||||
-rw-r--r-- | drivers/media/platform/coda/coda.h | 2 |
3 files changed, 20 insertions, 1 deletions
diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c index bcb9911d5e3f..b14affcf8dc0 100644 --- a/drivers/media/platform/coda/coda-bit.c +++ b/drivers/media/platform/coda/coda-bit.c | |||
@@ -922,6 +922,9 @@ static int coda_start_encoding(struct coda_ctx *ctx) | |||
922 | value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK) | 922 | value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK) |
923 | << CODA_RATECONTROL_BITRATE_OFFSET; | 923 | << CODA_RATECONTROL_BITRATE_OFFSET; |
924 | value |= 1 & CODA_RATECONTROL_ENABLE_MASK; | 924 | value |= 1 & CODA_RATECONTROL_ENABLE_MASK; |
925 | value |= (ctx->params.vbv_delay & | ||
926 | CODA_RATECONTROL_INITIALDELAY_MASK) | ||
927 | << CODA_RATECONTROL_INITIALDELAY_OFFSET; | ||
925 | if (dev->devtype->product == CODA_960) | 928 | if (dev->devtype->product == CODA_960) |
926 | value |= BIT(31); /* disable autoskip */ | 929 | value |= BIT(31); /* disable autoskip */ |
927 | } else { | 930 | } else { |
@@ -929,7 +932,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) | |||
929 | } | 932 | } |
930 | coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); | 933 | coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); |
931 | 934 | ||
932 | coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_BUF_SIZE); | 935 | coda_write(dev, ctx->params.vbv_size, CODA_CMD_ENC_SEQ_RC_BUF_SIZE); |
933 | coda_write(dev, ctx->params.intra_refresh, | 936 | coda_write(dev, ctx->params.intra_refresh, |
934 | CODA_CMD_ENC_SEQ_INTRA_REFRESH); | 937 | CODA_CMD_ENC_SEQ_INTRA_REFRESH); |
935 | 938 | ||
diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c index 367b6baa8f31..24737f1a1a1b 100644 --- a/drivers/media/platform/coda/coda-common.c +++ b/drivers/media/platform/coda/coda-common.c | |||
@@ -1400,6 +1400,12 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl) | |||
1400 | case V4L2_CID_JPEG_RESTART_INTERVAL: | 1400 | case V4L2_CID_JPEG_RESTART_INTERVAL: |
1401 | ctx->params.jpeg_restart_interval = ctrl->val; | 1401 | ctx->params.jpeg_restart_interval = ctrl->val; |
1402 | break; | 1402 | break; |
1403 | case V4L2_CID_MPEG_VIDEO_VBV_DELAY: | ||
1404 | ctx->params.vbv_delay = ctrl->val; | ||
1405 | break; | ||
1406 | case V4L2_CID_MPEG_VIDEO_VBV_SIZE: | ||
1407 | ctx->params.vbv_size = min(ctrl->val * 8192, 0x7fffffff); | ||
1408 | break; | ||
1403 | default: | 1409 | default: |
1404 | v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, | 1410 | v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, |
1405 | "Invalid control, id=%d, val=%d\n", | 1411 | "Invalid control, id=%d, val=%d\n", |
@@ -1459,6 +1465,14 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) | |||
1459 | v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, | 1465 | v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, |
1460 | V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0, | 1466 | V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0, |
1461 | 1920 * 1088 / 256, 1, 0); | 1467 | 1920 * 1088 / 256, 1, 0); |
1468 | v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, | ||
1469 | V4L2_CID_MPEG_VIDEO_VBV_DELAY, 0, 0x7fff, 1, 0); | ||
1470 | /* | ||
1471 | * The maximum VBV size value is 0x7fffffff bits, | ||
1472 | * one bit less than 262144 KiB | ||
1473 | */ | ||
1474 | v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, | ||
1475 | V4L2_CID_MPEG_VIDEO_VBV_SIZE, 0, 262144, 1, 0); | ||
1462 | } | 1476 | } |
1463 | 1477 | ||
1464 | static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx) | 1478 | static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx) |
diff --git a/drivers/media/platform/coda/coda.h b/drivers/media/platform/coda/coda.h index a3d70ccd1020..26c9c4bb6e4a 100644 --- a/drivers/media/platform/coda/coda.h +++ b/drivers/media/platform/coda/coda.h | |||
@@ -128,6 +128,8 @@ struct coda_params { | |||
128 | enum v4l2_mpeg_video_multi_slice_mode slice_mode; | 128 | enum v4l2_mpeg_video_multi_slice_mode slice_mode; |
129 | u32 framerate; | 129 | u32 framerate; |
130 | u16 bitrate; | 130 | u16 bitrate; |
131 | u16 vbv_delay; | ||
132 | u32 vbv_size; | ||
131 | u32 slice_max_bits; | 133 | u32 slice_max_bits; |
132 | u32 slice_max_mb; | 134 | u32 slice_max_mb; |
133 | }; | 135 | }; |