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