| Index: webrtc/video/vie_encoder.cc
|
| diff --git a/webrtc/video/vie_encoder.cc b/webrtc/video/vie_encoder.cc
|
| index b0f62724ef1e9c8ee3e8624ba9e5bf242585bf99..89cbb5285f9c43030605705f80827001ce5d20a9 100644
|
| --- a/webrtc/video/vie_encoder.cc
|
| +++ b/webrtc/video/vie_encoder.cc
|
| @@ -38,28 +38,6 @@ namespace webrtc {
|
| static const float kStopPaddingThresholdMs = 2000;
|
| static const int kMinKeyFrameRequestIntervalMs = 300;
|
|
|
| -std::vector<uint32_t> AllocateStreamBitrates(
|
| - uint32_t total_bitrate,
|
| - const SimulcastStream* stream_configs,
|
| - size_t number_of_streams) {
|
| - if (number_of_streams == 0) {
|
| - std::vector<uint32_t> stream_bitrates(1, 0);
|
| - stream_bitrates[0] = total_bitrate;
|
| - return stream_bitrates;
|
| - }
|
| - std::vector<uint32_t> stream_bitrates(number_of_streams, 0);
|
| - uint32_t bitrate_remainder = total_bitrate;
|
| - for (size_t i = 0; i < stream_bitrates.size() && bitrate_remainder > 0; ++i) {
|
| - if (stream_configs[i].maxBitrate * 1000 > bitrate_remainder) {
|
| - stream_bitrates[i] = bitrate_remainder;
|
| - } else {
|
| - stream_bitrates[i] = stream_configs[i].maxBitrate * 1000;
|
| - }
|
| - bitrate_remainder -= stream_bitrates[i];
|
| - }
|
| - return stream_bitrates;
|
| -}
|
| -
|
| class QMVideoSettingsCallback : public VCMQMSettingsCallback {
|
| public:
|
| explicit QMVideoSettingsCallback(VideoProcessing* vpm);
|
| @@ -81,9 +59,7 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores,
|
| SendStatisticsProxy* stats_proxy,
|
| rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback,
|
| OveruseFrameDetector* overuse_detector,
|
| - PacedSender* pacer,
|
| - PayloadRouter* payload_router,
|
| - EncodedImageCallback* post_encode_callback)
|
| + PacedSender* pacer)
|
| : number_of_cores_(number_of_cores),
|
| ssrcs_(ssrcs),
|
| vp_(VideoProcessing::Create()),
|
| @@ -93,14 +69,12 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores,
|
| pre_encode_callback_(pre_encode_callback),
|
| overuse_detector_(overuse_detector),
|
| pacer_(pacer),
|
| - send_payload_router_(payload_router),
|
| - post_encode_callback_(post_encode_callback),
|
| time_of_last_frame_activity_ms_(0),
|
| encoder_config_(),
|
| min_transmit_bitrate_bps_(0),
|
| last_observed_bitrate_bps_(0),
|
| network_is_transmitting_(true),
|
| - encoder_paused_(false),
|
| + encoder_paused_(true),
|
| encoder_paused_and_dropped_frame_(false),
|
| time_last_intra_request_ms_(ssrcs.size(), -1),
|
| module_process_thread_(module_process_thread),
|
| @@ -149,7 +123,7 @@ void ViEEncoder::Pause() {
|
| encoder_paused_ = true;
|
| }
|
|
|
| -void ViEEncoder::Restart() {
|
| +void ViEEncoder::Start() {
|
| rtc::CritScope lock(&data_cs_);
|
| encoder_paused_ = false;
|
| }
|
| @@ -166,8 +140,9 @@ int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
|
| return 0;
|
| }
|
| void ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec,
|
| - int min_transmit_bitrate_bps) {
|
| - RTC_DCHECK(send_payload_router_);
|
| + int min_transmit_bitrate_bps,
|
| + size_t max_data_payload_length,
|
| + EncodedImageCallback* sink) {
|
| // Setting target width and height for VPM.
|
| RTC_CHECK_EQ(VPM_OK,
|
| vp_->SetTargetResolution(video_codec.width, video_codec.height,
|
| @@ -178,11 +153,13 @@ void ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec,
|
| {
|
| rtc::CritScope lock(&data_cs_);
|
| encoder_config_ = video_codec;
|
| - encoder_paused_ = true;
|
| min_transmit_bitrate_bps_ = min_transmit_bitrate_bps;
|
| }
|
| + {
|
| + rtc::CritScope lock(&sink_cs_);
|
| + sink_ = sink;
|
| + }
|
|
|
| - size_t max_data_payload_length = send_payload_router_->MaxPayloadLength();
|
| bool success = video_sender_.RegisterSendCodec(
|
| &video_codec, number_of_cores_,
|
| static_cast<uint32_t>(max_data_payload_length)) == VCM_OK;
|
| @@ -191,11 +168,6 @@ void ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec,
|
| RTC_DCHECK(success);
|
| }
|
|
|
| - send_payload_router_->SetSendingRtpModules(
|
| - video_codec.numberOfSimulcastStreams);
|
| -
|
| - // Restart the media flow
|
| - Restart();
|
| if (stats_proxy_) {
|
| // Clear stats for disabled layers.
|
| for (size_t i = video_codec.numberOfSimulcastStreams; i < ssrcs_.size();
|
| @@ -307,11 +279,6 @@ void ViEEncoder::TraceFrameDropEnd() {
|
| }
|
|
|
| void ViEEncoder::EncodeVideoFrame(const VideoFrame& video_frame) {
|
| - if (!send_payload_router_->active()) {
|
| - // We've paused or we have no channels attached, don't waste resources on
|
| - // encoding.
|
| - return;
|
| - }
|
| VideoCodecType codec_type;
|
| {
|
| rtc::CritScope lock(&data_cs_);
|
| @@ -394,25 +361,21 @@ void ViEEncoder::OnEncoderImplementationName(const char* implementation_name) {
|
| int32_t ViEEncoder::Encoded(const EncodedImage& encoded_image,
|
| const CodecSpecificInfo* codec_specific_info,
|
| const RTPFragmentationHeader* fragmentation) {
|
| - RTC_DCHECK(send_payload_router_);
|
| -
|
| {
|
| rtc::CritScope lock(&data_cs_);
|
| time_of_last_frame_activity_ms_ = TickTime::MillisecondTimestamp();
|
| }
|
| -
|
| - if (post_encode_callback_) {
|
| - post_encode_callback_->Encoded(encoded_image, codec_specific_info,
|
| - fragmentation);
|
| - }
|
| -
|
| if (stats_proxy_) {
|
| stats_proxy_->OnSendEncodedImage(encoded_image, codec_specific_info);
|
| }
|
| - int success = send_payload_router_->Encoded(
|
| - encoded_image, codec_specific_info, fragmentation);
|
| - overuse_detector_->FrameSent(encoded_image._timeStamp);
|
|
|
| + int success = 0;
|
| + {
|
| + rtc::CritScope lock(&sink_cs_);
|
| + success = sink_->Encoded(encoded_image, codec_specific_info, fragmentation);
|
| + }
|
| +
|
| + overuse_detector_->FrameSent(encoded_image._timeStamp);
|
| if (kEnableFrameRecording) {
|
| int layer = codec_specific_info->codecType == kVideoCodecVP8
|
| ? codec_specific_info->codecSpecific.VP8.simulcastIdx
|
| @@ -489,26 +452,17 @@ void ViEEncoder::OnBitrateUpdated(uint32_t bitrate_bps,
|
| LOG(LS_VERBOSE) << "OnBitrateUpdated, bitrate" << bitrate_bps
|
| << " packet loss " << static_cast<int>(fraction_lost)
|
| << " rtt " << round_trip_time_ms;
|
| - RTC_DCHECK(send_payload_router_);
|
| video_sender_.SetChannelParameters(bitrate_bps, fraction_lost,
|
| round_trip_time_ms);
|
| bool video_is_suspended = video_sender_.VideoSuspended();
|
| bool video_suspension_changed;
|
| - VideoCodec send_codec;
|
| {
|
| rtc::CritScope lock(&data_cs_);
|
| last_observed_bitrate_bps_ = bitrate_bps;
|
| video_suspension_changed = video_suspended_ != video_is_suspended;
|
| video_suspended_ = video_is_suspended;
|
| - send_codec = encoder_config_;
|
| }
|
|
|
| - SimulcastStream* stream_configs = send_codec.simulcastStream;
|
| - // Allocate the bandwidth between the streams.
|
| - std::vector<uint32_t> stream_bitrates = AllocateStreamBitrates(
|
| - bitrate_bps, stream_configs, send_codec.numberOfSimulcastStreams);
|
| - send_payload_router_->SetTargetSendBitrates(stream_bitrates);
|
| -
|
| if (!video_suspension_changed)
|
| return;
|
| // Video suspend-state changed, inform codec observer.
|
|
|