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 {
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;
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;
}
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;
}
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]);
}
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;