Index: webrtc/video/video_send_stream.cc |
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc |
index 9ffe8a34c07f1139d19a4337f9894cc36507aa48..840991b4baceadf16fe026bd02915d816aa84da8 100644 |
--- a/webrtc/video/video_send_stream.cc |
+++ b/webrtc/video/video_send_stream.cc |
@@ -24,6 +24,7 @@ |
#include "webrtc/modules/pacing/packet_router.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
#include "webrtc/modules/utility/include/process_thread.h" |
+#include "webrtc/modules/video_coding/utility/ivf_file_writer.h" |
#include "webrtc/video/call_stats.h" |
#include "webrtc/video/video_capture_input.h" |
#include "webrtc/video/vie_remb.h" |
@@ -376,10 +377,12 @@ VideoSendStream::VideoSendStream( |
config.post_encode_callback, |
&stats_proxy_), |
vie_encoder_(num_cpu_cores, |
- config_.rtp.ssrcs, |
module_process_thread_, |
&stats_proxy_, |
&overuse_detector_), |
+ encoder_feedback_(Clock::GetRealTimeClock(), |
+ config.rtp.ssrcs, |
+ &vie_encoder_), |
video_sender_(vie_encoder_.video_sender()), |
bandwidth_observer_(congestion_controller_->GetBitrateController() |
->CreateRtcpBandwidthObserver()), |
@@ -407,7 +410,6 @@ VideoSendStream::VideoSendStream( |
RTC_DCHECK(congestion_controller_); |
RTC_DCHECK(remb_); |
- encoder_feedback_.Init(config_.rtp.ssrcs, &vie_encoder_); |
// RTP/RTCP initialization. |
for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { |
@@ -567,6 +569,13 @@ void VideoSendStream::EncoderProcess() { |
vie_encoder_.SetEncoder(encoder_settings->video_codec, |
encoder_settings->min_transmit_bitrate_bps, |
payload_router_.MaxPayloadLength(), this); |
+ |
+ // Clear stats for disabled layers. |
+ for (size_t i = encoder_settings->streams.size(); |
+ i < config_.rtp.ssrcs.size(); ++i) { |
+ stats_proxy_.OnInactiveSsrc(config_.rtp.ssrcs[i]); |
+ } |
+ |
if (config_.suspend_below_min_bitrate) { |
video_sender_->SuspendBelowMinBitrate(); |
bitrate_allocator_->EnforceMinBitrate(false); |
@@ -627,8 +636,33 @@ int32_t VideoSendStream::Encoded(const EncodedImage& encoded_image, |
// |encoded_frame_proxy_| forwards frames to |config_.post_encode_callback|; |
encoded_frame_proxy_.Encoded(encoded_image, codec_specific_info, |
fragmentation); |
- return payload_router_.Encoded(encoded_image, codec_specific_info, |
- fragmentation); |
+ int32_t return_value = payload_router_.Encoded( |
+ encoded_image, codec_specific_info, fragmentation); |
+ |
+ if (kEnableFrameRecording) { |
+ int layer = codec_specific_info->codecType == kVideoCodecVP8 |
+ ? codec_specific_info->codecSpecific.VP8.simulcastIdx |
+ : 0; |
+ IvfFileWriter* file_writer; |
+ { |
+ if (file_writers_[layer] == nullptr) { |
+ std::ostringstream oss; |
+ oss << "send_bitstream_ssrc"; |
+ for (uint32_t ssrc : config_.rtp.ssrcs) |
+ oss << "_" << ssrc; |
+ oss << "_layer" << layer << ".ivf"; |
+ file_writers_[layer] = |
+ IvfFileWriter::Open(oss.str(), codec_specific_info->codecType); |
+ } |
+ file_writer = file_writers_[layer].get(); |
+ } |
+ if (file_writer) { |
+ bool ok = file_writer->WriteFrame(encoded_image); |
+ RTC_DCHECK(ok); |
+ } |
+ } |
+ |
+ return return_value; |
} |
void VideoSendStream::ConfigureProtection() { |