blob: 14cb4a5a6dbb866a97db347c03f57a6b494455f8 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "rtc_base/memory/fifo_buffer.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <string.h>
14
15#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000016
17namespace rtc {
18
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019TEST(FifoBufferTest, TestAll) {
20 const size_t kSize = 16;
21 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
22 char out[kSize * 2];
23 void* p;
24 const void* q;
25 size_t bytes;
26 FifoBuffer buf(kSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000027
28 // Test assumptions about base state
Niels Möllera8fa2d02018-10-31 10:19:50 +010029 EXPECT_EQ(SS_OPEN, buf.GetState());
30 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
31 EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000032 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010033 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000034
35 // Try a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +010036 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000037 EXPECT_EQ(kSize, bytes);
38
39 // Try a write that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +010040 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000041
42 // Try a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +010043 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000044 EXPECT_EQ(kSize, bytes);
45 EXPECT_EQ(0, memcmp(in, out, kSize));
46
47 // Try a read that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +010048 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000049
50 // Try a too-big write
Niels Möllera8fa2d02018-10-31 10:19:50 +010051 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000052 EXPECT_EQ(bytes, kSize);
53
54 // Try a too-big read
Niels Möllera8fa2d02018-10-31 10:19:50 +010055 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000056 EXPECT_EQ(kSize, bytes);
57 EXPECT_EQ(0, memcmp(in, out, kSize));
58
59 // Try some small writes and reads
Niels Möllera8fa2d02018-10-31 10:19:50 +010060 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000061 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010062 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000063 EXPECT_EQ(kSize / 2, bytes);
64 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010065 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000066 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010067 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000068 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010069 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000070 EXPECT_EQ(kSize / 2, bytes);
71 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010072 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000073 EXPECT_EQ(kSize / 2, bytes);
74 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
75
76 // Try wraparound reads and writes in the following pattern
77 // WWWWWWWWWWWW.... 0123456789AB....
78 // RRRRRRRRXXXX.... ........89AB....
79 // WWWW....XXXXWWWW 4567....89AB0123
80 // XXXX....RRRRXXXX 4567........0123
81 // XXXXWWWWWWWWXXXX 4567012345670123
82 // RRRRXXXXXXXXRRRR ....01234567....
83 // ....RRRRRRRR.... ................
Niels Möllera8fa2d02018-10-31 10:19:50 +010084 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000085 EXPECT_EQ(kSize * 3 / 4, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010086 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000087 EXPECT_EQ(kSize / 2, bytes);
88 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010089 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000090 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010091 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 4, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020092 EXPECT_EQ(kSize / 4, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000093 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +010094 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000095 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010096 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020097 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000098 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010099 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200100 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000101 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
102
103 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100104 buf.GetWriteBuffer(&bytes);
105 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000106
107 // Try using GetReadData to do a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100108 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
109 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800110 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000111 EXPECT_EQ(kSize, bytes);
112 EXPECT_EQ(0, memcmp(q, in, kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100113 buf.ConsumeReadData(kSize);
114 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115
116 // Try using GetReadData to do some small reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100117 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
118 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800119 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000120 EXPECT_EQ(kSize, bytes);
121 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100122 buf.ConsumeReadData(kSize / 2);
123 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800124 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125 EXPECT_EQ(kSize / 2, bytes);
126 EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100127 buf.ConsumeReadData(kSize / 2);
128 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000129
130 // Try using GetReadData in a wraparound case
131 // WWWWWWWWWWWWWWWW 0123456789ABCDEF
132 // RRRRRRRRRRRRXXXX ............CDEF
133 // WWWWWWWW....XXXX 01234567....CDEF
134 // ............RRRR 01234567........
135 // RRRRRRRR........ ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100136 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
137 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
138 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
139 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800140 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000141 EXPECT_EQ(kSize / 4, bytes);
142 EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100143 buf.ConsumeReadData(kSize / 4);
144 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800145 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000146 EXPECT_EQ(kSize / 2, bytes);
147 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100148 buf.ConsumeReadData(kSize / 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000149
150 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100151 buf.GetWriteBuffer(&bytes);
152 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000153
154 // Try using GetWriteBuffer to do a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100155 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800156 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000157 EXPECT_EQ(kSize, bytes);
158 memcpy(p, in, kSize);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100159 buf.ConsumeWriteBuffer(kSize);
160 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000161 EXPECT_EQ(kSize, bytes);
162 EXPECT_EQ(0, memcmp(in, out, kSize));
163
164 // Try using GetWriteBuffer to do some small writes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100165 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800166 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000167 EXPECT_EQ(kSize, bytes);
168 memcpy(p, in, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100169 buf.ConsumeWriteBuffer(kSize / 2);
170 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800171 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000172 EXPECT_EQ(kSize / 2, bytes);
173 memcpy(p, in + kSize / 2, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100174 buf.ConsumeWriteBuffer(kSize / 2);
175 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000176 EXPECT_EQ(kSize, bytes);
177 EXPECT_EQ(0, memcmp(in, out, kSize));
178
179 // Try using GetWriteBuffer in a wraparound case
180 // WWWWWWWWWWWW.... 0123456789AB....
181 // RRRRRRRRXXXX.... ........89AB....
182 // ........XXXXWWWW ........89AB0123
183 // WWWW....XXXXXXXX 4567....89AB0123
184 // RRRR....RRRRRRRR ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100185 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
186 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
187 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800188 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000189 EXPECT_EQ(kSize / 4, bytes);
190 memcpy(p, in, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100191 buf.ConsumeWriteBuffer(kSize / 4);
192 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800193 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000194 EXPECT_EQ(kSize / 2, bytes);
195 memcpy(p, in + kSize / 4, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100196 buf.ConsumeWriteBuffer(kSize / 4);
197 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000198 EXPECT_EQ(kSize * 3 / 4, bytes);
199 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
200 EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
201
202 // Check that the stream is now empty
Niels Möllera8fa2d02018-10-31 10:19:50 +0100203 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000204
205 // Try growing the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100206 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000207 EXPECT_EQ(kSize, bytes);
208 EXPECT_TRUE(buf.SetCapacity(kSize * 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100209 EXPECT_EQ(SR_SUCCESS, buf.Write(in + kSize, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000210 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100211 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000212 EXPECT_EQ(kSize * 2, bytes);
213 EXPECT_EQ(0, memcmp(in, out, kSize * 2));
214
215 // Try shrinking the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100216 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000217 EXPECT_EQ(kSize, bytes);
218 EXPECT_TRUE(buf.SetCapacity(kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100219 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
220 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000221 EXPECT_EQ(kSize, bytes);
222 EXPECT_EQ(0, memcmp(in, out, kSize));
223
224 // Write to the stream, close it, read the remaining bytes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100225 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
226 buf.Close();
227 EXPECT_EQ(SS_CLOSED, buf.GetState());
228 EXPECT_EQ(SR_EOS, buf.Write(in, kSize / 2, &bytes, nullptr));
229 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000230 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100231 EXPECT_EQ(SR_EOS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000232}
233
234TEST(FifoBufferTest, FullBufferCheck) {
235 FifoBuffer buff(10);
236 buff.ConsumeWriteBuffer(10);
237
238 size_t free;
deadbeef37f5ecf2017-02-27 14:06:41 -0800239 EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000240 EXPECT_EQ(0U, free);
241}
242
243TEST(FifoBufferTest, WriteOffsetAndReadOffset) {
244 const size_t kSize = 16;
245 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
246 char out[kSize * 2];
247 FifoBuffer buf(kSize);
248
249 // Write 14 bytes.
deadbeef37f5ecf2017-02-27 14:06:41 -0800250 EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, nullptr, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000251
252 // Make sure data is in |buf|.
253 size_t buffered;
254 EXPECT_TRUE(buf.GetBuffered(&buffered));
255 EXPECT_EQ(14u, buffered);
256
257 // Read 10 bytes.
258 buf.ConsumeReadData(10);
259
260 // There should be now 12 bytes of available space.
261 size_t remaining;
262 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
263 EXPECT_EQ(12u, remaining);
264
265 // Write at offset 12, this should fail.
deadbeef37f5ecf2017-02-27 14:06:41 -0800266 EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000267
268 // Write 8 bytes at offset 4, this wraps around the buffer.
deadbeef37f5ecf2017-02-27 14:06:41 -0800269 EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000270
271 // Number of available space remains the same until we call
272 // ConsumeWriteBuffer().
273 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
274 EXPECT_EQ(12u, remaining);
275 buf.ConsumeWriteBuffer(12);
276
277 // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the
278 // 8 bytes written.
279 size_t read;
280 EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read));
281 EXPECT_EQ(8u, read);
282 EXPECT_EQ(0, memcmp(out, in, 8));
283
284 // There should still be 16 bytes available for reading.
285 EXPECT_TRUE(buf.GetBuffered(&buffered));
286 EXPECT_EQ(16u, buffered);
287
288 // Read at offset 16, this should fail since we don't have that much data.
deadbeef37f5ecf2017-02-27 14:06:41 -0800289 EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000290}
291
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000292} // namespace rtc