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 |
11 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" | 11 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" |
12 | 12 |
13 #include <memory> | 13 #include <memory> |
14 #include <utility> | 14 #include <utility> |
15 | 15 |
16 #include "webrtc/base/checks.h" | |
17 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | |
16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
17 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 19 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
18 | 20 |
19 namespace webrtc { | 21 namespace webrtc { |
20 namespace test { | 22 namespace test { |
21 namespace fec { | 23 namespace fec { |
22 | 24 |
23 namespace { | 25 namespace { |
24 constexpr uint8_t kFecPayloadType = 96; | 26 constexpr uint8_t kFecPayloadType = 96; |
25 constexpr uint8_t kRedPayloadType = 97; | 27 constexpr uint8_t kRedPayloadType = 97; |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
128 void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header, | 130 void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header, |
129 uint8_t* data) { | 131 uint8_t* data) { |
130 data[0] = 0x80; // Version 2. | 132 data[0] = 0x80; // Version 2. |
131 data[1] = header.payloadType; | 133 data[1] = header.payloadType; |
132 data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0); | 134 data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0); |
133 ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber); | 135 ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber); |
134 ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp); | 136 ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp); |
135 ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc); | 137 ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc); |
136 } | 138 } |
137 | 139 |
140 FlexfecPacketGenerator::FlexfecPacketGenerator(uint32_t media_ssrc, | |
141 uint32_t flexfec_ssrc) | |
142 : AugmentedPacketGenerator(media_ssrc), | |
143 flexfec_ssrc_(flexfec_ssrc), | |
144 flexfec_seq_num_(0), | |
145 flexfec_timestamp_(0) {} | |
146 | |
147 std::unique_ptr<AugmentedPacket> FlexfecPacketGenerator::BuildFlexfecPacket( | |
148 const ForwardErrorCorrection::Packet& packet) { | |
149 RTC_DCHECK_LE(packet.length, | |
150 static_cast<size_t>(IP_PACKET_SIZE - kRtpHeaderSize)); | |
151 | |
152 RTPHeader header; | |
153 header.sequenceNumber = flexfec_seq_num_; | |
154 ++flexfec_seq_num_; | |
155 header.timestamp = flexfec_timestamp_; | |
156 flexfec_timestamp_ += 3000; | |
philipel
2016/09/21 11:15:27
constexpr int kMagicConstantWithSomeDescriptiveNam
brandtr
2016/09/21 11:59:21
Done.
| |
157 header.ssrc = flexfec_ssrc_; | |
158 | |
159 std::unique_ptr<AugmentedPacket> packet_with_rtp_header( | |
160 new AugmentedPacket()); | |
161 memset(packet_with_rtp_header->data, 0, IP_PACKET_SIZE); | |
philipel
2016/09/21 11:15:27
Do you really need to zero this memory?
brandtr
2016/09/21 11:59:21
No, this was overly cautious of me.
Parts of the
| |
162 WriteRtpHeader(header, packet_with_rtp_header->data); | |
163 memcpy(packet_with_rtp_header->data + kRtpHeaderSize, packet.data, | |
164 packet.length); | |
165 packet_with_rtp_header->length = kRtpHeaderSize + packet.length; | |
166 | |
167 return packet_with_rtp_header; | |
168 } | |
169 | |
138 UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc) | 170 UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc) |
139 : AugmentedPacketGenerator(ssrc) {} | 171 : AugmentedPacketGenerator(ssrc) {} |
140 | 172 |
141 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket( | 173 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket( |
142 const AugmentedPacket& packet) { | 174 const AugmentedPacket& packet) { |
143 std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket()); | 175 std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket()); |
144 | 176 |
145 const size_t kHeaderLength = packet.header.header.headerLength; | 177 const size_t kHeaderLength = packet.header.header.headerLength; |
146 red_packet->header = packet.header; | 178 red_packet->header = packet.header; |
147 red_packet->length = packet.length + 1; // 1 byte RED header. | 179 red_packet->length = packet.length + 1; // 1 byte RED header. |
148 memset(red_packet->data, 0, red_packet->length); | 180 memset(red_packet->data, 0, red_packet->length); |
brandtr
2016/09/21 11:59:21
This memset is also unnecessary, since the entire
| |
149 // Copy RTP header. | 181 // Copy RTP header. |
150 memcpy(red_packet->data, packet.data, kHeaderLength); | 182 memcpy(red_packet->data, packet.data, kHeaderLength); |
151 SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get()); | 183 SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get()); |
152 memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength, | 184 memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength, |
153 packet.length - kHeaderLength); | 185 packet.length - kHeaderLength); |
154 | 186 |
155 return red_packet; | 187 return red_packet; |
156 } | 188 } |
157 | 189 |
158 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket( | 190 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket( |
(...skipping 19 matching lines...) Expand all Loading... | |
178 red_packet->data[1] &= 0x80; // Reset. | 210 red_packet->data[1] &= 0x80; // Reset. |
179 red_packet->data[1] += kRedPayloadType; // Replace. | 211 red_packet->data[1] += kRedPayloadType; // Replace. |
180 | 212 |
181 // Add RED header, f-bit always 0. | 213 // Add RED header, f-bit always 0. |
182 red_packet->data[header_length] = payload_type; | 214 red_packet->data[header_length] = payload_type; |
183 } | 215 } |
184 | 216 |
185 } // namespace fec | 217 } // namespace fec |
186 } // namespace test | 218 } // namespace test |
187 } // namespace webrtc | 219 } // namespace webrtc |
OLD | NEW |