| /* |
| * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include <cstdio> |
| #include <map> |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| #include "webrtc/system_wrappers/interface/clock.h" |
| #include "webrtc/system_wrappers/interface/scoped_ptr.h" |
| #include "webrtc/typedefs.h" |
| #include "webrtc/video_engine/new_include/video_engine.h" |
| #include "webrtc/video_engine/test/common/direct_transport.h" |
| #include "webrtc/video_engine/test/common/flags.h" |
| #include "webrtc/video_engine/test/common/generate_ssrcs.h" |
| #include "webrtc/video_engine/test/common/run_loop.h" |
| #include "webrtc/video_engine/test/common/run_tests.h" |
| #include "webrtc/video_engine/test/common/video_capturer.h" |
| #include "webrtc/video_engine/test/common/video_renderer.h" |
| |
| namespace webrtc { |
| |
| class LoopbackTest : public ::testing::Test { |
| protected: |
| std::map<uint32_t, bool> reserved_ssrcs_; |
| }; |
| |
| TEST_F(LoopbackTest, Test) { |
| scoped_ptr<test::VideoRenderer> local_preview(test::VideoRenderer::Create( |
| "Local Preview", test::flags::Width(), test::flags::Height())); |
| scoped_ptr<test::VideoRenderer> loopback_video(test::VideoRenderer::Create( |
| "Loopback Video", test::flags::Width(), test::flags::Height())); |
| |
| scoped_ptr<newapi::VideoEngine> video_engine( |
| newapi::VideoEngine::Create(webrtc::newapi::VideoEngineConfig())); |
| |
| test::DirectTransport transport(NULL); |
| scoped_ptr<newapi::VideoCall> call(video_engine->CreateCall(&transport)); |
| |
| // Loopback, call sends to itself. |
| transport.SetReceiver(call->Receiver()); |
| |
| newapi::VideoSendStream::Config send_config = call->GetDefaultSendConfig(); |
| test::GenerateRandomSsrcs(&send_config, &reserved_ssrcs_); |
| |
| send_config.local_renderer = local_preview.get(); |
| |
| // TODO(pbos): static_cast shouldn't be required after mflodman refactors the |
| // VideoCodec struct. |
| send_config.codec.width = static_cast<uint16_t>(test::flags::Width()); |
| send_config.codec.height = static_cast<uint16_t>(test::flags::Height()); |
| send_config.codec.minBitrate = |
| static_cast<unsigned int>(test::flags::MinBitrate()); |
| send_config.codec.startBitrate = |
| static_cast<unsigned int>(test::flags::StartBitrate()); |
| send_config.codec.maxBitrate = |
| static_cast<unsigned int>(test::flags::MaxBitrate()); |
| |
| newapi::VideoSendStream* send_stream = call->CreateSendStream(send_config); |
| |
| Clock* test_clock = Clock::GetRealTimeClock(); |
| |
| scoped_ptr<test::VideoCapturer> camera( |
| test::VideoCapturer::Create(send_stream->Input(), |
| test::flags::Width(), |
| test::flags::Height(), |
| test::flags::Fps(), |
| test_clock)); |
| |
| newapi::VideoReceiveStream::Config receive_config = |
| call->GetDefaultReceiveConfig(); |
| receive_config.rtp.ssrc = send_config.rtp.ssrcs[0]; |
| receive_config.renderer = loopback_video.get(); |
| |
| newapi::VideoReceiveStream* receive_stream = |
| call->CreateReceiveStream(receive_config); |
| |
| receive_stream->StartReceive(); |
| send_stream->StartSend(); |
| camera->Start(); |
| |
| test::PressEnterToContinue(); |
| |
| camera->Stop(); |
| send_stream->StopSend(); |
| receive_stream->StopReceive(); |
| |
| call->DestroyReceiveStream(receive_stream); |
| call->DestroySendStream(send_stream); |
| } |
| } // webrtc |