MLK-19514-1: ISI: correct capture and output meaning

According to V4L2 doc, cap_q_ctx is for "output to memory"
queue and out_q_ctx is for "input from memory", so capature
should represent for output of ISI and output should represent
for ISI's input. But I reversed their relationship, so correct
it.

Signed-off-by: Guoniu.Zhou <guoniu.zhou@nxp.com>
This commit is contained in:
Guoniu.Zhou
2018-09-03 15:20:10 +08:00
committed by Jason Liu
parent 00104883b1
commit 02228658df

View File

@ -177,10 +177,10 @@ static int m2m_vb2_queue_setup(struct vb2_queue *q,
return -EINVAL;
}
if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
frame = &mxc_isi->m2m.src_f;
else
if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
frame = &mxc_isi->m2m.dst_f;
else
frame = &mxc_isi->m2m.src_f;
fmt = frame->fmt;
if (fmt == NULL)
@ -214,10 +214,10 @@ static int m2m_vb2_buffer_prepare(struct vb2_buffer *vb2)
struct mxc_isi_frame *frame;
int i;
if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
frame = &mxc_isi->m2m.src_f;
else
if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
frame = &mxc_isi->m2m.dst_f;
else
frame = &mxc_isi->m2m.src_f;
if (frame == NULL)
return -EINVAL;
@ -289,7 +289,7 @@ static int mxc_m2m_queue_init(void *priv, struct vb2_queue *src_vq,
struct mxc_isi_dev *mxc_isi = mxc_ctx->isi_dev;
int ret;
src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
src_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
src_vq->drv_priv = mxc_ctx;
src_vq->buf_struct_size = sizeof(struct mxc_isi_buffer);
@ -303,7 +303,7 @@ static int mxc_m2m_queue_init(void *priv, struct vb2_queue *src_vq,
if (ret)
return ret;
dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
dst_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
dst_vq->drv_priv = mxc_ctx;
dst_vq->buf_struct_size = sizeof(struct mxc_isi_buffer);
@ -406,7 +406,7 @@ static int mxc_isi_m2m_querycap(struct file *file, void *priv,
dev_name(&mxc_isi->pdev->dev), mxc_isi->id);
cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE |
V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT_MPLANE;
V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_VIDEO_OUTPUT;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0;
@ -418,27 +418,6 @@ static int mxc_isi_m2m_enum_fmt_vid_out(struct file *file, void *priv,
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct mxc_isi_fmt *fmt;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->index >= (int)ARRAY_SIZE(mxc_isi_out_formats))
return -EINVAL;
fmt = &mxc_isi_out_formats[f->index];
if (!fmt)
return -EINVAL;
strncpy(f->description, fmt->name, sizeof(f->description) - 1);
f->pixelformat = fmt->fourcc;
return 0;
}
static int mxc_isi_m2m_enum_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct mxc_isi_fmt *fmt;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->index >= (int)ARRAY_SIZE(mxc_isi_input_formats))
return -EINVAL;
@ -454,49 +433,47 @@ static int mxc_isi_m2m_enum_fmt_vid_cap(struct file *file, void *priv,
return 0;
}
static int m2m_get_formats(struct mxc_isi_fmt *fmt, enum v4l2_buf_type type)
static int mxc_isi_m2m_enum_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
int ret = 0;
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct mxc_isi_fmt *fmt;
switch (type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
fmt = &mxc_isi_input_formats[0];
break;
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
fmt = &mxc_isi_out_formats[0];
break;
default:
pr_err("Invalid buf type\n");
ret = -EINVAL;
}
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->index >= (int)ARRAY_SIZE(mxc_isi_out_formats))
return -EINVAL;
return ret;
fmt = &mxc_isi_out_formats[f->index];
if (!fmt)
return -EINVAL;
strncpy(f->description, fmt->name, sizeof(f->description) - 1);
f->pixelformat = fmt->fourcc;
return 0;
}
static int mxc_isi_m2m_try_fmt(struct file *file, struct v4l2_format *f)
static int mxc_isi_m2m_try_fmt_vid_out(struct file *file, void *fh,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
struct mxc_isi_fmt *fmt, *formats = NULL;
int array_size_fmt;
int i, ret;
struct mxc_isi_fmt *fmt = NULL;
int i;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
ret = m2m_get_formats(formats, f->type);
if (ret < 0)
return ret;
if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
return -EINVAL;
if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
array_size_fmt = ARRAY_SIZE(mxc_isi_input_formats);
else
array_size_fmt = ARRAY_SIZE(mxc_isi_out_formats);
for (i = 0; i < array_size_fmt; i++) {
fmt = &formats[i];
for (i = 0; i < ARRAY_SIZE(mxc_isi_input_formats); i++) {
fmt = &mxc_isi_input_formats[i];
if (fmt->fourcc == pix->pixelformat)
break;
}
if (i >= array_size_fmt) {
if (i >= ARRAY_SIZE(mxc_isi_input_formats)) {
v4l2_err(mxc_isi->v4l2_dev, "%s, format is not support!\n", __func__);
return -EINVAL;
}
@ -510,34 +487,97 @@ static int mxc_isi_m2m_try_fmt(struct file *file, struct v4l2_format *f)
return 0;
}
static int mxc_isi_m2m_try_fmt_vid_out(struct file *file, void *fh,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
int ret;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
ret = mxc_isi_m2m_try_fmt(file, f);
return ret;
}
static int mxc_isi_m2m_try_fmt_vid_cap(struct file *file, void *fh,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
int ret;
struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
struct mxc_isi_fmt *fmt = NULL;
int i;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
ret = mxc_isi_m2m_try_fmt(file, f);
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
return -EINVAL;
return ret;
for (i = 0; i < ARRAY_SIZE(mxc_isi_out_formats); i++) {
fmt = &mxc_isi_out_formats[i];
if (fmt->fourcc == pix->pixelformat)
break;
}
if (i >= ARRAY_SIZE(mxc_isi_out_formats)) {
v4l2_err(mxc_isi->v4l2_dev, "%s, format is not support!\n", __func__);
return -EINVAL;
}
if (pix->width <= 0 || pix->height <= 0) {
v4l2_err(mxc_isi->v4l2_dev, "%s, width %d, height %d is not valid\n"
, __func__, pix->width, pix->height);
return -EINVAL;
}
return 0;
}
static int mxc_isi_m2m_s_fmt_vid_out(struct file *file, void *priv,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_fh *fh = file->private_data;
struct mxc_isi_frame *frame = &mxc_isi->m2m.src_f;
struct v4l2_pix_format *pix = &f->fmt.pix;
struct mxc_isi_fmt *fmt;
struct vb2_queue *vq;
int i;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
return -EINVAL;
vq = v4l2_m2m_get_vq(fh->m2m_ctx, f->type);
if (!vq)
return -EINVAL;
if (vb2_is_busy(vq)) {
dev_err(&mxc_isi->pdev->dev, "queue busy\n");
return -EBUSY;
}
for (i = 0; i < ARRAY_SIZE(mxc_isi_input_formats); i++) {
fmt = &mxc_isi_input_formats[i];
if (pix && fmt->fourcc == pix->pixelformat)
break;
}
if (i >= ARRAY_SIZE(mxc_isi_input_formats)) {
dev_dbg(&mxc_isi->pdev->dev, "%s, format is not support!\n", __func__);
return -EINVAL;
}
/* update out put frame size and formate */
if (pix->height <= 0 || pix->width <= 0)
return -EINVAL;
frame->fmt = fmt;
frame->height = pix->height;
frame->width = pix->width;
pix->bytesperline = pix->width * fmt->depth[0] >> 3;
pix->sizeimage = pix->height * pix->bytesperline;
frame->bytesperline[0] = pix->bytesperline;
frame->sizeimage[0] = pix->sizeimage;
set_frame_bounds(frame, pix->width, pix->height);
mxc_isi_m2m_config_src(mxc_isi);
return 0;
}
static int mxc_isi_m2m_s_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_fh *fh = file->private_data;
@ -549,7 +589,7 @@ static int mxc_isi_m2m_s_fmt_vid_out(struct file *file, void *priv,
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
return -EINVAL;
vq = v4l2_m2m_get_vq(fh->m2m_ctx, f->type);
@ -611,92 +651,12 @@ static int mxc_isi_m2m_s_fmt_vid_out(struct file *file, void *priv,
set_frame_bounds(frame, pix->width, pix->height);
mxc_isi_m2m_config_dst(mxc_isi);
return 0;
}
static int mxc_isi_m2m_s_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_fh *fh = file->private_data;
struct mxc_isi_frame *frame = &mxc_isi->m2m.src_f;
struct v4l2_pix_format *pix = &f->fmt.pix;
struct mxc_isi_fmt *fmt;
struct vb2_queue *vq;
int i;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
vq = v4l2_m2m_get_vq(fh->m2m_ctx, f->type);
if (!vq)
return -EINVAL;
if (vb2_is_busy(vq)) {
dev_err(&mxc_isi->pdev->dev, "queue busy\n");
return -EBUSY;
}
for (i = 0; i < ARRAY_SIZE(mxc_isi_input_formats); i++) {
fmt = &mxc_isi_input_formats[i];
if (pix && fmt->fourcc == pix->pixelformat)
break;
}
if (i >= ARRAY_SIZE(mxc_isi_input_formats)) {
dev_dbg(&mxc_isi->pdev->dev, "%s, format is not support!\n", __func__);
return -EINVAL;
}
/* update out put frame size and formate */
if (pix->height <= 0 || pix->width <= 0)
return -EINVAL;
frame->fmt = fmt;
frame->height = pix->height;
frame->width = pix->width;
pix->bytesperline = pix->width * fmt->depth[0] >> 3;
pix->sizeimage = pix->height * pix->bytesperline;
frame->bytesperline[0] = pix->bytesperline;
frame->sizeimage[0] = pix->sizeimage;
set_frame_bounds(frame, pix->width, pix->height);
mxc_isi_m2m_config_src(mxc_isi);
pr_info("w/h=(%d,%d), bytesperline=0x%x sizeimage=0x%x\n",
pix->width, pix->height, pix->bytesperline, pix->sizeimage);
return 0;
}
static int mxc_isi_m2m_g_fmt_vid_cap(struct file *file, void *fh,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_pix_format *pix = &f->fmt.pix;
struct mxc_isi_frame *frame = &mxc_isi->m2m.src_f;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
pix->width = frame->o_width;
pix->height = frame->o_height;
pix->field = V4L2_FIELD_NONE;
pix->pixelformat = frame->fmt->fourcc;
pix->colorspace = V4L2_COLORSPACE_JPEG;
pix->bytesperline = frame->bytesperline[0];
pix->sizeimage = frame->sizeimage[0];
return 0;
}
static int mxc_isi_m2m_g_fmt_vid_out(struct file *file, void *fh,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
@ -705,7 +665,7 @@ static int mxc_isi_m2m_g_fmt_vid_out(struct file *file, void *fh,
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
return -EINVAL;
pix->width = frame->o_width;
@ -723,6 +683,29 @@ static int mxc_isi_m2m_g_fmt_vid_out(struct file *file, void *fh,
return 0;
}
static int mxc_isi_m2m_g_fmt_vid_out(struct file *file, void *fh,
struct v4l2_format *f)
{
struct mxc_isi_dev *mxc_isi = video_drvdata(file);
struct v4l2_pix_format *pix = &f->fmt.pix;
struct mxc_isi_frame *frame = &mxc_isi->m2m.src_f;
dev_dbg(&mxc_isi->pdev->dev, "%s\n", __func__);
if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
return -EINVAL;
pix->width = frame->o_width;
pix->height = frame->o_height;
pix->field = V4L2_FIELD_NONE;
pix->pixelformat = frame->fmt->fourcc;
pix->colorspace = V4L2_COLORSPACE_JPEG;
pix->bytesperline = frame->bytesperline[0];
pix->sizeimage = frame->sizeimage[0];
return 0;
}
static int mxc_isi_m2m_streamon(struct file *file, void *priv,
enum v4l2_buf_type type)
{
@ -754,17 +737,17 @@ static int mxc_isi_m2m_streamoff(struct file *file, void *priv,
static const struct v4l2_ioctl_ops mxc_isi_m2m_ioctl_ops = {
.vidioc_querycap = mxc_isi_m2m_querycap,
.vidioc_enum_fmt_vid_cap = mxc_isi_m2m_enum_fmt_vid_cap,
.vidioc_enum_fmt_vid_out_mplane = mxc_isi_m2m_enum_fmt_vid_out,
.vidioc_enum_fmt_vid_cap_mplane = mxc_isi_m2m_enum_fmt_vid_cap,
.vidioc_enum_fmt_vid_out = mxc_isi_m2m_enum_fmt_vid_out,
.vidioc_try_fmt_vid_cap = mxc_isi_m2m_try_fmt_vid_cap,
.vidioc_try_fmt_vid_out_mplane = mxc_isi_m2m_try_fmt_vid_out,
.vidioc_try_fmt_vid_cap_mplane = mxc_isi_m2m_try_fmt_vid_cap,
.vidioc_try_fmt_vid_out = mxc_isi_m2m_try_fmt_vid_out,
.vidioc_s_fmt_vid_cap = mxc_isi_m2m_s_fmt_vid_cap,
.vidioc_s_fmt_vid_out_mplane = mxc_isi_m2m_s_fmt_vid_out,
.vidioc_s_fmt_vid_cap_mplane = mxc_isi_m2m_s_fmt_vid_cap,
.vidioc_s_fmt_vid_out = mxc_isi_m2m_s_fmt_vid_out,
.vidioc_g_fmt_vid_cap = mxc_isi_m2m_g_fmt_vid_cap,
.vidioc_g_fmt_vid_out_mplane = mxc_isi_m2m_g_fmt_vid_out,
.vidioc_g_fmt_vid_cap_mplane = mxc_isi_m2m_g_fmt_vid_cap,
.vidioc_g_fmt_vid_out = mxc_isi_m2m_g_fmt_vid_out,
.vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
.vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
@ -784,7 +767,6 @@ int mxc_isi_register_m2m_device(struct mxc_isi_dev *mxc_isi,
struct device *dev = &mxc_isi->pdev->dev;
struct video_device *vdev = &mxc_isi->m2m.vdev;
struct mxc_isi_m2m_dev *isi_m2m = &mxc_isi->m2m;
/*struct v4l2_fh *fh = &isi_m2m->fh;*/
int ret = -ENOMEM;
/* Only ISI channel0 support memory to memory */
@ -874,8 +856,8 @@ void mxc_isi_m2m_frame_write_done(struct mxc_isi_dev *mxc_isi)
src_buf = vb2_to_isi_buffer(src_vb2);
dst_buf = vb2_to_isi_buffer(dst_vb2);
mxc_isi_channel_set_m2m_src_addr(mxc_isi, dst_buf);
mxc_isi_channel_set_m2m_out_addr(mxc_isi, src_buf);
mxc_isi_channel_set_m2m_src_addr(mxc_isi, src_buf);
mxc_isi_channel_set_m2m_out_addr(mxc_isi, dst_buf);
v4l2_m2m_src_buf_remove(fh->m2m_ctx);
v4l2_m2m_dst_buf_remove(fh->m2m_ctx);