From: Sangchul Lee Date: Mon, 13 Dec 2021 07:44:02 +0000 (+0900) Subject: webrtc_private: Add some parsing functions for rtpmap attribute X-Git-Tag: submit/tizen/20211216.092652~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9f2eb3b58c1f8460b2d9eb2160da1a5ebfd22a8e;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_private: Add some parsing functions for rtpmap attribute A verbose log for attribute key/value is added. [Version] 0.3.22 [Issue Type] Improvement Change-Id: I6412f5842f196b2310c42a48b39ae129d3c54e5c Signed-off-by: Sangchul Lee --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index f72afffa..dc32f7a5 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.3.21 +Version: 0.3.22 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_private.c b/src/webrtc_private.c index a5afdb0d..555620f7 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -220,6 +220,54 @@ static GstSDPMessage* __webrtcbin_get_description(GstElement *webrtcbin, bool is return desc->sdp; } +static int __parse_attribute_value(const gchar *value, int *pt, gchar **attr_param) +{ + gchar **values; + + RET_VAL_IF(value == NULL, -1, "value is NULL"); + RET_VAL_IF(pt == NULL && attr_param == NULL, -1, "pt and attr_param is NULL"); + + values = g_strsplit(value, " ", 2); + if (g_strv_length(values) != 2) { + LOG_ERROR("empty attribute parameter, value[%s]", value); + g_strfreev(values); + return -1; + } + + if (pt) { + if (!g_strcmp0(values[0], "0")) { + *pt = 0; + } else { + *pt = g_ascii_strtoll((const gchar *)values[0], NULL, 10); + /* g_ascii_strtoll() returns 0 on failure */ + if (*pt == 0) { + LOG_ERROR("invalid value[%s] for pt", values[0]); + g_strfreev(values); + return -1; + } + } + } + + if (attr_param) + *attr_param = g_strdup(values[1]); + + g_strfreev(values); + + return 0; +} + +static int __get_pt_and_encoding_info_from_rtpmap_attribute(const gchar *key, const gchar *value, int *pt, gchar **encoding_info) +{ + RET_VAL_IF(key == NULL, -1, "key is NULL"); + RET_VAL_IF(value == NULL, -1, "value is NULL"); + RET_VAL_IF(pt == NULL, -1, "pt is NULL"); + RET_VAL_IF(encoding_info == NULL, -1, "encoding_info is NULL"); + RET_VAL_IF(strcmp(key, "rtpmap"), -1, "invalid key[%s]", key); + RET_VAL_IF(__parse_attribute_value(value, pt, encoding_info), -1, "failed to __parse_attribute_value()"); + + return 0; +} + static void __update_data_recovery_type_from_remote_offer_description(webrtc_s *webrtc) { guint i, j; @@ -245,18 +293,27 @@ static void __update_data_recovery_type_from_remote_offer_description(webrtc_s * attr_length = gst_sdp_media_attributes_len(media); for (j = 0; j < attr_length; j++) { attr = gst_sdp_media_get_attribute(media, j); + LOG_VERBOSE(" attr[key:%s, value:%s]", attr->key, attr->value); + if (!strcmp(attr->key, "rtpmap")) { - if (g_strrstr(attr->value, "red/")) { - webrtc->data_recovery_types[i].red = true; - LOG_INFO(" RED is set [key:%s, value:%s]", attr->key, attr->value); + int pt; + gchar *encoding_info; + + if (__get_pt_and_encoding_info_from_rtpmap_attribute(attr->key, attr->value, &pt, &encoding_info) == -1) continue; - } - if (g_strrstr(attr->value, "ulpfec/")) { + + if (g_strrstr(encoding_info, "red")) { + webrtc->data_recovery_types[i].red = true; + LOG_INFO(" RED is set [key:%s, pt:%d, encoding_info:%s]", attr->key, pt, encoding_info); + + } else if (g_strrstr(encoding_info, "ulpfec")) { webrtc->data_recovery_types[i].ulpfec = true; - LOG_INFO(" ULPFEC is set [key:%s, value:%s]", attr->key, attr->value); - continue; + LOG_INFO(" ULPFEC is set [key:%s, pt:%d, encoding_info:%s]", attr->key, pt, encoding_info); } + + g_free(encoding_info); } + /* TODO: parsing 'fmtp' */ } } } @@ -1152,7 +1209,6 @@ static void __webrtcbin_transceiver_set_fec_percentage(webrtc_s *webrtc, GstWebR LOG_INFO("set fec-percentage[%u] to transceiver[%p]", fec_percentage, transceiver); } - //LCOV_EXCL_START gchar * _get_media_type_from_pad(GstPad *pad) {