diff options
author | Jason Chen <b02280@freescale.com> | 2011-11-16 17:33:15 +0800 |
---|---|---|
committer | Eric Miao <eric.miao@linaro.org> | 2011-12-01 11:36:37 +0800 |
commit | 961da8a994b800acb966b8844a800d811bcc8185 (patch) | |
tree | 43b988d0f2f7027a23ef274ef3d0de2cf981a49d | |
parent | 29ce26c0483eb77afd5a7b9778e085cc186c6d2f (diff) |
ENGR00162360 mxc_vout: fix STREAMOFF and G_CROP issues
1. move videobuf_mmap_free to mxc_vout_release.
2. call videobuf_queue_cancel in mxc_vout_release if no streamon called.
3. correct return value of G_CROP for support_window case.
Signed-off-by: Jason Chen <b02280@freescale.com>
-rw-r--r-- | drivers/media/video/mxc/output/mxc_vout.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/drivers/media/video/mxc/output/mxc_vout.c b/drivers/media/video/mxc/output/mxc_vout.c index 1cacbd6e2fa..d7e6fa3e02c 100644 --- a/drivers/media/video/mxc/output/mxc_vout.c +++ b/drivers/media/video/mxc/output/mxc_vout.c @@ -650,8 +650,11 @@ static int mxc_vout_release(struct file *file) if (--vout->open_cnt == 0) { q = &vout->vbq; if (q->streaming) - ret = mxc_vidioc_streamoff(file, vout, vout->type); + mxc_vidioc_streamoff(file, vout, vout->type); + else + videobuf_queue_cancel(q); destroy_workqueue(vout->v4l_wq); + ret = videobuf_mmap_free(q); } return ret; @@ -917,16 +920,23 @@ static int mxc_vidioc_g_crop(struct file *file, void *fh, struct v4l2_crop *crop if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) return -EINVAL; - if (vout->task.output.crop.w && vout->task.output.crop.h) { - crop->c.left = vout->task.output.crop.pos.x; - crop->c.top = vout->task.output.crop.pos.y; - crop->c.width = vout->task.output.crop.w; - crop->c.height = vout->task.output.crop.h; - } else { - crop->c.left = 0; - crop->c.top = 0; + if (vout->disp_support_windows) { + crop->c.left = vout->win_pos.x; + crop->c.top = vout->win_pos.y; crop->c.width = vout->task.output.width; crop->c.height = vout->task.output.height; + } else { + if (vout->task.output.crop.w && vout->task.output.crop.h) { + crop->c.left = vout->task.output.crop.pos.x; + crop->c.top = vout->task.output.crop.pos.y; + crop->c.width = vout->task.output.crop.w; + crop->c.height = vout->task.output.crop.h; + } else { + crop->c.left = 0; + crop->c.top = 0; + crop->c.width = vout->task.output.width; + crop->c.height = vout->task.output.height; + } } return 0; @@ -1349,22 +1359,19 @@ static int mxc_vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type { struct mxc_vout_output *vout = fh; struct videobuf_queue *q = &vout->vbq; - int ret; - - del_timer(&vout->timer); + int ret = 0; - cancel_work_sync(&vout->disp_work); - flush_workqueue(vout->v4l_wq); + if (q->streaming) { + del_timer(&vout->timer); - release_disp_output(vout); + cancel_work_sync(&vout->disp_work); + flush_workqueue(vout->v4l_wq); - ret = videobuf_streamoff(&vout->vbq); - if (ret < 0) - goto err; + release_disp_output(vout); - ret = videobuf_mmap_free(q); + ret = videobuf_streamoff(&vout->vbq); + } -err: return ret; } |