webrtc_internal: Set payloader type only if it is not occupied 97/304197/1
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 11 Jan 2024 02:58:49 +0000 (11:58 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 12 Jan 2024 01:28:35 +0000 (10:28 +0900)
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 <sc11.lee@samsung.com>
(cherry picked from commit 65cecdf58ca7f90bbf1774f944d0eb54db93ff0b)

include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_internal.c
src/webrtc_transceiver.c

index 4781271d34a2930c461dc54d73fd2b7ad025651e..3061d6a2d6fc0629e0823c62b2bee4e33da8721b 100644 (file)
@@ -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);
index 52cd7b626de062b717640e9bd69a882adf8393f5..78427a316c10703d89c248d6a99fb3e02afb0c4c 100644 (file)
@@ -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
index a3a408bd7c22ee98367ce5179b0948dc5536f416..3a96eda9b425d5bbc3b71b3a87a8ee0098f4792d 100644 (file)
@@ -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);
index 6ee3fbb3ca15cfe7569bb9acda6adeef308099f3..58a3a9e0de8128d1e7960a57441e8a75e71bd800 100644 (file)
@@ -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;