OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2009 Google Inc. | 3 * Copyright 2009 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 static const uint32 kSsrc1 = 0x1111; | 70 static const uint32 kSsrc1 = 0x1111; |
71 static const uint32 kSsrc2 = 0x2222; | 71 static const uint32 kSsrc2 = 0x2222; |
72 static const uint32 kSsrc3 = 0x3333; | 72 static const uint32 kSsrc3 = 0x3333; |
73 static const int kAudioPts[] = {0, 8}; | 73 static const int kAudioPts[] = {0, 8}; |
74 static const int kVideoPts[] = {97, 99}; | 74 static const int kVideoPts[] = {97, 99}; |
75 | 75 |
76 template<class ChannelT, | 76 template<class ChannelT, |
77 class MediaChannelT, | 77 class MediaChannelT, |
78 class ContentT, | 78 class ContentT, |
79 class CodecT, | 79 class CodecT, |
80 class MediaInfoT> | 80 class MediaInfoT, |
| 81 class OptionsT> |
81 class Traits { | 82 class Traits { |
82 public: | 83 public: |
83 typedef ChannelT Channel; | 84 typedef ChannelT Channel; |
84 typedef MediaChannelT MediaChannel; | 85 typedef MediaChannelT MediaChannel; |
85 typedef ContentT Content; | 86 typedef ContentT Content; |
86 typedef CodecT Codec; | 87 typedef CodecT Codec; |
87 typedef MediaInfoT MediaInfo; | 88 typedef MediaInfoT MediaInfo; |
| 89 typedef OptionsT Options; |
88 }; | 90 }; |
89 | 91 |
90 // Controls how long we wait for a session to send messages that we | 92 // Controls how long we wait for a session to send messages that we |
91 // expect, in milliseconds. We put it high to avoid flaky tests. | 93 // expect, in milliseconds. We put it high to avoid flaky tests. |
92 static const int kEventTimeout = 5000; | 94 static const int kEventTimeout = 5000; |
93 | 95 |
94 class VoiceTraits : public Traits<cricket::VoiceChannel, | 96 class VoiceTraits : public Traits<cricket::VoiceChannel, |
95 cricket::FakeVoiceMediaChannel, | 97 cricket::FakeVoiceMediaChannel, |
96 cricket::AudioContentDescription, | 98 cricket::AudioContentDescription, |
97 cricket::AudioCodec, | 99 cricket::AudioCodec, |
98 cricket::VoiceMediaInfo> { | 100 cricket::VoiceMediaInfo, |
| 101 cricket::AudioOptions> { |
99 }; | 102 }; |
100 | 103 |
101 class VideoTraits : public Traits<cricket::VideoChannel, | 104 class VideoTraits : public Traits<cricket::VideoChannel, |
102 cricket::FakeVideoMediaChannel, | 105 cricket::FakeVideoMediaChannel, |
103 cricket::VideoContentDescription, | 106 cricket::VideoContentDescription, |
104 cricket::VideoCodec, | 107 cricket::VideoCodec, |
105 cricket::VideoMediaInfo> { | 108 cricket::VideoMediaInfo, |
| 109 cricket::VideoOptions> { |
106 }; | 110 }; |
107 | 111 |
108 class DataTraits : public Traits<cricket::DataChannel, | 112 class DataTraits : public Traits<cricket::DataChannel, |
109 cricket::FakeDataMediaChannel, | 113 cricket::FakeDataMediaChannel, |
110 cricket::DataContentDescription, | 114 cricket::DataContentDescription, |
111 cricket::DataCodec, | 115 cricket::DataCodec, |
112 cricket::DataMediaInfo> { | 116 cricket::DataMediaInfo, |
| 117 cricket::DataOptions> { |
113 }; | 118 }; |
114 | 119 |
115 | 120 |
116 rtc::StreamInterface* Open(const std::string& path) { | 121 rtc::StreamInterface* Open(const std::string& path) { |
117 return rtc::Filesystem::OpenFile( | 122 return rtc::Filesystem::OpenFile( |
118 rtc::Pathname(path), "wb"); | 123 rtc::Pathname(path), "wb"); |
119 } | 124 } |
120 | 125 |
121 // Base class for Voice/VideoChannel tests | 126 // Base class for Voice/VideoChannel tests |
122 template<class T> | 127 template<class T> |
(...skipping 10 matching lines...) Expand all Loading... |
133 media_channel2_(NULL), | 138 media_channel2_(NULL), |
134 rtp_packet_(reinterpret_cast<const char*>(rtp_data), rtp_len), | 139 rtp_packet_(reinterpret_cast<const char*>(rtp_data), rtp_len), |
135 rtcp_packet_(reinterpret_cast<const char*>(rtcp_data), rtcp_len), | 140 rtcp_packet_(reinterpret_cast<const char*>(rtcp_data), rtcp_len), |
136 media_info_callbacks1_(), | 141 media_info_callbacks1_(), |
137 media_info_callbacks2_(), | 142 media_info_callbacks2_(), |
138 ssrc_(0), | 143 ssrc_(0), |
139 error_(T::MediaChannel::ERROR_NONE) { | 144 error_(T::MediaChannel::ERROR_NONE) { |
140 } | 145 } |
141 | 146 |
142 void CreateChannels(int flags1, int flags2) { | 147 void CreateChannels(int flags1, int flags2) { |
143 CreateChannels(new typename T::MediaChannel(NULL), | 148 CreateChannels(new typename T::MediaChannel(NULL, typename T::Options()), |
144 new typename T::MediaChannel(NULL), | 149 new typename T::MediaChannel(NULL, typename T::Options()), |
145 flags1, flags2, rtc::Thread::Current()); | 150 flags1, flags2, rtc::Thread::Current()); |
146 } | 151 } |
147 void CreateChannels(int flags) { | |
148 CreateChannels(new typename T::MediaChannel(NULL), | |
149 new typename T::MediaChannel(NULL), | |
150 flags, rtc::Thread::Current()); | |
151 } | |
152 void CreateChannels(int flags1, int flags2, | |
153 rtc::Thread* thread) { | |
154 CreateChannels(new typename T::MediaChannel(NULL), | |
155 new typename T::MediaChannel(NULL), | |
156 flags1, flags2, thread); | |
157 } | |
158 void CreateChannels(int flags, | |
159 rtc::Thread* thread) { | |
160 CreateChannels(new typename T::MediaChannel(NULL), | |
161 new typename T::MediaChannel(NULL), | |
162 flags, thread); | |
163 } | |
164 void CreateChannels( | 152 void CreateChannels( |
165 typename T::MediaChannel* ch1, typename T::MediaChannel* ch2, | 153 typename T::MediaChannel* ch1, typename T::MediaChannel* ch2, |
166 int flags1, int flags2, rtc::Thread* thread) { | 154 int flags1, int flags2, rtc::Thread* thread) { |
167 media_channel1_ = ch1; | 155 media_channel1_ = ch1; |
168 media_channel2_ = ch2; | 156 media_channel2_ = ch2; |
169 channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_, | 157 channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_, |
170 (flags1 & RTCP) != 0)); | 158 (flags1 & RTCP) != 0)); |
171 channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session2_, | 159 channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session2_, |
172 (flags2 & RTCP) != 0)); | 160 (flags2 & RTCP) != 0)); |
173 channel1_->SignalMediaMonitor.connect( | 161 channel1_->SignalMediaMonitor.connect( |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_); | 197 AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_); |
210 | 198 |
211 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream. | 199 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream. |
212 if (flags1 & SSRC_MUX) { | 200 if (flags1 & SSRC_MUX) { |
213 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_); | 201 AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_); |
214 } | 202 } |
215 if (flags2 & SSRC_MUX) { | 203 if (flags2 & SSRC_MUX) { |
216 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_); | 204 AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_); |
217 } | 205 } |
218 } | 206 } |
219 | |
220 void CreateChannels( | |
221 typename T::MediaChannel* ch1, typename T::MediaChannel* ch2, | |
222 int flags, rtc::Thread* thread) { | |
223 media_channel1_ = ch1; | |
224 media_channel2_ = ch2; | |
225 | |
226 channel1_.reset(CreateChannel(thread, &media_engine_, ch1, &session1_, | |
227 (flags & RTCP) != 0)); | |
228 channel2_.reset(CreateChannel(thread, &media_engine_, ch2, &session1_, | |
229 (flags & RTCP) != 0)); | |
230 channel1_->SignalMediaMonitor.connect( | |
231 this, &ChannelTest<T>::OnMediaMonitor); | |
232 channel2_->SignalMediaMonitor.connect( | |
233 this, &ChannelTest<T>::OnMediaMonitor); | |
234 channel2_->SignalMediaError.connect( | |
235 this, &ChannelTest<T>::OnMediaChannelError); | |
236 CreateContent(flags, kPcmuCodec, kH264Codec, | |
237 &local_media_content1_); | |
238 CreateContent(flags, kPcmuCodec, kH264Codec, | |
239 &local_media_content2_); | |
240 CopyContent(local_media_content1_, &remote_media_content1_); | |
241 CopyContent(local_media_content2_, &remote_media_content2_); | |
242 // Add stream information (SSRC) to the local content but not to the remote | |
243 // content. This means that we per default know the SSRC of what we send but | |
244 // not what we receive. | |
245 AddLegacyStreamInContent(kSsrc1, flags, &local_media_content1_); | |
246 AddLegacyStreamInContent(kSsrc2, flags, &local_media_content2_); | |
247 | |
248 // If SSRC_MUX is used we also need to know the SSRC of the incoming stream. | |
249 if (flags & SSRC_MUX) { | |
250 AddLegacyStreamInContent(kSsrc1, flags, &remote_media_content1_); | |
251 AddLegacyStreamInContent(kSsrc2, flags, &remote_media_content2_); | |
252 } | |
253 } | |
254 | |
255 typename T::Channel* CreateChannel(rtc::Thread* thread, | 207 typename T::Channel* CreateChannel(rtc::Thread* thread, |
256 cricket::MediaEngineInterface* engine, | 208 cricket::MediaEngineInterface* engine, |
257 typename T::MediaChannel* ch, | 209 typename T::MediaChannel* ch, |
258 cricket::BaseSession* session, | 210 cricket::BaseSession* session, |
259 bool rtcp) { | 211 bool rtcp) { |
260 typename T::Channel* channel = new typename T::Channel( | 212 typename T::Channel* channel = new typename T::Channel( |
261 thread, engine, ch, session, cricket::CN_AUDIO, rtcp); | 213 thread, engine, ch, session, cricket::CN_AUDIO, rtcp); |
262 if (!channel->Init()) { | 214 if (!channel->Init()) { |
263 delete channel; | 215 delete channel; |
264 channel = NULL; | 216 channel = NULL; |
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 EXPECT_EQ(1U, media_channel2_->codecs().size()); | 912 EXPECT_EQ(1U, media_channel2_->codecs().size()); |
961 } | 913 } |
962 | 914 |
963 // Test that we don't crash if packets are sent during call teardown | 915 // Test that we don't crash if packets are sent during call teardown |
964 // when RTCP mux is enabled. This is a regression test against a specific | 916 // when RTCP mux is enabled. This is a regression test against a specific |
965 // race condition that would only occur when a RTCP packet was sent during | 917 // race condition that would only occur when a RTCP packet was sent during |
966 // teardown of a channel on which RTCP mux was enabled. | 918 // teardown of a channel on which RTCP mux was enabled. |
967 void TestCallTeardownRtcpMux() { | 919 void TestCallTeardownRtcpMux() { |
968 class LastWordMediaChannel : public T::MediaChannel { | 920 class LastWordMediaChannel : public T::MediaChannel { |
969 public: | 921 public: |
970 LastWordMediaChannel() : T::MediaChannel(NULL) {} | 922 LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {} |
971 ~LastWordMediaChannel() { | 923 ~LastWordMediaChannel() { |
972 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame)); | 924 T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame)); |
973 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport)); | 925 T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport)); |
974 } | 926 } |
975 }; | 927 }; |
976 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(), | 928 CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(), |
977 RTCP | RTCP_MUX, RTCP | RTCP_MUX, | 929 RTCP | RTCP_MUX, RTCP | RTCP_MUX, |
978 rtc::Thread::Current()); | 930 rtc::Thread::Current()); |
979 EXPECT_TRUE(SendInitiate()); | 931 EXPECT_TRUE(SendInitiate()); |
980 EXPECT_TRUE(SendAccept()); | 932 EXPECT_TRUE(SendAccept()); |
(...skipping 1798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2779 }; | 2731 }; |
2780 rtc::Buffer payload(data, 3); | 2732 rtc::Buffer payload(data, 3); |
2781 cricket::SendDataResult result; | 2733 cricket::SendDataResult result; |
2782 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result)); | 2734 ASSERT_TRUE(media_channel1_->SendData(params, payload, &result)); |
2783 EXPECT_EQ(params.ssrc, | 2735 EXPECT_EQ(params.ssrc, |
2784 media_channel1_->last_sent_data_params().ssrc); | 2736 media_channel1_->last_sent_data_params().ssrc); |
2785 EXPECT_EQ("foo", media_channel1_->last_sent_data()); | 2737 EXPECT_EQ("foo", media_channel1_->last_sent_data()); |
2786 } | 2738 } |
2787 | 2739 |
2788 // TODO(pthatcher): TestSetReceiver? | 2740 // TODO(pthatcher): TestSetReceiver? |
OLD | NEW |