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
23bool 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
88void 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