diff options
-rw-r--r-- | drivers/media/video/tegra_v4l2_camera.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/media/video/tegra_v4l2_camera.c b/drivers/media/video/tegra_v4l2_camera.c index e5cbb3a582dc..f4e33817241a 100644 --- a/drivers/media/video/tegra_v4l2_camera.c +++ b/drivers/media/video/tegra_v4l2_camera.c @@ -1178,6 +1178,13 @@ static int tegra_camera_capture_frame(struct tegra_camera_dev *pcdev) if (pcdev->active) tegra_camera_capture_setup(pcdev); } + + /* drop the first interlaced frame */ + if (IS_INTERLACED && (pcdev->num_frames == 0)) { + pcdev->num_frames++; + return err; + } + spin_lock_irq(&pcdev->videobuf_queue_lock); do_gettimeofday(&vb->v4l2_buf.timestamp); vb->v4l2_buf.field = pcdev->field; @@ -1186,11 +1193,8 @@ static int tegra_camera_capture_frame(struct tegra_camera_dev *pcdev) else if (port == TEGRA_CAMERA_PORT_CSI_B) vb->v4l2_buf.sequence = pcdev->sequence_b++; - if (IS_INTERLACED && pcdev->num_frames == 0) - /* if we're dealing with interlaced frames, tell V4L to remove the frame from the queue */ - vb2_buffer_done(vb, VB2_BUF_STATE_DEQUEUED); - else - vb2_buffer_done(vb, (err != 0) ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); + vb2_buffer_done(vb, (err != 0) ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); + list_del_init(&buf->queue); pcdev->num_frames++; |