Index: media/cast/net/rtp/rtp_packetizer.cc |
diff --git a/media/cast/net/rtp/rtp_packetizer.cc b/media/cast/net/rtp/rtp_packetizer.cc |
index 81bc6ddaad6250abda542996f8c8863ce9a4b17a..247eae8034334eba8394fe49d93452a7d289d66c 100644 |
--- a/media/cast/net/rtp/rtp_packetizer.cc |
+++ b/media/cast/net/rtp/rtp_packetizer.cc |
@@ -29,8 +29,6 @@ RtpPacketizer::RtpPacketizer(PacedSender* const transport, |
transport_(transport), |
packet_storage_(packet_storage), |
sequence_number_(config_.sequence_number), |
- rtp_timestamp_(0), |
- packet_id_(0), |
send_packet_count_(0), |
send_octet_count_(0) { |
DCHECK(transport) << "Invalid argument"; |
@@ -46,7 +44,6 @@ uint16_t RtpPacketizer::NextSequenceNumber() { |
void RtpPacketizer::SendFrameAsPackets(const EncodedFrame& frame) { |
uint16_t rtp_header_length = kRtpHeaderLength + kCastHeaderLength; |
uint16_t max_length = config_.max_payload_length - rtp_header_length - 1; |
- rtp_timestamp_ = frame.rtp_timestamp; |
// Split the payload evenly (round number up). |
size_t num_packets = (frame.data.size() + max_length) / max_length; |
@@ -80,7 +77,8 @@ void RtpPacketizer::SendFrameAsPackets(const EncodedFrame& frame) { |
if (frame.dependency == EncodedFrame::KEY) |
byte0 |= kCastKeyFrameBitMask; |
// Extensions only go on the first packet of the frame |
- if (packet_id_ == 0) |
+ const uint16_t packet_id = static_cast<uint16_t>(packets.size()); |
+ if (packet_id == 0) |
byte0 |= num_extensions; |
packet->data.push_back(byte0); |
packet->data.push_back(static_cast<uint8_t>(frame.frame_id)); |
@@ -88,11 +86,11 @@ void RtpPacketizer::SendFrameAsPackets(const EncodedFrame& frame) { |
packet->data.resize(start_size + 4); |
base::BigEndianWriter big_endian_writer( |
reinterpret_cast<char*>(&(packet->data[start_size])), 4); |
- big_endian_writer.WriteU16(packet_id_); |
+ big_endian_writer.WriteU16(packet_id); |
big_endian_writer.WriteU16(static_cast<uint16_t>(num_packets - 1)); |
packet->data.push_back(static_cast<uint8_t>(frame.referenced_frame_id)); |
// Add extension details only on the first packet of the frame |
- if (packet_id_ == 0 && frame.new_playout_delay_ms) { |
+ if (packet_id == 0 && frame.new_playout_delay_ms) { |
packet->data.push_back(kCastRtpExtensionAdaptiveLatency << 2); |
packet->data.push_back(2); // 2 bytes |
packet->data.push_back( |
@@ -107,27 +105,24 @@ void RtpPacketizer::SendFrameAsPackets(const EncodedFrame& frame) { |
data_iter += payload_length; |
const PacketKey key = PacedPacketSender::MakePacketKey( |
- PacketKey::RTP, frame.frame_id, config_.ssrc, packet_id_++); |
+ PacketKey::RTP, frame.frame_id, config_.ssrc, packet_id); |
packets.push_back(make_pair(key, packet)); |
// Update stats. |
++send_packet_count_; |
send_octet_count_ += payload_length; |
} |
- DCHECK(packet_id_ == num_packets) << "Invalid state"; |
+ DCHECK_EQ(num_packets, packets.size()) << "Invalid state"; |
packet_storage_->StoreFrame(frame.frame_id, packets); |
// Send to network. |
transport_->SendPackets(packets); |
- |
- // Prepare for next frame. |
- packet_id_ = 0; |
} |
void RtpPacketizer::BuildCommonRTPheader(Packet* packet, |
bool marker_bit, |
- uint32_t time_stamp) { |
+ RtpTimeTicks rtp_timestamp) { |
packet->push_back(0x80); |
packet->push_back(static_cast<uint8_t>(config_.payload_type) | |
(marker_bit ? kRtpMarkerBitMask : 0)); |
@@ -136,7 +131,7 @@ void RtpPacketizer::BuildCommonRTPheader(Packet* packet, |
base::BigEndianWriter big_endian_writer( |
reinterpret_cast<char*>(&((*packet)[start_size])), 10); |
big_endian_writer.WriteU16(sequence_number_); |
- big_endian_writer.WriteU32(time_stamp); |
+ big_endian_writer.WriteU32(rtp_timestamp.lower_32_bits()); |
big_endian_writer.WriteU32(config_.ssrc); |
++sequence_number_; |
} |