OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/video/vie_encoder.h" | 11 #include "webrtc/video/vie_encoder.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include <limits> | 14 #include <limits> |
15 #include <utility> | 15 #include <utility> |
16 | 16 |
17 #include "webrtc/modules/video_coding/include/video_codec_initializer.h" | 17 #include "webrtc/modules/video_coding/include/video_codec_initializer.h" |
| 18 #include "webrtc/base/arraysize.h" |
18 #include "webrtc/base/checks.h" | 19 #include "webrtc/base/checks.h" |
19 #include "webrtc/base/logging.h" | 20 #include "webrtc/base/logging.h" |
20 #include "webrtc/base/trace_event.h" | 21 #include "webrtc/base/trace_event.h" |
21 #include "webrtc/base/timeutils.h" | 22 #include "webrtc/base/timeutils.h" |
22 #include "webrtc/common_video/include/video_bitrate_allocator.h" | 23 #include "webrtc/common_video/include/video_bitrate_allocator.h" |
23 #include "webrtc/modules/pacing/paced_sender.h" | 24 #include "webrtc/modules/pacing/paced_sender.h" |
24 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h" | 25 #include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h" |
25 #include "webrtc/modules/video_coding/include/video_coding.h" | 26 #include "webrtc/modules/video_coding/include/video_coding.h" |
26 #include "webrtc/modules/video_coding/include/video_coding_defines.h" | 27 #include "webrtc/modules/video_coding/include/video_coding_defines.h" |
27 #include "webrtc/video/overuse_frame_detector.h" | 28 #include "webrtc/video/overuse_frame_detector.h" |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 encoder_start_bitrate_bps_(0), | 256 encoder_start_bitrate_bps_(0), |
256 max_data_payload_length_(0), | 257 max_data_payload_length_(0), |
257 nack_enabled_(false), | 258 nack_enabled_(false), |
258 last_observed_bitrate_bps_(0), | 259 last_observed_bitrate_bps_(0), |
259 encoder_paused_and_dropped_frame_(false), | 260 encoder_paused_and_dropped_frame_(false), |
260 has_received_sli_(false), | 261 has_received_sli_(false), |
261 picture_id_sli_(0), | 262 picture_id_sli_(0), |
262 has_received_rpsi_(false), | 263 has_received_rpsi_(false), |
263 picture_id_rpsi_(0), | 264 picture_id_rpsi_(0), |
264 clock_(Clock::GetRealTimeClock()), | 265 clock_(Clock::GetRealTimeClock()), |
| 266 scale_counter_(kScaleReasonSize, 0), |
265 last_frame_width_(0), | 267 last_frame_width_(0), |
266 last_frame_height_(0), | 268 last_frame_height_(0), |
267 last_captured_timestamp_(0), | 269 last_captured_timestamp_(0), |
268 delta_ntp_internal_ms_(clock_->CurrentNtpInMilliseconds() - | 270 delta_ntp_internal_ms_(clock_->CurrentNtpInMilliseconds() - |
269 clock_->TimeInMilliseconds()), | 271 clock_->TimeInMilliseconds()), |
270 last_frame_log_ms_(clock_->TimeInMilliseconds()), | 272 last_frame_log_ms_(clock_->TimeInMilliseconds()), |
271 captured_frame_count_(0), | 273 captured_frame_count_(0), |
272 dropped_frame_count_(0), | 274 dropped_frame_count_(0), |
273 bitrate_observer_(nullptr), | 275 bitrate_observer_(nullptr), |
274 encoder_queue_("EncoderQueue") { | 276 encoder_queue_("EncoderQueue") { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 rtc::VideoSourceInterface<VideoFrame>* source, | 332 rtc::VideoSourceInterface<VideoFrame>* source, |
331 const VideoSendStream::DegradationPreference& degradation_preference) { | 333 const VideoSendStream::DegradationPreference& degradation_preference) { |
332 RTC_DCHECK_RUN_ON(&thread_checker_); | 334 RTC_DCHECK_RUN_ON(&thread_checker_); |
333 source_proxy_->SetSource(source, degradation_preference); | 335 source_proxy_->SetSource(source, degradation_preference); |
334 encoder_queue_.PostTask([this, degradation_preference] { | 336 encoder_queue_.PostTask([this, degradation_preference] { |
335 RTC_DCHECK_RUN_ON(&encoder_queue_); | 337 RTC_DCHECK_RUN_ON(&encoder_queue_); |
336 scaling_enabled_ = | 338 scaling_enabled_ = |
337 (degradation_preference != | 339 (degradation_preference != |
338 VideoSendStream::DegradationPreference::kMaintainResolution); | 340 VideoSendStream::DegradationPreference::kMaintainResolution); |
339 stats_proxy_->SetResolutionRestrictionStats( | 341 stats_proxy_->SetResolutionRestrictionStats( |
340 scaling_enabled_ && scale_counter_[kQuality] > 0, | 342 scaling_enabled_, scale_counter_[kCpu] > 0, scale_counter_[kQuality]); |
341 scaling_enabled_ && scale_counter_[kCpu] > 0); | |
342 }); | 343 }); |
343 } | 344 } |
344 | 345 |
345 void ViEEncoder::SetSink(EncoderSink* sink, bool rotation_applied) { | 346 void ViEEncoder::SetSink(EncoderSink* sink, bool rotation_applied) { |
346 source_proxy_->SetWantsRotationApplied(rotation_applied); | 347 source_proxy_->SetWantsRotationApplied(rotation_applied); |
347 encoder_queue_.PostTask([this, sink] { | 348 encoder_queue_.PostTask([this, sink] { |
348 RTC_DCHECK_RUN_ON(&encoder_queue_); | 349 RTC_DCHECK_RUN_ON(&encoder_queue_); |
349 sink_ = sink; | 350 sink_ = sink; |
350 }); | 351 }); |
351 } | 352 } |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 video_sender_.IntraFrameRequest(0); | 584 video_sender_.IntraFrameRequest(0); |
584 } | 585 } |
585 | 586 |
586 EncodedImageCallback::Result ViEEncoder::OnEncodedImage( | 587 EncodedImageCallback::Result ViEEncoder::OnEncodedImage( |
587 const EncodedImage& encoded_image, | 588 const EncodedImage& encoded_image, |
588 const CodecSpecificInfo* codec_specific_info, | 589 const CodecSpecificInfo* codec_specific_info, |
589 const RTPFragmentationHeader* fragmentation) { | 590 const RTPFragmentationHeader* fragmentation) { |
590 // Encoded is called on whatever thread the real encoder implementation run | 591 // Encoded is called on whatever thread the real encoder implementation run |
591 // on. In the case of hardware encoders, there might be several encoders | 592 // on. In the case of hardware encoders, there might be several encoders |
592 // running in parallel on different threads. | 593 // running in parallel on different threads. |
593 if (stats_proxy_) { | 594 if (stats_proxy_) |
594 stats_proxy_->OnSendEncodedImage(encoded_image, codec_specific_info); | 595 stats_proxy_->OnSendEncodedImage(encoded_image, codec_specific_info); |
595 } | |
596 | 596 |
597 EncodedImageCallback::Result result = | 597 EncodedImageCallback::Result result = |
598 sink_->OnEncodedImage(encoded_image, codec_specific_info, fragmentation); | 598 sink_->OnEncodedImage(encoded_image, codec_specific_info, fragmentation); |
599 | 599 |
600 int64_t time_sent = clock_->TimeInMilliseconds(); | 600 int64_t time_sent = clock_->TimeInMilliseconds(); |
601 uint32_t timestamp = encoded_image._timeStamp; | 601 uint32_t timestamp = encoded_image._timeStamp; |
602 const int qp = encoded_image.qp_; | 602 const int qp = encoded_image.qp_; |
603 encoder_queue_.PostTask([this, timestamp, time_sent, qp] { | 603 encoder_queue_.PostTask([this, timestamp, time_sent, qp] { |
604 RTC_DCHECK_RUN_ON(&encoder_queue_); | 604 RTC_DCHECK_RUN_ON(&encoder_queue_); |
605 overuse_detector_.FrameSent(timestamp, time_sent); | 605 overuse_detector_.FrameSent(timestamp, time_sent); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 RTC_DCHECK_RUN_ON(&encoder_queue_); | 694 RTC_DCHECK_RUN_ON(&encoder_queue_); |
695 if (!scaling_enabled_) | 695 if (!scaling_enabled_) |
696 return; | 696 return; |
697 // Request lower resolution if the current resolution is lower than last time | 697 // Request lower resolution if the current resolution is lower than last time |
698 // we asked for the resolution to be lowered. | 698 // we asked for the resolution to be lowered. |
699 int current_pixel_count = last_frame_height_ * last_frame_width_; | 699 int current_pixel_count = last_frame_height_ * last_frame_width_; |
700 if (max_pixel_count_ && current_pixel_count >= *max_pixel_count_) | 700 if (max_pixel_count_ && current_pixel_count >= *max_pixel_count_) |
701 return; | 701 return; |
702 switch (reason) { | 702 switch (reason) { |
703 case kQuality: | 703 case kQuality: |
704 stats_proxy_->OnQualityRestrictedResolutionChanged(true); | 704 stats_proxy_->OnQualityRestrictedResolutionChanged( |
| 705 scale_counter_[reason] + 1); |
705 break; | 706 break; |
706 case kCpu: | 707 case kCpu: |
707 if (scale_counter_[reason] >= kMaxCpuDowngrades) | 708 if (scale_counter_[reason] >= kMaxCpuDowngrades) |
708 return; | 709 return; |
709 // Update stats accordingly. | 710 // Update stats accordingly. |
710 stats_proxy_->OnCpuRestrictedResolutionChanged(true); | 711 stats_proxy_->OnCpuRestrictedResolutionChanged(true); |
711 break; | 712 break; |
712 } | 713 } |
713 max_pixel_count_ = rtc::Optional<int>(current_pixel_count); | 714 max_pixel_count_ = rtc::Optional<int>(current_pixel_count); |
714 max_pixel_count_step_up_ = rtc::Optional<int>(); | 715 max_pixel_count_step_up_ = rtc::Optional<int>(); |
(...skipping 11 matching lines...) Expand all Loading... |
726 if (scale_counter_[reason] == 0 || !scaling_enabled_) | 727 if (scale_counter_[reason] == 0 || !scaling_enabled_) |
727 return; | 728 return; |
728 // Only scale if resolution is higher than last time | 729 // Only scale if resolution is higher than last time |
729 // we requested higher resolution. | 730 // we requested higher resolution. |
730 int current_pixel_count = last_frame_height_ * last_frame_width_; | 731 int current_pixel_count = last_frame_height_ * last_frame_width_; |
731 if (current_pixel_count <= max_pixel_count_step_up_.value_or(0)) | 732 if (current_pixel_count <= max_pixel_count_step_up_.value_or(0)) |
732 return; | 733 return; |
733 switch (reason) { | 734 switch (reason) { |
734 case kQuality: | 735 case kQuality: |
735 stats_proxy_->OnQualityRestrictedResolutionChanged( | 736 stats_proxy_->OnQualityRestrictedResolutionChanged( |
736 scale_counter_[reason] > 1); | 737 scale_counter_[reason] - 1); |
737 break; | 738 break; |
738 case kCpu: | 739 case kCpu: |
739 // Update stats accordingly. | 740 // Update stats accordingly. |
740 stats_proxy_->OnCpuRestrictedResolutionChanged(scale_counter_[reason] > | 741 stats_proxy_->OnCpuRestrictedResolutionChanged(scale_counter_[reason] > |
741 1); | 742 1); |
742 break; | 743 break; |
743 } | 744 } |
744 max_pixel_count_ = rtc::Optional<int>(); | 745 max_pixel_count_ = rtc::Optional<int>(); |
745 max_pixel_count_step_up_ = rtc::Optional<int>(current_pixel_count); | 746 max_pixel_count_step_up_ = rtc::Optional<int>(current_pixel_count); |
746 --scale_counter_[reason]; | 747 --scale_counter_[reason]; |
747 source_proxy_->RequestHigherResolutionThan(current_pixel_count); | 748 source_proxy_->RequestHigherResolutionThan(current_pixel_count); |
748 LOG(LS_INFO) << "Scaling up resolution."; | 749 LOG(LS_INFO) << "Scaling up resolution."; |
749 for (size_t i = 0; i < kScaleReasonSize; ++i) { | 750 for (size_t i = 0; i < kScaleReasonSize; ++i) { |
750 LOG(LS_INFO) << "Scaled " << scale_counter_[i] | 751 LOG(LS_INFO) << "Scaled " << scale_counter_[i] |
751 << " times for reason: " << (i ? "quality" : "cpu"); | 752 << " times for reason: " << (i ? "quality" : "cpu"); |
752 } | 753 } |
753 } | 754 } |
754 | 755 |
755 } // namespace webrtc | 756 } // namespace webrtc |
OLD | NEW |