Add codes to invoke error callback in two cases 68/245268/3
authorSangchul Lee <sc11.lee@samsung.com>
Tue, 6 Oct 2020 07:59:43 +0000 (16:59 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 8 Oct 2020 07:12:05 +0000 (16:12 +0900)
There are cases that 'peer connection state callback' or
'ice connection state callback' of webrtcbin is called
with FAILED state. Such cases deserve to be forwarded to
user via the error callback.

[Version] 0.1.36
[Issue Type] Improvement

Change-Id: I54f85da412b200b53b07f9ca5011df8f0295c11b
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
src/webrtc_private.c

index 6cdf74cebddc74e11ba590b84b9ede2a1ef1b448..fa028d949ec601a49847d2541ad46c69fd29f4ed 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.1.35
+Version:    0.1.36
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index ef72e4a5763b9ff940e3abb82b137ddff1708872..40a5a91b6fa789d76358e8a3b26736dc22938d94 100644 (file)
@@ -162,6 +162,19 @@ static void __invoke_state_changed_cb(webrtc_s *webrtc, webrtc_state_e old, webr
        GENERATE_DOT(webrtc, "STATE_%s", __state_str[webrtc->state]);
 }
 
+static void __invoke_error_cb(webrtc_s *webrtc, webrtc_error_e error)
+{
+       RET_IF(webrtc == NULL, "webrtc is NULL");
+
+       LOG_INFO("error[0x%x]", error);
+
+       if (webrtc->error_cb.callback) {
+               LOG_DEBUG(">>> callback[%p], user_data[%p]", webrtc->error_cb.callback, webrtc->error_cb.user_data);
+               ((webrtc_error_cb)(webrtc->error_cb.callback))((webrtc_h)webrtc, error, webrtc->state, webrtc->error_cb.user_data);
+               LOG_DEBUG("<<< end of the callback");
+       }
+}
+
 static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_data)
 {
        webrtc_s *webrtc = (webrtc_s *)user_data;
@@ -180,26 +193,23 @@ static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_d
        }
 
        switch (GST_MESSAGE_TYPE(message)) {
-       case GST_MESSAGE_ERROR:
+       case GST_MESSAGE_ERROR: {
+               webrtc_error_e error = WEBRTC_ERROR_INVALID_OPERATION;
                gst_message_parse_error(message, &err, NULL);
 
                LOG_ERROR("Error[from %s]: message[%s], code[%d]",
                        GST_OBJECT_NAME(GST_OBJECT_CAST(GST_ELEMENT(GST_MESSAGE_SRC(message)))), err->message, err->code);
-               if (webrtc->error_cb.callback) {
-                       webrtc_error_e error = WEBRTC_ERROR_INVALID_OPERATION;
-                       if (err->domain == GST_RESOURCE_ERROR)
-                               error = WEBRTC_ERROR_RESOURCE_FAILED;
-                       else if (err->domain == GST_STREAM_ERROR)
-                               error = WEBRTC_ERROR_STREAM_FAILED;
-
-                       LOG_DEBUG(">>> invoke error_cb[%p], user_data[%p]",
-                               webrtc->error_cb.callback, webrtc->error_cb.user_data);
-                       ((webrtc_error_cb)(webrtc->error_cb.callback))((webrtc_h)webrtc, error, webrtc->state, webrtc->error_cb.user_data);
-                       LOG_DEBUG("<<< end of the callback");
-               }
+
+               if (err->domain == GST_RESOURCE_ERROR)
+                       error = WEBRTC_ERROR_RESOURCE_FAILED;
+               else if (err->domain == GST_STREAM_ERROR)
+                       error = WEBRTC_ERROR_STREAM_FAILED;
+
+               __invoke_error_cb(webrtc, error);
 
                g_error_free(err);
                break;
+       }
 
        case GST_MESSAGE_STATE_CHANGED:
                if (GST_MESSAGE_SRC(message) != GST_OBJECT(webrtc->gst.pipeline))
@@ -546,6 +556,8 @@ static void __webrtcbin_peer_connection_state_cb(GstElement *webrtcbin, GParamSp
 
        case GST_WEBRTC_PEER_CONNECTION_STATE_FAILED:
                new_state = "FAILED";
+
+               __invoke_error_cb(webrtc, WEBRTC_ERROR_CONNECTION_FAILED);
                break;
 
        case GST_WEBRTC_PEER_CONNECTION_STATE_CLOSED:
@@ -654,6 +666,8 @@ static void __webrtcbin_ice_connection_state_cb(GstElement *webrtcbin, GParamSpe
 
        case GST_WEBRTC_ICE_CONNECTION_STATE_FAILED:
                new_state = "FAILED";
+
+               __invoke_error_cb(webrtc, WEBRTC_ERROR_CONNECTION_FAILED);
                break;
 
        case GST_WEBRTC_ICE_CONNECTION_STATE_DISCONNECTED: