调用栈
WebrtcVideoSendStream::SetSendParameters
WebrtcVideoSendStream::SetCodec

void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(const VideoCodecSettings& codec_settings) {RTC_DCHECK_RUN_ON(&thread_checker_);parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);parameters_.config.rtp.payload_name = codec_settings.codec.name;parameters_.config.rtp.payload_type = codec_settings.codec.id;parameters_.config.rtp.raw_payload =codec_settings.codec.packetization == kPacketizationParamRaw;parameters_.config.rtp.ulpfec = codec_settings.ulpfec;parameters_.config.rtp.flexfec.payload_type =codec_settings.flexfec_payload_type;// Set RTX payload type if RTX is enabled.if (!parameters_.config.rtp.rtx.ssrcs.empty()) {if (codec_settings.rtx_payload_type == -1) {RTC_LOG(LS_WARNING)<< "RTX SSRCs configured but there's no configured RTX ""payload type. Ignoring.";parameters_.config.rtp.rtx.ssrcs.clear();} else {parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type;}}const bool has_lntf = HasLntf(codec_settings.codec);parameters_.config.rtp.lntf.enabled = has_lntf;parameters_.config.encoder_settings.capabilities.loss_notification = has_lntf;parameters_.config.rtp.nack.rtp_history_ms =HasNack(codec_settings.codec) ? kNackHistoryMs : 0;parameters_.codec_settings = codec_settings;// TODO(nisse): Avoid recreation, it should be enough to call// ReconfigureEncoder.RTC_LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetCodec.";RecreateWebRtcStream();}
WebRtcVideoSendStream::RecreateWebRtcStream

void WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream() {RTC_DCHECK_RUN_ON(&thread_checker_);if (stream_ != NULL) {call_->DestroyVideoSendStream(stream_);}RTC_CHECK(parameters_.codec_settings);RTC_DCHECK_EQ((parameters_.encoder_config.content_type ==webrtc::VideoEncoderConfig::ContentType::kScreen),parameters_.options.is_screencast.value_or(false))<< "encoder content type inconsistent with screencast option";parameters_.encoder_config.encoder_specific_settings =ConfigureVideoEncoderSettings(parameters_.codec_settings->codec);webrtc::VideoSendStream::Config config = parameters_.config.Copy();if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) {RTC_LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX ""payload type the set codec. Ignoring RTX.";config.rtp.rtx.ssrcs.clear();}if (parameters_.encoder_config.number_of_streams == 1) {// SVC is used instead of simulcast. Remove unnecessary SSRCs.if (config.rtp.ssrcs.size() > 1) {config.rtp.ssrcs.resize(1);if (config.rtp.rtx.ssrcs.size() > 1) {config.rtp.rtx.ssrcs.resize(1);}}}stream_ = call_->CreateVideoSendStream(std::move(config),parameters_.encoder_config.Copy());parameters_.encoder_config.encoder_specific_settings = NULL;if (source_) {stream_->SetSource(source_, GetDegradationPreference());}// Call stream_->Start() if necessary conditions are met.UpdateSendState();}
Call::CreateVideoSendSendStream

会有两个ssrc,各自的用处是,一个是视频流,一个是重传流。
simucast又有很多ssrc。
webrtc::VideoSendStream* Call::CreateVideoSendStream(webrtc::VideoSendStream::Config config,VideoEncoderConfig encoder_config) {if (config_.fec_controller_factory) {RTC_LOG(LS_INFO) << "External FEC Controller will be used.";}std::unique_ptr<FecController> fec_controller =config_.fec_controller_factory? config_.fec_controller_factory->CreateFecController(): std::make_unique<FecControllerDefault>(clock_);return CreateVideoSendStream(std::move(config), std::move(encoder_config),std::move(fec_controller));}
小结

