modify to post error when error is occured after eos tizen_2.1 2.2_release accepted/tizen_2.1/20130520.093045 submit/tizen_2.1/20130516.042111 submit/tizen_2.2/20130714.145556
authorSunghyun Eum <sunghyun.eum@samsung.com>
Tue, 7 May 2013 11:44:18 +0000 (20:44 +0900)
committerSunghyun Eum <sunghyun.eum@samsung.com>
Wed, 8 May 2013 01:53:24 +0000 (10:53 +0900)
Change-Id: I5e80526653cf5f5e11616cb4e0a06db1577a0805

omx/gstomx_base_filter.c
omx/gstomx_util.c
omx/gstomx_util.h
packaging/gst-openmax.spec

index f4b72c4..e42e5c4 100644 (file)
@@ -217,8 +217,14 @@ out_flushing:
     }
 
     if (error_msg) {
-      GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL), ("%s", error_msg));
-      ret = GST_FLOW_ERROR;
+      if (gomx->post_gst_element_error == FALSE) {
+        GST_ERROR_OBJECT (self, "post GST_ELEMENT_ERROR as %s", error_msg);
+        GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL), ("%s", error_msg));
+        gomx->post_gst_element_error = TRUE;
+        ret = GST_FLOW_ERROR;
+      } else {
+        GST_ERROR_OBJECT (self, "GST_ELEMENT_ERROR is already posted. skip this (%s)", error_msg);
+      }
     }
 
     if (buf)
@@ -246,6 +252,9 @@ change_state (GstElement * element, GstStateChange transition)
   switch (transition) {
     case GST_STATE_CHANGE_NULL_TO_READY:
       GST_INFO_OBJECT (self, "GST_STATE_CHANGE_NULL_TO_READY");
+      core->omx_unrecover_err_cnt = 0;
+      core->post_gst_element_error = FALSE;
+
       if (core->omx_state != OMX_StateLoaded) {
         ret = GST_STATE_CHANGE_FAILURE;
         goto leave;
@@ -327,6 +336,8 @@ change_state (GstElement * element, GstStateChange transition)
         g_object_unref(self->adapter);
         self->adapter = NULL;
       }
+      core->omx_unrecover_err_cnt = 0;
+      core->post_gst_element_error = FALSE;
       break;
 
     default:
@@ -970,8 +981,14 @@ out_flushing:
     }
 
     if (error_msg) {
-      GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL), ("%s", error_msg));
-      ret = GST_FLOW_ERROR;
+      if (gomx->post_gst_element_error == FALSE) {
+        GST_ERROR_OBJECT (self, "post GST_ELEMENT_ERROR as %s", error_msg);
+        GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL), ("%s", error_msg));
+        gomx->post_gst_element_error = TRUE;
+        ret = GST_FLOW_ERROR;
+      } else {
+        GST_ERROR_OBJECT (self, "GST_ELEMENT_ERROR is already posted. skip this (%s)", error_msg);
+      }
     }
 
     if (self->adapter_size > 0 && adapter_buf) {
index 2783b6b..65abddc 100644 (file)
@@ -920,16 +920,26 @@ EventHandler (OMX_HANDLETYPE omx_handle,
       /* MODIFICATION: set to ignore condition signal to stop. */
       if (core->component_vendor == GOMX_VENDOR_SLSI &&
           core->omx_error == OMX_ErrorMFCInit) {
-        GST_WARNING_OBJECT (core->object, "do not send g_cond_signal when MFC init fail. (%d)", core->omx_unrecover_err_cnt);
+        GST_WARNING_OBJECT (core->object, "do not send g_cond_signal when MFC init fail. (%d)",
+            core->omx_unrecover_err_cnt);
+        if (core->omx_unrecover_err_cnt == 0) {
+          if (core->post_gst_element_error == FALSE) {
+            GST_ERROR_OBJECT (core->object, "post GST_ELEMENT_ERROR as Error from OpenMAX component");
+            GST_ELEMENT_ERROR (core->object, STREAM, FAILED, (NULL), ("%s", "Error from OpenMAX component"));
+            core->post_gst_element_error = TRUE;
+          } else {
+            GST_ERROR_OBJECT (core->object, "GST_ELEMENT_ERROR is already posted. skip this (Error from OpenMAX component)");
+          }
+        }
         core->omx_unrecover_err_cnt++;
       } else {
         g_cond_signal (core->omx_state_condition);
       }
       g_mutex_unlock (core->omx_state_mutex);
-
       if (core->omx_unrecover_err_cnt >= OMX_UNRECOVERABLE_ERROR_MAX_COUNT) {
-        GST_WARNING_OBJECT (core->object, "got unrecoverable error 10 times. go to omx pause state");
+        GST_WARNING_OBJECT (core->object, "got unrecoverable error too much. go to omx pause state");
         g_omx_core_pause(core);
+        core->omx_unrecover_err_cnt = 0;
       }
       break;
     }
index ee72653..ae30a14 100644 (file)
@@ -107,10 +107,15 @@ struct GOmxCore
   gchar *library_name;
   gchar *component_name;
   gchar *component_role;
+
   /* MODIFICATION: omx vender */
   GOmxVendor component_vendor;
 
+  /* MODIFICATION: handle continuous MFC init fails */
   gint omx_unrecover_err_cnt;
+
+  /* MODIFICATION: to do GST_ELEMENT_ERROR only one time */
+  gboolean post_gst_element_error;
 };
 
 struct GOmxPort
index e1af246..2820219 100644 (file)
@@ -2,7 +2,7 @@
 Name:       gst-openmax
 Summary:    GStreamer plug-in that allows communication with OpenMAX IL components
 Version:    0.10.1
-Release:    6
+Release:    7
 Group:      Application/Multimedia
 License:    LGPLv2.1
 Source0:    %{name}-%{version}.tar.gz