Home | History | Annotate | Download | only in video
      1 /*
      2  *  Copyright (c) 2013 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 <stdio.h>
     12 
     13 #include <map>
     14 
     15 #include "gflags/gflags.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 
     18 #include "webrtc/call.h"
     19 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
     20 #include "webrtc/system_wrappers/interface/clock.h"
     21 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     22 #include "webrtc/test/direct_transport.h"
     23 #include "webrtc/test/encoder_settings.h"
     24 #include "webrtc/test/fake_encoder.h"
     25 #include "webrtc/test/run_loop.h"
     26 #include "webrtc/test/run_test.h"
     27 #include "webrtc/test/video_capturer.h"
     28 #include "webrtc/test/video_renderer.h"
     29 #include "webrtc/typedefs.h"
     30 
     31 namespace webrtc {
     32 namespace flags {
     33 
     34 DEFINE_int32(width, 640, "Video width.");
     35 size_t Width() { return static_cast<size_t>(FLAGS_width); }
     36 
     37 DEFINE_int32(height, 480, "Video height.");
     38 size_t Height() { return static_cast<size_t>(FLAGS_height); }
     39 
     40 DEFINE_int32(fps, 30, "Frames per second.");
     41 int Fps() { return static_cast<int>(FLAGS_fps); }
     42 
     43 DEFINE_int32(min_bitrate, 50, "Minimum video bitrate.");
     44 size_t MinBitrate() { return static_cast<size_t>(FLAGS_min_bitrate); }
     45 
     46 DEFINE_int32(start_bitrate, 300, "Video starting bitrate.");
     47 size_t StartBitrate() { return static_cast<size_t>(FLAGS_start_bitrate); }
     48 
     49 DEFINE_int32(max_bitrate, 800, "Maximum video bitrate.");
     50 size_t MaxBitrate() { return static_cast<size_t>(FLAGS_max_bitrate); }
     51 }  // namespace flags
     52 
     53 static const uint32_t kSendSsrc = 0x654321;
     54 static const uint32_t kReceiverLocalSsrc = 0x123456;
     55 
     56 void Loopback() {
     57   scoped_ptr<test::VideoRenderer> local_preview(test::VideoRenderer::Create(
     58       "Local Preview", flags::Width(), flags::Height()));
     59   scoped_ptr<test::VideoRenderer> loopback_video(test::VideoRenderer::Create(
     60       "Loopback Video", flags::Width(), flags::Height()));
     61 
     62   test::DirectTransport transport;
     63   Call::Config call_config(&transport);
     64   call_config.start_bitrate_bps =
     65       static_cast<int>(flags::StartBitrate()) * 1000;
     66   scoped_ptr<Call> call(Call::Create(call_config));
     67 
     68   // Loopback, call sends to itself.
     69   transport.SetReceiver(call->Receiver());
     70 
     71   VideoSendStream::Config send_config = call->GetDefaultSendConfig();
     72   send_config.rtp.ssrcs.push_back(kSendSsrc);
     73 
     74   send_config.local_renderer = local_preview.get();
     75 
     76   scoped_ptr<VP8Encoder> encoder(VP8Encoder::Create());
     77   send_config.encoder_settings.encoder = encoder.get();
     78   send_config.encoder_settings.payload_name = "VP8";
     79   send_config.encoder_settings.payload_type = 124;
     80   std::vector<VideoStream> video_streams = test::CreateVideoStreams(1);
     81   VideoStream* stream = &video_streams[0];
     82   stream->width = flags::Width();
     83   stream->height = flags::Height();
     84   stream->min_bitrate_bps = static_cast<int>(flags::MinBitrate()) * 1000;
     85   stream->target_bitrate_bps = static_cast<int>(flags::MaxBitrate()) * 1000;
     86   stream->max_bitrate_bps = static_cast<int>(flags::MaxBitrate()) * 1000;
     87   stream->max_framerate = 30;
     88   stream->max_qp = 56;
     89 
     90   VideoSendStream* send_stream =
     91       call->CreateVideoSendStream(send_config, video_streams, NULL);
     92 
     93   Clock* test_clock = Clock::GetRealTimeClock();
     94 
     95   scoped_ptr<test::VideoCapturer> camera(
     96       test::VideoCapturer::Create(send_stream->Input(),
     97                                   flags::Width(),
     98                                   flags::Height(),
     99                                   flags::Fps(),
    100                                   test_clock));
    101 
    102   VideoReceiveStream::Config receive_config = call->GetDefaultReceiveConfig();
    103   receive_config.rtp.remote_ssrc = send_config.rtp.ssrcs[0];
    104   receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
    105   receive_config.renderer = loopback_video.get();
    106   VideoCodec codec =
    107       test::CreateDecoderVideoCodec(send_config.encoder_settings);
    108   receive_config.codecs.push_back(codec);
    109 
    110   VideoReceiveStream* receive_stream =
    111       call->CreateVideoReceiveStream(receive_config);
    112 
    113   receive_stream->Start();
    114   send_stream->Start();
    115   camera->Start();
    116 
    117   test::PressEnterToContinue();
    118 
    119   camera->Stop();
    120   send_stream->Stop();
    121   receive_stream->Stop();
    122 
    123   call->DestroyVideoReceiveStream(receive_stream);
    124   call->DestroyVideoSendStream(send_stream);
    125 
    126   transport.StopSending();
    127 }
    128 }  // namespace webrtc
    129 
    130 int main(int argc, char* argv[]) {
    131   ::testing::InitGoogleTest(&argc, argv);
    132   google::ParseCommandLineFlags(&argc, &argv, true);
    133 
    134   webrtc::test::RunTest(webrtc::Loopback);
    135   return 0;
    136 }
    137