Improvement in case of no preroll with READY state 66/245366/6
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 8 Oct 2020 01:16:30 +0000 (10:16 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 19 Oct 2020 05:58:03 +0000 (14:58 +0900)
Set PLAYING state for a short time to fix an issue not getting
the SSRC information properly in case of ANSWER mode with the max
bundle policy. Without the first input buffer, the SSRC can not be
obtained and mlineindex can be wrong in webrtcbin.

[Issue type] Improvement
[Version] 0.1.125

Change-Id: I40c7761bea705b91e2b5231c64ac6460ec12edb4
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-streamer.spec
src/media_streamer_gst_webrtc.c
src/media_streamer_node.c
src/media_streamer_priv.c

index 59c51dcdf4a4ec5badd428d36839ab91938c343d..65795262d02ea2fe19641bd517f1fcfe041a8df2 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamer
 Summary:    A Media Streamer API
-Version:    0.1.124
+Version:    0.1.125
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index b8c3e5761dbc64af20d6b53acbf4b87f272e42a1..3d1d3cb53c0994fbed84b1a3cd892750bd7e78df 100644 (file)
@@ -415,9 +415,10 @@ void ms_webrtcbin_on_negotiation_needed_cb(GstElement *webrtcbin, gpointer user_
 {
        GstPromise *promise;
        media_streamer_node_s *webrtc_node = (media_streamer_node_s *)user_data;
+       gboolean is_offerer = FALSE;
 
        ms_retm_if(webrtcbin == NULL, "webrtcbin is NULL");
-       ms_retm_if(user_data == NULL, "user_data is NULL");
+       ms_retm_if(webrtc_node == NULL, "webrtc_node is NULL");
        ms_retm_if(webrtc_node->parent_streamer == NULL, "parent_streamer is NULL");
 
        ms_debug_fenter();
@@ -428,8 +429,14 @@ void ms_webrtcbin_on_negotiation_needed_cb(GstElement *webrtcbin, gpointer user_
                webrtc_node->parent_streamer->need_paused_by_live_source = FALSE;
        }
 
-       promise = gst_promise_new_with_change_func(__on_offer_created_cb, user_data, NULL);
-       g_signal_emit_by_name(G_OBJECT(webrtcbin), "create-offer", NULL, promise);
+       if (ms_webrtc_node_is_offerer(webrtc_node, &is_offerer) != MEDIA_STREAMER_ERROR_NONE) {
+               ms_error("Failed to get peer type");
+               return;
+       }
+       if (is_offerer) {
+               promise = gst_promise_new_with_change_func(__on_offer_created_cb, user_data, NULL);
+               g_signal_emit_by_name(G_OBJECT(webrtcbin), "create-offer", NULL, promise);
+       }
 
        ms_debug_fleave();
 }
index 8877726c6cc0c91bba29fe2e3fc8dd6ab4c78c20..64e3ddebb88c801a5de156bb06d9e7fb08b86f21 100644 (file)
@@ -2106,7 +2106,6 @@ int ms_webrtc_node_prepare(media_streamer_s *ms_streamer, media_streamer_node_s
        GstElement *webrtcbin = NULL;
        GstElement *rtpbin = NULL;
        GObject *send_channel = NULL;
-       gboolean is_offerer = FALSE;
        gint latency = DEFAULT_MEDIA_STREAMER_RTP_LATENCY;
        media_streamer_webrtc_callbacks_s *_callbacks = NULL;
 
@@ -2125,14 +2124,7 @@ int ms_webrtc_node_prepare(media_streamer_s *ms_streamer, media_streamer_node_s
                return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
        }
 
-       if (ms_webrtc_node_is_offerer(node, &is_offerer) != MEDIA_STREAMER_ERROR_NONE) {
-               ms_error("Failed to get peer type");
-               return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
-       }
-
-       if (is_offerer)
-               ms_signal_create(&node->sig_list, webrtcbin, "on-negotiation-needed", G_CALLBACK(ms_webrtcbin_on_negotiation_needed_cb), node);
-
+       ms_signal_create(&node->sig_list, webrtcbin, "on-negotiation-needed", G_CALLBACK(ms_webrtcbin_on_negotiation_needed_cb), node);
        ms_signal_create(&node->sig_list, webrtcbin, "on-ice-candidate", G_CALLBACK(ms_webrtcbin_on_ice_candidate_cb), node);
        ms_signal_create(&node->sig_list, webrtcbin, "on-new-transceiver", G_CALLBACK(ms_webrtcbin_on_new_transceiver_cb), NULL);
        ms_signal_create(&node->sig_list, webrtcbin, "notify::ice-gathering-state", G_CALLBACK(ms_webrtcbin_notify_ice_gathering_state_cb), NULL);
index 51e27f997ea61b36187c0f7310257cd22f4469e0..09663ddf877f910692cf51f2eeba380b52f00598 100644 (file)
@@ -109,16 +109,15 @@ int ms_set_state(media_streamer_s *ms_streamer, media_streamer_state_e state)
 
                ret = ms_element_set_state(ms_streamer->pipeline, GST_STATE_PAUSED);
                if (ret == MEDIA_STREAMER_ERROR_NONE) {
-                       /* Note that in case of WebRTC offer mode, 'on-negotiation-needed' callback depends on
+                       /* Note that in case of OFFER mode, 'on-negotiation-needed' callback depends on
                         * the first input buffer. GST_STATE_PAUSED with no prerolled buffer can not meet the condition above.
-                        * Therefore, we set the state to PLAYING for a short time. */
+                        * In the case of ANSWER mode with the max bundle policy, the first input buffer is also required to
+                        * set SSRC information to SDP properly inside of webrtcbin. Therefore, we set the state to PLAYING
+                        * for a short time as below.
+                        */
                        media_streamer_node_s *webrtc = (media_streamer_node_s *)g_hash_table_lookup(ms_streamer->nodes_table, "webrtc_container");
-                       gboolean is_offerer = FALSE;
                        if (webrtc) {
-                               ret = ms_webrtc_node_is_offerer(webrtc, &is_offerer);
-                               if (ret != MEDIA_STREAMER_ERROR_NONE)
-                                       break;
-                               if (is_offerer && ms_pipeline_is_get_state_with_no_preroll(ms_streamer)) {
+                               if (ms_pipeline_is_get_state_with_no_preroll(ms_streamer)) {
                                        ms_info("No preroll, we make the GST state to PLAYING here");
                                        ms_streamer->need_paused_by_live_source = TRUE;
                                        ret = ms_element_set_state(ms_streamer->pipeline, GST_STATE_PLAYING);