Improve codes for setting transceiver FEC 47/267847/6
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 10 Dec 2021 11:40:58 +0000 (20:40 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 13 Dec 2021 06:06:40 +0000 (15:06 +0900)
It is revised to update the values before creating offer/answer.
Logic is branched by situation if it is an offer or answer.

[Version] 0.3.21
[Issue Type] Improvement

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

index 038d5613f93b9856e1ddf639666d35d24d4de646..6ee9f38f62ecd4c76d90d8a075c9a91452f1f6c1 100644 (file)
@@ -585,6 +585,7 @@ int _add_media_source_internal(webrtc_s *webrtc, int type, unsigned int *source_
 int _remove_media_source(webrtc_s *webrtc, unsigned int source_id);
 int _set_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e direction);
 int _get_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e *direction);
+void _update_transceivers_fec(webrtc_s *webrtc, bool is_offer);
 int _set_pause(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, bool pause);
 int _get_pause(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, bool *paused);
 int _set_audio_mute(webrtc_s *webrtc, unsigned int source_id, bool mute);
index cb0be76081e6c979ff9f0e249544d923030cf2d8..f72afffa3df2e8b36884902d969555cba3707cb8 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.20
+Version:    0.3.21
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 7c083e8862a98d85231dbf47d8bc3e74ebfe57c3..fd996f3039c9c539a3b0df77494d6af2454e9e74 100644 (file)
@@ -1438,6 +1438,8 @@ int webrtc_create_offer(webrtc_h webrtc, bundle *options, char **offer)
 
        LOG_INFO("webrtc[%p] offer[%p]", webrtc, offer);
 
+       _update_transceivers_fec(webrtc, true);
+
        return _webrtcbin_create_session_description(webrtc, true, offer);
 }
 
@@ -1456,6 +1458,8 @@ int webrtc_create_answer(webrtc_h webrtc, bundle *options, char **answer)
 
        LOG_INFO("webrtc[%p] answer[%p]", webrtc, answer);
 
+       _update_transceivers_fec(webrtc, false);
+
        return _webrtcbin_create_session_description(webrtc, false, answer);
 }
 
index 1253dad7364905076ee8b4ef5d9a28de6f8470fe..a5afdb0d82da69c5f0547e5dc81a057520a914c9 100644 (file)
@@ -1249,7 +1249,6 @@ static void __webrtcbin_on_new_transceiver_cb(GstElement *webrtcbin, GstWebRTCRT
        GHashTableIter iter;
        gpointer key, value;
        webrtc_gst_slot_s *source;
-       const ini_item_media_source_s *ini_source;
        int i;
 
        RET_IF(webrtcbin == NULL, "webrtcbin is NULL");
@@ -1282,17 +1281,62 @@ static void __webrtcbin_on_new_transceiver_cb(GstElement *webrtcbin, GstWebRTCRT
                                source->av[i].mline = transceiver->mline;
                                LOG_DEBUG("source[%s, id:%u, mline:%d for %s]",
                                        (gchar*)key, source->id, source->av[i].mline, i == AV_IDX_AUDIO ? "AUDIO" : "VIDEO");
+                               return;
+                       }
+               }
+       }
+}
 
-                               ini_source = _ini_get_source_by_type(&webrtc->ini, source->type);
-                               if (ini_source == NULL)
-                                       ini_source = &(webrtc->ini.media_source);
-                               if (!ini_source->use_ulpfec_red)
-                                       return;
+void _update_transceivers_fec(webrtc_s *webrtc, bool is_offer)
+{
+       const ini_item_media_source_s *ini_source;
+       GstWebRTCRTPTransceiver *transceiver;
+       GHashTableIter iter;
+       gpointer key, value;
+       webrtc_gst_slot_s *source;
+       int i;
+
+       RET_IF(webrtc == NULL, "webrtc is NULL");
 
+       g_hash_table_iter_init(&iter, webrtc->gst.source_slots);
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               source = (webrtc_gst_slot_s*)value;
+               for (i = AV_IDX_AUDIO; i < AV_IDX_MAX; i++) {
+                       if (!(source->media_types & (i == AV_IDX_AUDIO ? MEDIA_TYPE_AUDIO : MEDIA_TYPE_VIDEO)))
+                               continue;
+                       if (source->av[i].mline == -1)
+                               continue;
+
+                       g_signal_emit_by_name(G_OBJECT(webrtc->gst.webrtcbin), "get-transceiver", source->av[i].mline, &transceiver);
+                       if (!transceiver) {
+                               LOG_ERROR("transceiver of mline[%u] is NULL", source->av[i].mline);
+                               continue;
+                       }
+
+                       ini_source = _ini_get_source_by_type(&webrtc->ini, source->type);
+                       if (ini_source == NULL)
+                               ini_source = &(webrtc->ini.media_source);
+
+                       if (is_offer) {
+                               if (!ini_source->use_ulpfec_red)
+                                       continue;
+                               __webrtcbin_transceiver_set_ulpfec_red(webrtc, transceiver);
+                       } else {
+                               /* NOTE that this maximum value exists only for data_recovery_types due to the scenario an answerer
+                                * without any added media sources. It would be moved to the source slot without this scenario. */
+                               if (transceiver->mline >= MAX_MLINE_NUM) {
+                                       LOG_ERROR("mline[%u] exceeds the max value", transceiver->mline);
+                                       continue;
+                               }
+                               if (!webrtc->data_recovery_types[transceiver->mline].red ||
+                                       !webrtc->data_recovery_types[transceiver->mline].ulpfec)
+                                       continue;
                                __webrtcbin_transceiver_set_ulpfec_red(webrtc, transceiver);
-                               __webrtcbin_transceiver_set_fec_percentage(webrtc, transceiver, ini_source->fec_percentage);
-                               return;
                        }
+
+                       if (transceiver->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDONLY ||
+                               transceiver->direction == GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_SENDRECV)
+                               __webrtcbin_transceiver_set_fec_percentage(webrtc, transceiver, ini_source->fec_percentage);
                }
        }
 }