| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/net/rtcp/test_rtcp_packet_builder.h" | 5 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "media/cast/net/rtcp/rtcp_utility.h" | 8 #include "media/cast/net/rtcp/rtcp_utility.h" |
| 9 | 9 |
| 10 namespace media { | 10 namespace media { |
| 11 namespace cast { | 11 namespace cast { |
| 12 | 12 |
| 13 TestRtcpPacketBuilder::TestRtcpPacketBuilder() | 13 TestRtcpPacketBuilder::TestRtcpPacketBuilder() |
| 14 : ptr_of_length_(NULL), | 14 : ptr_of_length_(NULL), |
| 15 big_endian_writer_(reinterpret_cast<char*>(buffer_), kMaxIpPacketSize), | 15 big_endian_writer_(reinterpret_cast<char*>(buffer_), kMaxIpPacketSize), |
| 16 big_endian_reader_(NULL, 0) {} | 16 big_endian_reader_(NULL, 0) {} |
| 17 | 17 |
| 18 void TestRtcpPacketBuilder::AddSr(uint32 sender_ssrc, | 18 void TestRtcpPacketBuilder::AddSr(uint32_t sender_ssrc, |
| 19 int number_of_report_blocks) { | 19 int number_of_report_blocks) { |
| 20 AddRtcpHeader(200, number_of_report_blocks); | 20 AddRtcpHeader(200, number_of_report_blocks); |
| 21 big_endian_writer_.WriteU32(sender_ssrc); | 21 big_endian_writer_.WriteU32(sender_ssrc); |
| 22 big_endian_writer_.WriteU32(kNtpHigh); // NTP timestamp. | 22 big_endian_writer_.WriteU32(kNtpHigh); // NTP timestamp. |
| 23 big_endian_writer_.WriteU32(kNtpLow); | 23 big_endian_writer_.WriteU32(kNtpLow); |
| 24 big_endian_writer_.WriteU32(kRtpTimestamp); | 24 big_endian_writer_.WriteU32(kRtpTimestamp); |
| 25 big_endian_writer_.WriteU32(kSendPacketCount); | 25 big_endian_writer_.WriteU32(kSendPacketCount); |
| 26 big_endian_writer_.WriteU32(kSendOctetCount); | 26 big_endian_writer_.WriteU32(kSendOctetCount); |
| 27 } | 27 } |
| 28 | 28 |
| 29 void TestRtcpPacketBuilder::AddSrWithNtp(uint32 sender_ssrc, | 29 void TestRtcpPacketBuilder::AddSrWithNtp(uint32_t sender_ssrc, |
| 30 uint32 ntp_high, | 30 uint32_t ntp_high, |
| 31 uint32 ntp_low, | 31 uint32_t ntp_low, |
| 32 uint32 rtp_timestamp) { | 32 uint32_t rtp_timestamp) { |
| 33 AddRtcpHeader(200, 0); | 33 AddRtcpHeader(200, 0); |
| 34 big_endian_writer_.WriteU32(sender_ssrc); | 34 big_endian_writer_.WriteU32(sender_ssrc); |
| 35 big_endian_writer_.WriteU32(ntp_high); | 35 big_endian_writer_.WriteU32(ntp_high); |
| 36 big_endian_writer_.WriteU32(ntp_low); | 36 big_endian_writer_.WriteU32(ntp_low); |
| 37 big_endian_writer_.WriteU32(rtp_timestamp); | 37 big_endian_writer_.WriteU32(rtp_timestamp); |
| 38 big_endian_writer_.WriteU32(kSendPacketCount); | 38 big_endian_writer_.WriteU32(kSendPacketCount); |
| 39 big_endian_writer_.WriteU32(kSendOctetCount); | 39 big_endian_writer_.WriteU32(kSendOctetCount); |
| 40 } | 40 } |
| 41 | 41 |
| 42 void TestRtcpPacketBuilder::AddRr(uint32 sender_ssrc, | 42 void TestRtcpPacketBuilder::AddRr(uint32_t sender_ssrc, |
| 43 int number_of_report_blocks) { | 43 int number_of_report_blocks) { |
| 44 AddRtcpHeader(201, number_of_report_blocks); | 44 AddRtcpHeader(201, number_of_report_blocks); |
| 45 big_endian_writer_.WriteU32(sender_ssrc); | 45 big_endian_writer_.WriteU32(sender_ssrc); |
| 46 } | 46 } |
| 47 | 47 |
| 48 void TestRtcpPacketBuilder::AddRb(uint32 rtp_ssrc) { | 48 void TestRtcpPacketBuilder::AddRb(uint32_t rtp_ssrc) { |
| 49 big_endian_writer_.WriteU32(rtp_ssrc); | 49 big_endian_writer_.WriteU32(rtp_ssrc); |
| 50 big_endian_writer_.WriteU32(kLoss); | 50 big_endian_writer_.WriteU32(kLoss); |
| 51 big_endian_writer_.WriteU32(kExtendedMax); | 51 big_endian_writer_.WriteU32(kExtendedMax); |
| 52 big_endian_writer_.WriteU32(kTestJitter); | 52 big_endian_writer_.WriteU32(kTestJitter); |
| 53 big_endian_writer_.WriteU32(kLastSr); | 53 big_endian_writer_.WriteU32(kLastSr); |
| 54 big_endian_writer_.WriteU32(kDelayLastSr); | 54 big_endian_writer_.WriteU32(kDelayLastSr); |
| 55 } | 55 } |
| 56 | 56 |
| 57 void TestRtcpPacketBuilder::AddXrHeader(uint32 sender_ssrc) { | 57 void TestRtcpPacketBuilder::AddXrHeader(uint32_t sender_ssrc) { |
| 58 AddRtcpHeader(207, 0); | 58 AddRtcpHeader(207, 0); |
| 59 big_endian_writer_.WriteU32(sender_ssrc); | 59 big_endian_writer_.WriteU32(sender_ssrc); |
| 60 } | 60 } |
| 61 | 61 |
| 62 void TestRtcpPacketBuilder::AddXrUnknownBlock() { | 62 void TestRtcpPacketBuilder::AddXrUnknownBlock() { |
| 63 big_endian_writer_.WriteU8(9); // Block type. | 63 big_endian_writer_.WriteU8(9); // Block type. |
| 64 big_endian_writer_.WriteU8(0); // Reserved. | 64 big_endian_writer_.WriteU8(0); // Reserved. |
| 65 big_endian_writer_.WriteU16(4); // Block length. | 65 big_endian_writer_.WriteU16(4); // Block length. |
| 66 // First receiver same as sender of this report. | 66 // First receiver same as sender of this report. |
| 67 big_endian_writer_.WriteU32(0); | 67 big_endian_writer_.WriteU32(0); |
| 68 big_endian_writer_.WriteU32(0); | 68 big_endian_writer_.WriteU32(0); |
| 69 big_endian_writer_.WriteU32(0); | 69 big_endian_writer_.WriteU32(0); |
| 70 big_endian_writer_.WriteU32(0); | 70 big_endian_writer_.WriteU32(0); |
| 71 } | 71 } |
| 72 | 72 |
| 73 void TestRtcpPacketBuilder::AddUnknownBlock() { | 73 void TestRtcpPacketBuilder::AddUnknownBlock() { |
| 74 AddRtcpHeader(99, 0); | 74 AddRtcpHeader(99, 0); |
| 75 big_endian_writer_.WriteU32(42); | 75 big_endian_writer_.WriteU32(42); |
| 76 big_endian_writer_.WriteU32(42); | 76 big_endian_writer_.WriteU32(42); |
| 77 big_endian_writer_.WriteU32(42); | 77 big_endian_writer_.WriteU32(42); |
| 78 } | 78 } |
| 79 | 79 |
| 80 void TestRtcpPacketBuilder::AddXrDlrrBlock(uint32 sender_ssrc) { | 80 void TestRtcpPacketBuilder::AddXrDlrrBlock(uint32_t sender_ssrc) { |
| 81 big_endian_writer_.WriteU8(5); // Block type. | 81 big_endian_writer_.WriteU8(5); // Block type. |
| 82 big_endian_writer_.WriteU8(0); // Reserved. | 82 big_endian_writer_.WriteU8(0); // Reserved. |
| 83 big_endian_writer_.WriteU16(3); // Block length. | 83 big_endian_writer_.WriteU16(3); // Block length. |
| 84 | 84 |
| 85 // First receiver same as sender of this report. | 85 // First receiver same as sender of this report. |
| 86 big_endian_writer_.WriteU32(sender_ssrc); | 86 big_endian_writer_.WriteU32(sender_ssrc); |
| 87 big_endian_writer_.WriteU32(kLastRr); | 87 big_endian_writer_.WriteU32(kLastRr); |
| 88 big_endian_writer_.WriteU32(kDelayLastRr); | 88 big_endian_writer_.WriteU32(kDelayLastRr); |
| 89 } | 89 } |
| 90 | 90 |
| 91 void TestRtcpPacketBuilder::AddXrExtendedDlrrBlock(uint32 sender_ssrc) { | 91 void TestRtcpPacketBuilder::AddXrExtendedDlrrBlock(uint32_t sender_ssrc) { |
| 92 big_endian_writer_.WriteU8(5); // Block type. | 92 big_endian_writer_.WriteU8(5); // Block type. |
| 93 big_endian_writer_.WriteU8(0); // Reserved. | 93 big_endian_writer_.WriteU8(0); // Reserved. |
| 94 big_endian_writer_.WriteU16(9); // Block length. | 94 big_endian_writer_.WriteU16(9); // Block length. |
| 95 big_endian_writer_.WriteU32(0xaaaaaaaa); | 95 big_endian_writer_.WriteU32(0xaaaaaaaa); |
| 96 big_endian_writer_.WriteU32(0xaaaaaaaa); | 96 big_endian_writer_.WriteU32(0xaaaaaaaa); |
| 97 big_endian_writer_.WriteU32(0xaaaaaaaa); | 97 big_endian_writer_.WriteU32(0xaaaaaaaa); |
| 98 | 98 |
| 99 // First receiver same as sender of this report. | 99 // First receiver same as sender of this report. |
| 100 big_endian_writer_.WriteU32(sender_ssrc); | 100 big_endian_writer_.WriteU32(sender_ssrc); |
| 101 big_endian_writer_.WriteU32(kLastRr); | 101 big_endian_writer_.WriteU32(kLastRr); |
| 102 big_endian_writer_.WriteU32(kDelayLastRr); | 102 big_endian_writer_.WriteU32(kDelayLastRr); |
| 103 big_endian_writer_.WriteU32(0xbbbbbbbb); | 103 big_endian_writer_.WriteU32(0xbbbbbbbb); |
| 104 big_endian_writer_.WriteU32(0xbbbbbbbb); | 104 big_endian_writer_.WriteU32(0xbbbbbbbb); |
| 105 big_endian_writer_.WriteU32(0xbbbbbbbb); | 105 big_endian_writer_.WriteU32(0xbbbbbbbb); |
| 106 } | 106 } |
| 107 | 107 |
| 108 void TestRtcpPacketBuilder::AddXrRrtrBlock() { | 108 void TestRtcpPacketBuilder::AddXrRrtrBlock() { |
| 109 big_endian_writer_.WriteU8(4); // Block type. | 109 big_endian_writer_.WriteU8(4); // Block type. |
| 110 big_endian_writer_.WriteU8(0); // Reserved. | 110 big_endian_writer_.WriteU8(0); // Reserved. |
| 111 big_endian_writer_.WriteU16(2); // Block length. | 111 big_endian_writer_.WriteU16(2); // Block length. |
| 112 big_endian_writer_.WriteU32(kNtpHigh); | 112 big_endian_writer_.WriteU32(kNtpHigh); |
| 113 big_endian_writer_.WriteU32(kNtpLow); | 113 big_endian_writer_.WriteU32(kNtpLow); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void TestRtcpPacketBuilder::AddNack(uint32 sender_ssrc, uint32 media_ssrc) { | 116 void TestRtcpPacketBuilder::AddNack(uint32_t sender_ssrc, uint32_t media_ssrc) { |
| 117 AddRtcpHeader(205, 1); | 117 AddRtcpHeader(205, 1); |
| 118 big_endian_writer_.WriteU32(sender_ssrc); | 118 big_endian_writer_.WriteU32(sender_ssrc); |
| 119 big_endian_writer_.WriteU32(media_ssrc); | 119 big_endian_writer_.WriteU32(media_ssrc); |
| 120 big_endian_writer_.WriteU16(kMissingPacket); | 120 big_endian_writer_.WriteU16(kMissingPacket); |
| 121 big_endian_writer_.WriteU16(0); | 121 big_endian_writer_.WriteU16(0); |
| 122 } | 122 } |
| 123 | 123 |
| 124 void TestRtcpPacketBuilder::AddSendReportRequest(uint32 sender_ssrc, | 124 void TestRtcpPacketBuilder::AddSendReportRequest(uint32_t sender_ssrc, |
| 125 uint32 media_ssrc) { | 125 uint32_t media_ssrc) { |
| 126 AddRtcpHeader(205, 5); | 126 AddRtcpHeader(205, 5); |
| 127 big_endian_writer_.WriteU32(sender_ssrc); | 127 big_endian_writer_.WriteU32(sender_ssrc); |
| 128 big_endian_writer_.WriteU32(media_ssrc); | 128 big_endian_writer_.WriteU32(media_ssrc); |
| 129 } | 129 } |
| 130 | 130 |
| 131 void TestRtcpPacketBuilder::AddCast(uint32 sender_ssrc, | 131 void TestRtcpPacketBuilder::AddCast(uint32_t sender_ssrc, |
| 132 uint32 media_ssrc, | 132 uint32_t media_ssrc, |
| 133 base::TimeDelta target_delay) { | 133 base::TimeDelta target_delay) { |
| 134 AddRtcpHeader(206, 15); | 134 AddRtcpHeader(206, 15); |
| 135 big_endian_writer_.WriteU32(sender_ssrc); | 135 big_endian_writer_.WriteU32(sender_ssrc); |
| 136 big_endian_writer_.WriteU32(media_ssrc); | 136 big_endian_writer_.WriteU32(media_ssrc); |
| 137 big_endian_writer_.WriteU8('C'); | 137 big_endian_writer_.WriteU8('C'); |
| 138 big_endian_writer_.WriteU8('A'); | 138 big_endian_writer_.WriteU8('A'); |
| 139 big_endian_writer_.WriteU8('S'); | 139 big_endian_writer_.WriteU8('S'); |
| 140 big_endian_writer_.WriteU8('T'); | 140 big_endian_writer_.WriteU8('T'); |
| 141 big_endian_writer_.WriteU8(kAckFrameId); | 141 big_endian_writer_.WriteU8(kAckFrameId); |
| 142 big_endian_writer_.WriteU8(3); // Loss fields. | 142 big_endian_writer_.WriteU8(3); // Loss fields. |
| 143 big_endian_writer_.WriteU16(target_delay.InMilliseconds()); | 143 big_endian_writer_.WriteU16(target_delay.InMilliseconds()); |
| 144 big_endian_writer_.WriteU8(kLostFrameId); | 144 big_endian_writer_.WriteU8(kLostFrameId); |
| 145 big_endian_writer_.WriteU16(kRtcpCastAllPacketsLost); | 145 big_endian_writer_.WriteU16(kRtcpCastAllPacketsLost); |
| 146 big_endian_writer_.WriteU8(0); // Lost packet id mask. | 146 big_endian_writer_.WriteU8(0); // Lost packet id mask. |
| 147 big_endian_writer_.WriteU8(kFrameIdWithLostPackets); | 147 big_endian_writer_.WriteU8(kFrameIdWithLostPackets); |
| 148 big_endian_writer_.WriteU16(kLostPacketId1); | 148 big_endian_writer_.WriteU16(kLostPacketId1); |
| 149 big_endian_writer_.WriteU8(0x2); // Lost packet id mask. | 149 big_endian_writer_.WriteU8(0x2); // Lost packet id mask. |
| 150 big_endian_writer_.WriteU8(kFrameIdWithLostPackets); | 150 big_endian_writer_.WriteU8(kFrameIdWithLostPackets); |
| 151 big_endian_writer_.WriteU16(kLostPacketId3); | 151 big_endian_writer_.WriteU16(kLostPacketId3); |
| 152 big_endian_writer_.WriteU8(0); // Lost packet id mask. | 152 big_endian_writer_.WriteU8(0); // Lost packet id mask. |
| 153 } | 153 } |
| 154 | 154 |
| 155 void TestRtcpPacketBuilder::AddReceiverLog(uint32 sender_ssrc) { | 155 void TestRtcpPacketBuilder::AddReceiverLog(uint32_t sender_ssrc) { |
| 156 AddRtcpHeader(204, 2); | 156 AddRtcpHeader(204, 2); |
| 157 big_endian_writer_.WriteU32(sender_ssrc); | 157 big_endian_writer_.WriteU32(sender_ssrc); |
| 158 big_endian_writer_.WriteU8('C'); | 158 big_endian_writer_.WriteU8('C'); |
| 159 big_endian_writer_.WriteU8('A'); | 159 big_endian_writer_.WriteU8('A'); |
| 160 big_endian_writer_.WriteU8('S'); | 160 big_endian_writer_.WriteU8('S'); |
| 161 big_endian_writer_.WriteU8('T'); | 161 big_endian_writer_.WriteU8('T'); |
| 162 } | 162 } |
| 163 | 163 |
| 164 void TestRtcpPacketBuilder::AddReceiverFrameLog(uint32 rtp_timestamp, | 164 void TestRtcpPacketBuilder::AddReceiverFrameLog(uint32_t rtp_timestamp, |
| 165 int num_events, | 165 int num_events, |
| 166 uint32 event_timesamp_base) { | 166 uint32_t event_timesamp_base) { |
| 167 big_endian_writer_.WriteU32(rtp_timestamp); | 167 big_endian_writer_.WriteU32(rtp_timestamp); |
| 168 big_endian_writer_.WriteU8(static_cast<uint8>(num_events - 1)); | 168 big_endian_writer_.WriteU8(static_cast<uint8_t>(num_events - 1)); |
| 169 big_endian_writer_.WriteU8(static_cast<uint8>(event_timesamp_base >> 16)); | 169 big_endian_writer_.WriteU8(static_cast<uint8_t>(event_timesamp_base >> 16)); |
| 170 big_endian_writer_.WriteU8(static_cast<uint8>(event_timesamp_base >> 8)); | 170 big_endian_writer_.WriteU8(static_cast<uint8_t>(event_timesamp_base >> 8)); |
| 171 big_endian_writer_.WriteU8(static_cast<uint8>(event_timesamp_base)); | 171 big_endian_writer_.WriteU8(static_cast<uint8_t>(event_timesamp_base)); |
| 172 } | 172 } |
| 173 | 173 |
| 174 void TestRtcpPacketBuilder::AddReceiverEventLog(uint16 event_data, | 174 void TestRtcpPacketBuilder::AddReceiverEventLog(uint16_t event_data, |
| 175 CastLoggingEvent event, | 175 CastLoggingEvent event, |
| 176 uint16 event_timesamp_delta) { | 176 uint16_t event_timesamp_delta) { |
| 177 big_endian_writer_.WriteU16(event_data); | 177 big_endian_writer_.WriteU16(event_data); |
| 178 uint8 event_id = ConvertEventTypeToWireFormat(event); | 178 uint8_t event_id = ConvertEventTypeToWireFormat(event); |
| 179 uint16 type_and_delta = static_cast<uint16>(event_id) << 12; | 179 uint16_t type_and_delta = static_cast<uint16_t>(event_id) << 12; |
| 180 type_and_delta += event_timesamp_delta & 0x0fff; | 180 type_and_delta += event_timesamp_delta & 0x0fff; |
| 181 big_endian_writer_.WriteU16(type_and_delta); | 181 big_endian_writer_.WriteU16(type_and_delta); |
| 182 } | 182 } |
| 183 | 183 |
| 184 scoped_ptr<media::cast::Packet> TestRtcpPacketBuilder::GetPacket() { | 184 scoped_ptr<media::cast::Packet> TestRtcpPacketBuilder::GetPacket() { |
| 185 PatchLengthField(); | 185 PatchLengthField(); |
| 186 return scoped_ptr<media::cast::Packet>( | 186 return scoped_ptr<media::cast::Packet>( |
| 187 new media::cast::Packet(buffer_, buffer_ + Length())); | 187 new media::cast::Packet(buffer_, buffer_ + Length())); |
| 188 } | 188 } |
| 189 | 189 |
| 190 const uint8* TestRtcpPacketBuilder::Data() { | 190 const uint8_t* TestRtcpPacketBuilder::Data() { |
| 191 PatchLengthField(); | 191 PatchLengthField(); |
| 192 return buffer_; | 192 return buffer_; |
| 193 } | 193 } |
| 194 | 194 |
| 195 base::BigEndianReader* TestRtcpPacketBuilder::Reader() { | 195 base::BigEndianReader* TestRtcpPacketBuilder::Reader() { |
| 196 big_endian_reader_ = base::BigEndianReader( | 196 big_endian_reader_ = base::BigEndianReader( |
| 197 reinterpret_cast<const char *>(Data()), Length()); | 197 reinterpret_cast<const char *>(Data()), Length()); |
| 198 return &big_endian_reader_; | 198 return &big_endian_reader_; |
| 199 } | 199 } |
| 200 | 200 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 219 big_endian_writer_.WriteU8(0x80 | (format_or_count & 0x1F)); | 219 big_endian_writer_.WriteU8(0x80 | (format_or_count & 0x1F)); |
| 220 big_endian_writer_.WriteU8(payload); | 220 big_endian_writer_.WriteU8(payload); |
| 221 ptr_of_length_ = big_endian_writer_.ptr(); | 221 ptr_of_length_ = big_endian_writer_.ptr(); |
| 222 | 222 |
| 223 // Initialize length to "clearly illegal". | 223 // Initialize length to "clearly illegal". |
| 224 big_endian_writer_.WriteU16(0xDEAD); | 224 big_endian_writer_.WriteU16(0xDEAD); |
| 225 } | 225 } |
| 226 | 226 |
| 227 } // namespace cast | 227 } // namespace cast |
| 228 } // namespace media | 228 } // namespace media |
| OLD | NEW |