From: Sangchul Lee Date: Mon, 9 Aug 2021 11:26:26 +0000 (+0900) Subject: webrtc_private: Add functions for appending negotiation callbacks to the main thread X-Git-Tag: submit/tizen/20210812.064820~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b15fb7973372b454e4125dc54538879207aa4627;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_private: Add functions for appending negotiation callbacks to the main thread Use g_idle_add_full() instead of g_idle_add(). [Version] 0.2.67 [Issue Type] New feature Change-Id: I17eb8f5ac14f046c3b3a9700c3a8f507644828ca Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 43fc5efe..ba08dd98 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -569,6 +569,10 @@ int _push_media_packet(webrtc_s *webrtc, unsigned int source_id, media_packet_h void _invoke_state_changed_cb(webrtc_s *webrtc, webrtc_state_e old, webrtc_state_e new); void _post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state); void _post_error_cb_in_idle(webrtc_s *webrtc, webrtc_error_e error); +void _post_peer_connection_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_peer_connection_state_e state); +void _post_signaling_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_signaling_state_e state); +void _post_ice_gathering_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_ice_gathering_state_e state); +void _post_ice_connection_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_ice_connection_state_e state); 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 15fd161c..5ee41145 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.2.66 +Version: 0.2.67 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_private.c b/src/webrtc_private.c index be87cfd3..1ce4962a 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -402,7 +402,11 @@ static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_d typedef enum _post_idle_cb_type_e { POST_IDLE_CB_TYPE_STATE, - POST_IDLE_CB_TYPE_ERROR + POST_IDLE_CB_TYPE_ERROR, + POST_IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE, + POST_IDLE_CB_TYPE_SIGNALING_STATE_CHANGE, + POST_IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE, + POST_IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE } post_idle_cb_type_e; typedef struct _idle_userdata { @@ -411,6 +415,10 @@ typedef struct _idle_userdata { union { webrtc_state_e state; webrtc_error_e error; + webrtc_peer_connection_state_e peer_connection_state; + webrtc_signaling_state_e signaling_state; + webrtc_ice_gathering_state_e ice_gathering_state; + webrtc_ice_connection_state_e ice_connection_state; } new; } idle_userdata_s; @@ -422,7 +430,6 @@ static gboolean __idle_cb(gpointer user_data) RET_VAL_IF(!data, G_SOURCE_REMOVE, "userdata is NULL"); if (!data->webrtc) { LOG_ERROR("webrtc is NULL"); - g_free(data); return G_SOURCE_REMOVE; } @@ -445,12 +452,22 @@ static gboolean __idle_cb(gpointer user_data) case POST_IDLE_CB_TYPE_ERROR: __invoke_error_cb(webrtc, data->new.error); break; + case POST_IDLE_CB_TYPE_PEER_CONNECTION_STATE_CHANGE: + __invoke_peer_connection_state_change_cb(webrtc, data->new.peer_connection_state); + break; + case POST_IDLE_CB_TYPE_SIGNALING_STATE_CHANGE: + __invoke_signaling_state_change_cb(webrtc, data->new.signaling_state); + break; + case POST_IDLE_CB_TYPE_ICE_GATHERING_STATE_CHANGE: + __invoke_ice_gathering_state_change_cb(webrtc, data->new.ice_gathering_state); + break; + case POST_IDLE_CB_TYPE_ICE_CONNECTION_STATE_CHANGE: + __invoke_ice_connection_state_change_cb(webrtc, data->new.ice_connection_state); + break; default: LOG_ERROR_IF_REACHED("type(%d)", data->type); } - g_free(data); - return G_SOURCE_REMOVE; } @@ -470,7 +487,7 @@ void _post_state_cb_in_idle(webrtc_s *webrtc, webrtc_state_e new_state) webrtc->pend_state = new_state; - g_idle_add(__idle_cb, data); + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); LOG_DEBUG("state will be changed [%s] -> [%s]", __state_str[webrtc->state], __state_str[new_state]); } @@ -486,11 +503,75 @@ void _post_error_cb_in_idle(webrtc_s *webrtc, webrtc_error_e error) data->type = POST_IDLE_CB_TYPE_ERROR; data->new.error = error; - g_idle_add(__idle_cb, data); + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); LOG_DEBUG("error will occur [0x%x]", error); } +void _post_peer_connection_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_peer_connection_state_e state) +{ + 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_PEER_CONNECTION_STATE_CHANGE; + data->new.peer_connection_state = state; + + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + + LOG_DEBUG("connection state will be changed to [%u]", state); +} + +void _post_signaling_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_signaling_state_e state) +{ + 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_SIGNALING_STATE_CHANGE; + data->new.signaling_state = state; + + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + + LOG_DEBUG("signaling state will be changed to [%u]", state); +} + +void _post_ice_gathering_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_ice_gathering_state_e state) +{ + 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_ICE_GATHERING_STATE_CHANGE; + data->new.ice_gathering_state = state; + + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + + LOG_DEBUG("ICE gathering state will be changed to [%u]", state); +} + +void _post_ice_connection_state_change_cb_in_idle(webrtc_s *webrtc, webrtc_ice_connection_state_e state) +{ + 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_ICE_CONNECTION_STATE_CHANGE; + data->new.ice_connection_state = state; + + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, __idle_cb, data, g_free); + + LOG_DEBUG("ICE connection state will be changed to [%u]", state); +} + GstElement *_create_element(const char *factory_name, const char *name) { GstElement *element = NULL;