webrtc_private: Add functions for appending negotiation callbacks to the main thread 79/262379/3
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 9 Aug 2021 11:26:26 +0000 (20:26 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 10 Aug 2021 07:37:35 +0000 (16:37 +0900)
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 <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_private.c

index 43fc5efeb75b9887c19d64384ee00eff03e49366..ba08dd985a799de063499349faefc6059f702ea9 100644 (file)
@@ -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);
index 15fd161c879e97cd6de123651ed65a54e73095a9..5ee4114523425454fc4e4662fbcd3259f3d35dc0 100644 (file)
@@ -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
index be87cfd34870014a55dd2aa287d52d2fdf78f7c5..1ce4962ab9c93b8eba705d3fc16d8a94164761f8 100644 (file)
@@ -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;