Index: webrtc/video/video_send_stream.cc |
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc |
index 656d5517941754df85a99a073d9634718a46c365..419c960910fad60dde1e4eef6c9b86defc7a6b05 100644 |
--- a/webrtc/video/video_send_stream.cc |
+++ b/webrtc/video/video_send_stream.cc |
@@ -92,13 +92,12 @@ std::string VideoSendStream::Config::ToString() const { |
std::stringstream ss; |
ss << "{encoder_settings: " << encoder_settings.ToString(); |
ss << ", rtp: " << rtp.ToString(); |
- ss << ", pre_encode_callback: " |
- << (pre_encode_callback != nullptr ? "(I420FrameCallback)" : "nullptr"); |
- ss << ", post_encode_callback: " << (post_encode_callback != nullptr |
- ? "(EncodedFrameObserver)" |
- : "nullptr"); |
- ss << ", local_renderer: " << (local_renderer != nullptr ? "(VideoRenderer)" |
- : "nullptr"); |
+ if (pre_encode_callback) |
+ ss << ", pre_encode_effects: (I420FrameCallback)"; |
+ if (post_encode_callback) |
+ ss << ", post_encode_callback: (EncodedFrameObserver)"; |
+ if (local_renderer) |
+ ss << ", local_renderer: (VideoRenderer)"; |
ss << ", render_delay_ms: " << render_delay_ms; |
ss << ", target_delay_ms: " << target_delay_ms; |
ss << ", suspend_below_min_bitrate: " << (suspend_below_min_bitrate ? "on" |
@@ -127,8 +126,7 @@ VideoSendStream::VideoSendStream( |
module_process_thread_(module_process_thread), |
call_stats_(call_stats), |
congestion_controller_(congestion_controller), |
- encoder_feedback_(new EncoderStateFeedback()), |
- use_config_bitrate_(true) { |
+ encoder_feedback_(new EncoderStateFeedback()) { |
LOG(LS_INFO) << "VideoSendStream: " << config_.ToString(); |
RTC_DCHECK(!config_.rtp.ssrcs.empty()); |
@@ -207,22 +205,14 @@ VideoSendStream::VideoSendStream( |
vie_channel_->SetRTCPCName(config_.rtp.c_name.c_str()); |
input_.reset(new internal::VideoCaptureInput( |
- module_process_thread_, vie_encoder_.get(), config_.local_renderer, |
- &stats_proxy_, this, config_.encoding_time_observer)); |
+ module_process_thread_, vie_encoder_.get(), vie_encoder_->vcm(), this, |
+ config_, &stats_proxy_, this)); |
// 28 to match packet overhead in ModuleRtpRtcpImpl. |
RTC_DCHECK_LE(config_.rtp.max_packet_size, static_cast<size_t>(0xFFFF - 28)); |
vie_channel_->SetMTU(static_cast<uint16_t>(config_.rtp.max_packet_size + 28)); |
- RTC_DCHECK(config.encoder_settings.encoder != nullptr); |
- RTC_DCHECK_GE(config.encoder_settings.payload_type, 0); |
- RTC_DCHECK_LE(config.encoder_settings.payload_type, 127); |
- RTC_CHECK_EQ(0, vie_encoder_->RegisterExternalEncoder( |
- config.encoder_settings.encoder, |
- config.encoder_settings.payload_type, |
- config.encoder_settings.internal_source)); |
- |
- RTC_CHECK(ReconfigureVideoEncoder(encoder_config)); |
+ ReconfigureVideoEncoder(encoder_config); |
vie_channel_->RegisterSendSideDelayObserver(&stats_proxy_); |
@@ -230,7 +220,7 @@ VideoSendStream::VideoSendStream( |
vie_encoder_->RegisterPostEncodeImageCallback(&encoded_frame_proxy_); |
if (config_.suspend_below_min_bitrate) |
- vie_encoder_->SuspendBelowMinBitrate(); |
+ bitrate_allocator->EnforceMinBitrate(false); |
congestion_controller_->AddEncoder(vie_encoder_.get()); |
encoder_feedback_->AddEncoder(ssrcs, vie_encoder_.get()); |
@@ -254,9 +244,6 @@ VideoSendStream::~VideoSendStream() { |
// channel is deleted. |
input_.reset(); |
- vie_encoder_->DeRegisterExternalEncoder( |
- config_.encoder_settings.payload_type); |
- |
call_stats_->DeregisterStatsObserver(vie_channel_->GetStatsObserver()); |
congestion_controller_->SetChannelRembStatus(false, false, |
vie_channel_->rtp_rtcp()); |
@@ -294,7 +281,7 @@ void VideoSendStream::Stop() { |
transport_adapter_.Disable(); |
} |
-bool VideoSendStream::ReconfigureVideoEncoder( |
+void VideoSendStream::ReconfigureVideoEncoder( |
const VideoEncoderConfig& config) { |
TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder"); |
LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString(); |
@@ -428,23 +415,12 @@ bool VideoSendStream::ReconfigureVideoEncoder( |
RTC_DCHECK_GT(streams[0].max_framerate, 0); |
video_codec.maxFramerate = streams[0].max_framerate; |
- if (!SetSendCodec(video_codec)) |
- return false; |
- |
- // Clear stats for disabled layers. |
- for (size_t i = video_codec.numberOfSimulcastStreams; |
- i < config_.rtp.ssrcs.size(); ++i) { |
- stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]); |
- } |
- |
- stats_proxy_.SetContentType(config.content_type); |
+ input_->TriggerSetSendCodec(video_codec); |
RTC_DCHECK_GE(config.min_transmit_bitrate_bps, 0); |
vie_encoder_->SetMinTransmitBitrate(config.min_transmit_bitrate_bps / 1000); |
encoder_config_ = config; |
- use_config_bitrate_ = false; |
- return true; |
} |
bool VideoSendStream::DeliverRtcp(const uint8_t* packet, size_t length) { |
@@ -541,7 +517,7 @@ int VideoSendStream::GetPaddingNeededBps() const { |
return vie_encoder_->GetPaddingNeededBps(); |
} |
-bool VideoSendStream::SetSendCodec(VideoCodec video_codec) { |
+void VideoSendStream::SetSendCodec(VideoCodec video_codec) { |
static const int kEncoderMinBitrate = 30; |
if (video_codec.maxBitrate == 0) { |
// Unset max bitrate -> cap to one bit per pixel. |
@@ -558,15 +534,8 @@ bool VideoSendStream::SetSendCodec(VideoCodec video_codec) { |
// Stop the media flow while reconfiguring. |
vie_encoder_->Pause(); |
- if (vie_encoder_->SetEncoder(video_codec) != 0) { |
- LOG(LS_ERROR) << "Failed to set encoder."; |
- return false; |
- } |
- |
- if (vie_channel_->SetSendCodec(video_codec, false) != 0) { |
- LOG(LS_ERROR) << "Failed to set send codec."; |
- return false; |
- } |
+ vie_encoder_->SetEncoder(video_codec); |
+ vie_channel_->SetSendCodec(video_codec); |
// Not all configured SSRCs have to be utilized (simulcast senders don't have |
// to send on all SSRCs at once etc.) |
@@ -576,8 +545,17 @@ bool VideoSendStream::SetSendCodec(VideoCodec video_codec) { |
// Restart the media flow |
vie_encoder_->Restart(); |
+ // Clear stats for disabled layers. |
+ for (size_t i = video_codec.numberOfSimulcastStreams; |
+ i < config_.rtp.ssrcs.size(); ++i) { |
+ stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]); |
+ } |
- return true; |
+ VideoEncoderConfig::ContentType content_type = |
+ video_codec.mode == kRealtimeVideo |
+ ? VideoEncoderConfig::ContentType::kRealtimeVideo |
+ : VideoEncoderConfig::ContentType::kScreen; |
+ stats_proxy_.SetContentType(content_type); |
} |
} // namespace internal |