diff --git a/src/lib/emotion/emotion_main.c b/src/lib/emotion/emotion_main.c index c99a1393fa..23f6c7f05d 100644 --- a/src/lib/emotion/emotion_main.c +++ b/src/lib/emotion/emotion_main.c @@ -130,7 +130,6 @@ emotion_object_extension_may_play_get(const char *file) static int _emotion_init_count = 0; - EAPI Eina_Bool emotion_init(void) { @@ -188,6 +187,20 @@ emotion_init(void) return EINA_FALSE; } +static int emotion_pendig_events = 0; + +EAPI void +_emotion_pending_ecore_begin(void) +{ + emotion_pendig_events++; +} + +EAPI void +_emotion_pending_ecore_end(void) +{ + emotion_pendig_events--; +} + EAPI Eina_Bool emotion_shutdown(void) { @@ -200,6 +213,21 @@ emotion_shutdown(void) } if (--_emotion_init_count) return EINA_TRUE; + start = ecore_time_get(); + while (((emotion_pending_objects > 0) || + (emotion_pendig_events > 0)) && + ((ecore_time_get() - start) < 0.5)) + ecore_main_loop_iterate(); + + if (emotion_pending_objects > 0) + { + EINA_LOG_ERR("There is still %i Emotion pipeline running", emotion_pending_objects); + } + if (emotion_pendig_events > 0) + { + EINA_LOG_ERR("There is still %i Emotion events queued", emotion_pendig_events); + } + emotion_modules_shutdown(); emotion_webcam_shutdown(); @@ -211,15 +239,6 @@ emotion_shutdown(void) _emotion_config_file = NULL; } - start = ecore_time_get(); - while (emotion_pending_objects && ecore_time_get() - start < 0.5) - ecore_main_loop_iterate(); - - if (emotion_pending_objects) - { - EINA_LOG_ERR("There is still %i Emotion pipeline running", emotion_pending_objects); - } - eet_shutdown(); ecore_shutdown(); diff --git a/src/lib/emotion/emotion_modules.h b/src/lib/emotion/emotion_modules.h index 0ece2c1d9c..03fb7dbab4 100644 --- a/src/lib/emotion/emotion_modules.h +++ b/src/lib/emotion/emotion_modules.h @@ -127,6 +127,10 @@ EAPI void _emotion_image_reset(Evas_Object *obj); EAPI void _emotion_pending_object_ref(void); EAPI void _emotion_pending_object_unref(void); +EAPI void _emotion_pending_ecore_begin(void); +EAPI void _emotion_pending_ecore_end(void); + + EAPI const char *emotion_webcam_custom_get(const char *device); EAPI Eina_Bool _emotion_module_register(const Emotion_Engine *api); diff --git a/src/modules/emotion/gstreamer/emotion_gstreamer.c b/src/modules/emotion/gstreamer/emotion_gstreamer.c index 9fe654311b..f678bf06f9 100644 --- a/src/modules/emotion/gstreamer/emotion_gstreamer.c +++ b/src/modules/emotion/gstreamer/emotion_gstreamer.c @@ -1220,7 +1220,7 @@ gstreamer_module_init(void) if (_emotion_init_count > 0) { - _emotion_init_count++; + _emotion_pending_ecore_begin(); return EINA_TRUE; } @@ -1525,6 +1525,7 @@ _main_frame_resize(void *data) ratio = (double)ev->src_width / (double)ev->src_height; _emotion_frame_resize(ev->obj, ev->src_width, ev->src_height, ratio); + _emotion_pending_ecore_end(); } static void @@ -1539,6 +1540,7 @@ _no_more_pads(GstElement *decodebin, gpointer data) { if(_video_size_get(GST_ELEMENT(elem), &ev->src_width, &ev->src_height)) { + _emotion_pending_ecore_begin(); ecore_main_loop_thread_safe_call_async(_main_frame_resize, ev); gst_object_unref(elem); break; @@ -1622,6 +1624,7 @@ _eos_main_fct(void *data) } emotion_gstreamer_message_free(send); + _emotion_pending_ecore_end(); } static GstBusSyncReply @@ -1642,7 +1645,11 @@ _eos_sync_fct(GstBus *bus EINA_UNUSED, GstMessage *msg, gpointer data) GST_MESSAGE_TYPE_NAME(msg)); send = emotion_gstreamer_message_alloc(ev, msg); - if (send) ecore_main_loop_thread_safe_call_async(_eos_main_fct, send); + if (send) + { + _emotion_pending_ecore_begin(); + ecore_main_loop_thread_safe_call_async(_eos_main_fct, send); + } break; @@ -1660,7 +1667,11 @@ _eos_sync_fct(GstBus *bus EINA_UNUSED, GstMessage *msg, gpointer data) { send = emotion_gstreamer_message_alloc(ev, msg); - if (send) ecore_main_loop_thread_safe_call_async(_eos_main_fct, send); + if (send) + { + _emotion_pending_ecore_begin(); + ecore_main_loop_thread_safe_call_async(_eos_main_fct, send); + } } break; } @@ -1679,7 +1690,11 @@ _eos_sync_fct(GstBus *bus EINA_UNUSED, GstMessage *msg, gpointer data) { send = emotion_gstreamer_message_alloc(ev, msg); - if (send) ecore_main_loop_thread_safe_call_async(_eos_main_fct, send); + if (send) + { + _emotion_pending_ecore_begin(); + ecore_main_loop_thread_safe_call_async(_eos_main_fct, send); + } } break; } diff --git a/src/modules/emotion/gstreamer/emotion_sink.c b/src/modules/emotion/gstreamer/emotion_sink.c index 1a1199f78e..9920d93f52 100644 --- a/src/modules/emotion/gstreamer/emotion_sink.c +++ b/src/modules/emotion/gstreamer/emotion_sink.c @@ -237,7 +237,7 @@ gboolean evas_video_sink_set_caps(GstBaseSink *bsink, GstCaps *caps) DBG("Found '%s'", colorspace_fourcc_convertion[i].name); priv->eformat = colorspace_fourcc_convertion[i].eformat; priv->func = colorspace_fourcc_convertion[i].func; - if (colorspace_fourcc_convertion[i].force_height) + if (colorspace_fourcc_convertion[i].force_height) { priv->height = (priv->height >> 1) << 1; } @@ -388,11 +388,14 @@ evas_video_sink_preroll(GstBaseSink* bsink, GstBuffer* buffer) else priv->func = _evas_video_st12; } - + _emotion_pending_ecore_begin(); ecore_main_loop_thread_safe_call_async(evas_video_sink_samsung_main_render, send); } else - ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send); + { + _emotion_pending_ecore_begin(); + ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send); + } } return GST_FLOW_OK; @@ -442,11 +445,14 @@ evas_video_sink_render(GstBaseSink* bsink, GstBuffer* buffer) else priv->func = _evas_video_st12; } - + _emotion_pending_ecore_begin(); ecore_main_loop_thread_safe_call_async(evas_video_sink_samsung_main_render, send); } else - ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send); + { + _emotion_pending_ecore_begin(); + ecore_main_loop_thread_safe_call_async(evas_video_sink_main_render, send); + } eina_condition_wait(&priv->c); eina_lock_release(&priv->m); @@ -612,11 +618,16 @@ evas_video_sink_samsung_main_render(void *data) exit_stream: if (priv) { - if (preroll || !priv->o) return; + if (preroll || !priv->o) + { + _emotion_pending_ecore_end(); + return; + } if (!priv->unlocked) eina_condition_signal(&priv->c); } + _emotion_pending_ecore_end(); } static void @@ -723,11 +734,16 @@ evas_video_sink_main_render(void *data) exit_stream: if (priv) { - if (preroll || !priv->o) return; + if (preroll || !priv->o) + { + _emotion_pending_ecore_end(); + return; + } if (!priv->unlocked) eina_condition_signal(&priv->c); } + _emotion_pending_ecore_end(); } static void @@ -976,9 +992,15 @@ _video_update_pixels(void *data, Evas_Object *obj EINA_UNUSED, const Evas_Video_ ev->send = NULL; if (priv->samsung) - evas_video_sink_samsung_main_render(send); + { + _emotion_pending_ecore_begin(); + evas_video_sink_samsung_main_render(send); + } else - evas_video_sink_main_render(send); + { + _emotion_pending_ecore_begin(); + evas_video_sink_main_render(send); + } } static void