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 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
66 if (kbps > 0) { | 66 if (kbps > 0) { |
67 if (kbps < 300 /* qvga */) { | 67 if (kbps < 300 /* qvga */) { |
68 return 320 * 240; | 68 return 320 * 240; |
69 } else if (kbps < 500 /* vga */) { | 69 } else if (kbps < 500 /* vga */) { |
70 return 640 * 480; | 70 return 640 * 480; |
71 } | 71 } |
72 } | 72 } |
73 return std::numeric_limits<uint32_t>::max(); | 73 return std::numeric_limits<uint32_t>::max(); |
74 } | 74 } |
75 | 75 |
76 // Limits for kBalanced degradation preference. | |
77 // >640x480: | max | | |
78 // <=640x480: | 15fps | max | | |
79 // <=480x270: | 10fps | 15fps | | |
80 // <=320x240: | 7fps | 10fps | | |
81 // ---------------------------------------------------------- | |
82 // kbps: 0 60 130 500 | | |
kthelgason
2017/05/19 08:34:14
Just out of curiosity, how are these determined?
åsapersson
2017/06/08 13:55:32
The bitrate limits were set roughly to a value whe
| |
83 | |
84 int MinFps(int pixels) { | |
85 if (pixels <= 320 * 240) | |
86 return 7; | |
87 else if (pixels <= 480 * 270) | |
88 return 10; | |
89 else if (pixels <= 640 * 480) | |
90 return 15; | |
91 else | |
92 return std::numeric_limits<int>::max(); | |
93 } | |
94 | |
95 int MaxFps(int pixels) { | |
96 if (pixels <= 320 * 240) | |
97 return 10; | |
98 else if (pixels <= 480 * 270) | |
99 return 15; | |
100 else | |
101 return std::numeric_limits<int>::max(); | |
102 } | |
103 | |
104 uint32_t BitrateLimit(int pixels) { | |
105 if (pixels <= 320 * 240) | |
106 return 60000; | |
107 else if (pixels <= 480 * 270) | |
108 return 130000; | |
109 else if (pixels <= 640 * 480) | |
110 return 500000; | |
111 else | |
112 return std::numeric_limits<uint32_t>::max(); | |
113 } | |
114 | |
115 int MaxFpsForBitrateAndResolution(uint32_t bps, int pixels) { | |
116 return (bps <= BitrateLimit(pixels)) ? MinFps(pixels) : MaxFps(pixels); | |
117 } | |
118 | |
76 bool IsResolutionScalingEnabled( | 119 bool IsResolutionScalingEnabled( |
77 VideoSendStream::DegradationPreference degradation_preference) { | 120 VideoSendStream::DegradationPreference degradation_preference) { |
78 return degradation_preference == | 121 return degradation_preference == |
79 VideoSendStream::DegradationPreference::kMaintainFramerate || | 122 VideoSendStream::DegradationPreference::kMaintainFramerate || |
80 degradation_preference == | 123 degradation_preference == |
81 VideoSendStream::DegradationPreference::kBalanced; | 124 VideoSendStream::DegradationPreference::kBalanced; |
82 } | 125 } |
83 | 126 |
84 bool IsFramerateScalingEnabled( | 127 bool IsFramerateScalingEnabled( |
85 VideoSendStream::DegradationPreference degradation_preference) { | 128 VideoSendStream::DegradationPreference degradation_preference) { |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
204 if (source_) | 247 if (source_) |
205 source_->AddOrUpdateSink(vie_encoder_, sink_wants_); | 248 source_->AddOrUpdateSink(vie_encoder_, sink_wants_); |
206 } | 249 } |
207 | 250 |
208 rtc::VideoSinkWants GetActiveSinkWants() EXCLUSIVE_LOCKS_REQUIRED(&crit_) { | 251 rtc::VideoSinkWants GetActiveSinkWants() EXCLUSIVE_LOCKS_REQUIRED(&crit_) { |
209 rtc::VideoSinkWants wants = sink_wants_; | 252 rtc::VideoSinkWants wants = sink_wants_; |
210 // Clear any constraints from the current sink wants that don't apply to | 253 // Clear any constraints from the current sink wants that don't apply to |
211 // the used degradation_preference. | 254 // the used degradation_preference. |
212 switch (degradation_preference_) { | 255 switch (degradation_preference_) { |
213 case VideoSendStream::DegradationPreference::kBalanced: | 256 case VideoSendStream::DegradationPreference::kBalanced: |
214 FALLTHROUGH(); | 257 break; |
215 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 258 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
216 wants.max_framerate_fps = std::numeric_limits<int>::max(); | 259 wants.max_framerate_fps = std::numeric_limits<int>::max(); |
217 break; | 260 break; |
218 case VideoSendStream::DegradationPreference::kMaintainResolution: | 261 case VideoSendStream::DegradationPreference::kMaintainResolution: |
219 wants.max_pixel_count = std::numeric_limits<int>::max(); | 262 wants.max_pixel_count = std::numeric_limits<int>::max(); |
220 wants.target_pixel_count.reset(); | 263 wants.target_pixel_count.reset(); |
221 break; | 264 break; |
222 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 265 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
223 wants.max_pixel_count = std::numeric_limits<int>::max(); | 266 wants.max_pixel_count = std::numeric_limits<int>::max(); |
224 wants.target_pixel_count.reset(); | 267 wants.target_pixel_count.reset(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
307 } else { | 350 } else { |
308 // The input video frame rate will be scaled up to the last step, with | 351 // The input video frame rate will be scaled up to the last step, with |
309 // rounding. | 352 // rounding. |
310 const int framerate_wanted = (framerate_fps * 3) / 2; | 353 const int framerate_wanted = (framerate_fps * 3) / 2; |
311 sink_wants_.max_framerate_fps = framerate_wanted; | 354 sink_wants_.max_framerate_fps = framerate_wanted; |
312 } | 355 } |
313 if (source_) | 356 if (source_) |
314 source_->AddOrUpdateSink(vie_encoder_, GetActiveSinkWants()); | 357 source_->AddOrUpdateSink(vie_encoder_, GetActiveSinkWants()); |
315 } | 358 } |
316 | 359 |
360 bool RestrictFpsOrRequestResolutionLowerThan(int max_fps, | |
361 int pixel_count, | |
362 bool* fps_changed) { | |
363 // Called on the encoder task queue. | |
kthelgason
2017/05/19 08:34:15
Do you want to add a thread_checker here to make t
åsapersson
2017/06/08 13:55:32
Can maybe do it in a separate cl.
| |
364 rtc::CritScope lock(&crit_); | |
365 // Restrict framerate if it is lower. | |
366 *fps_changed = false; | |
367 const int fps_wanted = std::max(kMinFramerateFps, max_fps); | |
368 if (fps_wanted < sink_wants_.max_framerate_fps && | |
369 RequestFramerateLocked(fps_wanted)) { | |
370 *fps_changed = true; | |
371 return true; | |
kthelgason
2017/05/19 08:34:14
I don't really like this weird way of signalling w
åsapersson
2017/06/08 13:55:32
This part has been changed in https://codereview.w
| |
372 } | |
373 // Request lower resolution. | |
374 if (!IsResolutionScalingEnabledLocked()) | |
375 return false; | |
376 | |
377 // The input video frame size will have a resolution less than or equal to | |
378 // |max_pixel_count| depending on how the source can scale the frame size. | |
379 const int pixels_wanted = (pixel_count * 3) / 5; | |
380 if (pixels_wanted < kMinPixelsPerFrame || | |
381 pixels_wanted >= sink_wants_.max_pixel_count) { | |
382 return false; | |
383 } | |
384 sink_wants_.max_pixel_count = pixels_wanted; | |
385 sink_wants_.target_pixel_count = rtc::Optional<int>(); | |
386 if (source_) | |
kthelgason
2017/05/19 08:34:14
Maybe we should just bail out right at the start i
åsapersson
2017/06/08 13:55:32
Done in https://codereview.webrtc.org/2903563002/.
| |
387 source_->AddOrUpdateSink(vie_encoder_, GetActiveSinkWants()); | |
388 return true; | |
389 } | |
390 | |
391 bool IncreaseFpsOrRequestHigherResolutionThan(int max_fps, | |
392 int pixel_count, | |
393 bool* fps_changed) { | |
394 // Called on the encoder task queue. | |
395 rtc::CritScope lock(&crit_); | |
396 // Increase framerate if it is higher. | |
397 *fps_changed = false; | |
398 const int fps_wanted = std::max(kMinFramerateFps, max_fps); | |
399 if (fps_wanted > sink_wants_.max_framerate_fps && | |
400 RequestFramerateLocked(fps_wanted)) { | |
401 *fps_changed = true; | |
402 return true; | |
403 } | |
404 // Request higher resolution. | |
405 if (!IsResolutionScalingEnabledLocked()) | |
406 return false; | |
407 | |
408 int max_pixels_wanted = pixel_count; | |
409 if (max_pixels_wanted != std::numeric_limits<int>::max()) | |
410 max_pixels_wanted = pixel_count * 4; | |
411 | |
412 if (max_pixels_wanted <= sink_wants_.max_pixel_count) | |
413 return false; | |
414 | |
415 sink_wants_.max_pixel_count = max_pixels_wanted; | |
416 if (max_pixels_wanted == std::numeric_limits<int>::max()) { | |
417 sink_wants_.target_pixel_count.reset(); | |
418 } else { | |
419 sink_wants_.target_pixel_count = | |
420 rtc::Optional<int>((pixel_count * 5) / 3); | |
421 } | |
422 if (source_) | |
423 source_->AddOrUpdateSink(vie_encoder_, GetActiveSinkWants()); | |
424 return true; | |
425 } | |
426 | |
317 private: | 427 private: |
428 bool RequestFramerateLocked(int framerate_fps) | |
429 EXCLUSIVE_LOCKS_REQUIRED(&crit_) { | |
430 if (!IsFramerateScalingEnabledLocked()) | |
431 return false; | |
432 | |
433 sink_wants_.max_framerate_fps = framerate_fps; | |
434 if (source_) | |
435 source_->AddOrUpdateSink(vie_encoder_, GetActiveSinkWants()); | |
436 return true; | |
437 } | |
438 | |
318 bool IsResolutionScalingEnabledLocked() const | 439 bool IsResolutionScalingEnabledLocked() const |
319 EXCLUSIVE_LOCKS_REQUIRED(&crit_) { | 440 EXCLUSIVE_LOCKS_REQUIRED(&crit_) { |
320 return degradation_preference_ == | 441 return degradation_preference_ == |
321 VideoSendStream::DegradationPreference::kMaintainFramerate || | 442 VideoSendStream::DegradationPreference::kMaintainFramerate || |
322 degradation_preference_ == | 443 degradation_preference_ == |
323 VideoSendStream::DegradationPreference::kBalanced; | 444 VideoSendStream::DegradationPreference::kBalanced; |
324 } | 445 } |
325 | 446 |
326 bool IsFramerateScalingEnabledLocked() const | 447 bool IsFramerateScalingEnabledLocked() const |
327 EXCLUSIVE_LOCKS_REQUIRED(&crit_) { | 448 EXCLUSIVE_LOCKS_REQUIRED(&crit_) { |
328 // TODO(sprang): Also accept kBalanced here? | |
329 return degradation_preference_ == | 449 return degradation_preference_ == |
330 VideoSendStream::DegradationPreference::kMaintainResolution; | 450 VideoSendStream::DegradationPreference::kMaintainResolution || |
451 degradation_preference_ == | |
452 VideoSendStream::DegradationPreference::kBalanced; | |
331 } | 453 } |
332 | 454 |
333 rtc::CriticalSection crit_; | 455 rtc::CriticalSection crit_; |
334 rtc::SequencedTaskChecker main_checker_; | 456 rtc::SequencedTaskChecker main_checker_; |
335 ViEEncoder* const vie_encoder_; | 457 ViEEncoder* const vie_encoder_; |
336 rtc::VideoSinkWants sink_wants_ GUARDED_BY(&crit_); | 458 rtc::VideoSinkWants sink_wants_ GUARDED_BY(&crit_); |
337 VideoSendStream::DegradationPreference degradation_preference_ | 459 VideoSendStream::DegradationPreference degradation_preference_ |
338 GUARDED_BY(&crit_); | 460 GUARDED_BY(&crit_); |
339 rtc::VideoSourceInterface<VideoFrame>* source_ GUARDED_BY(&crit_); | 461 rtc::VideoSourceInterface<VideoFrame>* source_ GUARDED_BY(&crit_); |
340 | 462 |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
810 stats_proxy_->GetStats().input_frame_rate, | 932 stats_proxy_->GetStats().input_frame_rate, |
811 AdaptationRequest::Mode::kAdaptDown}; | 933 AdaptationRequest::Mode::kAdaptDown}; |
812 | 934 |
813 bool downgrade_requested = | 935 bool downgrade_requested = |
814 last_adaptation_request_ && | 936 last_adaptation_request_ && |
815 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptDown; | 937 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptDown; |
816 | 938 |
817 int max_downgrades = 0; | 939 int max_downgrades = 0; |
818 switch (degradation_preference_) { | 940 switch (degradation_preference_) { |
819 case VideoSendStream::DegradationPreference::kBalanced: | 941 case VideoSendStream::DegradationPreference::kBalanced: |
820 FALLTHROUGH(); | 942 max_downgrades = kMaxCpuResolutionDowngrades; |
943 break; | |
821 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 944 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
822 max_downgrades = kMaxCpuResolutionDowngrades; | 945 max_downgrades = kMaxCpuResolutionDowngrades; |
823 if (downgrade_requested && | 946 if (downgrade_requested && |
824 adaptation_request.input_pixel_count_ >= | 947 adaptation_request.input_pixel_count_ >= |
825 last_adaptation_request_->input_pixel_count_) { | 948 last_adaptation_request_->input_pixel_count_) { |
826 // Don't request lower resolution if the current resolution is not | 949 // Don't request lower resolution if the current resolution is not |
827 // lower than the last time we asked for the resolution to be lowered. | 950 // lower than the last time we asked for the resolution to be lowered. |
828 return; | 951 return; |
829 } | 952 } |
830 break; | 953 break; |
(...skipping 14 matching lines...) Expand all Loading... | |
845 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 968 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
846 return; | 969 return; |
847 } | 970 } |
848 | 971 |
849 if (reason == kCpu) { | 972 if (reason == kCpu) { |
850 if (GetConstAdaptCounter().TotalCount(kCpu) >= max_downgrades) | 973 if (GetConstAdaptCounter().TotalCount(kCpu) >= max_downgrades) |
851 return; | 974 return; |
852 } | 975 } |
853 | 976 |
854 switch (degradation_preference_) { | 977 switch (degradation_preference_) { |
855 case VideoSendStream::DegradationPreference::kBalanced: | 978 case VideoSendStream::DegradationPreference::kBalanced: { |
856 FALLTHROUGH(); | 979 int max_fps = MaxFpsForBitrateAndResolution( |
980 last_observed_bitrate_bps_, last_frame_info_->pixel_count()); | |
981 bool fps_restricted; | |
982 if (!source_proxy_->RestrictFpsOrRequestResolutionLowerThan( | |
983 max_fps, adaptation_request.input_pixel_count_, | |
984 &fps_restricted)) { | |
985 return; | |
986 } | |
987 if (fps_restricted) { | |
988 LOG(LS_INFO) << "Scaling down framerate: " << max_fps; | |
989 GetAdaptCounter().IncrementFramerate(reason); | |
990 } else { | |
991 LOG(LS_INFO) << "Scaling down resolution."; | |
992 GetAdaptCounter().IncrementResolution(reason); | |
993 } | |
994 break; | |
995 } | |
857 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 996 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
858 if (!source_proxy_->RequestResolutionLowerThan( | 997 if (!source_proxy_->RequestResolutionLowerThan( |
859 adaptation_request.input_pixel_count_)) { | 998 adaptation_request.input_pixel_count_)) { |
860 return; | 999 return; |
861 } | 1000 } |
862 LOG(LS_INFO) << "Scaling down resolution."; | 1001 LOG(LS_INFO) << "Scaling down resolution."; |
863 GetAdaptCounter().IncrementResolution(reason, 1); | 1002 GetAdaptCounter().IncrementResolution(reason); |
864 break; | 1003 break; |
865 case VideoSendStream::DegradationPreference::kMaintainResolution: | 1004 case VideoSendStream::DegradationPreference::kMaintainResolution: |
866 source_proxy_->RequestFramerateLowerThan( | 1005 source_proxy_->RequestFramerateLowerThan( |
867 adaptation_request.framerate_fps_); | 1006 adaptation_request.framerate_fps_); |
868 LOG(LS_INFO) << "Scaling down framerate."; | 1007 LOG(LS_INFO) << "Scaling down framerate."; |
869 GetAdaptCounter().IncrementFramerate(reason, 1); | 1008 GetAdaptCounter().IncrementFramerate(reason); |
870 break; | 1009 break; |
871 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 1010 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
872 RTC_NOTREACHED(); | 1011 RTC_NOTREACHED(); |
873 } | 1012 } |
874 | 1013 |
875 last_adaptation_request_.emplace(adaptation_request); | 1014 last_adaptation_request_.emplace(adaptation_request); |
876 | 1015 |
877 UpdateAdaptationStats(reason); | 1016 UpdateAdaptationStats(reason); |
878 | 1017 |
879 LOG(LS_INFO) << GetConstAdaptCounter().ToString(); | 1018 LOG(LS_INFO) << GetConstAdaptCounter().ToString(); |
(...skipping 12 matching lines...) Expand all Loading... | |
892 last_frame_info_->pixel_count(), | 1031 last_frame_info_->pixel_count(), |
893 stats_proxy_->GetStats().input_frame_rate, | 1032 stats_proxy_->GetStats().input_frame_rate, |
894 AdaptationRequest::Mode::kAdaptUp}; | 1033 AdaptationRequest::Mode::kAdaptUp}; |
895 | 1034 |
896 bool adapt_up_requested = | 1035 bool adapt_up_requested = |
897 last_adaptation_request_ && | 1036 last_adaptation_request_ && |
898 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptUp; | 1037 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptUp; |
899 | 1038 |
900 switch (degradation_preference_) { | 1039 switch (degradation_preference_) { |
901 case VideoSendStream::DegradationPreference::kBalanced: | 1040 case VideoSendStream::DegradationPreference::kBalanced: |
902 FALLTHROUGH(); | 1041 break; |
903 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 1042 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
904 if (adapt_up_requested && | 1043 if (adapt_up_requested && |
905 adaptation_request.input_pixel_count_ <= | 1044 adaptation_request.input_pixel_count_ <= |
906 last_adaptation_request_->input_pixel_count_) { | 1045 last_adaptation_request_->input_pixel_count_) { |
907 // Don't request higher resolution if the current resolution is not | 1046 // Don't request higher resolution if the current resolution is not |
908 // higher than the last time we asked for the resolution to be higher. | 1047 // higher than the last time we asked for the resolution to be higher. |
909 return; | 1048 return; |
910 } | 1049 } |
911 break; | 1050 break; |
912 case VideoSendStream::DegradationPreference::kMaintainResolution: | 1051 case VideoSendStream::DegradationPreference::kMaintainResolution: |
913 // TODO(sprang): Don't request higher framerate if we are already at | 1052 // TODO(sprang): Don't request higher framerate if we are already at |
914 // max requested fps? | 1053 // max requested fps? |
915 break; | 1054 break; |
916 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 1055 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
917 return; | 1056 return; |
918 } | 1057 } |
919 | 1058 |
920 switch (degradation_preference_) { | 1059 switch (degradation_preference_) { |
kthelgason
2017/05/19 08:34:14
Why do we have these two identical switch statemen
åsapersson
2017/06/08 13:55:32
Removed the one above.
| |
921 case VideoSendStream::DegradationPreference::kBalanced: | 1060 case VideoSendStream::DegradationPreference::kBalanced: { |
922 FALLTHROUGH(); | 1061 int pixel_count = adaptation_request.input_pixel_count_; |
1062 if (adapt_counter.ResolutionCount() == 1) { | |
1063 LOG(LS_INFO) << "Removing down-scaling setting."; | |
1064 pixel_count = std::numeric_limits<int>::max(); | |
1065 } | |
1066 int fps = MaxFps(last_frame_info_->pixel_count()); | |
1067 bool fps_changed; | |
1068 if (!source_proxy_->IncreaseFpsOrRequestHigherResolutionThan( | |
1069 fps, pixel_count, &fps_changed)) { | |
1070 return; | |
1071 } | |
1072 if (fps_changed) { | |
1073 LOG(LS_INFO) << "Scaling up framerate: " << fps; | |
1074 GetAdaptCounter().DecrementFramerate(reason); | |
1075 } else { | |
1076 LOG(LS_INFO) << "Scaling up resolution."; | |
1077 GetAdaptCounter().DecrementResolution(reason); | |
1078 } | |
1079 break; | |
1080 } | |
923 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 1081 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
924 if (adapt_counter.TotalCount() == 1) { | 1082 if (adapt_counter.TotalCount() == 1) { |
925 LOG(LS_INFO) << "Removing resolution down-scaling setting."; | 1083 LOG(LS_INFO) << "Removing resolution down-scaling setting."; |
926 source_proxy_->RequestHigherResolutionThan( | 1084 source_proxy_->RequestHigherResolutionThan( |
927 std::numeric_limits<int>::max()); | 1085 std::numeric_limits<int>::max()); |
928 } else { | 1086 } else { |
929 source_proxy_->RequestHigherResolutionThan( | 1087 source_proxy_->RequestHigherResolutionThan( |
930 adaptation_request.input_pixel_count_); | 1088 adaptation_request.input_pixel_count_); |
931 LOG(LS_INFO) << "Scaling up resolution."; | 1089 LOG(LS_INFO) << "Scaling up resolution."; |
932 } | 1090 } |
933 GetAdaptCounter().IncrementResolution(reason, -1); | 1091 GetAdaptCounter().DecrementResolution(reason); |
934 break; | 1092 break; |
935 case VideoSendStream::DegradationPreference::kMaintainResolution: | 1093 case VideoSendStream::DegradationPreference::kMaintainResolution: |
936 if (adapt_counter.TotalCount() == 1) { | 1094 if (adapt_counter.TotalCount() == 1) { |
937 LOG(LS_INFO) << "Removing framerate down-scaling setting."; | 1095 LOG(LS_INFO) << "Removing framerate down-scaling setting."; |
938 source_proxy_->RequestHigherFramerateThan( | 1096 source_proxy_->RequestHigherFramerateThan( |
939 std::numeric_limits<int>::max()); | 1097 std::numeric_limits<int>::max()); |
940 } else { | 1098 } else { |
941 source_proxy_->RequestHigherFramerateThan( | 1099 source_proxy_->RequestHigherFramerateThan( |
942 adaptation_request.framerate_fps_); | 1100 adaptation_request.framerate_fps_); |
943 LOG(LS_INFO) << "Scaling up framerate."; | 1101 LOG(LS_INFO) << "Scaling up framerate."; |
944 } | 1102 } |
945 GetAdaptCounter().IncrementFramerate(reason, -1); | 1103 GetAdaptCounter().DecrementFramerate(reason); |
946 break; | 1104 break; |
947 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 1105 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
948 RTC_NOTREACHED(); | 1106 RTC_NOTREACHED(); |
949 } | 1107 } |
950 | 1108 |
951 last_adaptation_request_.emplace(adaptation_request); | 1109 last_adaptation_request_.emplace(adaptation_request); |
952 | 1110 |
953 UpdateAdaptationStats(reason); | 1111 UpdateAdaptationStats(reason); |
954 | 1112 |
955 LOG(LS_INFO) << adapt_counter.ToString(); | 1113 LOG(LS_INFO) << adapt_counter.ToString(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
996 } | 1154 } |
997 | 1155 |
998 const ViEEncoder::AdaptCounter& ViEEncoder::GetConstAdaptCounter() { | 1156 const ViEEncoder::AdaptCounter& ViEEncoder::GetConstAdaptCounter() { |
999 return adapt_counters_[degradation_preference_]; | 1157 return adapt_counters_[degradation_preference_]; |
1000 } | 1158 } |
1001 | 1159 |
1002 // Class holding adaptation information. | 1160 // Class holding adaptation information. |
1003 ViEEncoder::AdaptCounter::AdaptCounter() { | 1161 ViEEncoder::AdaptCounter::AdaptCounter() { |
1004 fps_counters_.resize(kScaleReasonSize); | 1162 fps_counters_.resize(kScaleReasonSize); |
1005 resolution_counters_.resize(kScaleReasonSize); | 1163 resolution_counters_.resize(kScaleReasonSize); |
1164 RTC_DCHECK_EQ(fps_counters_.size(), 2) << "Update MoveCount()"; | |
1165 RTC_DCHECK_EQ(resolution_counters_.size(), 2) << "Update MoveCount()"; | |
1006 } | 1166 } |
1007 | 1167 |
1008 ViEEncoder::AdaptCounter::~AdaptCounter() {} | 1168 ViEEncoder::AdaptCounter::~AdaptCounter() {} |
1009 | 1169 |
1010 std::string ViEEncoder::AdaptCounter::ToString() const { | 1170 std::string ViEEncoder::AdaptCounter::ToString() const { |
1011 std::stringstream ss; | 1171 std::stringstream ss; |
1012 ss << "Downgrade counts: fps: {" << ToString(fps_counters_); | 1172 ss << "Downgrade counts: fps: {" << ToString(fps_counters_); |
1013 ss << "}, resolution: {" << ToString(resolution_counters_) << "}"; | 1173 ss << "}, resolution: {" << ToString(resolution_counters_) << "}"; |
1014 return ss.str(); | 1174 return ss.str(); |
1015 } | 1175 } |
1016 | 1176 |
1017 ViEEncoder::AdaptCounts ViEEncoder::AdaptCounter::Counts(int reason) const { | 1177 ViEEncoder::AdaptCounts ViEEncoder::AdaptCounter::Counts(int reason) const { |
1018 AdaptCounts counts; | 1178 AdaptCounts counts; |
1019 counts.fps = fps_counters_[reason]; | 1179 counts.fps = fps_counters_[reason]; |
1020 counts.resolution = resolution_counters_[reason]; | 1180 counts.resolution = resolution_counters_[reason]; |
1021 return counts; | 1181 return counts; |
1022 } | 1182 } |
1023 | 1183 |
1024 void ViEEncoder::AdaptCounter::IncrementFramerate(int reason, int delta) { | 1184 void ViEEncoder::AdaptCounter::IncrementFramerate(int reason) { |
1025 fps_counters_[reason] += delta; | 1185 ++(fps_counters_[reason]); |
1026 } | 1186 } |
1027 | 1187 |
1028 void ViEEncoder::AdaptCounter::IncrementResolution(int reason, int delta) { | 1188 void ViEEncoder::AdaptCounter::IncrementResolution(int reason) { |
1029 resolution_counters_[reason] += delta; | 1189 ++(resolution_counters_[reason]); |
1190 } | |
1191 | |
1192 void ViEEncoder::AdaptCounter::DecrementFramerate(int reason) { | |
1193 if (fps_counters_[reason] == 0) { | |
1194 // Adapt up is in a different order, switch reason. | |
1195 // E.g. framerate adapt down: quality, framerate adapt up: cpu. | |
kthelgason
2017/05/19 08:34:14
Why is this the case? This seems very confusing.
åsapersson
2017/06/08 13:55:32
Updated comment.
| |
1196 MoveCount(&resolution_counters_, reason); | |
1197 MoveCount(&fps_counters_, (reason + 1) % kScaleReasonSize); | |
1198 } | |
1199 --(fps_counters_[reason]); | |
1200 RTC_DCHECK_GE(fps_counters_[reason], 0); | |
1201 } | |
1202 | |
1203 void ViEEncoder::AdaptCounter::DecrementResolution(int reason) { | |
1204 if (resolution_counters_[reason] == 0) { | |
1205 // Adapt up is in a different order, switch reason. | |
1206 // E.g. resolution adapt down: quality, resolution adapt up: cpu. | |
1207 MoveCount(&fps_counters_, reason); | |
1208 MoveCount(&resolution_counters_, (reason + 1) % kScaleReasonSize); | |
1209 } | |
1210 --(resolution_counters_[reason]); | |
1211 RTC_DCHECK_GE(resolution_counters_[reason], 0); | |
1030 } | 1212 } |
1031 | 1213 |
1032 int ViEEncoder::AdaptCounter::FramerateCount() const { | 1214 int ViEEncoder::AdaptCounter::FramerateCount() const { |
1033 return Count(fps_counters_); | 1215 return Count(fps_counters_); |
1034 } | 1216 } |
1035 | 1217 |
1036 int ViEEncoder::AdaptCounter::ResolutionCount() const { | 1218 int ViEEncoder::AdaptCounter::ResolutionCount() const { |
1037 return Count(resolution_counters_); | 1219 return Count(resolution_counters_); |
1038 } | 1220 } |
1039 | 1221 |
(...skipping 10 matching lines...) Expand all Loading... | |
1050 } | 1232 } |
1051 | 1233 |
1052 int ViEEncoder::AdaptCounter::TotalCount(int reason) const { | 1234 int ViEEncoder::AdaptCounter::TotalCount(int reason) const { |
1053 return FramerateCount(reason) + ResolutionCount(reason); | 1235 return FramerateCount(reason) + ResolutionCount(reason); |
1054 } | 1236 } |
1055 | 1237 |
1056 int ViEEncoder::AdaptCounter::Count(const std::vector<int>& counters) const { | 1238 int ViEEncoder::AdaptCounter::Count(const std::vector<int>& counters) const { |
1057 return std::accumulate(counters.begin(), counters.end(), 0); | 1239 return std::accumulate(counters.begin(), counters.end(), 0); |
1058 } | 1240 } |
1059 | 1241 |
1242 void ViEEncoder::AdaptCounter::MoveCount(std::vector<int>* counters, | |
1243 int from_reason) { | |
1244 int to_reason = (from_reason + 1) % kScaleReasonSize; | |
1245 ++((*counters)[to_reason]); | |
1246 --((*counters)[from_reason]); | |
1247 RTC_DCHECK_GE((*counters)[from_reason], 0); | |
1248 } | |
1249 | |
1060 std::string ViEEncoder::AdaptCounter::ToString( | 1250 std::string ViEEncoder::AdaptCounter::ToString( |
1061 const std::vector<int>& counters) const { | 1251 const std::vector<int>& counters) const { |
1062 std::stringstream ss; | 1252 std::stringstream ss; |
1063 for (size_t reason = 0; reason < kScaleReasonSize; ++reason) { | 1253 for (size_t reason = 0; reason < kScaleReasonSize; ++reason) { |
1064 ss << (reason ? " cpu" : "quality") << ":" << counters[reason]; | 1254 ss << (reason ? " cpu" : "quality") << ":" << counters[reason]; |
1065 } | 1255 } |
1066 return ss.str(); | 1256 return ss.str(); |
1067 } | 1257 } |
1068 | 1258 |
1069 } // namespace webrtc | 1259 } // namespace webrtc |
OLD | NEW |