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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/fec_test_helper.cc

Issue 2282473002: Add FlexfecPacketGenerator. (pt. 9) (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@generalize_ulpfec_packet_generator_into_augmented_packet_generator
Patch Set: Rebase. Created 4 years, 2 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
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/fec_test_helper.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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;
26 constexpr uint8_t kVp8PayloadType = 120; 28 constexpr uint8_t kVp8PayloadType = 120;
29
30 constexpr int kPacketTimestampIncrement = 3000;
27 } // namespace 31 } // namespace
28 32
29 ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets( 33 ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets(
30 int num_media_packets, 34 int num_media_packets,
31 uint16_t start_seq_num) { 35 uint16_t start_seq_num) {
32 RTC_DCHECK_GT(num_media_packets, 0); 36 RTC_DCHECK_GT(num_media_packets, 0);
33 uint16_t seq_num = start_seq_num; 37 uint16_t seq_num = start_seq_num;
34 int time_stamp = random_->Rand<int>(); 38 int time_stamp = random_->Rand<int>();
35 39
36 ForwardErrorCorrection::PacketList media_packets; 40 ForwardErrorCorrection::PacketList media_packets;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 90
87 uint16_t MediaPacketGenerator::GetFecSeqNum() { 91 uint16_t MediaPacketGenerator::GetFecSeqNum() {
88 return fec_seq_num_; 92 return fec_seq_num_;
89 } 93 }
90 94
91 AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc) 95 AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc)
92 : num_packets_(0), ssrc_(ssrc), seq_num_(0), timestamp_(0) {} 96 : num_packets_(0), ssrc_(ssrc), seq_num_(0), timestamp_(0) {}
93 97
94 void AugmentedPacketGenerator::NewFrame(size_t num_packets) { 98 void AugmentedPacketGenerator::NewFrame(size_t num_packets) {
95 num_packets_ = num_packets; 99 num_packets_ = num_packets;
96 timestamp_ += 3000; 100 timestamp_ += kPacketTimestampIncrement;
97 } 101 }
98 102
99 uint16_t AugmentedPacketGenerator::NextPacketSeqNum() { 103 uint16_t AugmentedPacketGenerator::NextPacketSeqNum() {
100 return ++seq_num_; 104 return ++seq_num_;
101 } 105 }
102 106
103 std::unique_ptr<AugmentedPacket> AugmentedPacketGenerator::NextPacket( 107 std::unique_ptr<AugmentedPacket> AugmentedPacketGenerator::NextPacket(
104 size_t offset, 108 size_t offset,
105 size_t length) { 109 size_t length) {
106 std::unique_ptr<AugmentedPacket> packet(new AugmentedPacket()); 110 std::unique_ptr<AugmentedPacket> packet(new AugmentedPacket());
(...skipping 19 matching lines...) Expand all
126 void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header, 130 void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header,
127 uint8_t* data) { 131 uint8_t* data) {
128 data[0] = 0x80; // Version 2. 132 data[0] = 0x80; // Version 2.
129 data[1] = header.payloadType; 133 data[1] = header.payloadType;
130 data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0); 134 data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0);
131 ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber); 135 ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber);
132 ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp); 136 ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp);
133 ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc); 137 ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc);
134 } 138 }
135 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_ += kPacketTimestampIncrement;
157 header.ssrc = flexfec_ssrc_;
158
159 std::unique_ptr<AugmentedPacket> packet_with_rtp_header(
160 new AugmentedPacket());
161 WriteRtpHeader(header, packet_with_rtp_header->data);
162 memcpy(packet_with_rtp_header->data + kRtpHeaderSize, packet.data,
163 packet.length);
164 packet_with_rtp_header->length = kRtpHeaderSize + packet.length;
165
166 return packet_with_rtp_header;
167 }
168
136 UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc) 169 UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc)
137 : AugmentedPacketGenerator(ssrc) {} 170 : AugmentedPacketGenerator(ssrc) {}
138 171
139 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket( 172 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket(
140 const AugmentedPacket& packet) { 173 const AugmentedPacket& packet) {
141 std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket()); 174 std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket());
142 175
143 const size_t kHeaderLength = packet.header.header.headerLength; 176 const size_t kHeaderLength = packet.header.header.headerLength;
144 red_packet->header = packet.header; 177 red_packet->header = packet.header;
145 red_packet->length = packet.length + 1; // 1 byte RED header. 178 red_packet->length = packet.length + 1; // 1 byte RED header.
146 memset(red_packet->data, 0, red_packet->length);
147 // Copy RTP header. 179 // Copy RTP header.
148 memcpy(red_packet->data, packet.data, kHeaderLength); 180 memcpy(red_packet->data, packet.data, kHeaderLength);
149 SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get()); 181 SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get());
150 memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength, 182 memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength,
151 packet.length - kHeaderLength); 183 packet.length - kHeaderLength);
152 184
153 return red_packet; 185 return red_packet;
154 } 186 }
155 187
156 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket( 188 std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket(
(...skipping 19 matching lines...) Expand all
176 red_packet->data[1] &= 0x80; // Reset. 208 red_packet->data[1] &= 0x80; // Reset.
177 red_packet->data[1] += kRedPayloadType; // Replace. 209 red_packet->data[1] += kRedPayloadType; // Replace.
178 210
179 // Add RED header, f-bit always 0. 211 // Add RED header, f-bit always 0.
180 red_packet->data[header_length] = payload_type; 212 red_packet->data[header_length] = payload_type;
181 } 213 }
182 214
183 } // namespace fec 215 } // namespace fec
184 } // namespace test 216 } // namespace test
185 } // namespace webrtc 217 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/fec_test_helper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698