Index: webrtc/media/engine/webrtcvideoengine2.cc |
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc |
index 2dec8f43b6c738875eabb4bb1f252608382ec9d0..9a2c2da8f8c4210a4a618a3d0950a662029f0d31 100644 |
--- a/webrtc/media/engine/webrtcvideoengine2.cc |
+++ b/webrtc/media/engine/webrtcvideoengine2.cc |
@@ -1582,6 +1582,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( |
source_(nullptr), |
external_encoder_factory_(external_encoder_factory), |
stream_(nullptr), |
+ encoder_sink_(nullptr), |
parameters_(std::move(config), options, max_bitrate_bps, codec_settings), |
rtp_parameters_(CreateRtpParametersWithOneEncoding()), |
pending_encoder_reconfiguration_(false), |
@@ -1659,7 +1660,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( |
<< ", texture=" << last_frame_info_.is_texture; |
} |
- if (stream_ == NULL) { |
+ if (encoder_sink_ == NULL) { |
// Frame input before send codecs are configured, dropping frame. |
return; |
} |
@@ -1692,7 +1693,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( |
if (cpu_restricted_counter_ > 0) |
++cpu_restricted_frame_count_; |
- stream_->Input()->IncomingCapturedFrame(video_frame); |
+ encoder_sink_->OnFrame(video_frame); |
} |
bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( |
@@ -1715,7 +1716,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( |
if (options_present) { |
VideoOptions old_options = parameters_.options; |
parameters_.options.SetAll(*options); |
- // Reconfigure encoder settings on the naext frame or stream |
+ // Reconfigure encoder settings on the next frame or stream |
// recreation if the options changed. |
if (parameters_.options != old_options) { |
pending_encoder_reconfiguration_ = true; |
@@ -1728,7 +1729,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( |
// one. |
first_frame_timestamp_ms_ = rtc::Optional<int64_t>(); |
- if (source == nullptr && stream_ != nullptr) { |
+ if (source == nullptr && encoder_sink_ != nullptr) { |
LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; |
// Force this black frame not to be dropped due to timestamp order |
// check. As IncomingCapturedFrame will drop the frame if this frame's |
@@ -1741,9 +1742,9 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend( |
last_frame_info_.height)); |
black_buffer->SetToBlack(); |
- stream_->Input()->IncomingCapturedFrame(webrtc::VideoFrame( |
- black_buffer, 0 /* timestamp (90 kHz) */, |
- last_frame_timestamp_ms_, last_frame_info_.rotation)); |
+ encoder_sink_->OnFrame(webrtc::VideoFrame( |
+ black_buffer, 0 /* timestamp (90 kHz) */, last_frame_timestamp_ms_, |
+ last_frame_info_.rotation)); |
} |
source_ = source; |
} |
@@ -2065,6 +2066,23 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) { |
UpdateSendState(); |
} |
+void WebRtcVideoChannel2::WebRtcVideoSendStream::AddOrUpdateSink( |
+ VideoSinkInterface<webrtc::VideoFrame>* sink, |
+ const rtc::VideoSinkWants& wants) { |
+ // TODO(perkj): Actually consider the encoder |wants| and remove |
+ // WebRtcVideoSendStream::OnLoadUpdate(Load load). |
+ rtc::CritScope cs(&lock_); |
+ RTC_DCHECK(!encoder_sink_ || encoder_sink_ == sink); |
+ encoder_sink_ = sink; |
+} |
+ |
+void WebRtcVideoChannel2::WebRtcVideoSendStream::RemoveSink( |
+ VideoSinkInterface<webrtc::VideoFrame>* sink) { |
+ rtc::CritScope cs(&lock_); |
+ RTC_DCHECK(encoder_sink_&& encoder_sink_ = sink); |
sprang_webrtc
2016/09/02 07:19:31
You don't need to check encoder_sink_ != nullptr i
nisse-webrtc
2016/09/02 08:10:18
I think it is desirable to fail this DCHECK in the
sprang_webrtc
2016/09/02 09:07:04
Sure, but then I'd rather check that sink != nullp
perkj_webrtc
2016/09/02 12:18:21
Prefer just DCHECK(sink_ == sink);
|
+ encoder_sink_ = nullptr; |
+} |
+ |
void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) { |
if (worker_thread_ != rtc::Thread::Current()) { |
invoker_.AsyncInvoke<void>( |
@@ -2257,6 +2275,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() { |
} |
stream_ = call_->CreateVideoSendStream(std::move(config), |
parameters_.encoder_config.Copy()); |
+ stream_->SetSource(this); |
parameters_.encoder_config.encoder_specific_settings = NULL; |
pending_encoder_reconfiguration_ = false; |