[media] coda: implement VBV delay and buffer size controls
authorPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 10 Jul 2015 13:37:52 +0000 (10:37 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 17 Jul 2015 14:24:05 +0000 (11:24 -0300)
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>
drivers/media/platform/coda/coda-bit.c
drivers/media/platform/coda/coda-common.c
drivers/media/platform/coda/coda.h

index bcb9911d5e3f1844cb0d72e17c26d0972600622d..b14affcf8dc01311b47a0f121bad08f43a92cffc 100644 (file)
@@ -922,6 +922,9 @@ static int coda_start_encoding(struct coda_ctx *ctx)
                value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK)
                        << CODA_RATECONTROL_BITRATE_OFFSET;
                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)
                        value |= BIT(31); /* disable autoskip */
        } 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, 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_CMD_ENC_SEQ_INTRA_REFRESH);
 
index 367b6baa8f31b59f908c5ef68e3d68255ed045f5..24737f1a1a1bbc9dcd020c2e9e1d404046ad8ec0 100644 (file)
@@ -1400,6 +1400,12 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl)
        case V4L2_CID_JPEG_RESTART_INTERVAL:
                ctx->params.jpeg_restart_interval = ctrl->val;
                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:
                v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
                        "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_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 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)
index a3d70ccd10204621fdf63c7d968df3ab66dddf0d..26c9c4bb6e4a4e7c9ebe9f208e4cd5169025c0c4 100644 (file)
@@ -128,6 +128,8 @@ struct coda_params {
        enum v4l2_mpeg_video_multi_slice_mode slice_mode;
        u32                     framerate;
        u16                     bitrate;
+       u16                     vbv_delay;
+       u32                     vbv_size;
        u32                     slice_max_bits;
        u32                     slice_max_mb;
 };