From: Sangchul Lee Date: Fri, 19 Feb 2021 11:34:22 +0000 (+0900) Subject: webrtc_resource: Invoke error callback when a resource conflict happens X-Git-Tag: submit/tizen/20210729.023123~123 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=25f0fb1034e68d05419c7a70c7a7e56eac10329c;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_resource: Invoke error callback when a resource conflict happens _post_error_cb_in_idle() is added to invoke the error callback in the main thread. [Version] 0.1.118 [Issue Type] Improvement Change-Id: I35290cb5ae37970cd599fc74e90e499837e50cd9 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index adea6f63..02d7ccf5 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -452,6 +452,7 @@ int _push_media_packet(webrtc_s *webrtc, unsigned int source_id, media_packet_h int _get_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e *direction); int _set_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e direction); void _invoke_state_changed_cb(webrtc_s *webrtc, webrtc_state_e old, webrtc_state_e new); +void _post_error_cb_in_idle(webrtc_s *webrtc, webrtc_error_e error); void _connect_and_append_signal(GList **signals, GObject *obj, const char *sig_name, GCallback cb, gpointer user_data); void _disconnect_signal(gpointer data); diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 795c5a70..eb50081f 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.1.117 +Version: 0.1.118 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_private.c b/src/webrtc_private.c index 6eb1aa4f..5cf2c295 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -257,16 +257,24 @@ static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_d return TRUE; } +typedef enum _post_idle_cb_type_e { + POST_IDLE_CB_TYPE_STATE, + POST_IDLE_CB_TYPE_ERROR +} post_idle_cb_type_e; + typedef struct _idle_userdata { webrtc_s *webrtc; - webrtc_state_e state; + post_idle_cb_type_e type; + union { + webrtc_state_e state; + webrtc_error_e error; + } new; } idle_userdata_s; static gboolean __idle_cb(gpointer user_data) { idle_userdata_s *data = (idle_userdata_s*)user_data; webrtc_s *webrtc; - webrtc_state_e old_state; RET_VAL_IF(!data, G_SOURCE_REMOVE, "userdata is NULL"); if (!data->webrtc) { @@ -277,14 +285,26 @@ static gboolean __idle_cb(gpointer user_data) webrtc = data->webrtc; - g_mutex_lock(&webrtc->mutex); + switch (data->type) { + case POST_IDLE_CB_TYPE_STATE: { + webrtc_state_e old_state; - old_state = webrtc->state; - webrtc->state = data->state; + g_mutex_lock(&webrtc->mutex); - g_mutex_unlock(&webrtc->mutex); + old_state = webrtc->state; + webrtc->state = data->new.state; - _invoke_state_changed_cb(webrtc, old_state, webrtc->state); + g_mutex_unlock(&webrtc->mutex); + + _invoke_state_changed_cb(webrtc, old_state, webrtc->state); + break; + } + case POST_IDLE_CB_TYPE_ERROR: + __invoke_error_cb(webrtc, data->new.error); + break; + default: + LOG_ERROR_IF_REACHED("type(%d)", data->type); + } g_free(data); @@ -295,12 +315,15 @@ static void __post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state) { idle_userdata_s *data; + RET_IF(webrtc == NULL, "webrtc is NULL"); + if (webrtc->state == new_state) return; data = g_new0(idle_userdata_s, 1); data->webrtc = webrtc; - data->state = new_state; + data->type = POST_IDLE_CB_TYPE_STATE; + data->new.state = new_state; webrtc->pend_state = new_state; @@ -309,6 +332,22 @@ static void __post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state) LOG_DEBUG("state will be changed [%s] -> [%s]", __state_str[webrtc->state], __state_str[new_state]); } +void _post_error_cb_in_idle(webrtc_s *webrtc, webrtc_error_e error) +{ + idle_userdata_s *data; + + RET_IF(webrtc == NULL, "webrtc is NULL"); + + data = g_new0(idle_userdata_s, 1); + data->webrtc = webrtc; + data->type = POST_IDLE_CB_TYPE_ERROR; + data->new.error = error; + + g_idle_add(__idle_cb, data); + + LOG_DEBUG("error will occur [0x%x]", error); +} + GstElement *_create_element(const char *factory_name, const char *name) { GstElement *element = NULL; diff --git a/src/webrtc_resource.c b/src/webrtc_resource.c index f7d68434..e21fd9f8 100644 --- a/src/webrtc_resource.c +++ b/src/webrtc_resource.c @@ -57,6 +57,8 @@ static int __resource_release_cb(mm_resource_manager_h mgr, if (_webrtc_stop(webrtc) != WEBRTC_ERROR_NONE) ret = false; + _post_error_cb_in_idle(webrtc, WEBRTC_ERROR_RESOURCE_CONFLICT); + webrtc->resource.release_cb_is_calling = false; return ret;