webrtc_private: Revise FEC setting condition in case of answerer without media source 46/267846/4
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 10 Dec 2021 10:34:32 +0000 (19:34 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 13 Dec 2021 06:04:57 +0000 (06:04 +0000)
In this case, it is fixed to depend on related values of remote offer description
instead of the ini value.

'fec-percentage' is not required for a 'recvonly' transceiver.

[Version] 0.3.20
[Issue Type] Improvement

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

index 2d9e59bc4719c557773ae5e6035cb9241a1701f5..cb0be76081e6c979ff9f0e249544d923030cf2d8 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.19
+Version:    0.3.20
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index b14ef2ef9d05f24cd39c6ce6a8aff8d4a5f6a5f9..1253dad7364905076ee8b4ef5d9a28de6f8470fe 100644 (file)
@@ -1121,7 +1121,7 @@ int _set_ghost_pad_target(GstPad *ghost_pad, GstElement *target_element, bool is
        return WEBRTC_ERROR_NONE;
 }
 
-static void __webrtcbin_transceiver_set_ulpfec_red(webrtc_s *webrtc, unsigned int fec_percentage, GstWebRTCRTPTransceiver *transceiver)
+static void __webrtcbin_transceiver_set_ulpfec_red(webrtc_s *webrtc, GstWebRTCRTPTransceiver *transceiver)
 {
        GstElement *rtpbin;
 
@@ -1133,20 +1133,26 @@ static void __webrtcbin_transceiver_set_ulpfec_red(webrtc_s *webrtc, unsigned in
                return;
        }
 
-       g_object_set(transceiver,
-               "fec-type", GST_WEBRTC_FEC_TYPE_ULP_RED,
-               "fec-percentage", fec_percentage,
-               NULL);
-
-       LOG_INFO("set ULPFEC/RED[percentage:%u] to transceiver[%p]", fec_percentage, transceiver);
+       g_object_set(transceiver, "fec-type", GST_WEBRTC_FEC_TYPE_ULP_RED, NULL);
+       LOG_INFO("set ULPFEC/RED to transceiver[%p]", transceiver);
 
        g_object_set(G_OBJECT(rtpbin), "do-lost", TRUE, NULL);
-
        LOG_DEBUG("set do-lost to rtpbin[%p], ULPFEC recovers a lost packet when do-lost event occurs", rtpbin);
 
        gst_object_unref(rtpbin);
 }
 
+static void __webrtcbin_transceiver_set_fec_percentage(webrtc_s *webrtc, GstWebRTCRTPTransceiver *transceiver, unsigned int fec_percentage)
+{
+       RET_IF(webrtc == NULL, "webrtc is NULL");
+       RET_IF(transceiver == NULL, "transceiver is NULL");
+
+       g_object_set(transceiver, "fec-percentage", fec_percentage, NULL);
+
+       LOG_INFO("set fec-percentage[%u] to transceiver[%p]", fec_percentage, transceiver);
+}
+
+
 //LCOV_EXCL_START
 gchar * _get_media_type_from_pad(GstPad *pad)
 {
@@ -1255,14 +1261,14 @@ static void __webrtcbin_on_new_transceiver_cb(GstElement *webrtcbin, GstWebRTCRT
        PRINT_CAPS(transceiver->codec_preferences, "codec preferences");
 
        if (g_hash_table_size(webrtc->gst.source_slots) == 0) {
-               /* In this case, it might be an answerer without setting any media source.
-                * Check the default FEC value of media source, apply it if needed. */
-               if (!(ini_source = &(webrtc->ini.media_source)))
+               if (transceiver->mline >= MAX_MLINE_NUM) {
+                       LOG_ERROR("mline[%u] exceeds the max value", transceiver->mline);
                        return;
-               if (!ini_source->use_ulpfec_red)
-                       return;
-
-               __webrtcbin_transceiver_set_ulpfec_red(webrtc, ini_source->fec_percentage, transceiver);
+               }
+               /* In this case, it might be an answerer without setting any media source. */
+               if (webrtc->data_recovery_types[transceiver->mline].red &&
+                       webrtc->data_recovery_types[transceiver->mline].ulpfec)
+                       __webrtcbin_transceiver_set_ulpfec_red(webrtc, transceiver);
                return;
        }
 
@@ -1283,7 +1289,8 @@ static void __webrtcbin_on_new_transceiver_cb(GstElement *webrtcbin, GstWebRTCRT
                                if (!ini_source->use_ulpfec_red)
                                        return;
 
-                               __webrtcbin_transceiver_set_ulpfec_red(webrtc, ini_source->fec_percentage, transceiver);
+                               __webrtcbin_transceiver_set_ulpfec_red(webrtc, transceiver);
+                               __webrtcbin_transceiver_set_fec_percentage(webrtc, transceiver, ini_source->fec_percentage);
                                return;
                        }
                }