webrtc_private: Ensure the NEGOTIATING state to get ready for negotiation operation 85/259485/2
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 9 Jun 2021 00:28:02 +0000 (09:28 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 9 Jun 2021 02:57:10 +0000 (11:57 +0900)
Invoking state callback for NEGOTIATING state is moved to the inside of
negotiation needed callback. This ensures to get the SSRC parameter
successfully while creating offer SDP.

[Version] 0.2.7
[Issue Type] Improvement

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

index b419d6cfbf3e6a8ad1e50a667cfa445cc9ae2056..44f2df4af60343f9cca615f151dc8c37dba03854 100644 (file)
@@ -1230,6 +1230,7 @@ int webrtc_unset_ice_candidate_cb(webrtc_h webrtc);
  * @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
  * @retval #WEBRTC_ERROR_INVALID_STATE Invalid state
  * @pre @a webrtc state must be set to #WEBRTC_STATE_NEGOTIATING.
+ * @see webrtc_state_changed_cb()
  * @see webrtc_negotiation_needed_cb()
  * @see webrtc_set_local_description()
  */
index cd95e54957976a476293d267c128e80d2e9804b3..d05da8ee138983450292e23710267c3a69956606 100644 (file)
@@ -387,6 +387,11 @@ typedef struct _webrtc_s {
        webrtc_callbacks_s encoded_video_frame_cb;
        webrtc_callbacks_s data_channel_cb;
 
+       /* FIXME: Once signal is emitted by webrtcbin, it'll not be triggered
+        * even if the pipeline state is changed to NULL to PLAYING again.
+        * This variable could be removed, some improvements are applied to webrtcbin. */
+       bool negotiation_needed_cb_invoked;
+
        webrtc_negotiation_states_s negotiation_states;
 #ifdef TIZEN_FEATURE_RES_MGR
        webrtc_resource_s resource;
index 48a93cea02e3dd2c6e526387ab0362954911d30b..96923de644da7765fe6abda471f00ec1af617253 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.2.6
+Version:    0.2.7
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 24226ae42e24d2cd2f6d92ec16c621f98c122dd9..16e4300b59cda3ac698d1596ded3eaab9f4723ba 100644 (file)
@@ -217,12 +217,12 @@ static gchar *__make_ice_candidate_message(guint mlineindex, gchar *candidate)
        return text;
 }
 
-static bool __meet_gst_state(webrtc_state_e state, GstState gst_state)
+static bool __meet_gst_state(webrtc_state_e state, GstState gst_state, bool negotiation_needed_cb_invoked)
 {
        if (state == WEBRTC_STATE_IDLE && gst_state == GST_STATE_READY)
                return true;
 
-       if (state == WEBRTC_STATE_NEGOTIATING && gst_state == GST_STATE_PLAYING)
+       if (state == WEBRTC_STATE_NEGOTIATING && gst_state == GST_STATE_PLAYING && negotiation_needed_cb_invoked)
                return true;
 
        return false;
@@ -232,6 +232,9 @@ void _invoke_state_changed_cb(webrtc_s *webrtc, webrtc_state_e old, webrtc_state
 {
        RET_IF(webrtc == NULL, "webrtc is NULL");
 
+       if (old == new)
+               return;
+
        LOG_INFO("state is changed [%s] -> [%s]", __state_str[old], __state_str[new]);
 
        if (webrtc->state_changed_cb.callback) {
@@ -379,7 +382,7 @@ static gboolean __bus_watch_cb(GstBus *bus, GstMessage *message, gpointer user_d
                        break;
                }
 
-               if (__meet_gst_state(webrtc->pend_state, gst_state_new)) {
+               if (__meet_gst_state(webrtc->pend_state, gst_state_new, webrtc->negotiation_needed_cb_invoked)) {
                        webrtc_state_e old_state = webrtc->state;
                        webrtc->state = webrtc->pend_state;
                        g_mutex_unlock(&webrtc->mutex);
@@ -676,10 +679,20 @@ void _disconnect_signal(gpointer data)
 static void __webrtcbin_on_negotiation_needed_cb(GstElement *webrtcbin, gpointer user_data)
 {
        webrtc_s *webrtc = (webrtc_s *)user_data;
+       webrtc_state_e old_state;
 
        RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
        RET_IF(webrtc == NULL, "webrtc is NULL");
 
+       g_mutex_lock(&webrtc->mutex);
+
+       old_state = webrtc->state;
+       webrtc->state = webrtc->pend_state;
+
+       g_mutex_unlock(&webrtc->mutex);
+       _invoke_state_changed_cb(webrtc, old_state, webrtc->state);
+       webrtc->negotiation_needed_cb_invoked = true;
+
        if (webrtc->negotiation_needed_cb.callback == NULL) {
                LOG_DEBUG("negotiation_needed_cb is NULL, skip it");
                return;