summaryrefslogtreecommitdiff
path: root/isp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-02-29 22:17:31 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-04-17 00:10:43 +0200
commit580ffb2d8cec4aed9b0acb5a704408d867cf70cd (patch)
tree5718edad7cef69fe57249a4686aa2e480fce7300 /isp
parente21f38fba0a5c61cc155dcf22be5df13140a0098 (diff)
omap3isp: Support capture of multiple snapshots
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'isp')
-rw-r--r--isp/omap3isp.c56
-rw-r--r--isp/omap3isp.h2
2 files changed, 37 insertions, 21 deletions
diff --git a/isp/omap3isp.c b/isp/omap3isp.c
index 9c60f45..bffbe13 100644
--- a/isp/omap3isp.c
+++ b/isp/omap3isp.c
@@ -852,6 +852,22 @@ static int omap3_isp_pipeline_activate(struct omap3_isp_device *isp,
return 0;
}
+static int omap3_isp_pipeline_put_buffer(struct omap3_isp_device *isp,
+ struct omap3_isp_pipeline *pipe,
+ void(*callback)(void*),
+ struct v4l2_video_buffer *buffer)
+{
+ pipe->output->dequeued &= ~(1 << buffer->index);
+
+ if (!pipe->output->running)
+ return 0;
+
+ if (pipe->output->queued == 0)
+ isp->ops->watch_fd(pipe->output->video->fd,
+ OMAP3_ISP_EVENT_READ, callback, isp);
+
+ return omap3_isp_video_queue_buffer(pipe->output, buffer);
+}
/* -----------------------------------------------------------------------------
* Open/close
*/
@@ -1134,17 +1150,9 @@ int omap3_isp_viewfinder_set_scaler(struct omap3_isp_device *isp,
int omap3_isp_viewfinder_put_buffer(struct omap3_isp_device *isp,
struct v4l2_video_buffer *buffer)
{
- isp->viewfinder.output->dequeued &= ~(1 << buffer->index);
-
- if (!isp->viewfinder.output->running)
- return 0;
-
- if (isp->viewfinder.output->queued == 0)
- isp->ops->watch_fd(isp->viewfinder.output->video->fd,
- OMAP3_ISP_EVENT_READ,
- omap3_isp_viewfinder_event, isp);
-
- return omap3_isp_video_queue_buffer(isp->viewfinder.output, buffer);
+ return omap3_isp_pipeline_put_buffer(isp, &isp->viewfinder,
+ omap3_isp_viewfinder_event,
+ buffer);
}
int omap3_isp_viewfinder_start(struct omap3_isp_device *isp)
@@ -1287,6 +1295,7 @@ static void omap3_isp_snapshot_event(void *priv)
struct omap3_isp_device *isp = priv;
struct v4l2_video_buffer buffer;
unsigned int i;
+ bool again;
int ret;
/* Dequeue a buffer, stop the stream and fire the snapshot event. */
@@ -1296,6 +1305,18 @@ static void omap3_isp_snapshot_event(void *priv)
return;
}
+ again = isp->ops->snapshot_ready(isp, &buffer);
+
+ if (again) {
+ isp->snapshot.output->dequeued |= 1 << buffer.index;
+
+ if (isp->snapshot.output->queued == 0)
+ isp->ops->unwatch_fd(isp->snapshot.output->video->fd);
+
+ return;
+ }
+
+ /* We're done, stop the stream and resume the viewfinder. */
isp->ops->unwatch_fd(isp->snapshot.output->video->fd);
ret = omap3_isp_video_stop(isp->snapshot.output);
@@ -1304,9 +1325,6 @@ static void omap3_isp_snapshot_event(void *priv)
return;
}
- isp->ops->snapshot_ready(isp, &buffer);
-
- /* Resume the viewfinder. */
ret = omap3_isp_viewfinder_resume(isp);
if (ret < 0) {
printf("error: unable to resume viewfinder.\n");
@@ -1359,11 +1377,9 @@ int omap3_isp_snapshot_capture(struct omap3_isp_device *isp)
return 0;
}
-int omap3_isp_snapshot_put_buffer(struct omap3_isp_device *isp __attribute__((__unused__)),
- struct v4l2_video_buffer *buffer __attribute__((__unused__)))
+int omap3_isp_snapshot_put_buffer(struct omap3_isp_device *isp,
+ struct v4l2_video_buffer *buffer)
{
- /* No-op, the stream is already stopped so we don't need to requeue the
- * buffer.
- */
- return 0;
+ return omap3_isp_pipeline_put_buffer(isp, &isp->snapshot,
+ omap3_isp_snapshot_event, buffer);
}
diff --git a/isp/omap3isp.h b/isp/omap3isp.h
index d454965..4e0588f 100644
--- a/isp/omap3isp.h
+++ b/isp/omap3isp.h
@@ -47,7 +47,7 @@ struct omap3_isp_operations {
void (*prepare_streamon)(struct omap3_isp_device *isp);
void (*viewfinder_ready)(struct omap3_isp_device *isp,
struct v4l2_video_buffer *buffer);
- void (*snapshot_ready)(struct omap3_isp_device *isp,
+ bool (*snapshot_ready)(struct omap3_isp_device *isp,
struct v4l2_video_buffer *buffer);
void (*watch_fd)(int fd, enum omap3_isp_event_type type,
void(*callback)(void *priv), void *priv);