|
@@ -513,7 +513,15 @@ static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec,
|
|
|
case V4L2_PIX_FMT_H264:
|
|
|
case V4L2_PIX_FMT_MPEG4:
|
|
|
f->fmt.pix.bytesperline = 0;
|
|
|
- f->fmt.pix.sizeimage = CODA_MAX_FRAME_SIZE;
|
|
|
+ /*
|
|
|
+ * This is a rough estimate for sensible compressed buffer
|
|
|
+ * sizes (between 1 and 16 bits per pixel). This could be
|
|
|
+ * improved by better format specific worst case estimates.
|
|
|
+ */
|
|
|
+ f->fmt.pix.sizeimage = round_up(clamp(f->fmt.pix.sizeimage,
|
|
|
+ f->fmt.pix.width * f->fmt.pix.height / 8,
|
|
|
+ f->fmt.pix.width * f->fmt.pix.height * 2),
|
|
|
+ PAGE_SIZE);
|
|
|
break;
|
|
|
default:
|
|
|
BUG();
|
|
@@ -1015,12 +1023,13 @@ static void coda_set_tiled_map_type(struct coda_ctx *ctx, int tiled_map_type)
|
|
|
|
|
|
static void set_default_params(struct coda_ctx *ctx)
|
|
|
{
|
|
|
- int max_w, max_h;
|
|
|
+ unsigned int max_w, max_h, size;
|
|
|
|
|
|
ctx->codec = coda_find_codec(ctx->dev, ctx->cvd->src_formats[0],
|
|
|
ctx->cvd->dst_formats[0]);
|
|
|
- max_w = ctx->codec->max_w;
|
|
|
- max_h = ctx->codec->max_h;
|
|
|
+ max_w = min(ctx->codec->max_w, 1920U);
|
|
|
+ max_h = min(ctx->codec->max_h, 1088U);
|
|
|
+ size = max_w * max_h * 3 / 2;
|
|
|
|
|
|
ctx->params.codec_mode = ctx->codec->mode;
|
|
|
ctx->colorspace = V4L2_COLORSPACE_REC709;
|
|
@@ -1035,14 +1044,14 @@ static void set_default_params(struct coda_ctx *ctx)
|
|
|
ctx->q_data[V4L2_M2M_DST].height = max_h;
|
|
|
if (ctx->codec->src_fourcc == V4L2_PIX_FMT_YUV420) {
|
|
|
ctx->q_data[V4L2_M2M_SRC].bytesperline = max_w;
|
|
|
- ctx->q_data[V4L2_M2M_SRC].sizeimage = (max_w * max_h * 3) / 2;
|
|
|
+ ctx->q_data[V4L2_M2M_SRC].sizeimage = size;
|
|
|
ctx->q_data[V4L2_M2M_DST].bytesperline = 0;
|
|
|
- ctx->q_data[V4L2_M2M_DST].sizeimage = CODA_MAX_FRAME_SIZE;
|
|
|
+ ctx->q_data[V4L2_M2M_DST].sizeimage = round_up(size, PAGE_SIZE);
|
|
|
} else {
|
|
|
ctx->q_data[V4L2_M2M_SRC].bytesperline = 0;
|
|
|
- ctx->q_data[V4L2_M2M_SRC].sizeimage = CODA_MAX_FRAME_SIZE;
|
|
|
+ ctx->q_data[V4L2_M2M_SRC].sizeimage = round_up(size, PAGE_SIZE);
|
|
|
ctx->q_data[V4L2_M2M_DST].bytesperline = max_w;
|
|
|
- ctx->q_data[V4L2_M2M_DST].sizeimage = (max_w * max_h * 3) / 2;
|
|
|
+ ctx->q_data[V4L2_M2M_DST].sizeimage = size;
|
|
|
}
|
|
|
ctx->q_data[V4L2_M2M_SRC].rect.width = max_w;
|
|
|
ctx->q_data[V4L2_M2M_SRC].rect.height = max_h;
|