diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2015-07-06 17:47:53 +0200 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2017-04-25 14:35:06 +0200 |
commit | 6665f2ce7808be6c57f0b7323b1a3c2c396fcd63 (patch) | |
tree | 4d73f985e48fe09c8b26726c2423bcdef5025cf0 | |
parent | 5a7ad1146caa895ad718a534399e38bd2ba721b7 (diff) | |
download | linux-coda/vp8.tar.gz linux-coda/vp8.tar.xz |
FIXME: [media] coda: enable VP8 decodingcoda/vp8
Hook up the VP8 decoder, doesn't work yet.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r-- | drivers/media/platform/coda/coda-bit.c | 38 | ||||
-rw-r--r-- | drivers/media/platform/coda/coda-common.c | 3 | ||||
-rw-r--r-- | drivers/media/platform/coda/coda.h | 1 | ||||
-rw-r--r-- | drivers/media/platform/coda/coda_regs.h | 2 |
4 files changed, 40 insertions, 4 deletions
diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c index 466a44e4549e..af5e0da8f5af 100644 --- a/drivers/media/platform/coda/coda-bit.c +++ b/drivers/media/platform/coda/coda-bit.c @@ -427,6 +427,7 @@ static void coda_free_context_buffers(struct coda_ctx *ctx) struct coda_dev *dev = ctx->dev; coda_free_aux_buf(dev, &ctx->slicebuf); + coda_free_aux_buf(dev, &ctx->vp8mbbuf); coda_free_aux_buf(dev, &ctx->psbuf); if (dev->devtype->product != CODA_DX6) coda_free_aux_buf(dev, &ctx->workbuf); @@ -460,6 +461,16 @@ static int coda_alloc_context_buffers(struct coda_ctx *ctx, goto err; } + if (!ctx->vp8mbbuf.vaddr && q_data->fourcc == V4L2_PIX_FMT_VP8) { + unsigned int stride = round_up(q_data->width, 16); + + size = 68 * (stride * q_data->width / 256); + ret = coda_alloc_context_buf(ctx, &ctx->vp8mbbuf, size, + "vp8mbbuf"); + if (ret < 0) + goto err; + } + if (!ctx->psbuf.vaddr && dev->devtype->product == CODA_7541) { ret = coda_alloc_context_buf(ctx, &ctx->psbuf, CODA7_PS_BUF_SIZE, "psbuf"); @@ -1562,11 +1573,14 @@ static int __coda_start_decoding(struct coda_ctx *ctx) coda_write(dev, val, CODA_CMD_DEC_SEQ_OPTION); ctx->params.codec_mode = ctx->codec->mode; - if (dev->devtype->product == CODA_960 && - src_fourcc == V4L2_PIX_FMT_MPEG4) - ctx->params.codec_mode_aux = CODA_MP4_AUX_MPEG4; - else + if (dev->devtype->product == CODA_960) { + if (src_fourcc == V4L2_PIX_FMT_MPEG4) + ctx->params.codec_mode_aux = CODA_MP4_AUX_MPEG4; + if (src_fourcc == V4L2_PIX_FMT_VP8) + ctx->params.codec_mode_aux = CODA_VPX_AUX_VP8; + } else { ctx->params.codec_mode_aux = 0; + } if (src_fourcc == V4L2_PIX_FMT_H264) { if (dev->devtype->product == CODA_7541) { coda_write(dev, ctx->psbuf.paddr, @@ -1655,6 +1669,18 @@ static int __coda_start_decoding(struct coda_ctx *ctx) (top_bottom & 0x3ff); } + if (src_fourcc == V4L2_PIX_FMT_VP8) { + u32 val = coda_read(dev, CODA9_RET_DEC_SEQ_VP8_SCALE_INFO); + int h_scale = (val >> 30) & 0x3; + int v_scale = (val >> 28) & 0x3; + int pic_width = (val >> 14) & 0x3fff; + int pic_height = (val >> 0) & 0x3fff; + + v4l2_dbg(1, coda_debug, &dev->v4l2_dev, + "VP8 scale factor %dx%d, picture size %dx%d\n", + h_scale, v_scale, pic_width, pic_height); + } + ret = coda_alloc_framebuffers(ctx, q_data_dst, src_fourcc); if (ret < 0) { v4l2_err(&dev->v4l2_dev, "failed to allocate framebuffers\n"); @@ -1688,6 +1714,10 @@ static int __coda_start_decoding(struct coda_ctx *ctx) } } + if (src_fourcc == V4L2_PIX_FMT_VP8) + coda_write(dev, ctx->vp8mbbuf.paddr, + CODA9_CMD_SET_FRAME_MB_BUF_BASE); + if (src_fourcc == V4L2_PIX_FMT_H264) { coda_write(dev, ctx->slicebuf.paddr, CODA_CMD_SET_FRAME_SLICE_BB_START); diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c index eb6548f46cba..a55d766cb676 100644 --- a/drivers/media/platform/coda/coda-common.c +++ b/drivers/media/platform/coda/coda-common.c @@ -149,6 +149,7 @@ static const struct coda_codec coda9_codecs[] = { CODA_CODEC(CODA9_MODE_DECODE_H264, V4L2_PIX_FMT_H264, V4L2_PIX_FMT_YUV420, 1920, 1088), CODA_CODEC(CODA9_MODE_DECODE_MP2, V4L2_PIX_FMT_MPEG2, V4L2_PIX_FMT_YUV420, 1920, 1088), CODA_CODEC(CODA9_MODE_DECODE_MP4, V4L2_PIX_FMT_MPEG4, V4L2_PIX_FMT_YUV420, 1920, 1088), + CODA_CODEC(CODA9_MODE_DECODE_VPX, V4L2_PIX_FMT_VP8, V4L2_PIX_FMT_YUV420, 1920, 1088), }; struct coda_video_device { @@ -198,6 +199,7 @@ static const struct coda_video_device coda_bit_decoder = { V4L2_PIX_FMT_H264, V4L2_PIX_FMT_MPEG2, V4L2_PIX_FMT_MPEG4, + V4L2_PIX_FMT_VP8, }, .dst_formats = { V4L2_PIX_FMT_NV12, @@ -549,6 +551,7 @@ static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec, case V4L2_PIX_FMT_H264: case V4L2_PIX_FMT_MPEG4: case V4L2_PIX_FMT_MPEG2: + case V4L2_PIX_FMT_VP8: f->fmt.pix.bytesperline = 0; f->fmt.pix.sizeimage = coda_estimate_sizeimage(ctx, f->fmt.pix.sizeimage, diff --git a/drivers/media/platform/coda/coda.h b/drivers/media/platform/coda/coda.h index 4b831c91ae4a..43ac6282d6b1 100644 --- a/drivers/media/platform/coda/coda.h +++ b/drivers/media/platform/coda/coda.h @@ -218,6 +218,7 @@ struct coda_ctx { struct coda_aux_buf parabuf; struct coda_aux_buf psbuf; struct coda_aux_buf slicebuf; + struct coda_aux_buf vp8mbbuf; struct coda_aux_buf internal_frames[CODA_MAX_FRAMEBUFFERS]; u32 frame_types[CODA_MAX_FRAMEBUFFERS]; struct coda_buffer_meta frame_metas[CODA_MAX_FRAMEBUFFERS]; diff --git a/drivers/media/platform/coda/coda_regs.h b/drivers/media/platform/coda/coda_regs.h index 3490602fa6e1..995780c8d8c2 100644 --- a/drivers/media/platform/coda/coda_regs.h +++ b/drivers/media/platform/coda/coda_regs.h @@ -170,6 +170,7 @@ #define CODA_RET_DEC_SEQ_FRAME_NEED 0x1cc #define CODA_RET_DEC_SEQ_FRAME_DELAY 0x1d0 #define CODA_RET_DEC_SEQ_INFO 0x1d4 +#define CODA9_RET_DEC_SEQ_VP8_SCALE_INFO 0x1d4 #define CODA_RET_DEC_SEQ_CROP_LEFT_RIGHT 0x1d8 #define CODA_RET_DEC_SEQ_CROP_TOP_BOTTOM 0x1dc #define CODA_RET_DEC_SEQ_NEXT_FRAME_NUM 0x1e0 @@ -402,6 +403,7 @@ #define CODA9_CACHE_LUMA_BUFFER_SIZE_OFFSET 16 #define CODA9_CACHE_CB_BUFFER_SIZE_OFFSET 8 #define CODA9_CACHE_CR_BUFFER_SIZE_OFFSET 0 +#define CODA9_CMD_SET_FRAME_MB_BUF_BASE 0x1b0 #define CODA9_CMD_SET_FRAME_SUBSAMP_A_MVC 0x1b0 #define CODA9_CMD_SET_FRAME_SUBSAMP_B_MVC 0x1b4 #define CODA9_CMD_SET_FRAME_DP_BUF_BASE 0x1b0 |