OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 // Last RED header: | 68 // Last RED header: |
69 // 0 1 2 3 4 5 6 7 | 69 // 0 1 2 3 4 5 6 7 |
70 // +-+-+-+-+-+-+-+-+ | 70 // +-+-+-+-+-+-+-+-+ |
71 // |0| Block PT | | 71 // |0| Block PT | |
72 // +-+-+-+-+-+-+-+-+ | 72 // +-+-+-+-+-+-+-+-+ |
73 | 73 |
74 // Creates a RED packet, with |num_payloads| payloads, with payload types given | 74 // Creates a RED packet, with |num_payloads| payloads, with payload types given |
75 // by the values in array |payload_types| (which must be of length | 75 // by the values in array |payload_types| (which must be of length |
76 // |num_payloads|). Each redundant payload is |timestamp_offset| samples | 76 // |num_payloads|). Each redundant payload is |timestamp_offset| samples |
77 // "behind" the the previous payload. | 77 // "behind" the the previous payload. |
78 Packet* CreateRedPayload(size_t num_payloads, | 78 Packet CreateRedPayload(size_t num_payloads, |
79 uint8_t* payload_types, | 79 uint8_t* payload_types, |
80 int timestamp_offset, | 80 int timestamp_offset, |
81 bool embed_opus_fec = false) { | 81 bool embed_opus_fec = false) { |
82 Packet* packet = new Packet; | 82 Packet packet; |
83 packet->payload_type = kRedPayloadType; | 83 packet.payload_type = kRedPayloadType; |
84 packet->timestamp = kBaseTimestamp; | 84 packet.timestamp = kBaseTimestamp; |
85 packet->sequence_number = kSequenceNumber; | 85 packet.sequence_number = kSequenceNumber; |
86 packet->payload.SetSize((kPayloadLength + 1) + | 86 packet.payload.SetSize((kPayloadLength + 1) + |
87 (num_payloads - 1) * | 87 (num_payloads - 1) * |
88 (kPayloadLength + kRedHeaderLength)); | 88 (kPayloadLength + kRedHeaderLength)); |
89 uint8_t* payload_ptr = packet->payload.data(); | 89 uint8_t* payload_ptr = packet.payload.data(); |
90 for (size_t i = 0; i < num_payloads; ++i) { | 90 for (size_t i = 0; i < num_payloads; ++i) { |
91 // Write the RED headers. | 91 // Write the RED headers. |
92 if (i == num_payloads - 1) { | 92 if (i == num_payloads - 1) { |
93 // Special case for last payload. | 93 // Special case for last payload. |
94 *payload_ptr = payload_types[i] & 0x7F; // F = 0; | 94 *payload_ptr = payload_types[i] & 0x7F; // F = 0; |
95 ++payload_ptr; | 95 ++payload_ptr; |
96 break; | 96 break; |
97 } | 97 } |
98 *payload_ptr = payload_types[i] & 0x7F; | 98 *payload_ptr = payload_types[i] & 0x7F; |
99 // Not the last block; set F = 1. | 99 // Not the last block; set F = 1. |
(...skipping 15 matching lines...) Expand all Loading... |
115 static_cast<uint8_t>(i)); | 115 static_cast<uint8_t>(i)); |
116 } else { | 116 } else { |
117 memset(payload_ptr, static_cast<int>(i), kPayloadLength); | 117 memset(payload_ptr, static_cast<int>(i), kPayloadLength); |
118 } | 118 } |
119 payload_ptr += kPayloadLength; | 119 payload_ptr += kPayloadLength; |
120 } | 120 } |
121 return packet; | 121 return packet; |
122 } | 122 } |
123 | 123 |
124 // Create a packet with all payload bytes set to |payload_value|. | 124 // Create a packet with all payload bytes set to |payload_value|. |
125 Packet* CreatePacket(uint8_t payload_type, | 125 Packet CreatePacket(uint8_t payload_type, |
126 size_t payload_length, | 126 size_t payload_length, |
127 uint8_t payload_value, | 127 uint8_t payload_value, |
128 bool opus_fec = false) { | 128 bool opus_fec = false) { |
129 Packet* packet = new Packet; | 129 Packet packet; |
130 packet->payload_type = payload_type; | 130 packet.payload_type = payload_type; |
131 packet->timestamp = kBaseTimestamp; | 131 packet.timestamp = kBaseTimestamp; |
132 packet->sequence_number = kSequenceNumber; | 132 packet.sequence_number = kSequenceNumber; |
133 packet->payload.SetSize(payload_length); | 133 packet.payload.SetSize(payload_length); |
134 if (opus_fec) { | 134 if (opus_fec) { |
135 CreateOpusFecPayload(packet->payload.data(), packet->payload.size(), | 135 CreateOpusFecPayload(packet.payload.data(), packet.payload.size(), |
136 payload_value); | 136 payload_value); |
137 } else { | 137 } else { |
138 memset(packet->payload.data(), payload_value, packet->payload.size()); | 138 memset(packet.payload.data(), payload_value, packet.payload.size()); |
139 } | 139 } |
140 return packet; | 140 return packet; |
141 } | 141 } |
142 | 142 |
143 // Checks that |packet| has the attributes given in the remaining parameters. | 143 // Checks that |packet| has the attributes given in the remaining parameters. |
144 void VerifyPacket(const Packet* packet, | 144 void VerifyPacket(const Packet& packet, |
145 size_t payload_length, | 145 size_t payload_length, |
146 uint8_t payload_type, | 146 uint8_t payload_type, |
147 uint16_t sequence_number, | 147 uint16_t sequence_number, |
148 uint32_t timestamp, | 148 uint32_t timestamp, |
149 uint8_t payload_value, | 149 uint8_t payload_value, |
150 Packet::Priority priority) { | 150 Packet::Priority priority) { |
151 EXPECT_EQ(payload_length, packet->payload.size()); | 151 EXPECT_EQ(payload_length, packet.payload.size()); |
152 EXPECT_EQ(payload_type, packet->payload_type); | 152 EXPECT_EQ(payload_type, packet.payload_type); |
153 EXPECT_EQ(sequence_number, packet->sequence_number); | 153 EXPECT_EQ(sequence_number, packet.sequence_number); |
154 EXPECT_EQ(timestamp, packet->timestamp); | 154 EXPECT_EQ(timestamp, packet.timestamp); |
155 EXPECT_EQ(priority, packet->priority); | 155 EXPECT_EQ(priority, packet.priority); |
156 ASSERT_FALSE(packet->payload.empty()); | 156 ASSERT_FALSE(packet.payload.empty()); |
157 for (size_t i = 0; i < packet->payload.size(); ++i) { | 157 for (size_t i = 0; i < packet.payload.size(); ++i) { |
158 ASSERT_EQ(payload_value, packet->payload.data()[i]); | 158 ASSERT_EQ(payload_value, packet.payload.data()[i]); |
159 } | 159 } |
160 } | 160 } |
161 | 161 |
162 void VerifyPacket(const Packet* packet, | 162 void VerifyPacket(const Packet& packet, |
163 size_t payload_length, | 163 size_t payload_length, |
164 uint8_t payload_type, | 164 uint8_t payload_type, |
165 uint16_t sequence_number, | 165 uint16_t sequence_number, |
166 uint32_t timestamp, | 166 uint32_t timestamp, |
167 uint8_t payload_value, | 167 uint8_t payload_value, |
168 bool primary) { | 168 bool primary) { |
169 return VerifyPacket(packet, payload_length, payload_type, sequence_number, | 169 return VerifyPacket(packet, payload_length, payload_type, sequence_number, |
170 timestamp, payload_value, | 170 timestamp, payload_value, |
171 Packet::Priority{0, primary ? 0 : 1}); | 171 Packet::Priority{0, primary ? 0 : 1}); |
172 } | 172 } |
173 | 173 |
174 // Start of test definitions. | 174 // Start of test definitions. |
175 | 175 |
176 TEST(RedPayloadSplitter, CreateAndDestroy) { | 176 TEST(RedPayloadSplitter, CreateAndDestroy) { |
177 RedPayloadSplitter* splitter = new RedPayloadSplitter; | 177 RedPayloadSplitter* splitter = new RedPayloadSplitter; |
178 delete splitter; | 178 delete splitter; |
179 } | 179 } |
180 | 180 |
181 // Packet A is split into A1 and A2. | 181 // Packet A is split into A1 and A2. |
182 TEST(RedPayloadSplitter, OnePacketTwoPayloads) { | 182 TEST(RedPayloadSplitter, OnePacketTwoPayloads) { |
183 uint8_t payload_types[] = {0, 0}; | 183 uint8_t payload_types[] = {0, 0}; |
184 const int kTimestampOffset = 160; | 184 const int kTimestampOffset = 160; |
185 Packet* packet = CreateRedPayload(2, payload_types, kTimestampOffset); | |
186 PacketList packet_list; | 185 PacketList packet_list; |
187 packet_list.push_back(packet); | 186 packet_list.push_back(CreateRedPayload(2, payload_types, kTimestampOffset)); |
188 RedPayloadSplitter splitter; | 187 RedPayloadSplitter splitter; |
189 EXPECT_TRUE(splitter.SplitRed(&packet_list)); | 188 EXPECT_TRUE(splitter.SplitRed(&packet_list)); |
190 ASSERT_EQ(2u, packet_list.size()); | 189 ASSERT_EQ(2u, packet_list.size()); |
191 // Check first packet. The first in list should always be the primary payload. | 190 // Check first packet. The first in list should always be the primary payload. |
192 packet = packet_list.front(); | 191 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[1], |
193 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber, | 192 kSequenceNumber, kBaseTimestamp, 1, true); |
194 kBaseTimestamp, 1, true); | |
195 delete packet; | |
196 packet_list.pop_front(); | 193 packet_list.pop_front(); |
197 // Check second packet. | 194 // Check second packet. |
198 packet = packet_list.front(); | 195 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0], |
199 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, | 196 kSequenceNumber, kBaseTimestamp - kTimestampOffset, 0, false); |
200 kBaseTimestamp - kTimestampOffset, 0, false); | |
201 delete packet; | |
202 } | 197 } |
203 | 198 |
204 // Packets A and B are not split at all. Only the RED header in each packet is | 199 // Packets A and B are not split at all. Only the RED header in each packet is |
205 // removed. | 200 // removed. |
206 TEST(RedPayloadSplitter, TwoPacketsOnePayload) { | 201 TEST(RedPayloadSplitter, TwoPacketsOnePayload) { |
207 uint8_t payload_types[] = {0}; | 202 uint8_t payload_types[] = {0}; |
208 const int kTimestampOffset = 160; | 203 const int kTimestampOffset = 160; |
209 // Create first packet, with a single RED payload. | 204 // Create first packet, with a single RED payload. |
210 Packet* packet = CreateRedPayload(1, payload_types, kTimestampOffset); | |
211 PacketList packet_list; | 205 PacketList packet_list; |
212 packet_list.push_back(packet); | 206 packet_list.push_back(CreateRedPayload(1, payload_types, kTimestampOffset)); |
213 // Create second packet, with a single RED payload. | 207 // Create second packet, with a single RED payload. |
214 packet = CreateRedPayload(1, payload_types, kTimestampOffset); | 208 { |
215 // Manually change timestamp and sequence number of second packet. | 209 Packet packet = CreateRedPayload(1, payload_types, kTimestampOffset); |
216 packet->timestamp += kTimestampOffset; | 210 // Manually change timestamp and sequence number of second packet. |
217 packet->sequence_number++; | 211 packet.timestamp += kTimestampOffset; |
218 packet_list.push_back(packet); | 212 packet.sequence_number++; |
| 213 packet_list.push_back(std::move(packet)); |
| 214 } |
219 RedPayloadSplitter splitter; | 215 RedPayloadSplitter splitter; |
220 EXPECT_TRUE(splitter.SplitRed(&packet_list)); | 216 EXPECT_TRUE(splitter.SplitRed(&packet_list)); |
221 ASSERT_EQ(2u, packet_list.size()); | 217 ASSERT_EQ(2u, packet_list.size()); |
222 // Check first packet. | 218 // Check first packet. |
223 packet = packet_list.front(); | 219 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0], |
224 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, | 220 kSequenceNumber, kBaseTimestamp, 0, true); |
225 kBaseTimestamp, 0, true); | |
226 delete packet; | |
227 packet_list.pop_front(); | 221 packet_list.pop_front(); |
228 // Check second packet. | 222 // Check second packet. |
229 packet = packet_list.front(); | 223 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0], |
230 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1, | 224 kSequenceNumber + 1, kBaseTimestamp + kTimestampOffset, 0, true); |
231 kBaseTimestamp + kTimestampOffset, 0, true); | |
232 delete packet; | |
233 } | 225 } |
234 | 226 |
235 // Packets A and B are split into packets A1, A2, A3, B1, B2, B3, with | 227 // Packets A and B are split into packets A1, A2, A3, B1, B2, B3, with |
236 // attributes as follows: | 228 // attributes as follows: |
237 // | 229 // |
238 // A1* A2 A3 B1* B2 B3 | 230 // A1* A2 A3 B1* B2 B3 |
239 // Payload type 0 1 2 0 1 2 | 231 // Payload type 0 1 2 0 1 2 |
240 // Timestamp b b-o b-2o b+o b b-o | 232 // Timestamp b b-o b-2o b+o b b-o |
241 // Sequence number 0 0 0 1 1 1 | 233 // Sequence number 0 0 0 1 1 1 |
242 // | 234 // |
243 // b = kBaseTimestamp, o = kTimestampOffset, * = primary. | 235 // b = kBaseTimestamp, o = kTimestampOffset, * = primary. |
244 TEST(RedPayloadSplitter, TwoPacketsThreePayloads) { | 236 TEST(RedPayloadSplitter, TwoPacketsThreePayloads) { |
245 uint8_t payload_types[] = {2, 1, 0}; // Primary is the last one. | 237 uint8_t payload_types[] = {2, 1, 0}; // Primary is the last one. |
246 const int kTimestampOffset = 160; | 238 const int kTimestampOffset = 160; |
247 // Create first packet, with 3 RED payloads. | 239 // Create first packet, with 3 RED payloads. |
248 Packet* packet = CreateRedPayload(3, payload_types, kTimestampOffset); | |
249 PacketList packet_list; | 240 PacketList packet_list; |
250 packet_list.push_back(packet); | 241 packet_list.push_back(CreateRedPayload(3, payload_types, kTimestampOffset)); |
251 // Create first packet, with 3 RED payloads. | 242 // Create first packet, with 3 RED payloads. |
252 packet = CreateRedPayload(3, payload_types, kTimestampOffset); | 243 { |
253 // Manually change timestamp and sequence number of second packet. | 244 Packet packet = CreateRedPayload(3, payload_types, kTimestampOffset); |
254 packet->timestamp += kTimestampOffset; | 245 // Manually change timestamp and sequence number of second packet. |
255 packet->sequence_number++; | 246 packet.timestamp += kTimestampOffset; |
256 packet_list.push_back(packet); | 247 packet.sequence_number++; |
| 248 packet_list.push_back(std::move(packet)); |
| 249 } |
257 RedPayloadSplitter splitter; | 250 RedPayloadSplitter splitter; |
258 EXPECT_TRUE(splitter.SplitRed(&packet_list)); | 251 EXPECT_TRUE(splitter.SplitRed(&packet_list)); |
259 ASSERT_EQ(6u, packet_list.size()); | 252 ASSERT_EQ(6u, packet_list.size()); |
260 // Check first packet, A1. | 253 // Check first packet, A1. |
261 packet = packet_list.front(); | 254 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[2], |
262 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber, | 255 kSequenceNumber, kBaseTimestamp, 2, {0, 0}); |
263 kBaseTimestamp, 2, {0, 0}); | |
264 delete packet; | |
265 packet_list.pop_front(); | 256 packet_list.pop_front(); |
266 // Check second packet, A2. | 257 // Check second packet, A2. |
267 packet = packet_list.front(); | 258 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[1], |
268 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber, | 259 kSequenceNumber, kBaseTimestamp - kTimestampOffset, 1, {0, 1}); |
269 kBaseTimestamp - kTimestampOffset, 1, {0, 1}); | |
270 delete packet; | |
271 packet_list.pop_front(); | 260 packet_list.pop_front(); |
272 // Check third packet, A3. | 261 // Check third packet, A3. |
273 packet = packet_list.front(); | 262 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0], |
274 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, | 263 kSequenceNumber, kBaseTimestamp - 2 * kTimestampOffset, 0, |
275 kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2}); | 264 {0, 2}); |
276 delete packet; | |
277 packet_list.pop_front(); | 265 packet_list.pop_front(); |
278 // Check fourth packet, B1. | 266 // Check fourth packet, B1. |
279 packet = packet_list.front(); | 267 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[2], |
280 VerifyPacket(packet, kPayloadLength, payload_types[2], kSequenceNumber + 1, | 268 kSequenceNumber + 1, kBaseTimestamp + kTimestampOffset, 2, |
281 kBaseTimestamp + kTimestampOffset, 2, {0, 0}); | 269 {0, 0}); |
282 delete packet; | |
283 packet_list.pop_front(); | 270 packet_list.pop_front(); |
284 // Check fifth packet, B2. | 271 // Check fifth packet, B2. |
285 packet = packet_list.front(); | 272 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[1], |
286 VerifyPacket(packet, kPayloadLength, payload_types[1], kSequenceNumber + 1, | 273 kSequenceNumber + 1, kBaseTimestamp, 1, {0, 1}); |
287 kBaseTimestamp, 1, {0, 1}); | |
288 delete packet; | |
289 packet_list.pop_front(); | 274 packet_list.pop_front(); |
290 // Check sixth packet, B3. | 275 // Check sixth packet, B3. |
291 packet = packet_list.front(); | 276 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0], |
292 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber + 1, | 277 kSequenceNumber + 1, kBaseTimestamp - kTimestampOffset, 0, |
293 kBaseTimestamp - kTimestampOffset, 0, {0, 2}); | 278 {0, 2}); |
294 delete packet; | |
295 } | 279 } |
296 | 280 |
297 // Creates a list with 4 packets with these payload types: | 281 // Creates a list with 4 packets with these payload types: |
298 // 0 = CNGnb | 282 // 0 = CNGnb |
299 // 1 = PCMu | 283 // 1 = PCMu |
300 // 2 = DTMF (AVT) | 284 // 2 = DTMF (AVT) |
301 // 3 = iLBC | 285 // 3 = iLBC |
302 // We expect the method CheckRedPayloads to discard the iLBC packet, since it | 286 // We expect the method CheckRedPayloads to discard the iLBC packet, since it |
303 // is a non-CNG, non-DTMF payload of another type than the first speech payload | 287 // is a non-CNG, non-DTMF payload of another type than the first speech payload |
304 // found in the list (which is PCMu). | 288 // found in the list (which is PCMu). |
305 TEST(RedPayloadSplitter, CheckRedPayloads) { | 289 TEST(RedPayloadSplitter, CheckRedPayloads) { |
306 PacketList packet_list; | 290 PacketList packet_list; |
307 for (uint8_t i = 0; i <= 3; ++i) { | 291 for (uint8_t i = 0; i <= 3; ++i) { |
308 // Create packet with payload type |i|, payload length 10 bytes, all 0. | 292 // Create packet with payload type |i|, payload length 10 bytes, all 0. |
309 Packet* packet = CreatePacket(i, 10, 0); | 293 packet_list.push_back(CreatePacket(i, 10, 0)); |
310 packet_list.push_back(packet); | |
311 } | 294 } |
312 | 295 |
313 // Use a real DecoderDatabase object here instead of a mock, since it is | 296 // Use a real DecoderDatabase object here instead of a mock, since it is |
314 // easier to just register the payload types and let the actual implementation | 297 // easier to just register the payload types and let the actual implementation |
315 // do its job. | 298 // do its job. |
316 DecoderDatabase decoder_database( | 299 DecoderDatabase decoder_database( |
317 new rtc::RefCountedObject<MockAudioDecoderFactory>); | 300 new rtc::RefCountedObject<MockAudioDecoderFactory>); |
318 decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderCNGnb, "cng-nb"); | 301 decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderCNGnb, "cng-nb"); |
319 decoder_database.RegisterPayload(1, NetEqDecoder::kDecoderPCMu, "pcmu"); | 302 decoder_database.RegisterPayload(1, NetEqDecoder::kDecoderPCMu, "pcmu"); |
320 decoder_database.RegisterPayload(2, NetEqDecoder::kDecoderAVT, "avt"); | 303 decoder_database.RegisterPayload(2, NetEqDecoder::kDecoderAVT, "avt"); |
321 decoder_database.RegisterPayload(3, NetEqDecoder::kDecoderILBC, "ilbc"); | 304 decoder_database.RegisterPayload(3, NetEqDecoder::kDecoderILBC, "ilbc"); |
322 | 305 |
323 RedPayloadSplitter splitter; | 306 RedPayloadSplitter splitter; |
324 splitter.CheckRedPayloads(&packet_list, decoder_database); | 307 splitter.CheckRedPayloads(&packet_list, decoder_database); |
325 | 308 |
326 ASSERT_EQ(3u, packet_list.size()); // Should have dropped the last packet. | 309 ASSERT_EQ(3u, packet_list.size()); // Should have dropped the last packet. |
327 // Verify packets. The loop verifies that payload types 0, 1, and 2 are in the | 310 // Verify packets. The loop verifies that payload types 0, 1, and 2 are in the |
328 // list. | 311 // list. |
329 for (int i = 0; i <= 2; ++i) { | 312 for (int i = 0; i <= 2; ++i) { |
330 Packet* packet = packet_list.front(); | 313 VerifyPacket(packet_list.front(), 10, i, kSequenceNumber, kBaseTimestamp, 0, |
331 VerifyPacket(packet, 10, i, kSequenceNumber, kBaseTimestamp, 0, true); | 314 true); |
332 delete packet; | |
333 packet_list.pop_front(); | 315 packet_list.pop_front(); |
334 } | 316 } |
335 EXPECT_TRUE(packet_list.empty()); | 317 EXPECT_TRUE(packet_list.empty()); |
336 } | 318 } |
337 | 319 |
338 // Packet A is split into A1, A2 and A3. But the length parameter is off, so | 320 // Packet A is split into A1, A2 and A3. But the length parameter is off, so |
339 // the last payloads should be discarded. | 321 // the last payloads should be discarded. |
340 TEST(RedPayloadSplitter, WrongPayloadLength) { | 322 TEST(RedPayloadSplitter, WrongPayloadLength) { |
341 uint8_t payload_types[] = {0, 0, 0}; | 323 uint8_t payload_types[] = {0, 0, 0}; |
342 const int kTimestampOffset = 160; | 324 const int kTimestampOffset = 160; |
343 Packet* packet = CreateRedPayload(3, payload_types, kTimestampOffset); | |
344 // Manually tamper with the payload length of the packet. | |
345 // This is one byte too short for the second payload (out of three). | |
346 // We expect only the first payload to be returned. | |
347 packet->payload.SetSize(packet->payload.size() - (kPayloadLength + 1)); | |
348 PacketList packet_list; | 325 PacketList packet_list; |
349 packet_list.push_back(packet); | 326 { |
| 327 Packet packet = CreateRedPayload(3, payload_types, kTimestampOffset); |
| 328 // Manually tamper with the payload length of the packet. |
| 329 // This is one byte too short for the second payload (out of three). |
| 330 // We expect only the first payload to be returned. |
| 331 packet.payload.SetSize(packet.payload.size() - (kPayloadLength + 1)); |
| 332 packet_list.push_back(std::move(packet)); |
| 333 } |
350 RedPayloadSplitter splitter; | 334 RedPayloadSplitter splitter; |
351 EXPECT_FALSE(splitter.SplitRed(&packet_list)); | 335 EXPECT_FALSE(splitter.SplitRed(&packet_list)); |
352 ASSERT_EQ(1u, packet_list.size()); | 336 ASSERT_EQ(1u, packet_list.size()); |
353 // Check first packet. | 337 // Check first packet. |
354 packet = packet_list.front(); | 338 VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0], |
355 VerifyPacket(packet, kPayloadLength, payload_types[0], kSequenceNumber, | 339 kSequenceNumber, kBaseTimestamp - 2 * kTimestampOffset, 0, |
356 kBaseTimestamp - 2 * kTimestampOffset, 0, {0, 2}); | 340 {0, 2}); |
357 delete packet; | |
358 packet_list.pop_front(); | 341 packet_list.pop_front(); |
359 } | 342 } |
360 | 343 |
361 } // namespace webrtc | 344 } // namespace webrtc |
OLD | NEW |