调用栈

image.png

WebrtcVideoSendStream::SetSendParameters

image.png

WebrtcVideoSendStream::SetCodec

image.png

  1. void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(
  2. const VideoCodecSettings& codec_settings) {
  3. RTC_DCHECK_RUN_ON(&thread_checker_);
  4. parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
  5. RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
  6. parameters_.config.rtp.payload_name = codec_settings.codec.name;
  7. parameters_.config.rtp.payload_type = codec_settings.codec.id;
  8. parameters_.config.rtp.raw_payload =
  9. codec_settings.codec.packetization == kPacketizationParamRaw;
  10. parameters_.config.rtp.ulpfec = codec_settings.ulpfec;
  11. parameters_.config.rtp.flexfec.payload_type =
  12. codec_settings.flexfec_payload_type;
  13. // Set RTX payload type if RTX is enabled.
  14. if (!parameters_.config.rtp.rtx.ssrcs.empty()) {
  15. if (codec_settings.rtx_payload_type == -1) {
  16. RTC_LOG(LS_WARNING)
  17. << "RTX SSRCs configured but there's no configured RTX "
  18. "payload type. Ignoring.";
  19. parameters_.config.rtp.rtx.ssrcs.clear();
  20. } else {
  21. parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type;
  22. }
  23. }
  24. const bool has_lntf = HasLntf(codec_settings.codec);
  25. parameters_.config.rtp.lntf.enabled = has_lntf;
  26. parameters_.config.encoder_settings.capabilities.loss_notification = has_lntf;
  27. parameters_.config.rtp.nack.rtp_history_ms =
  28. HasNack(codec_settings.codec) ? kNackHistoryMs : 0;
  29. parameters_.codec_settings = codec_settings;
  30. // TODO(nisse): Avoid recreation, it should be enough to call
  31. // ReconfigureEncoder.
  32. RTC_LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetCodec.";
  33. RecreateWebRtcStream();
  34. }

WebRtcVideoSendStream::RecreateWebRtcStream

image.png

  1. void WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream() {
  2. RTC_DCHECK_RUN_ON(&thread_checker_);
  3. if (stream_ != NULL) {
  4. call_->DestroyVideoSendStream(stream_);
  5. }
  6. RTC_CHECK(parameters_.codec_settings);
  7. RTC_DCHECK_EQ((parameters_.encoder_config.content_type ==
  8. webrtc::VideoEncoderConfig::ContentType::kScreen),
  9. parameters_.options.is_screencast.value_or(false))
  10. << "encoder content type inconsistent with screencast option";
  11. parameters_.encoder_config.encoder_specific_settings =
  12. ConfigureVideoEncoderSettings(parameters_.codec_settings->codec);
  13. webrtc::VideoSendStream::Config config = parameters_.config.Copy();
  14. if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) {
  15. RTC_LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX "
  16. "payload type the set codec. Ignoring RTX.";
  17. config.rtp.rtx.ssrcs.clear();
  18. }
  19. if (parameters_.encoder_config.number_of_streams == 1) {
  20. // SVC is used instead of simulcast. Remove unnecessary SSRCs.
  21. if (config.rtp.ssrcs.size() > 1) {
  22. config.rtp.ssrcs.resize(1);
  23. if (config.rtp.rtx.ssrcs.size() > 1) {
  24. config.rtp.rtx.ssrcs.resize(1);
  25. }
  26. }
  27. }
  28. stream_ = call_->CreateVideoSendStream(std::move(config),
  29. parameters_.encoder_config.Copy());
  30. parameters_.encoder_config.encoder_specific_settings = NULL;
  31. if (source_) {
  32. stream_->SetSource(source_, GetDegradationPreference());
  33. }
  34. // Call stream_->Start() if necessary conditions are met.
  35. UpdateSendState();
  36. }

Call::CreateVideoSendSendStream

image.png
会有两个ssrc,各自的用处是,一个是视频流,一个是重传流。
simucast又有很多ssrc。

  1. webrtc::VideoSendStream* Call::CreateVideoSendStream(
  2. webrtc::VideoSendStream::Config config,
  3. VideoEncoderConfig encoder_config) {
  4. if (config_.fec_controller_factory) {
  5. RTC_LOG(LS_INFO) << "External FEC Controller will be used.";
  6. }
  7. std::unique_ptr<FecController> fec_controller =
  8. config_.fec_controller_factory
  9. ? config_.fec_controller_factory->CreateFecController()
  10. : std::make_unique<FecControllerDefault>(clock_);
  11. return CreateVideoSendStream(std::move(config), std::move(encoder_config),
  12. std::move(fec_controller));
  13. }

小结

image.png