ctx->vpu_header_size[0] +
                        ctx->vpu_header_size[1] +
                        ctx->vpu_header_size[2];
-               pic_stream_buffer_size = CODA_MAX_FRAME_SIZE -
+               pic_stream_buffer_size = q_data_dst->sizeimage -
                        ctx->vpu_header_size[0] -
                        ctx->vpu_header_size[1] -
                        ctx->vpu_header_size[2];
        } else {
                pic_stream_buffer_addr =
                        vb2_dma_contig_plane_dma_addr(dst_buf, 0);
-               pic_stream_buffer_size = CODA_MAX_FRAME_SIZE;
+               pic_stream_buffer_size = q_data_dst->sizeimage;
        }
 
        if (src_buf->v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME) {
 
        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();
 
 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;
        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;