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 59c51dc..6579526 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 b8c3e57..3d1d3cb 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 8877726..64e3dde 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 51e27f9..09663dd 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);