blob: c2926b379e8f33cac949fc6801533b4df2e9757c [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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <string.h>
12
Niels Möller13339482019-03-28 13:30:15 +010013#include "rtc_base/memory/fifo_buffer.h"
Yves Gerey3e707812018-11-28 16:47:49 +010014#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015
16namespace rtc {
17
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018TEST(FifoBufferTest, TestAll) {
19 const size_t kSize = 16;
20 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
21 char out[kSize * 2];
22 void* p;
23 const void* q;
24 size_t bytes;
25 FifoBuffer buf(kSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000026
27 // Test assumptions about base state
Niels Möllera8fa2d02018-10-31 10:19:50 +010028 EXPECT_EQ(SS_OPEN, buf.GetState());
29 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
30 EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010032 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033
34 // Try a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +010035 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000036 EXPECT_EQ(kSize, bytes);
37
38 // Try a write that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +010039 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040
41 // Try a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +010042 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000043 EXPECT_EQ(kSize, bytes);
44 EXPECT_EQ(0, memcmp(in, out, kSize));
45
46 // Try a read that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +010047 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000048
49 // Try a too-big write
Niels Möllera8fa2d02018-10-31 10:19:50 +010050 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000051 EXPECT_EQ(bytes, kSize);
52
53 // Try a too-big read
Niels Möllera8fa2d02018-10-31 10:19:50 +010054 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000055 EXPECT_EQ(kSize, bytes);
56 EXPECT_EQ(0, memcmp(in, out, kSize));
57
58 // Try some small writes and reads
Niels Möllera8fa2d02018-10-31 10:19:50 +010059 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000060 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010061 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000062 EXPECT_EQ(kSize / 2, bytes);
63 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010064 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000065 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010066 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000067 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010068 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000069 EXPECT_EQ(kSize / 2, bytes);
70 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010071 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072 EXPECT_EQ(kSize / 2, bytes);
73 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
74
75 // Try wraparound reads and writes in the following pattern
76 // WWWWWWWWWWWW.... 0123456789AB....
77 // RRRRRRRRXXXX.... ........89AB....
78 // WWWW....XXXXWWWW 4567....89AB0123
79 // XXXX....RRRRXXXX 4567........0123
80 // XXXXWWWWWWWWXXXX 4567012345670123
81 // RRRRXXXXXXXXRRRR ....01234567....
82 // ....RRRRRRRR.... ................
Niels Möllera8fa2d02018-10-31 10:19:50 +010083 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084 EXPECT_EQ(kSize * 3 / 4, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010085 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086 EXPECT_EQ(kSize / 2, bytes);
87 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010088 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010090 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 4, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020091 EXPECT_EQ(kSize / 4, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000092 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +010093 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010095 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020096 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010098 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020099 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
101
102 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100103 buf.GetWriteBuffer(&bytes);
104 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105
106 // Try using GetReadData to do a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100107 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
108 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800109 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000110 EXPECT_EQ(kSize, bytes);
111 EXPECT_EQ(0, memcmp(q, in, kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100112 buf.ConsumeReadData(kSize);
113 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114
115 // Try using GetReadData to do some small reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100116 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
117 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800118 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000119 EXPECT_EQ(kSize, bytes);
120 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100121 buf.ConsumeReadData(kSize / 2);
122 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800123 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000124 EXPECT_EQ(kSize / 2, bytes);
125 EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100126 buf.ConsumeReadData(kSize / 2);
127 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000128
129 // Try using GetReadData in a wraparound case
130 // WWWWWWWWWWWWWWWW 0123456789ABCDEF
131 // RRRRRRRRRRRRXXXX ............CDEF
132 // WWWWWWWW....XXXX 01234567....CDEF
133 // ............RRRR 01234567........
134 // RRRRRRRR........ ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100135 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
136 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
137 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
138 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800139 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000140 EXPECT_EQ(kSize / 4, bytes);
141 EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100142 buf.ConsumeReadData(kSize / 4);
143 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800144 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000145 EXPECT_EQ(kSize / 2, bytes);
146 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100147 buf.ConsumeReadData(kSize / 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000148
149 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100150 buf.GetWriteBuffer(&bytes);
151 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000152
153 // Try using GetWriteBuffer to do a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100154 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800155 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000156 EXPECT_EQ(kSize, bytes);
157 memcpy(p, in, kSize);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100158 buf.ConsumeWriteBuffer(kSize);
159 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000160 EXPECT_EQ(kSize, bytes);
161 EXPECT_EQ(0, memcmp(in, out, kSize));
162
163 // Try using GetWriteBuffer to do some small writes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100164 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800165 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000166 EXPECT_EQ(kSize, bytes);
167 memcpy(p, in, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100168 buf.ConsumeWriteBuffer(kSize / 2);
169 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800170 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000171 EXPECT_EQ(kSize / 2, bytes);
172 memcpy(p, in + kSize / 2, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100173 buf.ConsumeWriteBuffer(kSize / 2);
174 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000175 EXPECT_EQ(kSize, bytes);
176 EXPECT_EQ(0, memcmp(in, out, kSize));
177
178 // Try using GetWriteBuffer in a wraparound case
179 // WWWWWWWWWWWW.... 0123456789AB....
180 // RRRRRRRRXXXX.... ........89AB....
181 // ........XXXXWWWW ........89AB0123
182 // WWWW....XXXXXXXX 4567....89AB0123
183 // RRRR....RRRRRRRR ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100184 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
185 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
186 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800187 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000188 EXPECT_EQ(kSize / 4, bytes);
189 memcpy(p, in, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100190 buf.ConsumeWriteBuffer(kSize / 4);
191 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800192 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000193 EXPECT_EQ(kSize / 2, bytes);
194 memcpy(p, in + kSize / 4, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100195 buf.ConsumeWriteBuffer(kSize / 4);
196 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000197 EXPECT_EQ(kSize * 3 / 4, bytes);
198 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
199 EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
200
201 // Check that the stream is now empty
Niels Möllera8fa2d02018-10-31 10:19:50 +0100202 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000203
204 // Try growing the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100205 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206 EXPECT_EQ(kSize, bytes);
207 EXPECT_TRUE(buf.SetCapacity(kSize * 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100208 EXPECT_EQ(SR_SUCCESS, buf.Write(in + kSize, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000209 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100210 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000211 EXPECT_EQ(kSize * 2, bytes);
212 EXPECT_EQ(0, memcmp(in, out, kSize * 2));
213
214 // Try shrinking the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100215 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000216 EXPECT_EQ(kSize, bytes);
217 EXPECT_TRUE(buf.SetCapacity(kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100218 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
219 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000220 EXPECT_EQ(kSize, bytes);
221 EXPECT_EQ(0, memcmp(in, out, kSize));
222
223 // Write to the stream, close it, read the remaining bytes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100224 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
225 buf.Close();
226 EXPECT_EQ(SS_CLOSED, buf.GetState());
227 EXPECT_EQ(SR_EOS, buf.Write(in, kSize / 2, &bytes, nullptr));
228 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000229 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100230 EXPECT_EQ(SR_EOS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000231}
232
233TEST(FifoBufferTest, FullBufferCheck) {
234 FifoBuffer buff(10);
235 buff.ConsumeWriteBuffer(10);
236
237 size_t free;
deadbeef37f5ecf2017-02-27 14:06:41 -0800238 EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000239 EXPECT_EQ(0U, free);
240}
241
242TEST(FifoBufferTest, WriteOffsetAndReadOffset) {
243 const size_t kSize = 16;
244 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
245 char out[kSize * 2];
246 FifoBuffer buf(kSize);
247
248 // Write 14 bytes.
deadbeef37f5ecf2017-02-27 14:06:41 -0800249 EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, nullptr, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000250
251 // Make sure data is in |buf|.
252 size_t buffered;
253 EXPECT_TRUE(buf.GetBuffered(&buffered));
254 EXPECT_EQ(14u, buffered);
255
256 // Read 10 bytes.
257 buf.ConsumeReadData(10);
258
259 // There should be now 12 bytes of available space.
260 size_t remaining;
261 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
262 EXPECT_EQ(12u, remaining);
263
264 // Write at offset 12, this should fail.
deadbeef37f5ecf2017-02-27 14:06:41 -0800265 EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000266
267 // Write 8 bytes at offset 4, this wraps around the buffer.
deadbeef37f5ecf2017-02-27 14:06:41 -0800268 EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000269
270 // Number of available space remains the same until we call
271 // ConsumeWriteBuffer().
272 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
273 EXPECT_EQ(12u, remaining);
274 buf.ConsumeWriteBuffer(12);
275
276 // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the
277 // 8 bytes written.
278 size_t read;
279 EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read));
280 EXPECT_EQ(8u, read);
281 EXPECT_EQ(0, memcmp(out, in, 8));
282
283 // There should still be 16 bytes available for reading.
284 EXPECT_TRUE(buf.GetBuffered(&buffered));
285 EXPECT_EQ(16u, buffered);
286
287 // Read at offset 16, this should fail since we don't have that much data.
deadbeef37f5ecf2017-02-27 14:06:41 -0800288 EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000289}
290
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291} // namespace rtc