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