mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
staging: bcm2835-codec: Refactor default resolution code
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>
This commit is contained in:
committed by
popcornmix
parent
d1a96bd0bd
commit
e6bfec5bd0
@@ -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_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].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_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;
|
||||
|
||||
Reference in New Issue
Block a user