OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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/send_statistics_proxy.h" | 11 #include "webrtc/video/send_statistics_proxy.h" |
12 | 12 |
13 #include <map> | 13 #include <map> |
14 #include <memory> | 14 #include <memory> |
15 #include <string> | 15 #include <string> |
16 #include <vector> | 16 #include <vector> |
17 | 17 |
18 #include "webrtc/system_wrappers/include/metrics.h" | 18 #include "webrtc/system_wrappers/include/metrics.h" |
19 #include "webrtc/system_wrappers/include/metrics_default.h" | 19 #include "webrtc/system_wrappers/include/metrics_default.h" |
20 #include "webrtc/test/gtest.h" | 20 #include "webrtc/test/gtest.h" |
21 | 21 |
22 namespace webrtc { | 22 namespace webrtc { |
23 namespace { | 23 namespace { |
24 const uint32_t kFirstSsrc = 17; | 24 const uint32_t kFirstSsrc = 17; |
25 const uint32_t kSecondSsrc = 42; | 25 const uint32_t kSecondSsrc = 42; |
26 const uint32_t kFirstRtxSsrc = 18; | 26 const uint32_t kFirstRtxSsrc = 18; |
27 const uint32_t kSecondRtxSsrc = 43; | 27 const uint32_t kSecondRtxSsrc = 43; |
28 const uint32_t kFlexFecSsrc = 55; | |
28 | 29 |
29 const int kQpIdx0 = 21; | 30 const int kQpIdx0 = 21; |
30 const int kQpIdx1 = 39; | 31 const int kQpIdx1 = 39; |
31 } // namespace | 32 } // namespace |
32 | 33 |
33 class SendStatisticsProxyTest : public ::testing::Test { | 34 class SendStatisticsProxyTest : public ::testing::Test { |
34 public: | 35 public: |
35 SendStatisticsProxyTest() | 36 SendStatisticsProxyTest() |
36 : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0), | 37 : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0), |
37 max_delay_ms_(0) {} | 38 max_delay_ms_(0) {} |
(...skipping 15 matching lines...) Expand all Loading... | |
53 VideoSendStream::Config GetTestConfig() { | 54 VideoSendStream::Config GetTestConfig() { |
54 VideoSendStream::Config config(nullptr); | 55 VideoSendStream::Config config(nullptr); |
55 config.rtp.ssrcs.push_back(kFirstSsrc); | 56 config.rtp.ssrcs.push_back(kFirstSsrc); |
56 config.rtp.ssrcs.push_back(kSecondSsrc); | 57 config.rtp.ssrcs.push_back(kSecondSsrc); |
57 config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc); | 58 config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc); |
58 config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc); | 59 config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc); |
59 config.rtp.ulpfec.red_payload_type = 17; | 60 config.rtp.ulpfec.red_payload_type = 17; |
60 return config; | 61 return config; |
61 } | 62 } |
62 | 63 |
64 VideoSendStream::Config GetTestConfigWithFlexFec() { | |
65 VideoSendStream::Config config(nullptr); | |
66 config.rtp.ssrcs.push_back(kFirstSsrc); | |
67 config.rtp.ssrcs.push_back(kSecondSsrc); | |
68 config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc); | |
69 config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc); | |
70 config.rtp.flexfec.flexfec_payload_type = 50; | |
71 config.rtp.flexfec.flexfec_ssrc = kFlexFecSsrc; | |
72 return config; | |
73 } | |
74 | |
75 VideoSendStream::StreamStats* GetStreamStats(uint32_t ssrc) { | |
76 VideoSendStream::Stats stats = statistics_proxy_->GetStats(); | |
77 std::map<uint32_t, VideoSendStream::StreamStats>::iterator it = | |
78 stats.substreams.find(ssrc); | |
79 EXPECT_NE(it, stats.substreams.end()); | |
80 return &it->second; | |
81 } | |
82 | |
63 void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) { | 83 void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) { |
64 EXPECT_EQ(one.input_frame_rate, other.input_frame_rate); | 84 EXPECT_EQ(one.input_frame_rate, other.input_frame_rate); |
65 EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate); | 85 EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate); |
66 EXPECT_EQ(one.media_bitrate_bps, other.media_bitrate_bps); | 86 EXPECT_EQ(one.media_bitrate_bps, other.media_bitrate_bps); |
67 EXPECT_EQ(one.preferred_media_bitrate_bps, | 87 EXPECT_EQ(one.preferred_media_bitrate_bps, |
68 other.preferred_media_bitrate_bps); | 88 other.preferred_media_bitrate_bps); |
69 EXPECT_EQ(one.suspended, other.suspended); | 89 EXPECT_EQ(one.suspended, other.suspended); |
70 | 90 |
71 EXPECT_EQ(one.substreams.size(), other.substreams.size()); | 91 EXPECT_EQ(one.substreams.size(), other.substreams.size()); |
72 for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it = | 92 for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it = |
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
817 2 * kRate)); | 837 2 * kRate)); |
818 EXPECT_EQ(1, metrics::NumEvents( | 838 EXPECT_EQ(1, metrics::NumEvents( |
819 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute", | 839 "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute", |
820 3 * kRate)); | 840 3 * kRate)); |
821 EXPECT_EQ(1, | 841 EXPECT_EQ(1, |
822 metrics::NumEvents( | 842 metrics::NumEvents( |
823 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent", | 843 "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent", |
824 4 * 100 / 5)); | 844 4 * 100 / 5)); |
825 } | 845 } |
826 | 846 |
847 TEST_F(SendStatisticsProxyTest, GetStatsReportsIsFlexFec) { | |
848 statistics_proxy_.reset( | |
849 new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(), | |
850 VideoEncoderConfig::ContentType::kRealtimeVideo)); | |
851 | |
852 StreamDataCountersCallback* proxy = | |
853 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); | |
854 StreamDataCounters counters; | |
855 proxy->DataCountersUpdated(counters, kFirstSsrc); | |
856 proxy->DataCountersUpdated(counters, kFlexFecSsrc); | |
857 | |
858 EXPECT_FALSE(GetStreamStats(kFirstSsrc)->is_flexfec); | |
859 EXPECT_TRUE(GetStreamStats(kFlexFecSsrc)->is_flexfec); | |
860 } | |
861 | |
862 TEST_F(SendStatisticsProxyTest, SendBitratesAreReportedWithFlexFecEnabled) { | |
863 statistics_proxy_.reset( | |
864 new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(), | |
865 VideoEncoderConfig::ContentType::kRealtimeVideo)); | |
866 | |
867 StreamDataCountersCallback* proxy = | |
868 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); | |
869 | |
870 StreamDataCounters counters; | |
871 StreamDataCounters rtx_counters; | |
872 proxy->DataCountersUpdated(counters, kFirstSsrc); | |
873 proxy->DataCountersUpdated(counters, kSecondSsrc); | |
874 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); | |
875 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); | |
876 proxy->DataCountersUpdated(counters, kFlexFecSsrc); | |
877 | |
878 counters.transmitted.header_bytes = 400; | |
879 counters.transmitted.packets = 20; | |
880 counters.transmitted.padding_bytes = 1000; | |
881 counters.transmitted.payload_bytes = 2000; | |
882 counters.retransmitted.header_bytes = 40; | |
883 counters.retransmitted.packets = 2; | |
884 counters.retransmitted.padding_bytes = 100; | |
885 counters.retransmitted.payload_bytes = 200; | |
886 counters.fec = counters.retransmitted; | |
887 rtx_counters.transmitted = counters.transmitted; | |
888 | |
889 fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds); | |
890 proxy->DataCountersUpdated(counters, kFirstSsrc); | |
891 proxy->DataCountersUpdated(counters, kSecondSsrc); | |
892 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); | |
893 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); | |
894 proxy->DataCountersUpdated(counters, kFlexFecSsrc); | |
895 | |
896 // Reset stats proxy causes histograms to be reported. | |
897 statistics_proxy_.reset(); | |
898 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps")); | |
899 EXPECT_EQ(1, | |
900 metrics::NumEvents( | |
901 "WebRTC.Video.BitrateSentInKbps", | |
902 static_cast<int>((counters.transmitted.TotalBytes() * 4 * 8) / | |
903 metrics::kMinRunTimeInSeconds / 1000))); | |
904 | |
905 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps")); | |
906 EXPECT_EQ(1, metrics::NumEvents( | |
907 "WebRTC.Video.MediaBitrateSentInKbps", | |
908 static_cast<int>((counters.MediaPayloadBytes() * 2 * 8) / | |
909 metrics::kMinRunTimeInSeconds / 1000))); | |
910 | |
911 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps")); | |
912 EXPECT_EQ(1, | |
913 metrics::NumEvents( | |
914 "WebRTC.Video.PaddingBitrateSentInKbps", | |
915 static_cast<int>((counters.transmitted.padding_bytes * 4 * 8) / | |
916 metrics::kMinRunTimeInSeconds / 1000))); | |
917 | |
918 EXPECT_EQ(1, | |
919 metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps")); | |
920 EXPECT_EQ(1, | |
921 metrics::NumEvents( | |
922 "WebRTC.Video.RetransmittedBitrateSentInKbps", | |
923 static_cast<int>((counters.retransmitted.TotalBytes() * 2 * 8) / | |
924 metrics::kMinRunTimeInSeconds / 1000))); | |
925 | |
926 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps")); | |
927 EXPECT_EQ( | |
928 1, metrics::NumEvents( | |
929 "WebRTC.Video.RtxBitrateSentInKbps", | |
930 static_cast<int>((rtx_counters.transmitted.TotalBytes() * 2 * 8) / | |
931 metrics::kMinRunTimeInSeconds / 1000))); | |
932 | |
933 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps")); | |
934 EXPECT_EQ(1, metrics::NumEvents( | |
935 "WebRTC.Video.FecBitrateSentInKbps", | |
936 static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / | |
brandtr
2016/11/24 14:11:11
Should this not be |counters|? It seems to me that
åsapersson
2016/11/24 15:46:57
Right, the bitrate for counters.fec was zero. Incr
| |
937 metrics::kMinRunTimeInSeconds / 1000))); | |
938 } | |
939 | |
827 TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) { | 940 TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) { |
828 StreamDataCountersCallback* proxy = | 941 StreamDataCountersCallback* proxy = |
829 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); | 942 static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); |
830 StreamDataCounters counters; | 943 StreamDataCounters counters; |
831 StreamDataCounters rtx_counters; | 944 StreamDataCounters rtx_counters; |
832 counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds(); | 945 counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds(); |
833 proxy->DataCountersUpdated(counters, kFirstSsrc); | 946 proxy->DataCountersUpdated(counters, kFirstSsrc); |
834 proxy->DataCountersUpdated(counters, kSecondSsrc); | 947 proxy->DataCountersUpdated(counters, kSecondSsrc); |
835 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); | 948 proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc); |
836 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); | 949 proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
963 | 1076 |
964 EXPECT_EQ( | 1077 EXPECT_EQ( |
965 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps")); | 1078 1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps")); |
966 EXPECT_EQ(1, metrics::NumEvents( | 1079 EXPECT_EQ(1, metrics::NumEvents( |
967 "WebRTC.Video.Screenshare.FecBitrateSentInKbps", | 1080 "WebRTC.Video.Screenshare.FecBitrateSentInKbps", |
968 static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / | 1081 static_cast<int>((rtx_counters.fec.TotalBytes() * 2 * 8) / |
969 metrics::kMinRunTimeInSeconds / 1000))); | 1082 metrics::kMinRunTimeInSeconds / 1000))); |
970 } | 1083 } |
971 | 1084 |
972 } // namespace webrtc | 1085 } // namespace webrtc |
OLD | NEW |