Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 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 "webrtc/video_engine/test/auto_test/interface/vie_file_based_comparison_tests.h"
     12 
     13 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
     14 #include "webrtc/video_engine/test/auto_test/primitives/base_primitives.h"
     15 #include "webrtc/video_engine/test/auto_test/primitives/framedrop_primitives.h"
     16 #include "webrtc/video_engine/test/auto_test/primitives/general_primitives.h"
     17 #include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
     18 #include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
     19 #include "webrtc/video_engine/test/libvietest/include/vie_external_render_filter.h"
     20 #include "webrtc/video_engine/test/libvietest/include/vie_fake_camera.h"
     21 #include "webrtc/video_engine/test/libvietest/include/vie_to_file_renderer.h"
     22 
     23 bool ViEFileBasedComparisonTests::TestCallSetup(
     24     const std::string& i420_video_file,
     25     int width,
     26     int height,
     27     ViEToFileRenderer* local_file_renderer,
     28     ViEToFileRenderer* remote_file_renderer) {
     29 
     30   TbInterfaces interfaces("TestCallSetup");
     31 
     32   int video_channel = -1;
     33   EXPECT_EQ(0, interfaces.base->CreateChannel(video_channel));
     34 
     35   ViEFakeCamera fake_camera(interfaces.capture);
     36   if (!fake_camera.StartCameraInNewThread(i420_video_file,
     37                                           width,
     38                                           height)) {
     39     // No point in continuing if we have no proper video source
     40     ADD_FAILURE() << "Could not open input video " << i420_video_file <<
     41         ": aborting test...";
     42     return false;
     43   }
     44   int capture_id = fake_camera.capture_id();
     45 
     46   // Apparently, we need to connect external capture devices, but we should
     47   // not start them since the external device is not a proper device.
     48   EXPECT_EQ(0, interfaces.capture->ConnectCaptureDevice(
     49       capture_id, video_channel));
     50 
     51   ConfigureRtpRtcp(interfaces.rtp_rtcp, kNack, video_channel);
     52 
     53   webrtc::ViERender* render_interface = interfaces.render;
     54   webrtc::ViEImageProcess* image_process = interfaces.image_process;
     55 
     56   RenderToFile(render_interface, video_channel, remote_file_renderer);
     57 
     58   // We make a special hookup of the local renderer to use an effect filter
     59   // instead of using the render interface for the capture device. This way
     60   // we will only render frames that actually get sent.
     61   webrtc::ExternalRendererEffectFilter renderer_filter(local_file_renderer);
     62   EXPECT_EQ(0, image_process->RegisterSendEffectFilter(video_channel,
     63                                                        renderer_filter));
     64 
     65   // Run the test itself:
     66   const char* device_name = "Fake Capture Device";
     67 
     68   ::TestI420CallSetup(interfaces.codec, interfaces.video_engine,
     69                       interfaces.base, interfaces.network, interfaces.rtp_rtcp,
     70                       video_channel, device_name);
     71 
     72   EXPECT_EQ(0, render_interface->StopRender(video_channel));
     73   EXPECT_EQ(0, render_interface->RemoveRenderer(video_channel));
     74 
     75   interfaces.capture->DisconnectCaptureDevice(video_channel);
     76 
     77   // Stop sending data, clean up the camera thread and release the capture
     78   // device. Note that this all happens after StopEverything, so this
     79   // tests that the system doesn't mind that the external capture device sends
     80   // data after rendering has been stopped.
     81   fake_camera.StopCamera();
     82   EXPECT_EQ(0, image_process->DeregisterSendEffectFilter(video_channel));
     83 
     84   EXPECT_EQ(0, interfaces.base->DeleteChannel(video_channel));
     85   return true;
     86 }
     87 
     88 void ViEFileBasedComparisonTests::TestFullStack(
     89     const std::string& i420_video_file,
     90     int width,
     91     int height,
     92     int bit_rate_kbps,
     93     ProtectionMethod protection_method,
     94     const NetworkParameters& network,
     95     ViEToFileRenderer* local_file_renderer,
     96     ViEToFileRenderer* remote_file_renderer,
     97     FrameDropDetector* frame_drop_detector) {
     98   TbInterfaces interfaces("TestFullStack");
     99 
    100   // Setup camera capturing from file.
    101   ViEFakeCamera fake_camera(interfaces.capture);
    102   if (!fake_camera.StartCameraInNewThread(i420_video_file, width, height)) {
    103     // No point in continuing if we have no proper video source
    104     ADD_FAILURE() << "Could not open input video " << i420_video_file <<
    105         ": aborting test...";
    106     return;
    107   }
    108   int video_channel = -1;
    109   int capture_id = fake_camera.capture_id();
    110   EXPECT_EQ(0, interfaces.base->CreateChannel(video_channel));
    111 
    112   // Must set SSRC to avoid SSRC collision detection since we're sending and
    113   // receiving from the same machine (that would cause frames being discarded
    114   // and decoder reset).
    115   EXPECT_EQ(0, interfaces.rtp_rtcp->SetLocalSSRC(video_channel, 12345));
    116 
    117   EXPECT_EQ(0, interfaces.capture->ConnectCaptureDevice(
    118       capture_id, video_channel));
    119   ConfigureRtpRtcp(interfaces.rtp_rtcp, protection_method, video_channel);
    120 
    121   ::TestFullStack(interfaces, capture_id, video_channel, width, height,
    122                   bit_rate_kbps, network, frame_drop_detector,
    123                   remote_file_renderer, local_file_renderer);
    124   EXPECT_TRUE(fake_camera.StopCamera());
    125 }
    126