aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Chen <b02280@freescale.com>2011-11-16 17:33:15 +0800
committerEric Miao <eric.miao@linaro.org>2011-12-01 11:36:37 +0800
commit961da8a994b800acb966b8844a800d811bcc8185 (patch)
tree43b988d0f2f7027a23ef274ef3d0de2cf981a49d
parent29ce26c0483eb77afd5a7b9778e085cc186c6d2f (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.c47
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;
}