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 #include <algorithm> | 10 #include <algorithm> |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 CreateMatchingReceiveConfigs(&receiver_transport); | 222 CreateMatchingReceiveConfigs(&receiver_transport); |
223 | 223 |
224 video_receive_configs_[0].renderer = &renderer; | 224 video_receive_configs_[0].renderer = &renderer; |
225 | 225 |
226 CreateVideoStreams(); | 226 CreateVideoStreams(); |
227 Start(); | 227 Start(); |
228 | 228 |
229 // Create frames that are smaller than the send width/height, this is done to | 229 // Create frames that are smaller than the send width/height, this is done to |
230 // check that the callbacks are done after processing video. | 230 // check that the callbacks are done after processing video. |
231 std::unique_ptr<test::FrameGenerator> frame_generator( | 231 std::unique_ptr<test::FrameGenerator> frame_generator( |
232 test::FrameGenerator::CreateChromaGenerator(kWidth, kHeight)); | 232 test::FrameGenerator::CreateSquareGenerator(kWidth, kHeight)); |
233 test::FrameForwarder frame_forwarder; | 233 test::FrameForwarder frame_forwarder; |
234 video_send_stream_->SetSource( | 234 video_send_stream_->SetSource( |
235 &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced); | 235 &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced); |
236 | 236 |
237 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); | 237 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); |
238 EXPECT_TRUE(renderer.Wait()) | 238 EXPECT_TRUE(renderer.Wait()) |
239 << "Timed out while waiting for the frame to render."; | 239 << "Timed out while waiting for the frame to render."; |
240 | 240 |
241 Stop(); | 241 Stop(); |
242 | 242 |
(...skipping 23 matching lines...) Expand all Loading... |
266 receiver_transport.SetReceiver(sender_call_->Receiver()); | 266 receiver_transport.SetReceiver(sender_call_->Receiver()); |
267 | 267 |
268 CreateSendConfig(1, 0, 0, &sender_transport); | 268 CreateSendConfig(1, 0, 0, &sender_transport); |
269 CreateMatchingReceiveConfigs(&receiver_transport); | 269 CreateMatchingReceiveConfigs(&receiver_transport); |
270 video_receive_configs_[0].renderer = &renderer; | 270 video_receive_configs_[0].renderer = &renderer; |
271 | 271 |
272 CreateVideoStreams(); | 272 CreateVideoStreams(); |
273 Start(); | 273 Start(); |
274 | 274 |
275 std::unique_ptr<test::FrameGenerator> frame_generator( | 275 std::unique_ptr<test::FrameGenerator> frame_generator( |
276 test::FrameGenerator::CreateChromaGenerator(kDefaultWidth, | 276 test::FrameGenerator::CreateSquareGenerator(kDefaultWidth, |
277 kDefaultHeight)); | 277 kDefaultHeight)); |
278 test::FrameForwarder frame_forwarder; | 278 test::FrameForwarder frame_forwarder; |
279 video_send_stream_->SetSource( | 279 video_send_stream_->SetSource( |
280 &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced); | 280 &frame_forwarder, VideoSendStream::DegradationPreference::kBalanced); |
281 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); | 281 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); |
282 | 282 |
283 EXPECT_TRUE(renderer.Wait()) | 283 EXPECT_TRUE(renderer.Wait()) |
284 << "Timed out while waiting for the frame to render."; | 284 << "Timed out while waiting for the frame to render."; |
285 | 285 |
286 Stop(); | 286 Stop(); |
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1662 // Only drop media, and not on the first stream (otherwise it will be | 1662 // Only drop media, and not on the first stream (otherwise it will be |
1663 // hard to distinguish from padding, which is always sent on the first | 1663 // hard to distinguish from padding, which is always sent on the first |
1664 // stream). | 1664 // stream). |
1665 if (header.payloadType != kSendRtxPayloadType && | 1665 if (header.payloadType != kSendRtxPayloadType && |
1666 header.ssrc != first_media_ssrc_ && | 1666 header.ssrc != first_media_ssrc_ && |
1667 header.extension.transportSequenceNumber % 17 == 0) { | 1667 header.extension.transportSequenceNumber % 17 == 0) { |
1668 dropped_seq_[header.ssrc].insert(header.sequenceNumber); | 1668 dropped_seq_[header.ssrc].insert(header.sequenceNumber); |
1669 drop_packet = true; | 1669 drop_packet = true; |
1670 } | 1670 } |
1671 | 1671 |
1672 size_t payload_length = | 1672 if (header.payloadType == kSendRtxPayloadType) { |
1673 length - (header.headerLength + header.paddingLength); | |
1674 if (payload_length == 0) { | |
1675 padding_observed_ = true; | |
1676 } else if (header.payloadType == kSendRtxPayloadType) { | |
1677 uint16_t original_sequence_number = | 1673 uint16_t original_sequence_number = |
1678 ByteReader<uint16_t>::ReadBigEndian(&data[header.headerLength]); | 1674 ByteReader<uint16_t>::ReadBigEndian(&data[header.headerLength]); |
1679 uint32_t original_ssrc = | 1675 uint32_t original_ssrc = |
1680 rtx_to_media_ssrcs_.find(header.ssrc)->second; | 1676 rtx_to_media_ssrcs_.find(header.ssrc)->second; |
1681 std::set<uint16_t>* seq_no_map = &dropped_seq_[original_ssrc]; | 1677 std::set<uint16_t>* seq_no_map = &dropped_seq_[original_ssrc]; |
1682 auto it = seq_no_map->find(original_sequence_number); | 1678 auto it = seq_no_map->find(original_sequence_number); |
1683 if (it != seq_no_map->end()) { | 1679 if (it != seq_no_map->end()) { |
1684 retransmit_observed_ = true; | 1680 retransmit_observed_ = true; |
1685 seq_no_map->erase(it); | 1681 seq_no_map->erase(it); |
1686 } else { | 1682 } else { |
(...skipping 10 matching lines...) Expand all Loading... |
1697 return true; | 1693 return true; |
1698 } | 1694 } |
1699 } | 1695 } |
1700 | 1696 |
1701 return test::DirectTransport::SendRtp(data, length, options); | 1697 return test::DirectTransport::SendRtp(data, length, options); |
1702 } | 1698 } |
1703 | 1699 |
1704 bool IsDone() { | 1700 bool IsDone() { |
1705 bool observed_types_ok = | 1701 bool observed_types_ok = |
1706 streams_observed_.size() == MultiStreamTest::kNumStreams && | 1702 streams_observed_.size() == MultiStreamTest::kNumStreams && |
1707 padding_observed_ && retransmit_observed_ && rtx_padding_observed_; | 1703 retransmit_observed_ && rtx_padding_observed_; |
1708 if (!observed_types_ok) | 1704 if (!observed_types_ok) |
1709 return false; | 1705 return false; |
1710 // We should not have any gaps in the sequence number range. | 1706 // We should not have any gaps in the sequence number range. |
1711 size_t seqno_range = | 1707 size_t seqno_range = |
1712 *received_packed_ids_.rbegin() - *received_packed_ids_.begin() + 1; | 1708 *received_packed_ids_.rbegin() - *received_packed_ids_.begin() + 1; |
1713 return seqno_range == received_packed_ids_.size(); | 1709 return seqno_range == received_packed_ids_.size(); |
1714 } | 1710 } |
1715 | 1711 |
1716 bool Wait() { | 1712 bool Wait() { |
1717 { | 1713 { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 | 1748 |
1753 void UpdateSendConfig( | 1749 void UpdateSendConfig( |
1754 size_t stream_index, | 1750 size_t stream_index, |
1755 VideoSendStream::Config* send_config, | 1751 VideoSendStream::Config* send_config, |
1756 VideoEncoderConfig* encoder_config, | 1752 VideoEncoderConfig* encoder_config, |
1757 test::FrameGeneratorCapturer** frame_generator) override { | 1753 test::FrameGeneratorCapturer** frame_generator) override { |
1758 send_config->rtp.extensions.clear(); | 1754 send_config->rtp.extensions.clear(); |
1759 send_config->rtp.extensions.push_back(RtpExtension( | 1755 send_config->rtp.extensions.push_back(RtpExtension( |
1760 RtpExtension::kTransportSequenceNumberUri, kExtensionId)); | 1756 RtpExtension::kTransportSequenceNumberUri, kExtensionId)); |
1761 | 1757 |
1762 // Force some padding to be sent. | 1758 // Force some padding to be sent. Note that since we do send media |
| 1759 // packets we can not guarantee that a padding only packet is sent. |
| 1760 // Instead, padding will most likely be send as an RTX packet. |
1763 const int kPaddingBitrateBps = 50000; | 1761 const int kPaddingBitrateBps = 50000; |
1764 encoder_config->max_bitrate_bps = 1000000; | 1762 encoder_config->max_bitrate_bps = 200000; |
1765 encoder_config->min_transmit_bitrate_bps = | 1763 encoder_config->min_transmit_bitrate_bps = |
1766 encoder_config->max_bitrate_bps + kPaddingBitrateBps; | 1764 encoder_config->max_bitrate_bps + kPaddingBitrateBps; |
1767 | 1765 |
1768 // Configure RTX for redundant payload padding. | 1766 // Configure RTX for redundant payload padding. |
1769 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1767 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
1770 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[stream_index]); | 1768 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[stream_index]); |
1771 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; | 1769 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; |
1772 rtx_to_media_ssrcs_[kSendRtxSsrcs[stream_index]] = | 1770 rtx_to_media_ssrcs_[kSendRtxSsrcs[stream_index]] = |
1773 send_config->rtp.ssrcs[0]; | 1771 send_config->rtp.ssrcs[0]; |
1774 | 1772 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1946 | 1944 |
1947 CreateSendConfig(1, 0, 0, &sender_transport); | 1945 CreateSendConfig(1, 0, 0, &sender_transport); |
1948 CreateMatchingReceiveConfigs(&receiver_transport); | 1946 CreateMatchingReceiveConfigs(&receiver_transport); |
1949 video_send_config_.post_encode_callback = &post_encode_observer; | 1947 video_send_config_.post_encode_callback = &post_encode_observer; |
1950 video_receive_configs_[0].pre_decode_callback = &pre_decode_observer; | 1948 video_receive_configs_[0].pre_decode_callback = &pre_decode_observer; |
1951 | 1949 |
1952 CreateVideoStreams(); | 1950 CreateVideoStreams(); |
1953 Start(); | 1951 Start(); |
1954 | 1952 |
1955 std::unique_ptr<test::FrameGenerator> frame_generator( | 1953 std::unique_ptr<test::FrameGenerator> frame_generator( |
1956 test::FrameGenerator::CreateChromaGenerator(kDefaultWidth, | 1954 test::FrameGenerator::CreateSquareGenerator(kDefaultWidth, |
1957 kDefaultHeight)); | 1955 kDefaultHeight)); |
1958 test::FrameForwarder forwarder; | 1956 test::FrameForwarder forwarder; |
1959 video_send_stream_->SetSource( | 1957 video_send_stream_->SetSource( |
1960 &forwarder, VideoSendStream::DegradationPreference::kBalanced); | 1958 &forwarder, VideoSendStream::DegradationPreference::kBalanced); |
1961 forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); | 1959 forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); |
1962 | 1960 |
1963 EXPECT_TRUE(post_encode_observer.Wait()) | 1961 EXPECT_TRUE(post_encode_observer.Wait()) |
1964 << "Timed out while waiting for send-side encoded-frame callback."; | 1962 << "Timed out while waiting for send-side encoded-frame callback."; |
1965 | 1963 |
1966 EXPECT_TRUE(pre_decode_observer.Wait()) | 1964 EXPECT_TRUE(pre_decode_observer.Wait()) |
(...skipping 2216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4183 std::unique_ptr<VideoEncoder> encoder_; | 4181 std::unique_ptr<VideoEncoder> encoder_; |
4184 std::unique_ptr<VideoDecoder> decoder_; | 4182 std::unique_ptr<VideoDecoder> decoder_; |
4185 rtc::CriticalSection crit_; | 4183 rtc::CriticalSection crit_; |
4186 int recorded_frames_ GUARDED_BY(crit_); | 4184 int recorded_frames_ GUARDED_BY(crit_); |
4187 } test(this); | 4185 } test(this); |
4188 | 4186 |
4189 RunBaseTest(&test); | 4187 RunBaseTest(&test); |
4190 } | 4188 } |
4191 | 4189 |
4192 } // namespace webrtc | 4190 } // namespace webrtc |
OLD | NEW |