[media] coda: add coda_write_base helper
Add a helper function that writes a vb2_buffer's Y, Cb, and Cr plane base addresses of into three consecutive registers. This moves common code out of coda-bit.c. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Kamil Debski <k.debski@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
6da999d935
commit
856d7d9326
@ -1036,9 +1036,9 @@ static int coda_prepare_encode(struct coda_ctx *ctx)
|
|||||||
struct coda_dev *dev = ctx->dev;
|
struct coda_dev *dev = ctx->dev;
|
||||||
int force_ipicture;
|
int force_ipicture;
|
||||||
int quant_param = 0;
|
int quant_param = 0;
|
||||||
u32 picture_y, picture_cb, picture_cr;
|
|
||||||
u32 pic_stream_buffer_addr, pic_stream_buffer_size;
|
u32 pic_stream_buffer_addr, pic_stream_buffer_size;
|
||||||
u32 dst_fourcc;
|
u32 dst_fourcc;
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
||||||
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
||||||
@ -1129,37 +1129,17 @@ static int coda_prepare_encode(struct coda_ctx *ctx)
|
|||||||
coda_write(dev, quant_param, CODA_CMD_ENC_PIC_QS);
|
coda_write(dev, quant_param, CODA_CMD_ENC_PIC_QS);
|
||||||
|
|
||||||
|
|
||||||
picture_y = vb2_dma_contig_plane_dma_addr(src_buf, 0);
|
|
||||||
switch (q_data_src->fourcc) {
|
|
||||||
case V4L2_PIX_FMT_YVU420:
|
|
||||||
/* Switch Cb and Cr for YVU420 format */
|
|
||||||
picture_cr = picture_y + q_data_src->bytesperline *
|
|
||||||
q_data_src->height;
|
|
||||||
picture_cb = picture_cr + q_data_src->bytesperline / 2 *
|
|
||||||
q_data_src->height / 2;
|
|
||||||
break;
|
|
||||||
case V4L2_PIX_FMT_YUV420:
|
|
||||||
default:
|
|
||||||
picture_cb = picture_y + q_data_src->bytesperline *
|
|
||||||
q_data_src->height;
|
|
||||||
picture_cr = picture_cb + q_data_src->bytesperline / 2 *
|
|
||||||
q_data_src->height / 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->devtype->product == CODA_960) {
|
if (dev->devtype->product == CODA_960) {
|
||||||
coda_write(dev, 4/*FIXME: 0*/, CODA9_CMD_ENC_PIC_SRC_INDEX);
|
coda_write(dev, 4/*FIXME: 0*/, CODA9_CMD_ENC_PIC_SRC_INDEX);
|
||||||
coda_write(dev, q_data_src->width, CODA9_CMD_ENC_PIC_SRC_STRIDE);
|
coda_write(dev, q_data_src->width, CODA9_CMD_ENC_PIC_SRC_STRIDE);
|
||||||
coda_write(dev, 0, CODA9_CMD_ENC_PIC_SUB_FRAME_SYNC);
|
coda_write(dev, 0, CODA9_CMD_ENC_PIC_SUB_FRAME_SYNC);
|
||||||
|
|
||||||
coda_write(dev, picture_y, CODA9_CMD_ENC_PIC_SRC_ADDR_Y);
|
reg = CODA9_CMD_ENC_PIC_SRC_ADDR_Y;
|
||||||
coda_write(dev, picture_cb, CODA9_CMD_ENC_PIC_SRC_ADDR_CB);
|
|
||||||
coda_write(dev, picture_cr, CODA9_CMD_ENC_PIC_SRC_ADDR_CR);
|
|
||||||
} else {
|
} else {
|
||||||
coda_write(dev, picture_y, CODA_CMD_ENC_PIC_SRC_ADDR_Y);
|
reg = CODA_CMD_ENC_PIC_SRC_ADDR_Y;
|
||||||
coda_write(dev, picture_cb, CODA_CMD_ENC_PIC_SRC_ADDR_CB);
|
|
||||||
coda_write(dev, picture_cr, CODA_CMD_ENC_PIC_SRC_ADDR_CR);
|
|
||||||
}
|
}
|
||||||
|
coda_write_base(ctx, q_data_src, src_buf, reg);
|
||||||
|
|
||||||
coda_write(dev, force_ipicture << 1 & 0x2,
|
coda_write(dev, force_ipicture << 1 & 0x2,
|
||||||
CODA_CMD_ENC_PIC_OPTION);
|
CODA_CMD_ENC_PIC_OPTION);
|
||||||
|
|
||||||
@ -1501,20 +1481,11 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
|
|||||||
struct vb2_buffer *dst_buf;
|
struct vb2_buffer *dst_buf;
|
||||||
struct coda_dev *dev = ctx->dev;
|
struct coda_dev *dev = ctx->dev;
|
||||||
struct coda_q_data *q_data_dst;
|
struct coda_q_data *q_data_dst;
|
||||||
u32 stridey, height;
|
u32 reg_addr, reg_stride;
|
||||||
u32 picture_y, picture_cb, picture_cr;
|
|
||||||
|
|
||||||
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
|
||||||
q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||||
|
|
||||||
if (ctx->params.rot_mode & CODA_ROT_90) {
|
|
||||||
stridey = q_data_dst->height;
|
|
||||||
height = q_data_dst->width;
|
|
||||||
} else {
|
|
||||||
stridey = q_data_dst->width;
|
|
||||||
height = q_data_dst->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try to copy source buffer contents into the bitstream ringbuffer */
|
/* Try to copy source buffer contents into the bitstream ringbuffer */
|
||||||
mutex_lock(&ctx->bitstream_mutex);
|
mutex_lock(&ctx->bitstream_mutex);
|
||||||
coda_fill_bitstream(ctx);
|
coda_fill_bitstream(ctx);
|
||||||
@ -1545,17 +1516,6 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
|
|||||||
if (dev->devtype->product == CODA_960)
|
if (dev->devtype->product == CODA_960)
|
||||||
coda_set_gdi_regs(ctx);
|
coda_set_gdi_regs(ctx);
|
||||||
|
|
||||||
/* Set rotator output */
|
|
||||||
picture_y = vb2_dma_contig_plane_dma_addr(dst_buf, 0);
|
|
||||||
if (q_data_dst->fourcc == V4L2_PIX_FMT_YVU420) {
|
|
||||||
/* Switch Cr and Cb for YVU420 format */
|
|
||||||
picture_cr = picture_y + stridey * height;
|
|
||||||
picture_cb = picture_cr + stridey / 2 * height / 2;
|
|
||||||
} else {
|
|
||||||
picture_cb = picture_y + stridey * height;
|
|
||||||
picture_cr = picture_cb + stridey / 2 * height / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->devtype->product == CODA_960) {
|
if (dev->devtype->product == CODA_960) {
|
||||||
/*
|
/*
|
||||||
* The CODA960 seems to have an internal list of buffers with
|
* The CODA960 seems to have an internal list of buffers with
|
||||||
@ -1565,16 +1525,16 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
|
|||||||
*/
|
*/
|
||||||
coda_write(dev, CODA_MAX_FRAMEBUFFERS + dst_buf->v4l2_buf.index,
|
coda_write(dev, CODA_MAX_FRAMEBUFFERS + dst_buf->v4l2_buf.index,
|
||||||
CODA9_CMD_DEC_PIC_ROT_INDEX);
|
CODA9_CMD_DEC_PIC_ROT_INDEX);
|
||||||
coda_write(dev, picture_y, CODA9_CMD_DEC_PIC_ROT_ADDR_Y);
|
|
||||||
coda_write(dev, picture_cb, CODA9_CMD_DEC_PIC_ROT_ADDR_CB);
|
reg_addr = CODA9_CMD_DEC_PIC_ROT_ADDR_Y;
|
||||||
coda_write(dev, picture_cr, CODA9_CMD_DEC_PIC_ROT_ADDR_CR);
|
reg_stride = CODA9_CMD_DEC_PIC_ROT_STRIDE;
|
||||||
coda_write(dev, stridey, CODA9_CMD_DEC_PIC_ROT_STRIDE);
|
|
||||||
} else {
|
} else {
|
||||||
coda_write(dev, picture_y, CODA_CMD_DEC_PIC_ROT_ADDR_Y);
|
reg_addr = CODA_CMD_DEC_PIC_ROT_ADDR_Y;
|
||||||
coda_write(dev, picture_cb, CODA_CMD_DEC_PIC_ROT_ADDR_CB);
|
reg_stride = CODA_CMD_DEC_PIC_ROT_STRIDE;
|
||||||
coda_write(dev, picture_cr, CODA_CMD_DEC_PIC_ROT_ADDR_CR);
|
|
||||||
coda_write(dev, stridey, CODA_CMD_DEC_PIC_ROT_STRIDE);
|
|
||||||
}
|
}
|
||||||
|
coda_write_base(ctx, q_data_dst, dst_buf, reg_addr);
|
||||||
|
coda_write(dev, q_data_dst->bytesperline, reg_stride);
|
||||||
|
|
||||||
coda_write(dev, CODA_ROT_MIR_ENABLE | ctx->params.rot_mode,
|
coda_write(dev, CODA_ROT_MIR_ENABLE | ctx->params.rot_mode,
|
||||||
CODA_CMD_DEC_PIC_ROT_MODE);
|
CODA_CMD_DEC_PIC_ROT_MODE);
|
||||||
|
|
||||||
|
@ -82,6 +82,30 @@ unsigned int coda_read(struct coda_dev *dev, u32 reg)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
|
||||||
|
struct vb2_buffer *buf, unsigned int reg_y)
|
||||||
|
{
|
||||||
|
u32 base_y = vb2_dma_contig_plane_dma_addr(buf, 0);
|
||||||
|
u32 base_cb, base_cr;
|
||||||
|
|
||||||
|
switch (q_data->fourcc) {
|
||||||
|
case V4L2_PIX_FMT_YVU420:
|
||||||
|
/* Switch Cb and Cr for YVU420 format */
|
||||||
|
base_cr = base_y + q_data->bytesperline * q_data->height;
|
||||||
|
base_cb = base_cr + q_data->bytesperline * q_data->height / 4;
|
||||||
|
break;
|
||||||
|
case V4L2_PIX_FMT_YUV420:
|
||||||
|
default:
|
||||||
|
base_cb = base_y + q_data->bytesperline * q_data->height;
|
||||||
|
base_cr = base_cb + q_data->bytesperline * q_data->height / 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
coda_write(ctx->dev, base_y, reg_y);
|
||||||
|
coda_write(ctx->dev, base_cb, reg_y + 4);
|
||||||
|
coda_write(ctx->dev, base_cr, reg_y + 8);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Array of all formats supported by any version of Coda:
|
* Array of all formats supported by any version of Coda:
|
||||||
*/
|
*/
|
||||||
|
@ -232,6 +232,8 @@ extern int coda_debug;
|
|||||||
|
|
||||||
void coda_write(struct coda_dev *dev, u32 data, u32 reg);
|
void coda_write(struct coda_dev *dev, u32 data, u32 reg);
|
||||||
unsigned int coda_read(struct coda_dev *dev, u32 reg);
|
unsigned int coda_read(struct coda_dev *dev, u32 reg);
|
||||||
|
void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
|
||||||
|
struct vb2_buffer *buf, unsigned int reg_y);
|
||||||
|
|
||||||
int coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf,
|
int coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf,
|
||||||
size_t size, const char *name, struct dentry *parent);
|
size_t size, const char *name, struct dentry *parent);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user