1 /*
2 * Copyright 2018 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <stddef.h>
12 #include <stdint.h>
13
14 #include <memory>
15 #include <vector>
16
17 #include "api/video/video_frame.h"
18 #include "api/video/video_sink_interface.h"
19 #include "api/video_codecs/video_encoder_config.h"
20 #include "call/rtp_config.h"
21 #include "call/video_receive_stream.h"
22 #include "call/video_send_stream.h"
23 #include "rtc_base/event.h"
24 #include "test/frame_generator_capturer.h"
25 #include "test/gtest.h"
26 #include "video/end_to_end_tests/multi_stream_tester.h"
27
28 namespace webrtc {
29 // Each renderer verifies that it receives the expected resolution, and as soon
30 // as every renderer has received a frame, the test finishes.
TEST(MultiStreamEndToEndTest,SendsAndReceivesMultipleStreams)31 TEST(MultiStreamEndToEndTest, SendsAndReceivesMultipleStreams) {
32 class VideoOutputObserver : public rtc::VideoSinkInterface<VideoFrame> {
33 public:
34 VideoOutputObserver(const MultiStreamTester::CodecSettings& settings,
35 uint32_t ssrc,
36 test::FrameGeneratorCapturer** frame_generator)
37 : settings_(settings), ssrc_(ssrc), frame_generator_(frame_generator) {}
38
39 void OnFrame(const VideoFrame& video_frame) override {
40 EXPECT_EQ(settings_.width, video_frame.width());
41 EXPECT_EQ(settings_.height, video_frame.height());
42 (*frame_generator_)->Stop();
43 done_.Set();
44 }
45
46 uint32_t Ssrc() { return ssrc_; }
47
48 bool Wait() { return done_.Wait(30 * 1000); }
49
50 private:
51 const MultiStreamTester::CodecSettings& settings_;
52 const uint32_t ssrc_;
53 test::FrameGeneratorCapturer** const frame_generator_;
54 rtc::Event done_;
55 };
56
57 class Tester : public MultiStreamTester {
58 public:
59 Tester() = default;
60 ~Tester() override = default;
61
62 protected:
63 void Wait() override {
64 for (const auto& observer : observers_) {
65 EXPECT_TRUE(observer->Wait())
66 << "Time out waiting for from on ssrc " << observer->Ssrc();
67 }
68 }
69
70 void UpdateSendConfig(
71 size_t stream_index,
72 VideoSendStream::Config* send_config,
73 VideoEncoderConfig* encoder_config,
74 test::FrameGeneratorCapturer** frame_generator) override {
75 observers_[stream_index] = std::make_unique<VideoOutputObserver>(
76 codec_settings[stream_index], send_config->rtp.ssrcs.front(),
77 frame_generator);
78 }
79
80 void UpdateReceiveConfig(
81 size_t stream_index,
82 VideoReceiveStream::Config* receive_config) override {
83 receive_config->renderer = observers_[stream_index].get();
84 }
85
86 private:
87 std::unique_ptr<VideoOutputObserver> observers_[kNumStreams];
88 } tester;
89
90 tester.RunTest();
91 }
92 } // namespace webrtc
93