webrtc_resource: Invoke error callback when a resource conflict happens 37/253937/7
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 19 Feb 2021 11:34:22 +0000 (20:34 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 24 Feb 2021 02:58:46 +0000 (11:58 +0900)
_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 <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_private.c
src/webrtc_resource.c

index adea6f63351929a26cca1676678b79acfd5fa479..02d7ccf52368ac665fafe73a5f6ca05d0ae38cd3 100644 (file)
@@ -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);
index 795c5a702d5013b0034246b6e9278dbda2e8fb0f..eb50081f072cfd0fdd93bfa0940ed3bc6053b010 100644 (file)
@@ -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
index 6eb1aa4f9e1609f56adc839983d3f0fe6b26670c..5cf2c2952037a2e7a20185a5d9d1483e01f4e2c5 100644 (file)
@@ -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;
index f7d68434dfb4aefe4f3f555caf6a1f9e6b4f634c..e21fd9f895e8257065c73f54bdfe23a6f6941d7f 100644 (file)
@@ -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;