From: Jeongmo Yang Date: Mon, 14 Dec 2020 02:48:18 +0000 (+0900) Subject: Add new API for setting display in sub thread X-Git-Tag: submit/tizen/20201214.092711^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3bdb9c89afe57abfc3eaabaf526463f3d532e44d;p=platform%2Fcore%2Fmultimedia%2Flibmm-display.git Add new API for setting display in sub thread - mm_display_interface_set_display_mainloop_sync(); - mm_display_interface_set_display() should be called in main-thread, but, new API is allowed to be called in sub-thread. [Version] 0.0.10 [Issue Type] New feature Change-Id: Ia32fab3d643e3fe4f8a66b1e109858e05c69ea27 Signed-off-by: Jeongmo Yang --- diff --git a/packaging/libmm-display.spec b/packaging/libmm-display.spec index 8603f88..341d742 100644 --- a/packaging/libmm-display.spec +++ b/packaging/libmm-display.spec @@ -1,6 +1,6 @@ Name: libmm-display Summary: Multimedia framework display library -Version: 0.0.9 +Version: 0.0.10 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_display.h b/src/include/mm_display.h index ca1240c..65e8814 100644 --- a/src/include/mm_display.h +++ b/src/include/mm_display.h @@ -43,8 +43,15 @@ typedef void *mm_display_h; int mm_display_init(mm_display_h *handle); int mm_display_deinit(mm_display_h handle); + +/* NOTE: This function should be called in main thread. */ int mm_display_set_display(mm_display_h handle, mm_display_type_e type, void *display, int *parent_id); +/* NOTE: This function is allowed to call in sub thread, but main thread could be blocked until it's being called. */ +int mm_display_set_display_mainloop_sync(mm_display_h handle, mm_display_type_e type, void *display, int *parent_id); + int mm_display_get_type(mm_display_h handle, mm_display_type_e *type); +int mm_display_get_window_rect(mm_display_h handle, MMRectType *window_rect); + #ifdef TIZEN_FEATURE_EVAS_RENDERER int mm_display_evas_set_rotation(mm_display_h handle, int rotation); int mm_display_evas_get_rotation(mm_display_h handle, int *rotation); diff --git a/src/include/mm_display_interface.h b/src/include/mm_display_interface.h index 23989eb..6bd06cc 100644 --- a/src/include/mm_display_interface.h +++ b/src/include/mm_display_interface.h @@ -37,9 +37,15 @@ typedef void (*mm_display_evas_rendered_cb)(media_packet_h packet, void *user_da int mm_display_interface_init(mm_display_interface_h *handle); int mm_display_interface_deinit(mm_display_interface_h handle); + +/* NOTE: This function should be called in main thread. */ int mm_display_interface_set_display(mm_display_interface_h handle, mm_display_type_e type, void *display, int *parent_id); +/* NOTE: This function is allowed to call in sub thread, but main thread could be blocked until it's being called. */ +int mm_display_interface_set_display_mainloop_sync(mm_display_interface_h handle, mm_display_type_e type, void *display, int *parent_id); + int mm_display_interface_get_type(mm_display_interface_h handle, mm_display_type_e *type); int mm_display_interface_get_window_rect(mm_display_interface_h handle, MMRectType *window_rect); + int mm_display_interface_evas_set_rotation(mm_display_interface_h handle, int rotation); int mm_display_interface_evas_get_rotation(mm_display_interface_h handle, int *rotation); int mm_display_interface_evas_set_visible(mm_display_interface_h handle, bool visible); diff --git a/src/include/mm_display_interface_private.h b/src/include/mm_display_interface_private.h index 5b5d034..7602c22 100644 --- a/src/include/mm_display_interface_private.h +++ b/src/include/mm_display_interface_private.h @@ -34,6 +34,7 @@ typedef struct mm_display_interface { int (*init)(void **); int (*deinit)(void *); int (*set_display)(void *, mm_display_type_e, void *, int *); + int (*set_display_mainloop_sync)(void *, mm_display_type_e, void *, int *); int (*get_type)(void *, mm_display_type_e *); int (*get_window_rect)(void *, MMRectType *); int (*evas_set_rotation)(void *, int); diff --git a/src/mm_display.c b/src/mm_display.c index 1a75bb7..126d257 100644 --- a/src/mm_display.c +++ b/src/mm_display.c @@ -348,6 +348,28 @@ int mm_display_set_display(mm_display_h handle, mm_display_type_e type, void *di } +int mm_display_set_display_mainloop_sync(mm_display_h handle, mm_display_type_e type, void *display, int *parent_id) +{ + int ret = MM_ERROR_NONE; + + LOGD("enter - type %d", type); + + if (ecore_thread_main_loop_begin() < 0) { + LOGE("ecore_thread_main_loop_begin failed"); + return MM_ERROR_COMMON_INTERNAL; + } + + ret = mm_display_set_display(handle, type, display, parent_id); + + LOGI("ret 0x%x", ret); + + if (ecore_thread_main_loop_end() < 0) + LOGE("ecore_thread_main_loop_end failed"); + + return ret; +} + + int mm_display_get_type(mm_display_h handle, mm_display_type_e *type) { mm_display_t *dp_handle = (mm_display_t *)handle; diff --git a/src/mm_display_interface.c b/src/mm_display_interface.c index 5f3bc44..6f807bf 100644 --- a/src/mm_display_interface.c +++ b/src/mm_display_interface.c @@ -77,6 +77,7 @@ int mm_display_interface_init(mm_display_interface_h *handle) sym_ret = g_module_symbol(module, "mm_display_init", (gpointer *)&new_interface->init); sym_ret &= g_module_symbol(module, "mm_display_deinit", (gpointer *)&new_interface->deinit); sym_ret &= g_module_symbol(module, "mm_display_set_display", (gpointer *)&new_interface->set_display); + sym_ret &= g_module_symbol(module, "mm_display_set_display_mainloop_sync", (gpointer *)&new_interface->set_display_mainloop_sync); sym_ret &= g_module_symbol(module, "mm_display_get_type", (gpointer *)&new_interface->get_type); sym_ret &= g_module_symbol(module, "mm_display_get_window_rect", (gpointer *)&new_interface->get_window_rect); #ifdef TIZEN_FEATURE_EVAS_RENDERER @@ -176,6 +177,19 @@ int mm_display_interface_set_display(mm_display_interface_h handle, mm_display_t } +int mm_display_interface_set_display_mainloop_sync(mm_display_interface_h handle, mm_display_type_e type, void *display, int *parent_id) +{ + DECLARE_CHECK_INTERFACE_HANDLE(handle); + + if (!interface->set_display_mainloop_sync) { + LOGE("NULL function pointer"); + return MM_ERROR_UNKNOWN; + } + + return interface->set_display_mainloop_sync(interface->dp_handle, type, display, parent_id); +} + + int mm_display_interface_get_type(mm_display_interface_h handle, mm_display_type_e *type) { DECLARE_CHECK_INTERFACE_HANDLE(handle);