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:
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");
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) {
}
/* 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);
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");
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;
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,