]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: coda: let CODA960 firmware set frame cropping in SPS header
authorPhilipp Zabel <p.zabel@pengutronix.de>
Thu, 19 Jul 2018 10:42:28 +0000 (06:42 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 27 Jul 2018 10:52:34 +0000 (06:52 -0400)
When encoding h.264, if visible resolution is not aligned to macroblock
size, frame cropping has to be set in the SPS header to produce correct
streams. The CODA960 firmware can do this on its own if asked to.

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+samsung@kernel.org>
drivers/media/platform/coda/coda-bit.c

index 529fc187ccfd34742f5c35300244b17613f7d5a5..c255c8e9db52b27dcd7579da6e95b2082af8c4a5 100644 (file)
@@ -536,6 +536,8 @@ static int coda_encode_header(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf,
 {
        struct vb2_buffer *vb = &buf->vb2_buf;
        struct coda_dev *dev = ctx->dev;
+       struct coda_q_data *q_data_src;
+       struct v4l2_rect *r;
        size_t bufsize;
        int ret;
        int i;
@@ -549,6 +551,23 @@ static int coda_encode_header(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf,
        if (dev->devtype->product == CODA_960)
                bufsize /= 1024;
        coda_write(dev, bufsize, CODA_CMD_ENC_HEADER_BB_SIZE);
+       if (dev->devtype->product == CODA_960 &&
+           ctx->codec->dst_fourcc == V4L2_PIX_FMT_H264 &&
+           header_code == CODA_HEADER_H264_SPS) {
+               q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
+               r = &q_data_src->rect;
+
+               if (r->width % 16 || r->height % 16) {
+                       u32 crop_right = round_up(r->width, 16) -  r->width;
+                       u32 crop_bottom = round_up(r->height, 16) - r->height;
+
+                       coda_write(dev, crop_right,
+                                  CODA9_CMD_ENC_HEADER_FRAME_CROP_H);
+                       coda_write(dev, crop_bottom,
+                                  CODA9_CMD_ENC_HEADER_FRAME_CROP_V);
+                       header_code |= CODA9_HEADER_FRAME_CROP;
+               }
+       }
        coda_write(dev, header_code, CODA_CMD_ENC_HEADER_CODE);
        ret = coda_command_sync(ctx, CODA_COMMAND_ENCODE_HEADER);
        if (ret < 0) {