From f8529c10a97799582d9852b16b7ba8faa820f750 Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Thu, 11 Jan 2024 11:58:49 +0900 Subject: [PATCH] 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.4.33 [Issue Type] Improvement Change-Id: I9eaf492456d24977d300d0682bcbbf60acd0f9ef Signed-off-by: Sangchul Lee (cherry picked from commit 65cecdf58ca7f90bbf1774f944d0eb54db93ff0b) --- include/webrtc_private.h | 1 + packaging/capi-media-webrtc.spec | 2 +- src/webrtc_internal.c | 20 ++++++++++++++++++-- src/webrtc_transceiver.c | 20 ++++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 31299052..36ef21f3 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -714,6 +714,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 2b53668e..679a7857 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.4.32 +Version: 0.4.33 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_internal.c b/src/webrtc_internal.c index e3febaed..2e3753d5 100644 --- a/src/webrtc_internal.c +++ b/src/webrtc_internal.c @@ -157,6 +157,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"); @@ -178,13 +179,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); @@ -199,6 +214,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 6224c6fd..cde61595 100644 --- a/src/webrtc_transceiver.c +++ b/src/webrtc_transceiver.c @@ -373,6 +373,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; -- 2.34.1