staging: bcm2835-codec: Refactor default resolution code
authorDave Stevenson <dave.stevenson@raspberrypi.org>
Wed, 20 Mar 2019 10:06:51 +0000 (10:06 +0000)
committerpopcornmix <popcornmix@gmail.com>
Mon, 13 May 2019 23:08:24 +0000 (00:08 +0100)
The default resolution code was different for each role
as compressed formats need to pass bytesperline as 0 and
set up customised buffer sizes.
This is common setup, therefore amend get_sizeimage and
get_bytesperline to do the correct thing whether compressed
or uncompressed.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c

index 837fbec..4b67c9e 100644 (file)
@@ -578,10 +578,17 @@ static void job_abort(void *priv)
        ctx->aborting = 1;
 }
 
-static inline unsigned int get_sizeimage(int bpl, int height,
+static inline unsigned int get_sizeimage(int bpl, int width, int height,
                                         struct bcm2835_codec_fmt *fmt)
 {
-       return (bpl * height * fmt->size_multiplier_x2) >> 1;
+       if (fmt->flags & V4L2_FMT_FLAG_COMPRESSED) {
+               if (width * height > 1280 * 720)
+                       return DEF_COMP_BUF_SIZE_GREATER_720P;
+               else
+                       return DEF_COMP_BUF_SIZE_720P_OR_LESS;
+       } else {
+               return (bpl * height * fmt->size_multiplier_x2) >> 1;
+       }
 }
 
 static inline unsigned int get_bytesperline(int width,
@@ -1032,22 +1039,13 @@ static int vidioc_try_fmt(struct v4l2_format *f, struct bcm2835_codec_fmt *fmt)
                 * some of the pixels are active.
                 */
                f->fmt.pix.height = ALIGN(f->fmt.pix.height, 16);
-
-               f->fmt.pix.bytesperline = get_bytesperline(f->fmt.pix.width,
-                                                          fmt);
-               f->fmt.pix.sizeimage = get_sizeimage(f->fmt.pix.bytesperline,
-                                                    f->fmt.pix.height,
-                                                    fmt);
-       } else {
-               u32 min_size = f->fmt.pix.width > 1280 ||
-                              f->fmt.pix.height > 720 ?
-                              DEF_COMP_BUF_SIZE_GREATER_720P :
-                              DEF_COMP_BUF_SIZE_720P_OR_LESS;
-
-               f->fmt.pix.bytesperline = 0;
-               if (f->fmt.pix.sizeimage < min_size)
-                       f->fmt.pix.sizeimage = min_size;
        }
+       f->fmt.pix.bytesperline = get_bytesperline(f->fmt.pix.width,
+                                                  fmt);
+       f->fmt.pix.sizeimage = get_sizeimage(f->fmt.pix.bytesperline,
+                                            f->fmt.pix.width,
+                                            f->fmt.pix.height,
+                                            fmt);
 
        f->fmt.pix.field = V4L2_FIELD_NONE;
 
@@ -1159,6 +1157,7 @@ static int vidioc_s_fmt(struct bcm2835_codec_ctx *ctx, struct v4l2_format *f,
                q_data_dst->bytesperline =
                        get_bytesperline(f->fmt.pix.width, q_data_dst->fmt);
                q_data_dst->sizeimage = get_sizeimage(q_data_dst->bytesperline,
+                                                     q_data_dst->crop_width,
                                                      q_data_dst->height,
                                                      q_data_dst->fmt);
                update_capture_port = true;
@@ -2218,52 +2217,30 @@ static int bcm2835_codec_open(struct file *file)
 
        ctx->q_data[V4L2_M2M_SRC].fmt = get_default_format(dev, false);
        ctx->q_data[V4L2_M2M_DST].fmt = get_default_format(dev, true);
-       switch (dev->role) {
-       case DECODE:
-               /*
-                * Input width and height are irrelevant as they will be defined
-                * by the bitstream not the format. Required by V4L2 though.
-                */
-               ctx->q_data[V4L2_M2M_SRC].crop_width = DEFAULT_WIDTH;
-               ctx->q_data[V4L2_M2M_SRC].crop_height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_SRC].height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_SRC].bytesperline = 0;
-               ctx->q_data[V4L2_M2M_SRC].sizeimage =
-                                               DEF_COMP_BUF_SIZE_720P_OR_LESS;
-
-               ctx->q_data[V4L2_M2M_DST].crop_width = DEFAULT_WIDTH;
-               ctx->q_data[V4L2_M2M_DST].crop_height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_DST].height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_DST].bytesperline =
-                               get_bytesperline(DEFAULT_WIDTH,
-                                                ctx->q_data[V4L2_M2M_DST].fmt);
-               ctx->q_data[V4L2_M2M_DST].sizeimage =
-                       get_sizeimage(ctx->q_data[V4L2_M2M_DST].bytesperline,
-                                     ctx->q_data[V4L2_M2M_DST].height,
-                                     ctx->q_data[V4L2_M2M_DST].fmt);
-               break;
-       case ENCODE:
-               ctx->q_data[V4L2_M2M_SRC].crop_width = DEFAULT_WIDTH;
-               ctx->q_data[V4L2_M2M_SRC].crop_height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_SRC].height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_SRC].bytesperline =
-                               get_bytesperline(DEFAULT_WIDTH,
-                                                ctx->q_data[V4L2_M2M_SRC].fmt);
-               ctx->q_data[V4L2_M2M_SRC].sizeimage =
-                       get_sizeimage(ctx->q_data[V4L2_M2M_SRC].bytesperline,
-                                     ctx->q_data[V4L2_M2M_SRC].height,
-                                     ctx->q_data[V4L2_M2M_SRC].fmt);
-
-               ctx->q_data[V4L2_M2M_DST].crop_width = DEFAULT_WIDTH;
-               ctx->q_data[V4L2_M2M_DST].crop_height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_DST].bytesperline = 0;
-               ctx->q_data[V4L2_M2M_DST].height = DEFAULT_HEIGHT;
-               ctx->q_data[V4L2_M2M_DST].sizeimage =
-                                               DEF_COMP_BUF_SIZE_720P_OR_LESS;
-               break;
-       case ISP:
-               break;
-       }
+
+       ctx->q_data[V4L2_M2M_SRC].crop_width = DEFAULT_WIDTH;
+       ctx->q_data[V4L2_M2M_SRC].crop_height = DEFAULT_HEIGHT;
+       ctx->q_data[V4L2_M2M_SRC].height = DEFAULT_HEIGHT;
+       ctx->q_data[V4L2_M2M_SRC].bytesperline =
+                       get_bytesperline(DEFAULT_WIDTH,
+                                        ctx->q_data[V4L2_M2M_SRC].fmt);
+       ctx->q_data[V4L2_M2M_SRC].sizeimage =
+               get_sizeimage(ctx->q_data[V4L2_M2M_SRC].bytesperline,
+                             ctx->q_data[V4L2_M2M_SRC].crop_width,
+                             ctx->q_data[V4L2_M2M_SRC].height,
+                             ctx->q_data[V4L2_M2M_SRC].fmt);
+
+       ctx->q_data[V4L2_M2M_DST].crop_width = DEFAULT_WIDTH;
+       ctx->q_data[V4L2_M2M_DST].crop_height = DEFAULT_HEIGHT;
+       ctx->q_data[V4L2_M2M_DST].height = DEFAULT_HEIGHT;
+       ctx->q_data[V4L2_M2M_DST].bytesperline =
+                       get_bytesperline(DEFAULT_WIDTH,
+                                        ctx->q_data[V4L2_M2M_DST].fmt);
+       ctx->q_data[V4L2_M2M_DST].sizeimage =
+               get_sizeimage(ctx->q_data[V4L2_M2M_DST].bytesperline,
+                             ctx->q_data[V4L2_M2M_DST].crop_width,
+                             ctx->q_data[V4L2_M2M_DST].height,
+                             ctx->q_data[V4L2_M2M_DST].fmt);
 
        ctx->colorspace = V4L2_COLORSPACE_REC709;
        ctx->bitrate = 10 * 1000 * 1000;