blob: 7aabb6e4bf2444516f94d52c784641802a5a6bcf [file] [log] [blame]
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#include <stdio.h>
11
kwiberg77eab702016-09-28 17:42:01 -070012#include "webrtc/test/gtest.h"
ivica5d6a06c2015-09-17 05:30:24 -070013#include "webrtc/video/video_quality_test.h"
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +000014
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +000015namespace webrtc {
16
brandtrdd369c62016-11-16 23:56:57 -080017static const int kFullStackTestDurationSecs = 45;
pbos@webrtc.orgb613b5a2013-12-03 10:13:04 +000018
ivica5d6a06c2015-09-17 05:30:24 -070019class FullStackTest : public VideoQualityTest {
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +000020 public:
ivica5d6a06c2015-09-17 05:30:24 -070021 void RunTest(const VideoQualityTest::Params &params) {
22 RunWithAnalyzer(params);
pbos@webrtc.org94015242013-10-16 11:05:37 +000023 }
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +000024};
25
sprangce4aef12015-11-02 07:23:20 -080026// VideoQualityTest::Params params = {
27// { ... }, // Common.
28// { ... }, // Video-specific settings.
29// { ... }, // Screenshare-specific settings.
30// { ... }, // Analyzer settings.
31// pipe, // FakeNetworkPipe::Config
32// { ... }, // Spatial scalability.
33// logs // bool
34// };
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +000035
Peter Boström12996152016-05-14 02:03:18 +020036#if !defined(RTC_DISABLE_VP9)
asapersson88b0a222016-02-12 13:16:43 -080037TEST_F(FullStackTest, ForemanCifWithoutPacketLossVp9) {
brandtr93c5d032016-11-30 07:50:07 -080038 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
39 VideoQualityTest::Params foreman_cif;
40 foreman_cif.call.send_side_bwe = true;
41 foreman_cif.video = {true, 352, 288, 30, 700000, 700000, 700000, false,
42 "VP9", 1, 0, 0, false, false, "", "foreman_cif"};
43 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_VP9", 0.0, 0.0,
44 kFullStackTestDurationSecs};
45 RunTest(foreman_cif);
asapersson88b0a222016-02-12 13:16:43 -080046}
47
48TEST_F(FullStackTest, ForemanCifPlr5Vp9) {
brandtr93c5d032016-11-30 07:50:07 -080049 VideoQualityTest::Params foreman_cif;
50 foreman_cif.call.send_side_bwe = true;
51 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false,
52 "VP9", 1, 0, 0, false, false, "", "foreman_cif"};
53 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_VP9", 0.0, 0.0,
54 kFullStackTestDurationSecs};
55 foreman_cif.pipe.loss_percent = 5;
56 foreman_cif.pipe.queue_delay_ms = 50;
57 RunTest(foreman_cif);
asapersson88b0a222016-02-12 13:16:43 -080058}
Peter Boström12996152016-05-14 02:03:18 +020059#endif // !defined(RTC_DISABLE_VP9)
asapersson88b0a222016-02-12 13:16:43 -080060
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000061TEST_F(FullStackTest, ParisQcifWithoutPacketLoss) {
minyue626bc952016-10-31 05:47:02 -070062 VideoQualityTest::Params paris_qcif;
63 paris_qcif.call.send_side_bwe = true;
64 paris_qcif.video = {true, 176, 144, 30, 300000, 300000, 300000, false,
brandtr1293aca2016-11-16 22:47:29 -080065 "VP8", 1, 0, 0, false, false, "", "paris_qcif"};
minyue626bc952016-10-31 05:47:02 -070066 paris_qcif.analyzer = {"net_delay_0_0_plr_0", 36.0, 0.96,
67 kFullStackTestDurationSecs};
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +000068 RunTest(paris_qcif);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000069}
70
71TEST_F(FullStackTest, ForemanCifWithoutPacketLoss) {
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +000072 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
minyue626bc952016-10-31 05:47:02 -070073 VideoQualityTest::Params foreman_cif;
74 foreman_cif.call.send_side_bwe = true;
75 foreman_cif.video = {true, 352, 288, 30, 700000, 700000, 700000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -080076 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -070077 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0", 0.0, 0.0,
78 kFullStackTestDurationSecs};
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +000079 RunTest(foreman_cif);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000080}
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +000081
sprang@webrtc.org343096a2015-02-23 08:34:17 +000082TEST_F(FullStackTest, ForemanCifPlr5) {
minyue626bc952016-10-31 05:47:02 -070083 VideoQualityTest::Params foreman_cif;
84 foreman_cif.call.send_side_bwe = true;
85 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -080086 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -070087 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5", 0.0, 0.0,
88 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -070089 foreman_cif.pipe.loss_percent = 5;
90 foreman_cif.pipe.queue_delay_ms = 50;
stefan@webrtc.orgc216b9a2014-10-14 10:38:49 +000091 RunTest(foreman_cif);
92}
93
brandtr93c5d032016-11-30 07:50:07 -080094TEST_F(FullStackTest, ForemanCifPlr5Ulpfec) {
95 VideoQualityTest::Params foreman_cif;
96 foreman_cif.call.send_side_bwe = true;
97 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
98 1, 0, 0, true, false, "", "foreman_cif"};
99 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_ulpfec", 0.0, 0.0,
100 kFullStackTestDurationSecs};
101 foreman_cif.pipe.loss_percent = 5;
102 foreman_cif.pipe.queue_delay_ms = 50;
103 RunTest(foreman_cif);
104}
105
106TEST_F(FullStackTest, ForemanCifPlr5Flexfec) {
107 VideoQualityTest::Params foreman_cif;
108 foreman_cif.call.send_side_bwe = true;
109 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
110 1, 0, 0, false, true, "", "foreman_cif"};
111 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_flexfec", 0.0, 0.0,
112 kFullStackTestDurationSecs};
113 foreman_cif.pipe.loss_percent = 5;
114 foreman_cif.pipe.queue_delay_ms = 50;
115 RunTest(foreman_cif);
116}
117
brandtrdd369c62016-11-16 23:56:57 -0800118#if defined(WEBRTC_USE_H264)
119TEST_F(FullStackTest, ForemanCifWithoutPacketlossH264) {
brandtr93c5d032016-11-30 07:50:07 -0800120 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
121 VideoQualityTest::Params foreman_cif;
122 foreman_cif.call.send_side_bwe = true;
123 foreman_cif.video = {true, 352, 288, 30, 700000, 700000, 700000, false,
124 "H264", 1, 0, 0, false, false, "", "foreman_cif"};
125 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_H264", 0.0, 0.0,
126 kFullStackTestDurationSecs};
127 RunTest(foreman_cif);
brandtrdd369c62016-11-16 23:56:57 -0800128}
129
130TEST_F(FullStackTest, ForemanCifPlr5H264) {
brandtr93c5d032016-11-30 07:50:07 -0800131 VideoQualityTest::Params foreman_cif;
132 foreman_cif.call.send_side_bwe = true;
133 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false,
134 "H264", 1, 0, 0, false, false, "", "foreman_cif"};
135 std::string fec_description;
136 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264", 0.0, 0.0,
137 kFullStackTestDurationSecs};
138 foreman_cif.pipe.loss_percent = 5;
139 foreman_cif.pipe.queue_delay_ms = 50;
140 RunTest(foreman_cif);
brandtrdd369c62016-11-16 23:56:57 -0800141}
142
143// Verify that this is worth the bot time, before enabling.
144TEST_F(FullStackTest, ForemanCifPlr5H264Flexfec) {
brandtr93c5d032016-11-30 07:50:07 -0800145 VideoQualityTest::Params foreman_cif;
146 foreman_cif.call.send_side_bwe = true;
147 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false,
148 "H264", 1, 0, 0, false, true, "", "foreman_cif"};
149 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_flexfec", 0.0, 0.0,
150 kFullStackTestDurationSecs};
151 foreman_cif.pipe.loss_percent = 5;
152 foreman_cif.pipe.queue_delay_ms = 50;
153 RunTest(foreman_cif);
brandtrdd369c62016-11-16 23:56:57 -0800154}
155
156// Ulpfec with H264 is an unsupported combination, so this test is only useful
157// for debugging. It is therefore disabled by default.
158TEST_F(FullStackTest, DISABLED_ForemanCifPlr5H264Ulpfec) {
brandtr93c5d032016-11-30 07:50:07 -0800159 VideoQualityTest::Params foreman_cif;
160 foreman_cif.call.send_side_bwe = true;
161 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false,
162 "H264", 1, 0, 0, true, false, "", "foreman_cif"};
163 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_ulpfec", 0.0, 0.0,
164 kFullStackTestDurationSecs};
165 foreman_cif.pipe.loss_percent = 5;
166 foreman_cif.pipe.queue_delay_ms = 50;
167 RunTest(foreman_cif);
brandtrdd369c62016-11-16 23:56:57 -0800168}
169#endif // defined(WEBRTC_USE_H264)
170
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +0000171TEST_F(FullStackTest, ForemanCif500kbps) {
minyue626bc952016-10-31 05:47:02 -0700172 VideoQualityTest::Params foreman_cif;
173 foreman_cif.call.send_side_bwe = true;
174 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -0800175 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -0700176 foreman_cif.analyzer = {"foreman_cif_500kbps", 0.0, 0.0,
177 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700178 foreman_cif.pipe.queue_length_packets = 0;
179 foreman_cif.pipe.queue_delay_ms = 0;
180 foreman_cif.pipe.link_capacity_kbps = 500;
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +0000181 RunTest(foreman_cif);
182}
183
184TEST_F(FullStackTest, ForemanCif500kbpsLimitedQueue) {
minyue626bc952016-10-31 05:47:02 -0700185 VideoQualityTest::Params foreman_cif;
186 foreman_cif.call.send_side_bwe = true;
187 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -0800188 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -0700189 foreman_cif.analyzer = {"foreman_cif_500kbps_32pkts_queue", 0.0, 0.0,
190 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700191 foreman_cif.pipe.queue_length_packets = 32;
192 foreman_cif.pipe.queue_delay_ms = 0;
193 foreman_cif.pipe.link_capacity_kbps = 500;
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +0000194 RunTest(foreman_cif);
195}
196
197TEST_F(FullStackTest, ForemanCif500kbps100ms) {
minyue626bc952016-10-31 05:47:02 -0700198 VideoQualityTest::Params foreman_cif;
199 foreman_cif.call.send_side_bwe = true;
200 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -0800201 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -0700202 foreman_cif.analyzer = {"foreman_cif_500kbps_100ms", 0.0, 0.0,
203 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700204 foreman_cif.pipe.queue_length_packets = 0;
205 foreman_cif.pipe.queue_delay_ms = 100;
206 foreman_cif.pipe.link_capacity_kbps = 500;
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +0000207 RunTest(foreman_cif);
208}
209
210TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueue) {
minyue626bc952016-10-31 05:47:02 -0700211 VideoQualityTest::Params foreman_cif;
212 foreman_cif.call.send_side_bwe = true;
213 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -0800214 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -0700215 foreman_cif.analyzer = {"foreman_cif_500kbps_100ms_32pkts_queue", 0.0, 0.0,
216 kFullStackTestDurationSecs};
stefanb1797672016-08-11 07:00:57 -0700217 foreman_cif.pipe.queue_length_packets = 32;
218 foreman_cif.pipe.queue_delay_ms = 100;
219 foreman_cif.pipe.link_capacity_kbps = 500;
220 RunTest(foreman_cif);
221}
222
223TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueueRecvBwe) {
minyue626bc952016-10-31 05:47:02 -0700224 VideoQualityTest::Params foreman_cif;
brandtr93c5d032016-11-30 07:50:07 -0800225 foreman_cif.call.send_side_bwe = false;
minyue626bc952016-10-31 05:47:02 -0700226 foreman_cif.video = {true, 352, 288, 30, 30000, 500000, 2000000, false, "VP8",
brandtr1293aca2016-11-16 22:47:29 -0800227 1, 0, 0, false, false, "", "foreman_cif"};
brandtr93c5d032016-11-30 07:50:07 -0800228 foreman_cif.analyzer = {"foreman_cif_500kbps_100ms_32pkts_queue_recv_bwe",
229 0.0, 0.0, kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700230 foreman_cif.pipe.queue_length_packets = 32;
231 foreman_cif.pipe.queue_delay_ms = 100;
232 foreman_cif.pipe.link_capacity_kbps = 500;
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +0000233 RunTest(foreman_cif);
234}
235
236TEST_F(FullStackTest, ForemanCif1000kbps100msLimitedQueue) {
minyue626bc952016-10-31 05:47:02 -0700237 VideoQualityTest::Params foreman_cif;
238 foreman_cif.call.send_side_bwe = true;
239 foreman_cif.video = {true, 352, 288, 30, 30000, 2000000, 2000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800240 "VP8", 1, 0, 0, false, false, "", "foreman_cif"};
minyue626bc952016-10-31 05:47:02 -0700241 foreman_cif.analyzer = {"foreman_cif_1000kbps_100ms_32pkts_queue", 0.0, 0.0,
242 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700243 foreman_cif.pipe.queue_length_packets = 32;
244 foreman_cif.pipe.queue_delay_ms = 100;
245 foreman_cif.pipe.link_capacity_kbps = 1000;
stefan@webrtc.orgb8e9e442014-07-09 11:29:06 +0000246 RunTest(foreman_cif);
247}
sprang@webrtc.org131bea82015-02-18 12:46:06 +0000248
stefanb1797672016-08-11 07:00:57 -0700249TEST_F(FullStackTest, ConferenceMotionHd2000kbps100msLimitedQueue) {
minyue626bc952016-10-31 05:47:02 -0700250 VideoQualityTest::Params conf_motion_hd;
251 conf_motion_hd.call.send_side_bwe = true;
252 conf_motion_hd.video = {true, 1280, 720, 50, 30000, 3000000, 3000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800253 "VP8", 1, 0, 0, false, false, "",
minyue626bc952016-10-31 05:47:02 -0700254 "ConferenceMotion_1280_720_50"};
255 conf_motion_hd.analyzer = {"conference_motion_hd_2000kbps_100ms_32pkts_queue",
256 0.0, 0.0, kFullStackTestDurationSecs};
stefanb1797672016-08-11 07:00:57 -0700257 conf_motion_hd.pipe.queue_length_packets = 32;
258 conf_motion_hd.pipe.queue_delay_ms = 100;
259 conf_motion_hd.pipe.link_capacity_kbps = 2000;
260 RunTest(conf_motion_hd);
261}
262
ivica7bd242e2015-10-06 02:04:06 -0700263TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL) {
minyue626bc952016-10-31 05:47:02 -0700264 VideoQualityTest::Params screenshare;
265 screenshare.call.send_side_bwe = true;
266 screenshare.video = {true, 1850, 1110, 5, 50000, 200000, 2000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800267 "VP8", 2, 1, 400000, false, false, "", ""};
minyue626bc952016-10-31 05:47:02 -0700268 screenshare.screenshare = {true, 10};
269 screenshare.analyzer = {"screenshare_slides", 0.0, 0.0,
270 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700271 RunTest(screenshare);
Erik Språng6ee69aa2015-09-03 15:58:05 +0200272}
273
ivica7bd242e2015-10-06 02:04:06 -0700274TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_Scroll) {
minyue626bc952016-10-31 05:47:02 -0700275 VideoQualityTest::Params config;
276 config.call.send_side_bwe = true;
277 config.video = {true, 1850, 1110 / 2, 5, 50000, 200000, 2000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800278 "VP8", 2, 1, 400000, false, false, "", ""};
minyue626bc952016-10-31 05:47:02 -0700279 config.screenshare = {true, 10, 2};
280 config.analyzer = {"screenshare_slides_scrolling", 0.0, 0.0,
281 kFullStackTestDurationSecs};
ivica5d6a06c2015-09-17 05:30:24 -0700282 RunTest(config);
ivica028cf482015-07-30 02:15:56 -0700283}
284
sprangee37de32015-11-23 06:10:23 -0800285TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_LossyNet) {
minyue626bc952016-10-31 05:47:02 -0700286 VideoQualityTest::Params screenshare;
287 screenshare.call.send_side_bwe = true;
288 screenshare.video = {true, 1850, 1110, 5, 50000, 200000, 2000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800289 "VP8", 2, 1, 400000, false, false, "", ""};
minyue626bc952016-10-31 05:47:02 -0700290 screenshare.screenshare = {true, 10};
291 screenshare.analyzer = {"screenshare_slides_lossy_net", 0.0, 0.0,
292 kFullStackTestDurationSecs};
sprangee37de32015-11-23 06:10:23 -0800293 screenshare.pipe.loss_percent = 5;
294 screenshare.pipe.queue_delay_ms = 200;
295 screenshare.pipe.link_capacity_kbps = 500;
296 RunTest(screenshare);
297}
298
299TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_VeryLossyNet) {
minyue626bc952016-10-31 05:47:02 -0700300 VideoQualityTest::Params screenshare;
301 screenshare.call.send_side_bwe = true;
302 screenshare.video = {true, 1850, 1110, 5, 50000, 200000, 2000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800303 "VP8", 2, 1, 400000, false, false, "", ""};
minyue626bc952016-10-31 05:47:02 -0700304 screenshare.screenshare = {true, 10};
305 screenshare.analyzer = {"screenshare_slides_very_lossy", 0.0, 0.0,
306 kFullStackTestDurationSecs};
sprangee37de32015-11-23 06:10:23 -0800307 screenshare.pipe.loss_percent = 10;
308 screenshare.pipe.queue_delay_ms = 200;
309 screenshare.pipe.link_capacity_kbps = 500;
310 RunTest(screenshare);
311}
312
Peter Boström12996152016-05-14 02:03:18 +0200313#if !defined(RTC_DISABLE_VP9)
philipelcfc319b2015-11-10 07:17:23 -0800314TEST_F(FullStackTest, ScreenshareSlidesVP9_2SL) {
minyue626bc952016-10-31 05:47:02 -0700315 VideoQualityTest::Params screenshare;
316 screenshare.call.send_side_bwe = true;
317 screenshare.video = {true, 1850, 1110, 5, 50000, 200000, 2000000, false,
brandtr1293aca2016-11-16 22:47:29 -0800318 "VP9", 1, 0, 400000, false, false, "", ""};
minyue626bc952016-10-31 05:47:02 -0700319 screenshare.screenshare = {true, 10};
320 screenshare.analyzer = {"screenshare_slides_vp9_2sl", 0.0, 0.0,
321 kFullStackTestDurationSecs};
322 screenshare.logs = false;
323 screenshare.ss = {std::vector<VideoStream>(), 0, 2, 1};
ivica5d6a06c2015-09-17 05:30:24 -0700324 RunTest(screenshare);
sprang@webrtc.org131bea82015-02-18 12:46:06 +0000325}
Peter Boström12996152016-05-14 02:03:18 +0200326#endif // !defined(RTC_DISABLE_VP9)
brandtr93c5d032016-11-30 07:50:07 -0800327
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33 +0000328} // namespace webrtc