Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports_unittest.cc

Issue 1696203002: [rtp_rtcp] rtc::scoped_ptr<rtcp::RawPacket> replaced with rtc::Buffer (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
12 12
13 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webrtc/base/random.h" 15 #include "webrtc/base/random.h"
16 16
17 using testing::ElementsAre; 17 using testing::ElementsAre;
18 using testing::ElementsAreArray; 18 using testing::ElementsAreArray;
19 using testing::IsEmpty; 19 using testing::IsEmpty;
20 using testing::make_tuple; 20 using testing::make_tuple;
21 using webrtc::rtcp::Dlrr; 21 using webrtc::rtcp::Dlrr;
22 using webrtc::rtcp::ExtendedReports; 22 using webrtc::rtcp::ExtendedReports;
23 using webrtc::rtcp::RawPacket;
24 using webrtc::rtcp::ReceiveTimeInfo; 23 using webrtc::rtcp::ReceiveTimeInfo;
25 using webrtc::rtcp::Rrtr; 24 using webrtc::rtcp::Rrtr;
26 using webrtc::rtcp::VoipMetric; 25 using webrtc::rtcp::VoipMetric;
27 using webrtc::RTCPUtility::RtcpCommonHeader; 26 using webrtc::RTCPUtility::RtcpCommonHeader;
28 using webrtc::RTCPUtility::RtcpParseCommonHeader; 27 using webrtc::RTCPUtility::RtcpParseCommonHeader;
29 28
30 namespace webrtc { 29 namespace webrtc {
31 // Define comparision operators that shouldn't be needed in production, 30 // Define comparision operators that shouldn't be needed in production,
32 // but make testing matches more clear. 31 // but make testing matches more clear.
33 bool operator==(const RTCPVoIPMetric& metric1, const RTCPVoIPMetric& metric2) { 32 bool operator==(const RTCPVoIPMetric& metric1, const RTCPVoIPMetric& metric2) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 80
82 bool Parse(const uint8_t* buffer, 81 bool Parse(const uint8_t* buffer,
83 size_t length, 82 size_t length,
84 ExtendedReports* packet) { 83 ExtendedReports* packet) {
85 RtcpCommonHeader header; 84 RtcpCommonHeader header;
86 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); 85 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header));
87 EXPECT_EQ(length, header.BlockSize()); 86 EXPECT_EQ(length, header.BlockSize());
88 return packet->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes); 87 return packet->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes);
89 } 88 }
90 89
91 bool Parse(const RawPacket& buffer, ExtendedReports* packet) { 90 bool Parse(const rtc::Buffer& buffer, ExtendedReports* packet) {
92 return Parse(buffer.Buffer(), buffer.Length(), packet); 91 return Parse(buffer.data(), buffer.size(), packet);
93 } 92 }
94 } // namespace 93 } // namespace
95 94
96 class RtcpPacketExtendedReportsTest : public ::testing::Test { 95 class RtcpPacketExtendedReportsTest : public ::testing::Test {
97 public: 96 public:
98 RtcpPacketExtendedReportsTest() : random_(0x123456789) {} 97 RtcpPacketExtendedReportsTest() : random_(0x123456789) {}
99 98
100 protected: 99 protected:
101 template <typename T> 100 template <typename T>
102 T Rand() { 101 T Rand() {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 VoipMetric voip_metric; 159 VoipMetric voip_metric;
161 voip_metric.To(Rand<uint32_t>()); 160 voip_metric.To(Rand<uint32_t>());
162 voip_metric.WithVoipMetric(Rand<RTCPVoIPMetric>()); 161 voip_metric.WithVoipMetric(Rand<RTCPVoIPMetric>());
163 return voip_metric; 162 return voip_metric;
164 } 163 }
165 164
166 TEST_F(RtcpPacketExtendedReportsTest, CreateWithoutReportBlocks) { 165 TEST_F(RtcpPacketExtendedReportsTest, CreateWithoutReportBlocks) {
167 ExtendedReports xr; 166 ExtendedReports xr;
168 xr.From(kSenderSsrc); 167 xr.From(kSenderSsrc);
169 168
170 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 169 rtc::Buffer packet = xr.Build();
171 170
172 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), 171 EXPECT_THAT(make_tuple(packet.data(), packet.size()),
173 ElementsAreArray(kEmptyPacket)); 172 ElementsAreArray(kEmptyPacket));
174 } 173 }
175 174
176 TEST_F(RtcpPacketExtendedReportsTest, ParseWithoutReportBlocks) { 175 TEST_F(RtcpPacketExtendedReportsTest, ParseWithoutReportBlocks) {
177 ExtendedReports parsed; 176 ExtendedReports parsed;
178 EXPECT_TRUE(Parse(kEmptyPacket, sizeof(kEmptyPacket), &parsed)); 177 EXPECT_TRUE(Parse(kEmptyPacket, sizeof(kEmptyPacket), &parsed));
179 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 178 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
180 EXPECT_THAT(parsed.rrtrs(), IsEmpty()); 179 EXPECT_THAT(parsed.rrtrs(), IsEmpty());
181 EXPECT_THAT(parsed.dlrrs(), IsEmpty()); 180 EXPECT_THAT(parsed.dlrrs(), IsEmpty());
182 EXPECT_THAT(parsed.voip_metrics(), IsEmpty()); 181 EXPECT_THAT(parsed.voip_metrics(), IsEmpty());
183 } 182 }
184 183
185 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithOneRrtrBlock) { 184 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithOneRrtrBlock) {
186 Rrtr rrtr = Rand<Rrtr>(); 185 Rrtr rrtr = Rand<Rrtr>();
187 ExtendedReports xr; 186 ExtendedReports xr;
188 xr.From(kSenderSsrc); 187 xr.From(kSenderSsrc);
189 EXPECT_TRUE(xr.WithRrtr(rrtr)); 188 EXPECT_TRUE(xr.WithRrtr(rrtr));
190 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 189 rtc::Buffer packet = xr.Build();
191 190
192 ExtendedReports mparsed; 191 ExtendedReports mparsed;
193 EXPECT_TRUE(Parse(*packet, &mparsed)); 192 EXPECT_TRUE(Parse(packet, &mparsed));
194 const ExtendedReports& parsed = mparsed; 193 const ExtendedReports& parsed = mparsed;
195 194
196 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 195 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
197 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr)); 196 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr));
198 } 197 }
199 198
200 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoRrtrBlocks) { 199 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoRrtrBlocks) {
201 Rrtr rrtr1 = Rand<Rrtr>(); 200 Rrtr rrtr1 = Rand<Rrtr>();
202 Rrtr rrtr2 = Rand<Rrtr>(); 201 Rrtr rrtr2 = Rand<Rrtr>();
203 ExtendedReports xr; 202 ExtendedReports xr;
204 xr.From(kSenderSsrc); 203 xr.From(kSenderSsrc);
205 EXPECT_TRUE(xr.WithRrtr(rrtr1)); 204 EXPECT_TRUE(xr.WithRrtr(rrtr1));
206 EXPECT_TRUE(xr.WithRrtr(rrtr2)); 205 EXPECT_TRUE(xr.WithRrtr(rrtr2));
207 206
208 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 207 rtc::Buffer packet = xr.Build();
209 208
210 ExtendedReports mparsed; 209 ExtendedReports mparsed;
211 EXPECT_TRUE(Parse(*packet, &mparsed)); 210 EXPECT_TRUE(Parse(packet, &mparsed));
212 const ExtendedReports& parsed = mparsed; 211 const ExtendedReports& parsed = mparsed;
213 212
214 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 213 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
215 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr1, rrtr2)); 214 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr1, rrtr2));
216 } 215 }
217 216
218 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithOneSubBlock) { 217 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithOneSubBlock) {
219 Dlrr dlrr; 218 Dlrr dlrr;
220 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>())); 219 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
221 ExtendedReports xr; 220 ExtendedReports xr;
222 xr.From(kSenderSsrc); 221 xr.From(kSenderSsrc);
223 EXPECT_TRUE(xr.WithDlrr(dlrr)); 222 EXPECT_TRUE(xr.WithDlrr(dlrr));
224 223
225 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 224 rtc::Buffer packet = xr.Build();
226 225
227 ExtendedReports mparsed; 226 ExtendedReports mparsed;
228 EXPECT_TRUE(Parse(*packet, &mparsed)); 227 EXPECT_TRUE(Parse(packet, &mparsed));
229 const ExtendedReports& parsed = mparsed; 228 const ExtendedReports& parsed = mparsed;
230 229
231 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 230 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
232 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr)); 231 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr));
233 } 232 }
234 233
235 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithTwoSubBlocks) { 234 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithTwoSubBlocks) {
236 Dlrr dlrr; 235 Dlrr dlrr;
237 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>())); 236 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
238 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>())); 237 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
239 ExtendedReports xr; 238 ExtendedReports xr;
240 xr.From(kSenderSsrc); 239 xr.From(kSenderSsrc);
241 EXPECT_TRUE(xr.WithDlrr(dlrr)); 240 EXPECT_TRUE(xr.WithDlrr(dlrr));
242 241
243 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 242 rtc::Buffer packet = xr.Build();
244 243
245 ExtendedReports mparsed; 244 ExtendedReports mparsed;
246 EXPECT_TRUE(Parse(*packet, &mparsed)); 245 EXPECT_TRUE(Parse(packet, &mparsed));
247 const ExtendedReports& parsed = mparsed; 246 const ExtendedReports& parsed = mparsed;
248 247
249 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 248 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
250 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr)); 249 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr));
251 } 250 }
252 251
253 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoDlrrBlocks) { 252 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithTwoDlrrBlocks) {
254 Dlrr dlrr1; 253 Dlrr dlrr1;
255 EXPECT_TRUE(dlrr1.WithDlrrItem(Rand<ReceiveTimeInfo>())); 254 EXPECT_TRUE(dlrr1.WithDlrrItem(Rand<ReceiveTimeInfo>()));
256 Dlrr dlrr2; 255 Dlrr dlrr2;
257 EXPECT_TRUE(dlrr2.WithDlrrItem(Rand<ReceiveTimeInfo>())); 256 EXPECT_TRUE(dlrr2.WithDlrrItem(Rand<ReceiveTimeInfo>()));
258 ExtendedReports xr; 257 ExtendedReports xr;
259 xr.From(kSenderSsrc); 258 xr.From(kSenderSsrc);
260 EXPECT_TRUE(xr.WithDlrr(dlrr1)); 259 EXPECT_TRUE(xr.WithDlrr(dlrr1));
261 EXPECT_TRUE(xr.WithDlrr(dlrr2)); 260 EXPECT_TRUE(xr.WithDlrr(dlrr2));
262 261
263 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 262 rtc::Buffer packet = xr.Build();
264 263
265 ExtendedReports mparsed; 264 ExtendedReports mparsed;
266 EXPECT_TRUE(Parse(*packet, &mparsed)); 265 EXPECT_TRUE(Parse(packet, &mparsed));
267 const ExtendedReports& parsed = mparsed; 266 const ExtendedReports& parsed = mparsed;
268 267
269 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 268 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
270 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr1, dlrr2)); 269 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr1, dlrr2));
271 } 270 }
272 271
273 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithVoipMetric) { 272 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithVoipMetric) {
274 VoipMetric voip_metric = Rand<VoipMetric>(); 273 VoipMetric voip_metric = Rand<VoipMetric>();
275 274
276 ExtendedReports xr; 275 ExtendedReports xr;
277 xr.From(kSenderSsrc); 276 xr.From(kSenderSsrc);
278 EXPECT_TRUE(xr.WithVoipMetric(voip_metric)); 277 EXPECT_TRUE(xr.WithVoipMetric(voip_metric));
279 278
280 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 279 rtc::Buffer packet = xr.Build();
281 280
282 ExtendedReports mparsed; 281 ExtendedReports mparsed;
283 EXPECT_TRUE(Parse(*packet, &mparsed)); 282 EXPECT_TRUE(Parse(packet, &mparsed));
284 const ExtendedReports& parsed = mparsed; 283 const ExtendedReports& parsed = mparsed;
285 284
286 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 285 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
287 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(voip_metric)); 286 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(voip_metric));
288 } 287 }
289 288
290 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithMultipleReportBlocks) { 289 TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithMultipleReportBlocks) {
291 Rrtr rrtr = Rand<Rrtr>(); 290 Rrtr rrtr = Rand<Rrtr>();
292 Dlrr dlrr; 291 Dlrr dlrr;
293 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>())); 292 EXPECT_TRUE(dlrr.WithDlrrItem(Rand<ReceiveTimeInfo>()));
294 VoipMetric metric = Rand<VoipMetric>(); 293 VoipMetric metric = Rand<VoipMetric>();
295 ExtendedReports xr; 294 ExtendedReports xr;
296 xr.From(kSenderSsrc); 295 xr.From(kSenderSsrc);
297 EXPECT_TRUE(xr.WithRrtr(rrtr)); 296 EXPECT_TRUE(xr.WithRrtr(rrtr));
298 EXPECT_TRUE(xr.WithDlrr(dlrr)); 297 EXPECT_TRUE(xr.WithDlrr(dlrr));
299 EXPECT_TRUE(xr.WithVoipMetric(metric)); 298 EXPECT_TRUE(xr.WithVoipMetric(metric));
300 299
301 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 300 rtc::Buffer packet = xr.Build();
302 301
303 ExtendedReports mparsed; 302 ExtendedReports mparsed;
304 EXPECT_TRUE(Parse(*packet, &mparsed)); 303 EXPECT_TRUE(Parse(packet, &mparsed));
305 const ExtendedReports& parsed = mparsed; 304 const ExtendedReports& parsed = mparsed;
306 305
307 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 306 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
308 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr)); 307 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr));
309 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr)); 308 EXPECT_THAT(parsed.dlrrs(), ElementsAre(dlrr));
310 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric)); 309 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric));
311 } 310 }
312 311
313 TEST_F(RtcpPacketExtendedReportsTest, DlrrWithoutItemNotIncludedInPacket) { 312 TEST_F(RtcpPacketExtendedReportsTest, DlrrWithoutItemNotIncludedInPacket) {
314 Rrtr rrtr = Rand<Rrtr>(); 313 Rrtr rrtr = Rand<Rrtr>();
315 Dlrr dlrr; 314 Dlrr dlrr;
316 VoipMetric metric = Rand<VoipMetric>(); 315 VoipMetric metric = Rand<VoipMetric>();
317 ExtendedReports xr; 316 ExtendedReports xr;
318 xr.From(kSenderSsrc); 317 xr.From(kSenderSsrc);
319 EXPECT_TRUE(xr.WithRrtr(rrtr)); 318 EXPECT_TRUE(xr.WithRrtr(rrtr));
320 EXPECT_TRUE(xr.WithDlrr(dlrr)); 319 EXPECT_TRUE(xr.WithDlrr(dlrr));
321 EXPECT_TRUE(xr.WithVoipMetric(metric)); 320 EXPECT_TRUE(xr.WithVoipMetric(metric));
322 321
323 rtc::scoped_ptr<RawPacket> packet = xr.Build(); 322 rtc::Buffer packet = xr.Build();
324 323
325 ExtendedReports mparsed; 324 ExtendedReports mparsed;
326 EXPECT_TRUE(Parse(*packet, &mparsed)); 325 EXPECT_TRUE(Parse(packet, &mparsed));
327 const ExtendedReports& parsed = mparsed; 326 const ExtendedReports& parsed = mparsed;
328 327
329 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr)); 328 EXPECT_THAT(parsed.rrtrs(), ElementsAre(rrtr));
330 EXPECT_THAT(parsed.dlrrs(), IsEmpty()); 329 EXPECT_THAT(parsed.dlrrs(), IsEmpty());
331 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric)); 330 EXPECT_THAT(parsed.voip_metrics(), ElementsAre(metric));
332 } 331 }
333 332
334 TEST_F(RtcpPacketExtendedReportsTest, WithTooManyBlocks) { 333 TEST_F(RtcpPacketExtendedReportsTest, WithTooManyBlocks) {
335 const size_t kMaxBlocks = 50; 334 const size_t kMaxBlocks = 50;
336 ExtendedReports xr; 335 ExtendedReports xr;
337 336
338 Rrtr rrtr = Rand<Rrtr>(); 337 Rrtr rrtr = Rand<Rrtr>();
339 for (size_t i = 0; i < kMaxBlocks; ++i) 338 for (size_t i = 0; i < kMaxBlocks; ++i)
340 EXPECT_TRUE(xr.WithRrtr(rrtr)); 339 EXPECT_TRUE(xr.WithRrtr(rrtr));
341 EXPECT_FALSE(xr.WithRrtr(rrtr)); 340 EXPECT_FALSE(xr.WithRrtr(rrtr));
342 341
343 Dlrr dlrr; 342 Dlrr dlrr;
344 for (size_t i = 0; i < kMaxBlocks; ++i) 343 for (size_t i = 0; i < kMaxBlocks; ++i)
345 EXPECT_TRUE(xr.WithDlrr(dlrr)); 344 EXPECT_TRUE(xr.WithDlrr(dlrr));
346 EXPECT_FALSE(xr.WithDlrr(dlrr)); 345 EXPECT_FALSE(xr.WithDlrr(dlrr));
347 346
348 VoipMetric voip_metric = Rand<VoipMetric>(); 347 VoipMetric voip_metric = Rand<VoipMetric>();
349 for (size_t i = 0; i < kMaxBlocks; ++i) 348 for (size_t i = 0; i < kMaxBlocks; ++i)
350 EXPECT_TRUE(xr.WithVoipMetric(voip_metric)); 349 EXPECT_TRUE(xr.WithVoipMetric(voip_metric));
351 EXPECT_FALSE(xr.WithVoipMetric(voip_metric)); 350 EXPECT_FALSE(xr.WithVoipMetric(voip_metric));
352 } 351 }
353 } // namespace webrtc 352 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698