| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 |
| 11 #include <memory> | 11 #include <memory> |
| 12 | 12 |
| 13 #include "webrtc/common_types.h" | 13 #include "webrtc/common_types.h" |
| 14 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 14 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
| 15 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" | 15 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" |
| 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 17 #include "webrtc/modules/rtp_rtcp/source/mock/mock_rtp_payload_strategy.h" | |
| 18 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 17 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| 19 #include "webrtc/test/gmock.h" | 18 #include "webrtc/test/gmock.h" |
| 20 #include "webrtc/test/gtest.h" | 19 #include "webrtc/test/gtest.h" |
| 21 | 20 |
| 22 namespace webrtc { | 21 namespace webrtc { |
| 23 | 22 |
| 24 using ::testing::Eq; | 23 using ::testing::Eq; |
| 25 using ::testing::Return; | 24 using ::testing::Return; |
| 26 using ::testing::StrEq; | 25 using ::testing::StrEq; |
| 27 using ::testing::_; | 26 using ::testing::_; |
| 28 | 27 |
| 29 static const char* kTypicalPayloadName = "name"; | 28 static const char* kTypicalPayloadName = "name"; |
| 30 static const size_t kTypicalChannels = 1; | 29 static const size_t kTypicalChannels = 1; |
| 31 static const int kTypicalFrequency = 44000; | 30 static const uint32_t kTypicalFrequency = 44000; |
| 32 static const int kTypicalRate = 32 * 1024; | 31 static const uint32_t kTypicalRate = 32 * 1024; |
| 33 static const CodecInst kTypicalAudioCodec = {-1 /* pltype */, "name", | 32 static const CodecInst kTypicalAudioCodec = {-1 /* pltype */, "name", |
| 34 kTypicalFrequency, 0 /* pacsize */, | 33 kTypicalFrequency, 0 /* pacsize */, |
| 35 kTypicalChannels, kTypicalRate}; | 34 kTypicalChannels, kTypicalRate}; |
| 36 | 35 |
| 37 class RtpPayloadRegistryTest : public ::testing::Test { | 36 TEST(RtpPayloadRegistryTest, |
| 38 public: | 37 RegistersAndRemembersVideoPayloadsUntilDeregistered) { |
| 39 void SetUp() { | 38 RTPPayloadRegistry rtp_payload_registry; |
| 40 // Note: the payload registry takes ownership of the strategy. | |
| 41 mock_payload_strategy_ = new testing::NiceMock<MockRTPPayloadStrategy>(); | |
| 42 rtp_payload_registry_.reset(new RTPPayloadRegistry(mock_payload_strategy_)); | |
| 43 } | |
| 44 | |
| 45 protected: | |
| 46 RtpUtility::Payload* ExpectReturnOfTypicalAudioPayload(uint8_t payload_type, | |
| 47 uint32_t rate) { | |
| 48 bool audio = true; | |
| 49 RtpUtility::Payload returned_payload = { | |
| 50 "name", | |
| 51 audio, | |
| 52 {// Initialize the audio struct in this case. | |
| 53 {kTypicalFrequency, kTypicalChannels, rate}}}; | |
| 54 | |
| 55 // Note: we return a new payload since the payload registry takes ownership | |
| 56 // of the created object. | |
| 57 RtpUtility::Payload* returned_payload_on_heap = | |
| 58 new RtpUtility::Payload(returned_payload); | |
| 59 EXPECT_CALL(*mock_payload_strategy_, | |
| 60 CreatePayloadType(StrEq(kTypicalPayloadName), payload_type, | |
| 61 kTypicalFrequency, kTypicalChannels, rate)) | |
| 62 .WillOnce(Return(returned_payload_on_heap)); | |
| 63 return returned_payload_on_heap; | |
| 64 } | |
| 65 | |
| 66 std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry_; | |
| 67 testing::NiceMock<MockRTPPayloadStrategy>* mock_payload_strategy_; | |
| 68 }; | |
| 69 | |
| 70 TEST_F(RtpPayloadRegistryTest, | |
| 71 RegistersAndRemembersVideoPayloadsUntilDeregistered) { | |
| 72 const uint8_t payload_type = 97; | 39 const uint8_t payload_type = 97; |
| 73 RtpUtility::Payload returned_video_payload = { | |
| 74 "VP8", false /* audio */, {{kRtpVideoVp8}}}; | |
| 75 // Note: The payload registry takes ownership of this object in | |
| 76 // RegisterReceivePayload. | |
| 77 RtpUtility::Payload* returned_video_payload_on_heap = | |
| 78 new RtpUtility::Payload(returned_video_payload); | |
| 79 EXPECT_CALL( | |
| 80 *mock_payload_strategy_, | |
| 81 CreatePayloadType(StrEq("VP8"), payload_type, kVideoPayloadTypeFrequency, | |
| 82 0 /* channels */, 0 /* rate */)) | |
| 83 .WillOnce(Return(returned_video_payload_on_heap)); | |
| 84 | |
| 85 VideoCodec video_codec; | 40 VideoCodec video_codec; |
| 86 video_codec.codecType = kVideoCodecVP8; | 41 video_codec.codecType = kVideoCodecVP8; |
| 87 strncpy(video_codec.plName, "VP8", RTP_PAYLOAD_NAME_SIZE); | 42 strncpy(video_codec.plName, "VP8", RTP_PAYLOAD_NAME_SIZE); |
| 88 video_codec.plType = payload_type; | 43 video_codec.plType = payload_type; |
| 89 | 44 |
| 90 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload(video_codec)); | 45 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(video_codec)); |
| 91 | 46 |
| 92 const RtpUtility::Payload* retrieved_payload = | 47 const RtpUtility::Payload* retrieved_payload = |
| 93 rtp_payload_registry_->PayloadTypeToPayload(payload_type); | 48 rtp_payload_registry.PayloadTypeToPayload(payload_type); |
| 94 EXPECT_TRUE(retrieved_payload); | 49 EXPECT_TRUE(retrieved_payload); |
| 95 | 50 |
| 96 // We should get back the exact pointer to the payload returned by the | 51 // We should get back the corresponding payload that we registered. |
| 97 // payload strategy. | 52 EXPECT_STREQ("VP8", retrieved_payload->name); |
| 98 EXPECT_EQ(returned_video_payload_on_heap, retrieved_payload); | 53 EXPECT_FALSE(retrieved_payload->audio); |
| 54 EXPECT_EQ(kRtpVideoVp8, retrieved_payload->typeSpecific.Video.videoCodecType); |
| 99 | 55 |
| 100 // Now forget about it and verify it's gone. | 56 // Now forget about it and verify it's gone. |
| 101 EXPECT_EQ(0, rtp_payload_registry_->DeRegisterReceivePayload(payload_type)); | 57 EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); |
| 102 EXPECT_FALSE(rtp_payload_registry_->PayloadTypeToPayload(payload_type)); | 58 EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type)); |
| 103 } | 59 } |
| 104 | 60 |
| 105 TEST_F(RtpPayloadRegistryTest, | 61 TEST(RtpPayloadRegistryTest, |
| 106 RegistersAndRemembersAudioPayloadsUntilDeregistered) { | 62 RegistersAndRemembersAudioPayloadsUntilDeregistered) { |
| 63 RTPPayloadRegistry rtp_payload_registry; |
| 107 uint8_t payload_type = 97; | 64 uint8_t payload_type = 97; |
| 108 RtpUtility::Payload* returned_payload_on_heap = | |
| 109 ExpectReturnOfTypicalAudioPayload(payload_type, kTypicalRate); | |
| 110 | |
| 111 bool new_payload_created = false; | 65 bool new_payload_created = false; |
| 112 CodecInst audio_codec = kTypicalAudioCodec; | 66 CodecInst audio_codec = kTypicalAudioCodec; |
| 113 audio_codec.pltype = payload_type; | 67 audio_codec.pltype = payload_type; |
| 114 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload( | 68 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload( |
| 115 audio_codec, &new_payload_created)); | 69 audio_codec, &new_payload_created)); |
| 116 | 70 |
| 117 EXPECT_TRUE(new_payload_created) << "A new payload WAS created."; | 71 EXPECT_TRUE(new_payload_created) << "A new payload WAS created."; |
| 118 | 72 |
| 119 const RtpUtility::Payload* retrieved_payload = | 73 const RtpUtility::Payload* retrieved_payload = |
| 120 rtp_payload_registry_->PayloadTypeToPayload(payload_type); | 74 rtp_payload_registry.PayloadTypeToPayload(payload_type); |
| 121 EXPECT_TRUE(retrieved_payload); | 75 EXPECT_TRUE(retrieved_payload); |
| 122 | 76 |
| 123 // We should get back the exact pointer to the payload returned by the | 77 // We should get back the corresponding payload that we registered. |
| 124 // payload strategy. | 78 EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); |
| 125 EXPECT_EQ(returned_payload_on_heap, retrieved_payload); | 79 EXPECT_TRUE(retrieved_payload->audio); |
| 80 EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency); |
| 81 EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); |
| 82 EXPECT_EQ(kTypicalRate, retrieved_payload->typeSpecific.Audio.rate); |
| 126 | 83 |
| 127 // Now forget about it and verify it's gone. | 84 // Now forget about it and verify it's gone. |
| 128 EXPECT_EQ(0, rtp_payload_registry_->DeRegisterReceivePayload(payload_type)); | 85 EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type)); |
| 129 EXPECT_FALSE(rtp_payload_registry_->PayloadTypeToPayload(payload_type)); | 86 EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type)); |
| 130 } | 87 } |
| 131 | 88 |
| 132 TEST_F(RtpPayloadRegistryTest, AudioRedWorkProperly) { | 89 TEST(RtpPayloadRegistryTest, AudioRedWorkProperly) { |
| 133 const uint8_t kRedPayloadType = 127; | 90 const uint8_t kRedPayloadType = 127; |
| 134 const int kRedSampleRate = 8000; | 91 const int kRedSampleRate = 8000; |
| 135 const size_t kRedChannels = 1; | 92 const size_t kRedChannels = 1; |
| 136 const int kRedBitRate = 0; | 93 const int kRedBitRate = 0; |
| 137 | 94 |
| 138 // This creates an audio RTP payload strategy. | 95 RTPPayloadRegistry rtp_payload_registry; |
| 139 rtp_payload_registry_.reset( | |
| 140 new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))); | |
| 141 | 96 |
| 142 bool new_payload_created = false; | 97 bool new_payload_created = false; |
| 143 CodecInst red_audio_codec; | 98 CodecInst red_audio_codec; |
| 144 strncpy(red_audio_codec.plname, "red", RTP_PAYLOAD_NAME_SIZE); | 99 strncpy(red_audio_codec.plname, "red", RTP_PAYLOAD_NAME_SIZE); |
| 145 red_audio_codec.pltype = kRedPayloadType; | 100 red_audio_codec.pltype = kRedPayloadType; |
| 146 red_audio_codec.plfreq = kRedSampleRate; | 101 red_audio_codec.plfreq = kRedSampleRate; |
| 147 red_audio_codec.channels = kRedChannels; | 102 red_audio_codec.channels = kRedChannels; |
| 148 red_audio_codec.rate = kRedBitRate; | 103 red_audio_codec.rate = kRedBitRate; |
| 149 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload( | 104 EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload( |
| 150 red_audio_codec, &new_payload_created)); | 105 red_audio_codec, &new_payload_created)); |
| 151 EXPECT_TRUE(new_payload_created); | 106 EXPECT_TRUE(new_payload_created); |
| 152 | 107 |
| 153 EXPECT_EQ(kRedPayloadType, rtp_payload_registry_->red_payload_type()); | 108 EXPECT_EQ(kRedPayloadType, rtp_payload_registry.red_payload_type()); |
| 154 | 109 |
| 155 const RtpUtility::Payload* retrieved_payload = | 110 const RtpUtility::Payload* retrieved_payload = |
| 156 rtp_payload_registry_->PayloadTypeToPayload(kRedPayloadType); | 111 rtp_payload_registry.PayloadTypeToPayload(kRedPayloadType); |
| 157 EXPECT_TRUE(retrieved_payload); | 112 EXPECT_TRUE(retrieved_payload); |
| 158 EXPECT_TRUE(retrieved_payload->audio); | 113 EXPECT_TRUE(retrieved_payload->audio); |
| 159 EXPECT_STRCASEEQ("red", retrieved_payload->name); | 114 EXPECT_STRCASEEQ("red", retrieved_payload->name); |
| 160 | 115 |
| 161 // Sample rate is correctly registered. | 116 // Sample rate is correctly registered. |
| 162 EXPECT_EQ(kRedSampleRate, | 117 EXPECT_EQ(kRedSampleRate, |
| 163 rtp_payload_registry_->GetPayloadTypeFrequency(kRedPayloadType)); | 118 rtp_payload_registry.GetPayloadTypeFrequency(kRedPayloadType)); |
| 164 } | 119 } |
| 165 | 120 |
| 166 TEST_F(RtpPayloadRegistryTest, | 121 TEST(RtpPayloadRegistryTest, |
| 167 DoesNotAcceptSamePayloadTypeTwiceExceptIfPayloadIsCompatible) { | 122 DoesNotAcceptSamePayloadTypeTwiceExceptIfPayloadIsCompatible) { |
| 168 uint8_t payload_type = 97; | 123 uint8_t payload_type = 97; |
| 124 RTPPayloadRegistry rtp_payload_registry; |
| 169 | 125 |
| 170 bool ignored = false; | 126 bool ignored = false; |
| 171 RtpUtility::Payload* first_payload_on_heap = | |
| 172 ExpectReturnOfTypicalAudioPayload(payload_type, kTypicalRate); | |
| 173 CodecInst audio_codec = kTypicalAudioCodec; | 127 CodecInst audio_codec = kTypicalAudioCodec; |
| 174 audio_codec.pltype = payload_type; | 128 audio_codec.pltype = payload_type; |
| 129 EXPECT_EQ(0, |
| 130 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
| 131 |
| 132 CodecInst audio_codec_2 = kTypicalAudioCodec; |
| 133 audio_codec_2.pltype = payload_type; |
| 134 // Make |audio_codec_2| incompatible with |audio_codec| by changing |
| 135 // the frequency. |
| 136 audio_codec_2.plfreq = kTypicalFrequency + 1; |
| 175 EXPECT_EQ( | 137 EXPECT_EQ( |
| 176 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 138 -1, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored)) |
| 139 << "Adding incompatible codec with same payload type = bad."; |
| 177 | 140 |
| 178 EXPECT_EQ( | 141 // Change payload type. |
| 179 -1, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)) | |
| 180 << "Adding same codec twice = bad."; | |
| 181 | |
| 182 RtpUtility::Payload* second_payload_on_heap = | |
| 183 ExpectReturnOfTypicalAudioPayload(payload_type - 1, kTypicalRate); | |
| 184 CodecInst audio_codec_2 = kTypicalAudioCodec; | |
| 185 audio_codec_2.pltype = payload_type - 1; | 142 audio_codec_2.pltype = payload_type - 1; |
| 186 EXPECT_EQ( | 143 EXPECT_EQ( |
| 187 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec_2, &ignored)) | 144 0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored)) |
| 188 << "With a different payload type is fine though."; | 145 << "With a different payload type is fine though."; |
| 189 | 146 |
| 190 // Ensure both payloads are preserved. | 147 // Ensure both payloads are preserved. |
| 191 const RtpUtility::Payload* retrieved_payload = | 148 const RtpUtility::Payload* retrieved_payload = |
| 192 rtp_payload_registry_->PayloadTypeToPayload(payload_type); | 149 rtp_payload_registry.PayloadTypeToPayload(payload_type); |
| 193 EXPECT_TRUE(retrieved_payload); | 150 EXPECT_TRUE(retrieved_payload); |
| 194 EXPECT_EQ(first_payload_on_heap, retrieved_payload); | 151 EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); |
| 152 EXPECT_TRUE(retrieved_payload->audio); |
| 153 EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency); |
| 154 EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); |
| 155 EXPECT_EQ(kTypicalRate, retrieved_payload->typeSpecific.Audio.rate); |
| 156 |
| 195 retrieved_payload = | 157 retrieved_payload = |
| 196 rtp_payload_registry_->PayloadTypeToPayload(payload_type - 1); | 158 rtp_payload_registry.PayloadTypeToPayload(payload_type - 1); |
| 197 EXPECT_TRUE(retrieved_payload); | 159 EXPECT_TRUE(retrieved_payload); |
| 198 EXPECT_EQ(second_payload_on_heap, retrieved_payload); | 160 EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name); |
| 161 EXPECT_TRUE(retrieved_payload->audio); |
| 162 EXPECT_EQ(kTypicalFrequency + 1, |
| 163 retrieved_payload->typeSpecific.Audio.frequency); |
| 164 EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels); |
| 165 EXPECT_EQ(kTypicalRate, retrieved_payload->typeSpecific.Audio.rate); |
| 199 | 166 |
| 200 // Ok, update the rate for one of the codecs. If either the incoming rate or | 167 // Ok, update the rate for one of the codecs. If either the incoming rate or |
| 201 // the stored rate is zero it's not really an error to register the same | 168 // the stored rate is zero it's not really an error to register the same |
| 202 // codec twice, and in that case roughly the following happens. | 169 // codec twice, and in that case roughly the following happens. |
| 203 ON_CALL(*mock_payload_strategy_, PayloadIsCompatible(_, _, _, _)) | 170 EXPECT_EQ(0, |
| 204 .WillByDefault(Return(true)); | 171 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
| 205 EXPECT_CALL(*mock_payload_strategy_, | |
| 206 UpdatePayloadRate(first_payload_on_heap, kTypicalRate)); | |
| 207 EXPECT_EQ( | |
| 208 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | |
| 209 } | 172 } |
| 210 | 173 |
| 211 TEST_F(RtpPayloadRegistryTest, | 174 TEST(RtpPayloadRegistryTest, |
| 212 RemovesCompatibleCodecsOnRegistryIfCodecsMustBeUnique) { | 175 RemovesCompatibleCodecsOnRegistryIfCodecsMustBeUnique) { |
| 213 ON_CALL(*mock_payload_strategy_, PayloadIsCompatible(_, _, _, _)) | |
| 214 .WillByDefault(Return(true)); | |
| 215 ON_CALL(*mock_payload_strategy_, CodecsMustBeUnique()) | |
| 216 .WillByDefault(Return(true)); | |
| 217 | |
| 218 uint8_t payload_type = 97; | 176 uint8_t payload_type = 97; |
| 177 RTPPayloadRegistry rtp_payload_registry; |
| 219 | 178 |
| 220 bool ignored = false; | 179 bool ignored = false; |
| 221 ExpectReturnOfTypicalAudioPayload(payload_type, kTypicalRate); | |
| 222 CodecInst audio_codec = kTypicalAudioCodec; | 180 CodecInst audio_codec = kTypicalAudioCodec; |
| 223 audio_codec.pltype = payload_type; | 181 audio_codec.pltype = payload_type; |
| 224 EXPECT_EQ( | 182 EXPECT_EQ(0, |
| 225 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 183 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
| 226 ExpectReturnOfTypicalAudioPayload(payload_type - 1, kTypicalRate); | |
| 227 CodecInst audio_codec_2 = kTypicalAudioCodec; | 184 CodecInst audio_codec_2 = kTypicalAudioCodec; |
| 228 audio_codec_2.pltype = payload_type - 1; | 185 audio_codec_2.pltype = payload_type - 1; |
| 229 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload(audio_codec_2, | 186 EXPECT_EQ( |
| 230 &ignored)); | 187 0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored)); |
| 231 | 188 |
| 232 EXPECT_FALSE(rtp_payload_registry_->PayloadTypeToPayload(payload_type)) | 189 EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type)) |
| 233 << "The first payload should be " | 190 << "The first payload should be " |
| 234 "deregistered because the only thing that differs is payload type."; | 191 "deregistered because the only thing that differs is payload type."; |
| 235 EXPECT_TRUE(rtp_payload_registry_->PayloadTypeToPayload(payload_type - 1)) | 192 EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type - 1)) |
| 236 << "The second payload should still be registered though."; | 193 << "The second payload should still be registered though."; |
| 237 | 194 |
| 238 // Now ensure non-compatible codecs aren't removed. | 195 // Now ensure non-compatible codecs aren't removed. Make |audio_codec_3| |
| 239 ON_CALL(*mock_payload_strategy_, PayloadIsCompatible(_, _, _, _)) | 196 // incompatible by changing the frequency. |
| 240 .WillByDefault(Return(false)); | |
| 241 ExpectReturnOfTypicalAudioPayload(payload_type + 1, kTypicalRate); | |
| 242 CodecInst audio_codec_3 = kTypicalAudioCodec; | 197 CodecInst audio_codec_3 = kTypicalAudioCodec; |
| 243 audio_codec_3.pltype = payload_type + 1; | 198 audio_codec_3.pltype = payload_type + 1; |
| 244 EXPECT_EQ(0, rtp_payload_registry_->RegisterReceivePayload(audio_codec_3, | 199 audio_codec_3.plfreq = kTypicalFrequency + 1; |
| 245 &ignored)); | 200 EXPECT_EQ( |
| 201 0, rtp_payload_registry.RegisterReceivePayload(audio_codec_3, &ignored)); |
| 246 | 202 |
| 247 EXPECT_TRUE(rtp_payload_registry_->PayloadTypeToPayload(payload_type - 1)) | 203 EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type - 1)) |
| 248 << "Not compatible; both payloads should be kept."; | 204 << "Not compatible; both payloads should be kept."; |
| 249 EXPECT_TRUE(rtp_payload_registry_->PayloadTypeToPayload(payload_type + 1)) | 205 EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type + 1)) |
| 250 << "Not compatible; both payloads should be kept."; | 206 << "Not compatible; both payloads should be kept."; |
| 251 } | 207 } |
| 252 | 208 |
| 253 TEST_F(RtpPayloadRegistryTest, | 209 TEST(RtpPayloadRegistryTest, |
| 254 LastReceivedCodecTypesAreResetWhenRegisteringNewPayloadTypes) { | 210 LastReceivedCodecTypesAreResetWhenRegisteringNewPayloadTypes) { |
| 255 rtp_payload_registry_->set_last_received_payload_type(17); | 211 RTPPayloadRegistry rtp_payload_registry; |
| 256 EXPECT_EQ(17, rtp_payload_registry_->last_received_payload_type()); | 212 rtp_payload_registry.set_last_received_payload_type(17); |
| 213 EXPECT_EQ(17, rtp_payload_registry.last_received_payload_type()); |
| 257 | 214 |
| 258 bool media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(18); | 215 bool media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18); |
| 259 EXPECT_FALSE(media_type_unchanged); | 216 EXPECT_FALSE(media_type_unchanged); |
| 260 media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(18); | 217 media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18); |
| 261 EXPECT_TRUE(media_type_unchanged); | 218 EXPECT_TRUE(media_type_unchanged); |
| 262 | 219 |
| 263 bool ignored; | 220 bool ignored; |
| 264 ExpectReturnOfTypicalAudioPayload(34, kTypicalRate); | |
| 265 CodecInst audio_codec = kTypicalAudioCodec; | 221 CodecInst audio_codec = kTypicalAudioCodec; |
| 266 audio_codec.pltype = 34; | 222 audio_codec.pltype = 34; |
| 267 EXPECT_EQ( | 223 EXPECT_EQ(0, |
| 268 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 224 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
| 269 | 225 |
| 270 EXPECT_EQ(-1, rtp_payload_registry_->last_received_payload_type()); | 226 EXPECT_EQ(-1, rtp_payload_registry.last_received_payload_type()); |
| 271 media_type_unchanged = rtp_payload_registry_->ReportMediaPayloadType(18); | 227 media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18); |
| 272 EXPECT_FALSE(media_type_unchanged); | 228 EXPECT_FALSE(media_type_unchanged); |
| 273 } | 229 } |
| 274 | 230 |
| 275 class ParameterizedRtpPayloadRegistryTest | 231 class ParameterizedRtpPayloadRegistryTest |
| 276 : public RtpPayloadRegistryTest, | 232 : public ::testing::TestWithParam<int> {}; |
| 277 public ::testing::WithParamInterface<int> {}; | |
| 278 | 233 |
| 279 TEST_P(ParameterizedRtpPayloadRegistryTest, | 234 TEST_P(ParameterizedRtpPayloadRegistryTest, |
| 280 FailsToRegisterKnownPayloadsWeAreNotInterestedIn) { | 235 FailsToRegisterKnownPayloadsWeAreNotInterestedIn) { |
| 281 int payload_type = GetParam(); | 236 RTPPayloadRegistry rtp_payload_registry; |
| 282 | 237 |
| 283 bool ignored; | 238 bool ignored; |
| 284 CodecInst audio_codec; | 239 CodecInst audio_codec; |
| 285 strncpy(audio_codec.plname, "whatever", RTP_PAYLOAD_NAME_SIZE); | 240 strncpy(audio_codec.plname, "whatever", RTP_PAYLOAD_NAME_SIZE); |
| 286 audio_codec.pltype = static_cast<uint8_t>(payload_type); | 241 audio_codec.pltype = GetParam(); |
| 287 audio_codec.plfreq = 19; | 242 audio_codec.plfreq = 1900; |
| 288 audio_codec.channels = 1; | 243 audio_codec.channels = 1; |
| 289 audio_codec.rate = 17; | 244 audio_codec.rate = 17; |
| 290 EXPECT_EQ( | 245 EXPECT_EQ(-1, |
| 291 -1, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 246 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
| 292 } | 247 } |
| 293 | 248 |
| 294 INSTANTIATE_TEST_CASE_P(TestKnownBadPayloadTypes, | 249 INSTANTIATE_TEST_CASE_P(TestKnownBadPayloadTypes, |
| 295 ParameterizedRtpPayloadRegistryTest, | 250 ParameterizedRtpPayloadRegistryTest, |
| 296 testing::Values(64, 72, 73, 74, 75, 76, 77, 78, 79)); | 251 testing::Values(64, 72, 73, 74, 75, 76, 77, 78, 79)); |
| 297 | 252 |
| 298 class RtpPayloadRegistryGenericTest | 253 class RtpPayloadRegistryGenericTest : public ::testing::TestWithParam<int> {}; |
| 299 : public RtpPayloadRegistryTest, | |
| 300 public ::testing::WithParamInterface<int> {}; | |
| 301 | 254 |
| 302 TEST_P(RtpPayloadRegistryGenericTest, RegisterGenericReceivePayloadType) { | 255 TEST_P(RtpPayloadRegistryGenericTest, RegisterGenericReceivePayloadType) { |
| 256 RTPPayloadRegistry rtp_payload_registry; |
| 257 |
| 303 bool ignored; | 258 bool ignored; |
| 304 CodecInst audio_codec; | 259 CodecInst audio_codec; |
| 305 // Dummy values, except for payload_type. | 260 // Dummy values, except for payload_type. |
| 306 strncpy(audio_codec.plname, "generic-codec", RTP_PAYLOAD_NAME_SIZE); | 261 strncpy(audio_codec.plname, "generic-codec", RTP_PAYLOAD_NAME_SIZE); |
| 307 audio_codec.pltype = GetParam(); | 262 audio_codec.pltype = GetParam(); |
| 308 audio_codec.plfreq = 19; | 263 audio_codec.plfreq = 1900; |
| 309 audio_codec.channels = 1; | 264 audio_codec.channels = 1; |
| 310 audio_codec.rate = 17; | 265 audio_codec.rate = 17; |
| 311 EXPECT_EQ( | 266 EXPECT_EQ(0, |
| 312 0, rtp_payload_registry_->RegisterReceivePayload(audio_codec, &ignored)); | 267 rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored)); |
| 313 } | 268 } |
| 314 | 269 |
| 315 // Generates an RTX packet for the given length and original sequence number. | 270 // Generates an RTX packet for the given length and original sequence number. |
| 316 // The RTX sequence number and ssrc will use the default value of 9999. The | 271 // The RTX sequence number and ssrc will use the default value of 9999. The |
| 317 // caller takes ownership of the returned buffer. | 272 // caller takes ownership of the returned buffer. |
| 318 const uint8_t* GenerateRtxPacket(size_t header_length, | 273 const uint8_t* GenerateRtxPacket(size_t header_length, |
| 319 size_t payload_length, | 274 size_t payload_length, |
| 320 uint16_t original_sequence_number) { | 275 uint16_t original_sequence_number) { |
| 321 uint8_t* packet = | 276 uint8_t* packet = |
| 322 new uint8_t[kRtxHeaderSize + header_length + payload_length](); | 277 new uint8_t[kRtxHeaderSize + header_length + payload_length](); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 header_parser->Parse(restored_packet.get(), length, &restored_header)); | 332 header_parser->Parse(restored_packet.get(), length, &restored_header)); |
| 378 EXPECT_EQ(original_sequence_number, restored_header.sequenceNumber) | 333 EXPECT_EQ(original_sequence_number, restored_header.sequenceNumber) |
| 379 << "The restored packet should have the original sequence number " | 334 << "The restored packet should have the original sequence number " |
| 380 << "in the correct location in the RTP header."; | 335 << "in the correct location in the RTP header."; |
| 381 EXPECT_EQ(expected_payload_type, restored_header.payloadType) | 336 EXPECT_EQ(expected_payload_type, restored_header.payloadType) |
| 382 << "The restored packet should have the correct payload type."; | 337 << "The restored packet should have the correct payload type."; |
| 383 EXPECT_EQ(original_ssrc, restored_header.ssrc) | 338 EXPECT_EQ(original_ssrc, restored_header.ssrc) |
| 384 << "The restored packet should have the correct ssrc."; | 339 << "The restored packet should have the correct ssrc."; |
| 385 } | 340 } |
| 386 | 341 |
| 387 TEST_F(RtpPayloadRegistryTest, MultipleRtxPayloadTypes) { | 342 TEST(RtpPayloadRegistryTest, MultipleRtxPayloadTypes) { |
| 343 RTPPayloadRegistry rtp_payload_registry; |
| 388 // Set the incoming payload type to 90. | 344 // Set the incoming payload type to 90. |
| 389 RTPHeader header; | 345 RTPHeader header; |
| 390 header.payloadType = 90; | 346 header.payloadType = 90; |
| 391 header.ssrc = 1; | 347 header.ssrc = 1; |
| 392 rtp_payload_registry_->SetIncomingPayloadType(header); | 348 rtp_payload_registry.SetIncomingPayloadType(header); |
| 393 rtp_payload_registry_->SetRtxSsrc(100); | 349 rtp_payload_registry.SetRtxSsrc(100); |
| 394 // Map two RTX payload types. | 350 // Map two RTX payload types. |
| 395 rtp_payload_registry_->SetRtxPayloadType(105, 95); | 351 rtp_payload_registry.SetRtxPayloadType(105, 95); |
| 396 rtp_payload_registry_->SetRtxPayloadType(106, 96); | 352 rtp_payload_registry.SetRtxPayloadType(106, 96); |
| 397 | 353 |
| 398 TestRtxPacket(rtp_payload_registry_.get(), 105, 95, true); | 354 TestRtxPacket(&rtp_payload_registry, 105, 95, true); |
| 399 TestRtxPacket(rtp_payload_registry_.get(), 106, 96, true); | 355 TestRtxPacket(&rtp_payload_registry, 106, 96, true); |
| 400 } | 356 } |
| 401 | 357 |
| 402 TEST_F(RtpPayloadRegistryTest, InvalidRtxConfiguration) { | 358 TEST(RtpPayloadRegistryTest, InvalidRtxConfiguration) { |
| 403 rtp_payload_registry_->SetRtxSsrc(100); | 359 RTPPayloadRegistry rtp_payload_registry; |
| 360 rtp_payload_registry.SetRtxSsrc(100); |
| 404 // Fails because no mappings exist and the incoming payload type isn't known. | 361 // Fails because no mappings exist and the incoming payload type isn't known. |
| 405 TestRtxPacket(rtp_payload_registry_.get(), 105, 0, false); | 362 TestRtxPacket(&rtp_payload_registry, 105, 0, false); |
| 406 // Succeeds when the mapping is used, but fails for the implicit fallback. | 363 // Succeeds when the mapping is used, but fails for the implicit fallback. |
| 407 rtp_payload_registry_->SetRtxPayloadType(105, 95); | 364 rtp_payload_registry.SetRtxPayloadType(105, 95); |
| 408 TestRtxPacket(rtp_payload_registry_.get(), 105, 95, true); | 365 TestRtxPacket(&rtp_payload_registry, 105, 95, true); |
| 409 TestRtxPacket(rtp_payload_registry_.get(), 106, 0, false); | 366 TestRtxPacket(&rtp_payload_registry, 106, 0, false); |
| 410 } | 367 } |
| 411 | 368 |
| 412 INSTANTIATE_TEST_CASE_P(TestDynamicRange, | 369 INSTANTIATE_TEST_CASE_P(TestDynamicRange, |
| 413 RtpPayloadRegistryGenericTest, | 370 RtpPayloadRegistryGenericTest, |
| 414 testing::Range(96, 127 + 1)); | 371 testing::Range(96, 127 + 1)); |
| 415 | 372 |
| 416 } // namespace webrtc | 373 } // namespace webrtc |
| OLD | NEW |