From: Sangchul Lee Date: Thu, 11 Jan 2024 02:58:49 +0000 (+0900) Subject: webrtc_internal: Set payloader type only if it is not occupied X-Git-Tag: accepted/tizen/7.0/unified/20240112.160320~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f56bbc56c11a2507f7260c1fd2635f19fc0ced86;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_internal: Set payloader type only if it is not occupied Codes for occupying and releasing payload type have been added in webrtc_media_source_set_payload_type(). Checking the media_type parameter of webrtc_media_source_get_payload_type() has been added to fix coverity defect. [Version] 0.3.299 [Issue Type] Improvement Change-Id: I9eaf492456d24977d300d0682bcbbf60acd0f9ef Signed-off-by: Sangchul Lee (cherry picked from commit 65cecdf58ca7f90bbf1774f944d0eb54db93ff0b) --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 4781271d..3061d6a2 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -703,6 +703,7 @@ void _update_transceivers_for_offer(webrtc_s *webrtc); int _set_payload_type(webrtc_s *webrtc, webrtc_gst_slot_s *source, int av_idx, const gchar *media_type); int _get_fixed_payload_type(const gchar *media_type); void _return_payload_type(webrtc_s *webrtc, unsigned int payload_type); +int _set_manual_payload_type(webrtc_s *webrtc, unsigned int payload_type); void _check_and_add_recvonly_transceiver(webrtc_gst_slot_s *source); int _add_transceiver(webrtc_gst_slot_s *source, webrtc_media_type_e media_type, rtp_payload_info_s *payload_info); int _set_transceiver_direction(webrtc_s *webrtc, unsigned int source_id, webrtc_media_type_e media_type, webrtc_transceiver_direction_e direction); diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 52cd7b62..78427a31 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.298 +Version: 0.3.299 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_internal.c b/src/webrtc_internal.c index a3a408bd..3a96eda9 100644 --- a/src/webrtc_internal.c +++ b/src/webrtc_internal.c @@ -182,6 +182,7 @@ int webrtc_media_source_set_payload_type(webrtc_h webrtc, unsigned int source_id g_autoptr(GMutexLocker) locker = NULL; const char *_media_type; int _pt; + int av_idx = GET_AV_IDX(media_type == WEBRTC_MEDIA_TYPE_AUDIO); RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL"); RET_VAL_IF(source_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "source_id is 0"); @@ -203,13 +204,27 @@ int webrtc_media_source_set_payload_type(webrtc_h webrtc, unsigned int source_id if (_pt != -1 && (unsigned int)_pt != pt) { LOG_ERROR("this media_type[%s] only allows fixed payload type[%d]", _media_type, _pt); return WEBRTC_ERROR_INVALID_PARAMETER; + + } else if (pt == source->av[av_idx].pt) { + source->av[av_idx].pt_set_by_api = true; + LOG_INFO("already payload type[%u] was set", pt == source->av[av_idx].pt); + return WEBRTC_ERROR_NONE; + } else if (pt < 96 || pt > 127) { LOG_ERROR("invalid value[%u] for dynamic payload type (96 ~ 127)", pt); return WEBRTC_ERROR_INVALID_PARAMETER; } - source->av[GET_AV_IDX(media_type == WEBRTC_MEDIA_TYPE_AUDIO)].pt = pt; - source->av[GET_AV_IDX(media_type == WEBRTC_MEDIA_TYPE_AUDIO)].pt_set_by_api = true; + /* occupy the pt if it is not used */ + if (_set_manual_payload_type(_webrtc, pt) != 0) + return WEBRTC_ERROR_INVALID_PARAMETER; + + /* release the previous pt */ + if (source->av[av_idx].pt > 0) + _return_payload_type(_webrtc, source->av[av_idx].pt); + + source->av[av_idx].pt = pt; + source->av[av_idx].pt_set_by_api = true; LOG_INFO("webrtc[%p] source_id[%u] media_type[%u] payload type[%u]", _webrtc, source_id, media_type, pt); @@ -224,6 +239,7 @@ int webrtc_media_source_get_payload_type(webrtc_h webrtc, unsigned int source_id RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL"); RET_VAL_IF(source_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "source_id is 0"); + RET_VAL_IF(media_type > WEBRTC_MEDIA_TYPE_VIDEO, WEBRTC_ERROR_INVALID_PARAMETER, "invalid media type"); RET_VAL_IF(pt == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "pt is NULL"); locker = g_mutex_locker_new(&_webrtc->mutex); diff --git a/src/webrtc_transceiver.c b/src/webrtc_transceiver.c index 6ee3fbb3..58a3a9e0 100644 --- a/src/webrtc_transceiver.c +++ b/src/webrtc_transceiver.c @@ -363,6 +363,26 @@ void _return_payload_type(webrtc_s *webrtc, unsigned int payload_type) webrtc->payload_types ^= bitmask; } +int _set_manual_payload_type(webrtc_s *webrtc, unsigned int payload_type) +{ + int bitmask = 0x1; + int count = 0; + + RET_VAL_IF(webrtc == NULL, -1, "webrtc is NULL"); + RET_VAL_IF(payload_type < MIN_DYNAMIC_PAYLOAD_TYPE || payload_type > MAX_DYNAMIC_PAYLOAD_TYPE, -1, "invalid payload_type(%u)", payload_type); + + while (++count != (int)(payload_type - MIN_DYNAMIC_PAYLOAD_TYPE + 1)) + bitmask <<= 1; + + if ((webrtc->payload_types & bitmask)) { + LOG_ERROR("already occupied pt[%u]", payload_type); + return -1; + } + + webrtc->payload_types |= bitmask; + return 0; +} + void _check_and_add_recvonly_transceiver(webrtc_gst_slot_s *source) { rtp_payload_info_s *payload_info = NULL;