return 0;
}
+static int __add_transceiver_for_simulcast(webrtc_gst_slot_s *source, webrtc_media_type_e media_type)
+{
+ GstWebRTCRTPTransceiver *trans;
+ g_autoptr(GstCaps) caps = NULL;
+ int av_idx = (media_type == WEBRTC_MEDIA_TYPE_AUDIO) ? AV_IDX_AUDIO : AV_IDX_VIDEO;
+ rtp_payload_info_s *payload_info;
+
+ RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
+
+ if (!source->av[av_idx].transceiver) {
+ if (source->av[av_idx].pt >= MIN_DYNAMIC_PAYLOAD_TYPE && !source->av[av_idx].pt_set_by_api)
+ _return_payload_type(source->webrtc, source->av[av_idx].pt);
+ payload_info = __get_payload_info_by_encoding_name(source->av[av_idx].codec);
+ ASSERT(payload_info);
+ if ((_set_payload_type(source->webrtc, source, av_idx, payload_info->gst_media_type)) != WEBRTC_ERROR_NONE)
+ return WEBRTC_ERROR_INVALID_OPERATION;
+
+ g_signal_emit_by_name(source->webrtc->gst.webrtcbin, "add-transceiver",
+ GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY, NULL, &trans, NULL);
+ caps = _create_simulcast_caps(source, false, media_type == WEBRTC_MEDIA_TYPE_AUDIO);
+ PRINT_CAPS(caps, "transceiver");
+ g_object_set(G_OBJECT(trans), "codec-preferences", caps, NULL);
+ gst_object_unref(trans);
+ }
+
+ LOG_DEBUG("webrtc[%p] source_id[%u] transceiver[%p]",
+ source->webrtc, source->id, source->av[av_idx].transceiver );
+
+ return WEBRTC_ERROR_NONE;
+}
+
void _check_and_add_recvonly_transceiver(webrtc_gst_slot_s *source)
{
rtp_payload_info_s *payload_info = NULL;
RET_IF(source == NULL, "source is NULL");
if (source->av[AV_IDX_AUDIO].direction == WEBRTC_TRANSCEIVER_DIRECTION_RECVONLY && source->av[AV_IDX_AUDIO].codec) {
- if ((payload_info = __get_payload_info_by_encoding_name(source->av[AV_IDX_AUDIO].codec)))
+ if (g_hash_table_size(source->av[AV_IDX_AUDIO].encodings) > 0)
+ __add_transceiver_for_simulcast(source, WEBRTC_MEDIA_TYPE_AUDIO);
+ else if ((payload_info = __get_payload_info_by_encoding_name(source->av[AV_IDX_AUDIO].codec)))
_add_transceiver(source, WEBRTC_MEDIA_TYPE_AUDIO, payload_info);
}
if (source->av[AV_IDX_VIDEO].direction == WEBRTC_TRANSCEIVER_DIRECTION_RECVONLY && source->av[AV_IDX_VIDEO].codec) {
- if ((payload_info = __get_payload_info_by_encoding_name(source->av[AV_IDX_VIDEO].codec)))
+ if (g_hash_table_size(source->av[AV_IDX_VIDEO].encodings) > 0)
+ __add_transceiver_for_simulcast(source, WEBRTC_MEDIA_TYPE_VIDEO);
+ else if ((payload_info = __get_payload_info_by_encoding_name(source->av[AV_IDX_VIDEO].codec)))
_add_transceiver(source, WEBRTC_MEDIA_TYPE_VIDEO, payload_info);
}
}
RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
RET_VAL_IF((source = _get_slot_by_id(webrtc->gst.source_slots, source_id)) == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
- RET_VAL_IF((source->type > WEBRTC_MEDIA_SOURCE_TYPE_MIC), WEBRTC_ERROR_INVALID_PARAMETER, "not supported media source type[%d]", source->type);
+ RET_VAL_IF((source->type > WEBRTC_MEDIA_SOURCE_TYPE_MIC && source->type != WEBRTC_MEDIA_SOURCE_TYPE_NULL), WEBRTC_ERROR_INVALID_PARAMETER, "not supported media source type[%d]", source->type);
RET_VAL_IF(rid == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "rid is NULL");
+ RET_VAL_IF(source->media_types == 0, WEBRTC_ERROR_INVALID_OPERATION, "source->media_types is 0");
if ((media_type == WEBRTC_MEDIA_TYPE_AUDIO && !(source->media_types & MEDIA_TYPE_AUDIO)) ||
(media_type == WEBRTC_MEDIA_TYPE_VIDEO && !(source->media_types & MEDIA_TYPE_VIDEO))) {
if (media_type == WEBRTC_MEDIA_TYPE_AUDIO)
LOG_DEBUG("media_type is AUDIO, skip width[%d] height[%d] parameters", width, height);
+ if (source->type == WEBRTC_MEDIA_SOURCE_TYPE_NULL)
+ LOG_DEBUG("NULL source type, skip target_bitrate[%d] width[%d] height[%d] parameters", target_bitrate, width, height);
ret = _add_source_encoding(source, av_idx, rid, target_bitrate, width, height, &ssrc);
if (ret != WEBRTC_ERROR_NONE)
case WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST:
ret = _build_videotestsrc(webrtc, source, ssrc);
break;
+ case WEBRTC_MEDIA_SOURCE_TYPE_NULL:
+ return WEBRTC_ERROR_NONE;
default:
/* TODO: support other types */
LOG_ERROR_IF_REACHED("type(%d)", source->type);