OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h" | 5 #include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h" |
6 | 6 |
7 #include "base/big_endian.h" | 7 #include "base/big_endian.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "media/cast/transport/pacing/paced_sender.h" | 9 #include "media/cast/transport/pacing/paced_sender.h" |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 max_payload_length(kMaxIpPacketSize - 28), // Default is IP-v4/UDP. | 24 max_payload_length(kMaxIpPacketSize - 28), // Default is IP-v4/UDP. |
25 sequence_number(0), | 25 sequence_number(0), |
26 frequency(8000), | 26 frequency(8000), |
27 ssrc(0), | 27 ssrc(0), |
28 channels(0) {} | 28 channels(0) {} |
29 | 29 |
30 RtpPacketizerConfig::~RtpPacketizerConfig() {} | 30 RtpPacketizerConfig::~RtpPacketizerConfig() {} |
31 | 31 |
32 RtpPacketizer::RtpPacketizer(PacedSender* const transport, | 32 RtpPacketizer::RtpPacketizer(PacedSender* const transport, |
33 PacketStorage* packet_storage, | 33 PacketStorage* packet_storage, |
34 RtpPacketizerConfig rtp_packetizer_config, | 34 RtpPacketizerConfig rtp_packetizer_config) |
35 base::TickClock* clock, | |
36 LoggingImpl* logging) | |
37 : config_(rtp_packetizer_config), | 35 : config_(rtp_packetizer_config), |
38 transport_(transport), | 36 transport_(transport), |
39 packet_storage_(packet_storage), | 37 packet_storage_(packet_storage), |
40 clock_(clock), | |
41 logging_(logging), | |
42 sequence_number_(config_.sequence_number), | 38 sequence_number_(config_.sequence_number), |
43 rtp_timestamp_(0), | 39 rtp_timestamp_(0), |
44 packet_id_(0), | 40 packet_id_(0), |
45 send_packets_count_(0), | 41 send_packets_count_(0), |
46 send_octet_count_(0) { | 42 send_octet_count_(0) { |
47 DCHECK(transport) << "Invalid argument"; | 43 DCHECK(transport) << "Invalid argument"; |
48 } | 44 } |
49 | 45 |
50 RtpPacketizer::~RtpPacketizer() {} | 46 RtpPacketizer::~RtpPacketizer() {} |
51 | 47 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 uint16 rtp_header_length = kCommonRtpHeaderLength + kCastRtpHeaderLength; | 101 uint16 rtp_header_length = kCommonRtpHeaderLength + kCastRtpHeaderLength; |
106 uint16 max_length = config_.max_payload_length - rtp_header_length - 1; | 102 uint16 max_length = config_.max_payload_length - rtp_header_length - 1; |
107 rtp_timestamp_ = timestamp; | 103 rtp_timestamp_ = timestamp; |
108 | 104 |
109 // Split the payload evenly (round number up). | 105 // Split the payload evenly (round number up). |
110 size_t num_packets = (data.size() + max_length) / max_length; | 106 size_t num_packets = (data.size() + max_length) / max_length; |
111 size_t payload_length = (data.size() + num_packets) / num_packets; | 107 size_t payload_length = (data.size() + num_packets) / num_packets; |
112 DCHECK_LE(payload_length, max_length) << "Invalid argument"; | 108 DCHECK_LE(payload_length, max_length) << "Invalid argument"; |
113 | 109 |
114 SendPacketVector packets; | 110 SendPacketVector packets; |
115 PacketList packets_for_logging; | |
116 | 111 |
117 size_t remaining_size = data.size(); | 112 size_t remaining_size = data.size(); |
118 std::string::const_iterator data_iter = data.begin(); | 113 std::string::const_iterator data_iter = data.begin(); |
119 while (remaining_size > 0) { | 114 while (remaining_size > 0) { |
120 PacketRef packet(new base::RefCountedData<Packet>); | 115 PacketRef packet(new base::RefCountedData<Packet>); |
121 | 116 |
122 if (remaining_size < payload_length) { | 117 if (remaining_size < payload_length) { |
123 payload_length = remaining_size; | 118 payload_length = remaining_size; |
124 } | 119 } |
125 remaining_size -= payload_length; | 120 remaining_size -= payload_length; |
(...skipping 22 matching lines...) Expand all Loading... |
148 | 143 |
149 // Store packet. | 144 // Store packet. |
150 packet_storage_->StorePacket(frame_id, packet_id_, key, packet); | 145 packet_storage_->StorePacket(frame_id, packet_id_, key, packet); |
151 ++packet_id_; | 146 ++packet_id_; |
152 data_iter += payload_length; | 147 data_iter += payload_length; |
153 | 148 |
154 // Update stats. | 149 // Update stats. |
155 ++send_packets_count_; | 150 ++send_packets_count_; |
156 send_octet_count_ += payload_length; | 151 send_octet_count_ += payload_length; |
157 packets.push_back(make_pair(key, packet)); | 152 packets.push_back(make_pair(key, packet)); |
158 packets_for_logging.push_back(packet); | |
159 } | 153 } |
160 DCHECK(packet_id_ == num_packets) << "Invalid state"; | 154 DCHECK(packet_id_ == num_packets) << "Invalid state"; |
161 | 155 |
162 logging_->InsertPacketListEvent( | |
163 clock_->NowTicks(), | |
164 config_.audio ? kAudioPacketSentToPacer : kVideoPacketSentToPacer, | |
165 packets_for_logging); | |
166 | |
167 // Send to network. | 156 // Send to network. |
168 transport_->SendPackets(packets); | 157 transport_->SendPackets(packets); |
169 | 158 |
170 // Prepare for next frame. | 159 // Prepare for next frame. |
171 packet_id_ = 0; | 160 packet_id_ = 0; |
172 } | 161 } |
173 | 162 |
174 void RtpPacketizer::BuildCommonRTPheader(Packet* packet, | 163 void RtpPacketizer::BuildCommonRTPheader(Packet* packet, |
175 bool marker_bit, | 164 bool marker_bit, |
176 uint32 time_stamp) { | 165 uint32 time_stamp) { |
177 packet->push_back(0x80); | 166 packet->push_back(0x80); |
178 packet->push_back(static_cast<uint8>(config_.payload_type) | | 167 packet->push_back(static_cast<uint8>(config_.payload_type) | |
179 (marker_bit ? kRtpMarkerBitMask : 0)); | 168 (marker_bit ? kRtpMarkerBitMask : 0)); |
180 size_t start_size = packet->size(); | 169 size_t start_size = packet->size(); |
181 packet->resize(start_size + 10); | 170 packet->resize(start_size + 10); |
182 base::BigEndianWriter big_endian_writer( | 171 base::BigEndianWriter big_endian_writer( |
183 reinterpret_cast<char*>(&((*packet)[start_size])), 10); | 172 reinterpret_cast<char*>(&((*packet)[start_size])), 10); |
184 big_endian_writer.WriteU16(sequence_number_); | 173 big_endian_writer.WriteU16(sequence_number_); |
185 big_endian_writer.WriteU32(time_stamp); | 174 big_endian_writer.WriteU32(time_stamp); |
186 big_endian_writer.WriteU32(config_.ssrc); | 175 big_endian_writer.WriteU32(config_.ssrc); |
187 ++sequence_number_; | 176 ++sequence_number_; |
188 } | 177 } |
189 | 178 |
190 } // namespace transport | 179 } // namespace transport |
191 } // namespace cast | 180 } // namespace cast |
192 } // namespace media | 181 } // namespace media |
OLD | NEW |