tizencamerasrc: Update error handling while previewing 38/292638/1
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 19 Apr 2023 04:55:16 +0000 (13:55 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Wed, 10 May 2023 10:24:05 +0000 (19:24 +0900)
[Version] 1.20.0-17
[Issue Type] Error handling

Change-Id: I2cad0a4bebdd58652e21507ba83d56c60a9a800b
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/gst-plugins-tizen.spec
tizencamerasrc/src/gsttizencamerasrc.c

index 60095fa..00edf5c 100644 (file)
@@ -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+
index a911742..6ed4f10 100644 (file)
@@ -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);