| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 const Rpsi& parsed = mutable_parsed; // Read values from constant object. | 39 const Rpsi& parsed = mutable_parsed; // Read values from constant object. |
| 40 | 40 |
| 41 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 41 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
| 42 EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc()); | 42 EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc()); |
| 43 EXPECT_EQ(kPayloadType, parsed.payload_type()); | 43 EXPECT_EQ(kPayloadType, parsed.payload_type()); |
| 44 EXPECT_EQ(kPictureId, parsed.picture_id()); | 44 EXPECT_EQ(kPictureId, parsed.picture_id()); |
| 45 } | 45 } |
| 46 | 46 |
| 47 TEST(RtcpPacketRpsiTest, Create) { | 47 TEST(RtcpPacketRpsiTest, Create) { |
| 48 Rpsi rpsi; | 48 Rpsi rpsi; |
| 49 rpsi.From(kSenderSsrc); | 49 rpsi.SetSenderSsrc(kSenderSsrc); |
| 50 rpsi.To(kRemoteSsrc); | 50 rpsi.SetMediaSsrc(kRemoteSsrc); |
| 51 rpsi.WithPayloadType(kPayloadType); | 51 rpsi.SetPayloadType(kPayloadType); |
| 52 rpsi.WithPictureId(kPictureId); | 52 rpsi.SetPictureId(kPictureId); |
| 53 | 53 |
| 54 rtc::Buffer packet = rpsi.Build(); | 54 rtc::Buffer packet = rpsi.Build(); |
| 55 | 55 |
| 56 EXPECT_THAT(make_tuple(packet.data(), packet.size()), | 56 EXPECT_THAT(make_tuple(packet.data(), packet.size()), |
| 57 ElementsAreArray(kPacket)); | 57 ElementsAreArray(kPacket)); |
| 58 } | 58 } |
| 59 | 59 |
| 60 TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { | 60 TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { |
| 61 Rpsi rpsi; | 61 Rpsi rpsi; |
| 62 rpsi.From(kSenderSsrc); | 62 rpsi.SetSenderSsrc(kSenderSsrc); |
| 63 rpsi.To(kRemoteSsrc); | 63 rpsi.SetMediaSsrc(kRemoteSsrc); |
| 64 | 64 |
| 65 rtc::Buffer packet = rpsi.Build(); | 65 rtc::Buffer packet = rpsi.Build(); |
| 66 packet[3]--; // Reduce size field by one word (4 bytes). | 66 packet[3]--; // Reduce size field by one word (4 bytes). |
| 67 packet.SetSize(packet.size() - 4); | 67 packet.SetSize(packet.size() - 4); |
| 68 | 68 |
| 69 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); | 69 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); |
| 70 } | 70 } |
| 71 | 71 |
| 72 TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { | 72 TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { |
| 73 Rpsi rpsi; | 73 Rpsi rpsi; |
| 74 rpsi.From(kSenderSsrc); | 74 rpsi.SetSenderSsrc(kSenderSsrc); |
| 75 rpsi.To(kRemoteSsrc); | 75 rpsi.SetMediaSsrc(kRemoteSsrc); |
| 76 rpsi.WithPictureId(kPictureId); | 76 rpsi.SetPictureId(kPictureId); |
| 77 rtc::Buffer packet = rpsi.Build(); | 77 rtc::Buffer packet = rpsi.Build(); |
| 78 uint8_t* padding_bits = packet.data() + 12; | 78 uint8_t* padding_bits = packet.data() + 12; |
| 79 uint8_t saved_padding_bits = *padding_bits; | 79 uint8_t saved_padding_bits = *padding_bits; |
| 80 ASSERT_TRUE(test::ParseSinglePacket(packet, &rpsi)); | 80 ASSERT_TRUE(test::ParseSinglePacket(packet, &rpsi)); |
| 81 | 81 |
| 82 for (uint8_t i = 1; i < 8; ++i) { | 82 for (uint8_t i = 1; i < 8; ++i) { |
| 83 *padding_bits = saved_padding_bits + i; | 83 *padding_bits = saved_padding_bits + i; |
| 84 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); | 84 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { | 88 TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { |
| 89 Rpsi rpsi; | 89 Rpsi rpsi; |
| 90 rpsi.From(kSenderSsrc); | 90 rpsi.SetSenderSsrc(kSenderSsrc); |
| 91 rpsi.To(kRemoteSsrc); | 91 rpsi.SetMediaSsrc(kRemoteSsrc); |
| 92 rpsi.WithPictureId(1); // Small picture id that occupy just 1 byte. | 92 rpsi.SetPictureId(1); // Small picture id that occupy just 1 byte. |
| 93 rtc::Buffer packet = rpsi.Build(); | 93 rtc::Buffer packet = rpsi.Build(); |
| 94 uint8_t* padding_bits = packet.data() + 12; | 94 uint8_t* padding_bits = packet.data() + 12; |
| 95 ASSERT_TRUE(test::ParseSinglePacket(packet, &rpsi)); | 95 ASSERT_TRUE(test::ParseSinglePacket(packet, &rpsi)); |
| 96 | 96 |
| 97 *padding_bits += 8; | 97 *padding_bits += 8; |
| 98 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); | 98 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); |
| 99 } | 99 } |
| 100 | 100 |
| 101 // For raw rpsi packet extract how many bytes are used to store picture_id. | 101 // For raw rpsi packet extract how many bytes are used to store picture_id. |
| 102 size_t UsedBytes(const rtc::Buffer& packet) { // Works for small packets only. | 102 size_t UsedBytes(const rtc::Buffer& packet) { // Works for small packets only. |
| 103 RTC_CHECK_EQ(packet.data()[2], 0); // Assume packet is small. | 103 RTC_CHECK_EQ(packet.data()[2], 0); // Assume packet is small. |
| 104 size_t total_rpsi_payload_bytes = 4 * (packet.data()[3] - 2) - 2; | 104 size_t total_rpsi_payload_bytes = 4 * (packet.data()[3] - 2) - 2; |
| 105 uint8_t padding_bits = packet.data()[12]; | 105 uint8_t padding_bits = packet.data()[12]; |
| 106 RTC_CHECK_EQ(padding_bits % 8, 0); | 106 RTC_CHECK_EQ(padding_bits % 8, 0); |
| 107 return total_rpsi_payload_bytes - (padding_bits / 8); | 107 return total_rpsi_payload_bytes - (padding_bits / 8); |
| 108 } | 108 } |
| 109 | 109 |
| 110 TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { | 110 TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { |
| 111 Rpsi rpsi; | 111 Rpsi rpsi; |
| 112 // 1000001 (7 bits = 1 byte in native string). | 112 // 1000001 (7 bits = 1 byte in native string). |
| 113 const uint64_t kPictureId = 0x41; | 113 const uint64_t kPictureId = 0x41; |
| 114 const uint16_t kNumberOfValidBytes = 1; | 114 const uint16_t kNumberOfValidBytes = 1; |
| 115 rpsi.WithPictureId(kPictureId); | 115 rpsi.SetPictureId(kPictureId); |
| 116 | 116 |
| 117 rtc::Buffer packet = rpsi.Build(); | 117 rtc::Buffer packet = rpsi.Build(); |
| 118 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 118 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
| 119 | 119 |
| 120 Rpsi parsed; | 120 Rpsi parsed; |
| 121 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); | 121 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
| 122 EXPECT_EQ(kPictureId, parsed.picture_id()); | 122 EXPECT_EQ(kPictureId, parsed.picture_id()); |
| 123 } | 123 } |
| 124 | 124 |
| 125 TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { | 125 TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { |
| 126 Rpsi rpsi; | 126 Rpsi rpsi; |
| 127 // |1 0000001 (7 bits = 1 byte in native string). | 127 // |1 0000001 (7 bits = 1 byte in native string). |
| 128 const uint64_t kPictureId = 0x81; | 128 const uint64_t kPictureId = 0x81; |
| 129 const uint16_t kNumberOfValidBytes = 2; | 129 const uint16_t kNumberOfValidBytes = 2; |
| 130 rpsi.WithPictureId(kPictureId); | 130 rpsi.SetPictureId(kPictureId); |
| 131 | 131 |
| 132 rtc::Buffer packet = rpsi.Build(); | 132 rtc::Buffer packet = rpsi.Build(); |
| 133 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 133 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
| 134 | 134 |
| 135 Rpsi parsed; | 135 Rpsi parsed; |
| 136 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); | 136 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
| 137 EXPECT_EQ(kPictureId, parsed.picture_id()); | 137 EXPECT_EQ(kPictureId, parsed.picture_id()); |
| 138 } | 138 } |
| 139 | 139 |
| 140 TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { | 140 TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { |
| 141 Rpsi rpsi; | 141 Rpsi rpsi; |
| 142 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). | 142 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). |
| 143 const uint64_t kPictureId = 0x102040; | 143 const uint64_t kPictureId = 0x102040; |
| 144 const uint16_t kNumberOfValidBytes = 3; | 144 const uint16_t kNumberOfValidBytes = 3; |
| 145 rpsi.WithPictureId(kPictureId); | 145 rpsi.SetPictureId(kPictureId); |
| 146 | 146 |
| 147 rtc::Buffer packet = rpsi.Build(); | 147 rtc::Buffer packet = rpsi.Build(); |
| 148 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 148 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
| 149 | 149 |
| 150 Rpsi parsed; | 150 Rpsi parsed; |
| 151 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); | 151 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
| 152 EXPECT_EQ(kPictureId, parsed.picture_id()); | 152 EXPECT_EQ(kPictureId, parsed.picture_id()); |
| 153 } | 153 } |
| 154 | 154 |
| 155 TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { | 155 TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { |
| 156 Rpsi rpsi; | 156 Rpsi rpsi; |
| 157 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). | 157 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). |
| 158 const uint64_t kPictureId = 0x84161C2; | 158 const uint64_t kPictureId = 0x84161C2; |
| 159 const uint16_t kNumberOfValidBytes = 4; | 159 const uint16_t kNumberOfValidBytes = 4; |
| 160 rpsi.WithPictureId(kPictureId); | 160 rpsi.SetPictureId(kPictureId); |
| 161 | 161 |
| 162 rtc::Buffer packet = rpsi.Build(); | 162 rtc::Buffer packet = rpsi.Build(); |
| 163 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 163 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
| 164 | 164 |
| 165 Rpsi parsed; | 165 Rpsi parsed; |
| 166 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); | 166 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
| 167 EXPECT_EQ(kPictureId, parsed.picture_id()); | 167 EXPECT_EQ(kPictureId, parsed.picture_id()); |
| 168 } | 168 } |
| 169 | 169 |
| 170 TEST(RtcpPacketRpsiTest, WithMaxPictureId) { | 170 TEST(RtcpPacketRpsiTest, WithMaxPictureId) { |
| 171 Rpsi rpsi; | 171 Rpsi rpsi; |
| 172 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| | 172 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| |
| 173 // 11 111111|1 1111111 (7 bits = 1 byte in native string). | 173 // 11 111111|1 1111111 (7 bits = 1 byte in native string). |
| 174 const uint64_t kPictureId = 0xffffffffffffffff; | 174 const uint64_t kPictureId = 0xffffffffffffffff; |
| 175 const uint16_t kNumberOfValidBytes = 10; | 175 const uint16_t kNumberOfValidBytes = 10; |
| 176 rpsi.WithPictureId(kPictureId); | 176 rpsi.SetPictureId(kPictureId); |
| 177 | 177 |
| 178 rtc::Buffer packet = rpsi.Build(); | 178 rtc::Buffer packet = rpsi.Build(); |
| 179 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 179 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
| 180 | 180 |
| 181 Rpsi parsed; | 181 Rpsi parsed; |
| 182 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); | 182 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
| 183 EXPECT_EQ(kPictureId, parsed.picture_id()); | 183 EXPECT_EQ(kPictureId, parsed.picture_id()); |
| 184 } | 184 } |
| 185 } // namespace webrtc | 185 } // namespace webrtc |
| OLD | NEW |