diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2011-07-26 11:25:05 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-08-05 15:36:51 +0200 |
commit | 32936d759c49ba5abfb3f1937fc7a02e4ab36804 (patch) | |
tree | 7e65cb99456389984411f35e68060e389582bdf9 | |
parent | 53dfaefd26ef2e89f6f6293b406d1ba9d99f95ab (diff) | |
download | gst-plugins-fsl-vpu-32936d759c49ba5abfb3f1937fc7a02e4ab36804.tar.gz gst-plugins-fsl-vpu-32936d759c49ba5abfb3f1937fc7a02e4ab36804.tar.xz |
kernel module: Fix mpeg4 formats (wip)
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | module/imx-vpu.c | 26 | ||||
-rw-r--r-- | module/imx-vpu.h | 1 |
2 files changed, 23 insertions, 4 deletions
diff --git a/module/imx-vpu.c b/module/imx-vpu.c index 6fb5a43..7cb5f28 100644 --- a/module/imx-vpu.c +++ b/module/imx-vpu.c @@ -240,7 +240,7 @@ struct memalloc_record { void __iomem *cpu_addr; }; -#define VPU_MAX_FB 3 +#define VPU_MAX_FB 10 struct vpu_instance { struct vpu *vpu; @@ -523,7 +523,7 @@ static int vpu_alloc_fb_v2(struct vpu_instance *instance) size += mvsize; - for (i = 0; i < instance->num_fb; i++) { + for (i = 0; i < instance->num_fb + 1; i++) { struct memalloc_record *rec = &instance->rec[i]; rec->cpu_addr = dma_alloc_coherent(NULL, size, &rec->dma_addr, @@ -552,6 +552,9 @@ static int vpu_alloc_fb_v2(struct vpu_instance *instance) if (instance->standard == STD_AVC) para_buf[96 + i] = para_buf[i * 3 + 4] + (instance->width / 2) * (instance->height / 2); } + if (instance->standard == STD_MPEG4) { + para_buf[97] = instance->rec[instance->num_fb].dma_addr; + } out: if (ret) dev_dbg(vpu->dev, "%s failed with %d\n", __func__, ret); @@ -795,6 +798,14 @@ out: return ret; } +enum +{ + MP4_MPEG4 = 0, + MP4_DIVX5_HIGHER = 1, + MP4_XVID = 2, + MP4_DIVX4 = 5, +}; + static int noinline vpu_dec_get_initial_info(struct vpu_instance *instance) { struct vpu *vpu = instance->vpu; @@ -827,8 +838,15 @@ static int noinline vpu_dec_get_initial_info(struct vpu_instance *instance) vpu_write(vpu, CMD_DEC_SEQ_START_BYTE, instance->bitstream_buf_phys); vpu_write(vpu, CMD_DEC_SEQ_BB_SIZE, regs->bitstream_buf_size / 1024); vpu_write(vpu, CMD_DEC_SEQ_OPTION, 0); - vpu_write(vpu, CMD_DEC_SEQ_PS_BB_START, instance->ps_mem_buf_phys); - vpu_write(vpu, CMD_DEC_SEQ_PS_BB_SIZE, (PS_SAVE_SIZE / 1024)); + if (instance->format == VPU_CODEC_AVC_DEC) { + vpu_write(vpu, CMD_DEC_SEQ_PS_BB_START, instance->ps_mem_buf_phys); + vpu_write(vpu, CMD_DEC_SEQ_PS_BB_SIZE, (PS_SAVE_SIZE / 1024)); + } + if (instance->format == VPU_CODEC_MP4_DEC) { + vpu_write(vpu, CMD_DEC_SEQ_MP4_ASP_CLASS, MP4_MPEG4); + } + + vpu_write(vpu, V2_BIT_RUN_AUX_STD, 0); vpu_write(vpu, BIT_BUSY_FLAG, 0x1); vpu_bit_issue_command(instance, SEQ_INIT); diff --git a/module/imx-vpu.h b/module/imx-vpu.h index b51d1a4..d2de056 100644 --- a/module/imx-vpu.h +++ b/module/imx-vpu.h @@ -86,6 +86,7 @@ #define CMD_DEC_SEQ_START_BYTE 0x190 #define CMD_DEC_SEQ_PS_BB_START 0x194 #define CMD_DEC_SEQ_PS_BB_SIZE 0x198 +#define CMD_DEC_SEQ_MP4_ASP_CLASS 0x19C #define CMD_DEC_SEQ_INIT_ESCAPE 0x114 |