camerabin: Fix corner case for preview posting

Fix corner case where video preview image is not posted if stopping
video capture immediately after capture start.
This commit is contained in:
Lasse Laukkanen 2011-04-11 14:44:17 -03:00 committed by Thiago Santos
parent b84dd0a766
commit ada43fe3bd

View File

@ -1895,8 +1895,7 @@ gst_camerabin_have_vid_buffer (GstPad * pad, GstBuffer * buffer,
GST_LOG ("got video buffer %p with size %d", GST_LOG ("got video buffer %p with size %d",
buffer, GST_BUFFER_SIZE (buffer)); buffer, GST_BUFFER_SIZE (buffer));
if (camera->video_preview_caps && if (!camera->video_preview_buffer && camera->video_preview_caps) {
!camera->video_preview_buffer && !camera->stop_requested) {
GST_DEBUG ("storing video preview %p", buffer); GST_DEBUG ("storing video preview %p", buffer);
camera->video_preview_buffer = gst_buffer_copy (buffer); camera->video_preview_buffer = gst_buffer_copy (buffer);
} }
@ -2075,6 +2074,10 @@ gst_camerabin_reset_to_view_finder (GstCameraBin * camera)
camera->stop_requested = FALSE; camera->stop_requested = FALSE;
camera->paused = FALSE; camera->paused = FALSE;
camera->eos_handled = FALSE; camera->eos_handled = FALSE;
if (camera->video_preview_buffer) {
gst_buffer_unref (camera->video_preview_buffer);
camera->video_preview_buffer = NULL;
}
/* Enable view finder mode in v4l2camsrc */ /* Enable view finder mode in v4l2camsrc */
if (camera->src_vid_src && if (camera->src_vid_src &&
@ -2097,15 +2100,17 @@ gst_camerabin_reset_to_view_finder (GstCameraBin * camera)
static void static void
gst_camerabin_do_stop (GstCameraBin * camera) gst_camerabin_do_stop (GstCameraBin * camera)
{ {
gboolean video_preview_sent = FALSE;
g_mutex_lock (camera->capture_mutex); g_mutex_lock (camera->capture_mutex);
if (camera->capturing) { if (camera->capturing) {
GST_DEBUG_OBJECT (camera, "mark stop"); GST_DEBUG_OBJECT (camera, "mark stop");
camera->stop_requested = TRUE; camera->stop_requested = TRUE;
if (camera->video_preview_caps && camera->video_preview_buffer) { /* Post preview image ASAP and don't wait that video recording
finishes as it may take time. */
if (camera->video_preview_buffer) {
gst_camerabin_send_preview (camera, camera->video_preview_buffer); gst_camerabin_send_preview (camera, camera->video_preview_buffer);
gst_buffer_unref (camera->video_preview_buffer); video_preview_sent = TRUE;
camera->video_preview_buffer = NULL;
} }
/* Take special care when stopping paused video capture */ /* Take special care when stopping paused video capture */
@ -2121,6 +2126,15 @@ gst_camerabin_do_stop (GstCameraBin * camera)
GST_DEBUG_OBJECT (camera, "waiting for capturing to finish"); GST_DEBUG_OBJECT (camera, "waiting for capturing to finish");
g_cond_wait (camera->cond, camera->capture_mutex); g_cond_wait (camera->cond, camera->capture_mutex);
GST_DEBUG_OBJECT (camera, "capturing finished"); GST_DEBUG_OBJECT (camera, "capturing finished");
if (camera->video_preview_buffer) {
/* Double check that preview image has been sent. This is useful
in a corner case where capture-stop is issued immediately after
start before a single video buffer is actually recorded */
if (video_preview_sent == FALSE) {
gst_camerabin_send_preview (camera, camera->video_preview_buffer);
}
}
} }
g_mutex_unlock (camera->capture_mutex); g_mutex_unlock (camera->capture_mutex);
} }