Commit 7c3df789 authored by Philipp Zabel's avatar Philipp Zabel Committed by Mauro Carvalho Chehab

[media] coda: round up internal frames to multiples of macroblock size for h.264

CODA7541 only supports encoding h.264 frames with width and height that are
multiples of the macroblock size.
Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: default avatarKamil Debski <k.debski@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 1b0ed7be
...@@ -1744,15 +1744,21 @@ static void coda_free_framebuffers(struct coda_ctx *ctx) ...@@ -1744,15 +1744,21 @@ static void coda_free_framebuffers(struct coda_ctx *ctx)
static int coda_alloc_framebuffers(struct coda_ctx *ctx, struct coda_q_data *q_data, u32 fourcc) static int coda_alloc_framebuffers(struct coda_ctx *ctx, struct coda_q_data *q_data, u32 fourcc)
{ {
struct coda_dev *dev = ctx->dev; struct coda_dev *dev = ctx->dev;
int height = q_data->height; int width, height;
dma_addr_t paddr; dma_addr_t paddr;
int ysize; int ysize;
int ret; int ret;
int i; int i;
if (ctx->codec && ctx->codec->src_fourcc == V4L2_PIX_FMT_H264) if (ctx->codec && (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 ||
height = round_up(height, 16); ctx->codec->dst_fourcc == V4L2_PIX_FMT_H264)) {
ysize = round_up(q_data->width, 8) * height; width = round_up(q_data->width, 16);
height = round_up(q_data->height, 16);
} else {
width = round_up(q_data->width, 8);
height = q_data->height;
}
ysize = width * height;
/* Allocate frame buffers */ /* Allocate frame buffers */
for (i = 0; i < ctx->num_internal_frames; i++) { for (i = 0; i < ctx->num_internal_frames; i++) {
...@@ -2377,7 +2383,16 @@ static int coda_start_encoding(struct coda_ctx *ctx) ...@@ -2377,7 +2383,16 @@ static int coda_start_encoding(struct coda_ctx *ctx)
value = (q_data_src->width & CODADX6_PICWIDTH_MASK) << CODADX6_PICWIDTH_OFFSET; value = (q_data_src->width & CODADX6_PICWIDTH_MASK) << CODADX6_PICWIDTH_OFFSET;
value |= (q_data_src->height & CODADX6_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET; value |= (q_data_src->height & CODADX6_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET;
break; break;
default: case CODA_7541:
if (dst_fourcc == V4L2_PIX_FMT_H264) {
value = (round_up(q_data_src->width, 16) &
CODA7_PICWIDTH_MASK) << CODA7_PICWIDTH_OFFSET;
value |= (round_up(q_data_src->height, 16) &
CODA7_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET;
break;
}
/* fallthrough */
case CODA_960:
value = (q_data_src->width & CODA7_PICWIDTH_MASK) << CODA7_PICWIDTH_OFFSET; value = (q_data_src->width & CODA7_PICWIDTH_MASK) << CODA7_PICWIDTH_OFFSET;
value |= (q_data_src->height & CODA7_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET; value |= (q_data_src->height & CODA7_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment