From ea535f1f9d65680495c790e44c9c732dc34ccad2 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Wed, 19 Apr 2023 13:55:16 +0900 Subject: [PATCH] tizencamerasrc: Update error handling while previewing [Version] 1.20.0-17 [Issue Type] Error handling Change-Id: I2cad0a4bebdd58652e21507ba83d56c60a9a800b Signed-off-by: Jeongmo Yang --- packaging/gst-plugins-tizen.spec | 2 +- tizencamerasrc/src/gsttizencamerasrc.c | 32 ++++++++++++++++++-------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packaging/gst-plugins-tizen.spec b/packaging/gst-plugins-tizen.spec index 60095fa..00edf5c 100644 --- a/packaging/gst-plugins-tizen.spec +++ b/packaging/gst-plugins-tizen.spec @@ -5,7 +5,7 @@ Name: gst-plugins-tizen Version: 1.20.0 Summary: GStreamer tizen plugins (common) -Release: 16 +Release: 17 Group: Multimedia/Framework Url: http://gstreamer.freedesktop.org/ License: LGPL-2.1+ diff --git a/tizencamerasrc/src/gsttizencamerasrc.c b/tizencamerasrc/src/gsttizencamerasrc.c index a911742..6ed4f10 100644 --- a/tizencamerasrc/src/gsttizencamerasrc.c +++ b/tizencamerasrc/src/gsttizencamerasrc.c @@ -1569,47 +1569,51 @@ static gboolean gst_tizencamerasrc_capture_stop(GstTizenCameraSrc *camerasrc) static GstFlowReturn gst_tizencamerasrc_read_preview(GstTizenCameraSrc *camerasrc, GstBuffer **buffer) { int preview_check_count = 0; + gint64 end_time; + BufferControl *control = &camerasrc->preview_control; GST_DEBUG_OBJECT(camerasrc, "check preview buffer list"); - g_mutex_lock(&camerasrc->preview_control.lock); + g_mutex_lock(&control->lock); - while (g_queue_is_empty(camerasrc->preview_buffer_list) && - camerasrc->hal_error_code == CAMERA_ERROR_NONE) { + while (g_queue_is_empty(camerasrc->preview_buffer_list)) { GST_DEBUG_OBJECT(camerasrc, "buffer list is empty. waiting..."); - if (g_cond_wait_until(&camerasrc->preview_control.cond, - &camerasrc->preview_control.lock, - g_get_monotonic_time () + _BUFFER_WAIT_TIMEOUT)) { + end_time = g_get_monotonic_time () + _BUFFER_WAIT_TIMEOUT; + if (g_cond_wait_until(&control->cond, &control->lock, end_time)) { GST_DEBUG_OBJECT(camerasrc, "Signal received. Retry..."); continue; } + if (camerasrc->hal_error_code != CAMERA_ERROR_NONE) { + GST_WARNING_OBJECT(camerasrc, "buffer timeout and error[0x%x]", camerasrc->hal_error_code); + break; + } + if (camerasrc->is_flushing) { - g_mutex_unlock(&camerasrc->preview_control.lock); - GST_WARNING_OBJECT(camerasrc, "preview timeout, but FLUSHING now"); + g_mutex_unlock(&control->lock); + GST_WARNING_OBJECT(camerasrc, "FLUSHING now"); goto _FLUSHING; } if (camerasrc->mode == VIDEO_IN_MODE_CAPTURE) - GST_WARNING_OBJECT(camerasrc, "preview frame timeout, but capture mode now."); + GST_WARNING_OBJECT(camerasrc, "capture mode now."); else preview_check_count++; if (camerasrc->empty_buffer_timeout > 0 && preview_check_count * _BUFFER_WAIT_TIMEOUT >= camerasrc->empty_buffer_timeout * 1000) { - GST_ERROR_OBJECT(camerasrc, "wait frame failed for %dms", camerasrc->empty_buffer_timeout); + GST_ERROR_OBJECT(camerasrc, "wait buffer failed for [%d]ms", camerasrc->empty_buffer_timeout); break; } - GST_WARNING_OBJECT(camerasrc, "Buffer timeout[%d usec, retry %d]", + GST_WARNING_OBJECT(camerasrc, "preview buffer timeout[%d]usec, retry[%d]", _BUFFER_WAIT_TIMEOUT, preview_check_count); } - if (camerasrc->hal_error_code == CAMERA_ERROR_NONE) - *buffer = g_queue_pop_head(camerasrc->preview_buffer_list); + *buffer = g_queue_pop_head(camerasrc->preview_buffer_list); - g_mutex_unlock(&camerasrc->preview_control.lock); + g_mutex_unlock(&control->lock); if (*buffer == NULL) { GST_ERROR_OBJECT(camerasrc, "buffer is NULL (HAL error 0x%x)", camerasrc->hal_error_code); -- 2.7.4