webrtc_internal: Revise webrtc_media_source_set[get]_payload_type() 65/314565/3 accepted/tizen/unified/20240717.060545 accepted/tizen/unified/dev/20240718.035914 accepted/tizen/unified/x/20240718.022907
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 15 Jul 2024 09:37:22 +0000 (18:37 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 16 Jul 2024 03:54:31 +0000 (12:54 +0900)
Logic has been improved for multiple codecs of null source.
Now, payload type can be set to each codec of the null source.

[Version] 1.1.15
[Issue Type] Improvement

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

index 97b322dbcce05ed3ac467a8febd18f22fdd71668..063c504382b115104010ea5148d9e6c9e915885d 100644 (file)
@@ -607,6 +607,7 @@ typedef struct _webrtc_gst_slot_s {
                struct {
                        const char *codec;
                        unsigned int pt;
+                       bool pt_set_by_api;
                } multiple_codecs[MAX_MLINE_NUM];
                int num_of_codecs;
                struct {
index e04f8b35156ba4c9cbe70823eaab3576ab56334b..fe8ebf62959630cdd09b05f885f75e1933f8d403 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    1.1.14
+Version:    1.1.15
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index a3849142d8265ce20c8e7e5f97fe7da2e9f12823..4135c7a211be0f08d9f57ff52e6b9d367b28184d 100644 (file)
@@ -146,15 +146,15 @@ int webrtc_add_media_source_internal(webrtc_h webrtc, webrtc_media_source_type_i
 
 static bool __match_codec_with_media_type(webrtc_transceiver_codec_e codec, const char *media_type)
 {
-       ASSERT(media_type);
+       RET_VAL_IF(media_type == NULL, false, "media_type is NULL");
 
        switch (codec) {
        case WEBRTC_TRANSCEIVER_CODEC_PCMU:
-               if (g_strrstr(media_type, "pcmu") || g_strrstr(media_type, "PCMU"))
+               if (g_strrstr(media_type, "mulaw") || g_strrstr(media_type, "MULAW"))
                        return true;
                break;
        case WEBRTC_TRANSCEIVER_CODEC_PCMA:
-               if (g_strrstr(media_type, "pcma") || g_strrstr(media_type, "PCMA"))
+               if (g_strrstr(media_type, "alaw") || g_strrstr(media_type, "ALAW"))
                        return true;
                break;
        case WEBRTC_TRANSCEIVER_CODEC_OPUS:
@@ -188,6 +188,8 @@ int webrtc_media_source_set_payload_type(webrtc_h webrtc, unsigned int source_id
        const char *_media_type;
        int _pt;
        int av_idx = GET_AV_IDX(codec & CODEC_TYPE_AUDIO);
+       int mc_idx = -1;
+       int i;
 
        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");
@@ -197,23 +199,43 @@ int webrtc_media_source_set_payload_type(webrtc_h webrtc, unsigned int source_id
        RET_VAL_IF((source = _get_slot_by_id(_webrtc->gst.source_slots, source_id)) == NULL,
                WEBRTC_ERROR_INVALID_PARAMETER, "could not find source");
 
-       if (codec & CODEC_TYPE_AUDIO)
-               _media_type = _get_audio_media_type(source->av[AV_IDX_AUDIO].codec);
-       else
-               _media_type = _get_video_media_type(source->av[AV_IDX_VIDEO].codec);
-       RET_VAL_IF(_media_type == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "_media_type is NULL");
-       RET_VAL_IF(!__match_codec_with_media_type(codec, _media_type), WEBRTC_ERROR_INVALID_PARAMETER, "codec does not match with media_type");
+       if (source->av[av_idx].num_of_codecs > 0) {
+               for (i = 0; i < source->av[av_idx].num_of_codecs; i++) {
+                       const char *codec_str = source->av[av_idx].multiple_codecs[i].codec;
+                       _media_type = (codec & CODEC_TYPE_AUDIO) ?
+                               _get_audio_media_type(codec_str) : _get_video_media_type(codec_str);
+                       if (__match_codec_with_media_type(codec, _media_type)) {
+                               mc_idx = i;
+                               break;
+                       }
+               }
+               RET_VAL_IF(mc_idx == -1, WEBRTC_ERROR_INVALID_PARAMETER, "matched codec is not found");
+
+       } else {
+               _media_type = (codec & CODEC_TYPE_AUDIO) ?
+                       _get_audio_media_type(source->av[av_idx].codec) : _get_video_media_type(source->av[av_idx].codec);
+               RET_VAL_IF(_media_type == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "_media_type is NULL");
+               RET_VAL_IF(!__match_codec_with_media_type(codec, _media_type), WEBRTC_ERROR_INVALID_PARAMETER, "codec does not match with media_type");
+       }
 
        _pt = _get_fixed_payload_type(_media_type);
-       if (_pt != -1 && (unsigned int)_pt != pt) {
+       if (_pt != -1) {
                LOG_ERROR("this media_type[%s] only allows fixed payload type[%d]", _media_type, _pt);
                return WEBRTC_ERROR_INVALID_PARAMETER;
+       }
+
+       if (mc_idx != -1 && pt == source->av[av_idx].multiple_codecs[mc_idx].pt) {
+               if (!source->av[av_idx].multiple_codecs[mc_idx].pt_set_by_api)
+                       _return_payload_type(_webrtc, source->av[av_idx].multiple_codecs[mc_idx].pt);
+               source->av[av_idx].multiple_codecs[mc_idx].pt_set_by_api = true;
+               LOG_INFO("already payload type[%u] was set", source->av[av_idx].multiple_codecs[mc_idx].pt);
+               return WEBRTC_ERROR_NONE;
 
        } else if (pt == source->av[av_idx].pt) {
                if (!source->av[av_idx].pt_set_by_api)
                        _return_payload_type(_webrtc, 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);
+               LOG_INFO("already payload type[%u] was set", source->av[av_idx].pt);
                return WEBRTC_ERROR_NONE;
 
        } else if (pt < 96 || pt > 127) {
@@ -222,11 +244,20 @@ int webrtc_media_source_set_payload_type(webrtc_h webrtc, unsigned int source_id
        }
 
        /* release the previous pt */
-       if (!source->av[av_idx].pt_set_by_api && source->av[av_idx].pt > 0)
-               _return_payload_type(_webrtc, source->av[av_idx].pt);
+       if (mc_idx != -1) {
+               if (!source->av[av_idx].multiple_codecs[mc_idx].pt_set_by_api &&
+                       source->av[av_idx].multiple_codecs[mc_idx].pt > 0)
+                       _return_payload_type(_webrtc, source->av[av_idx].multiple_codecs[mc_idx].pt);
+
+               source->av[av_idx].multiple_codecs[mc_idx].pt = pt;
+               source->av[av_idx].multiple_codecs[mc_idx].pt_set_by_api = true;
+       } else {
+               if (!source->av[av_idx].pt_set_by_api && 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;
+               source->av[av_idx].pt = pt;
+               source->av[av_idx].pt_set_by_api = true;
+       }
 
        LOG_INFO("webrtc[%p] source_id[%u] codec[0x%x] payload type[%u]", _webrtc, source_id, codec, pt);
 
@@ -239,6 +270,8 @@ int webrtc_media_source_get_payload_type(webrtc_h webrtc, unsigned int source_id
        webrtc_gst_slot_s *source;
        g_autoptr(GMutexLocker) locker = NULL;
        const char *_media_type;
+       int av_idx = GET_AV_IDX(codec & CODEC_TYPE_AUDIO);
+       int i;
 
        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");
@@ -249,10 +282,24 @@ int webrtc_media_source_get_payload_type(webrtc_h webrtc, unsigned int source_id
        RET_VAL_IF((source = _get_slot_by_id(_webrtc->gst.source_slots, source_id)) == NULL,
                WEBRTC_ERROR_INVALID_PARAMETER, "could not find source");
 
-       if (codec & CODEC_TYPE_AUDIO)
-               _media_type = _get_audio_media_type(source->av[AV_IDX_AUDIO].codec);
-       else
-               _media_type = _get_video_media_type(source->av[AV_IDX_VIDEO].codec);
+       if (source->av[av_idx].num_of_codecs > 0) {
+               for (i = 0; i < source->av[av_idx].num_of_codecs; i++) {
+                       const char *codec_str = source->av[av_idx].multiple_codecs[i].codec;
+                       _media_type = (codec & CODEC_TYPE_AUDIO) ?
+                               _get_audio_media_type(codec_str) : _get_video_media_type(codec_str);
+                       if (__match_codec_with_media_type(codec, _media_type)) {
+                               *pt = source->av[av_idx].multiple_codecs[i].pt;
+
+                               LOG_INFO("webrtc[%p] source_id[%u] codec[0x%x] payload type[%u]", _webrtc, source_id, codec, *pt);
+                               return WEBRTC_ERROR_NONE;
+                       }
+               }
+               LOG_ERROR("could not find matched codec[0x%x]", codec);
+               return WEBRTC_ERROR_INVALID_PARAMETER;
+       }
+
+       _media_type = (codec & CODEC_TYPE_AUDIO) ?
+               _get_audio_media_type(source->av[av_idx].codec) : _get_video_media_type(source->av[av_idx].codec);
        RET_VAL_IF(!__match_codec_with_media_type(codec, _media_type), WEBRTC_ERROR_INVALID_PARAMETER, "codec does not match with media_type");
 
        *pt = source->av[GET_AV_IDX(codec & CODEC_TYPE_AUDIO)].pt;
index df4c3006740419dc6a11b0c3baeec8428cb6db1b..e11642bb025f11a5f7a6c91029c664ef7d0d17ac 100644 (file)
@@ -439,10 +439,22 @@ int __add_transceiver_with_multiple_codecs(webrtc_gst_slot_s *source, webrtc_med
                if (!(payload_info = __get_payload_info_by_encoding_name(source->av[av_idx].multiple_codecs[i].codec)))
                        return WEBRTC_ERROR_INVALID_OPERATION;
 
-               if ((pt = __get_available_payload_type(source->webrtc)) == -1)
-                       return WEBRTC_ERROR_INVALID_OPERATION;
-
-               source->av[av_idx].multiple_codecs[i].pt = pt;
+               LOG_DEBUG("i[%d] codec[%s] pt_set_by_api[%d]",
+                       i, source->av[av_idx].multiple_codecs[i].codec, source->av[av_idx].multiple_codecs[i].pt_set_by_api);
+               if (!source->av[av_idx].multiple_codecs[i].pt_set_by_api) {
+                       const char *codec_str = source->av[av_idx].multiple_codecs[i].codec;
+                       const char *_media_type = (media_type == WEBRTC_MEDIA_TYPE_AUDIO) ?
+                               _get_audio_media_type(codec_str) : _get_video_media_type(codec_str);
+
+                       if ((pt = _get_fixed_payload_type(_media_type)) != -1)
+                               LOG_DEBUG("fixed pt[%d] for _media_type[%s]", pt, _media_type);
+                       else if ((pt = __get_available_payload_type(source->webrtc)) == -1)
+                               return WEBRTC_ERROR_INVALID_OPERATION;
+
+                       source->av[av_idx].multiple_codecs[i].pt = pt;
+               } else {
+                       pt = source->av[av_idx].multiple_codecs[i].pt;
+               }
 
                _caps = gst_caps_new_simple("application/x-rtp",
                        "media", G_TYPE_STRING, payload_info->media_type,