summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2015-07-06 17:47:53 +0200
committerPhilipp Zabel <p.zabel@pengutronix.de>2017-04-25 14:35:06 +0200
commit6665f2ce7808be6c57f0b7323b1a3c2c396fcd63 (patch)
tree4d73f985e48fe09c8b26726c2423bcdef5025cf0
parent5a7ad1146caa895ad718a534399e38bd2ba721b7 (diff)
downloadlinux-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.c38
-rw-r--r--drivers/media/platform/coda/coda-common.c3
-rw-r--r--drivers/media/platform/coda/coda.h1
-rw-r--r--drivers/media/platform/coda/coda_regs.h2
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