| 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 |