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);
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");
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);
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);
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;