1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_file_based_comparison_tests.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
14281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/base_primitives.h"
15281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/framedrop_primitives.h"
16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/general_primitives.h"
17281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/vie_external_render_filter.h"
20281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/vie_fake_camera.h"
21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/vie_to_file_renderer.h"
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool ViEFileBasedComparisonTests::TestCallSetup(
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const std::string& i420_video_file,
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int width,
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int height,
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEToFileRenderer* local_file_renderer,
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEToFileRenderer* remote_file_renderer) {
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TbInterfaces interfaces("TestCallSetup");
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_channel = -1;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, interfaces.base->CreateChannel(video_channel));
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEFakeCamera fake_camera(interfaces.capture);
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!fake_camera.StartCameraInNewThread(i420_video_file,
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          width,
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          height)) {
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // No point in continuing if we have no proper video source
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ADD_FAILURE() << "Could not open input video " << i420_video_file <<
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ": aborting test...";
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int capture_id = fake_camera.capture_id();
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Apparently, we need to connect external capture devices, but we should
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // not start them since the external device is not a proper device.
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, interfaces.capture->ConnectCaptureDevice(
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      capture_id, video_channel));
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51a0f23f156822760eab87325c52216be18f3b72bdstefan@webrtc.org  ConfigureRtpRtcp(interfaces.rtp_rtcp, kNack, video_channel);
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
535600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  webrtc::ViERender* render_interface = interfaces.render;
545600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  webrtc::ViEImageProcess* image_process = interfaces.image_process;
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RenderToFile(render_interface, video_channel, remote_file_renderer);
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
585600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  // We make a special hookup of the local renderer to use an effect filter
595600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  // instead of using the render interface for the capture device. This way
605600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  // we will only render frames that actually get sent.
615600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  webrtc::ExternalRendererEffectFilter renderer_filter(local_file_renderer);
625600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, image_process->RegisterSendEffectFilter(video_channel,
635600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                                                       renderer_filter));
645600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Run the test itself:
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const char* device_name = "Fake Capture Device";
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ::TestI420CallSetup(interfaces.codec, interfaces.video_engine,
6919f89a1ab2ebe75e38d192c42453e9c50aae0c64stefan@webrtc.org                      interfaces.base, interfaces.network, interfaces.rtp_rtcp,
7019f89a1ab2ebe75e38d192c42453e9c50aae0c64stefan@webrtc.org                      video_channel, device_name);
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
725600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, render_interface->StopRender(video_channel));
735600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, render_interface->RemoveRenderer(video_channel));
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  interfaces.capture->DisconnectCaptureDevice(video_channel);
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Stop sending data, clean up the camera thread and release the capture
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // device. Note that this all happens after StopEverything, so this
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // tests that the system doesn't mind that the external capture device sends
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // data after rendering has been stopped.
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  fake_camera.StopCamera();
825600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, image_process->DeregisterSendEffectFilter(video_channel));
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, interfaces.base->DeleteChannel(video_channel));
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid ViEFileBasedComparisonTests::TestFullStack(
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const std::string& i420_video_file,
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int width,
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int height,
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int bit_rate_kbps,
93a0f23f156822760eab87325c52216be18f3b72bdstefan@webrtc.org    ProtectionMethod protection_method,
94137ed6cceec64fbed8ac72fcbbf44b6e2bb15fa5stefan@webrtc.org    const NetworkParameters& network,
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEToFileRenderer* local_file_renderer,
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEToFileRenderer* remote_file_renderer,
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FrameDropDetector* frame_drop_detector) {
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TbInterfaces interfaces("TestFullStack");
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Setup camera capturing from file.
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEFakeCamera fake_camera(interfaces.capture);
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!fake_camera.StartCameraInNewThread(i420_video_file, width, height)) {
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // No point in continuing if we have no proper video source
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ADD_FAILURE() << "Could not open input video " << i420_video_file <<
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ": aborting test...";
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_channel = -1;
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int capture_id = fake_camera.capture_id();
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, interfaces.base->CreateChannel(video_channel));
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Must set SSRC to avoid SSRC collision detection since we're sending and
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // receiving from the same machine (that would cause frames being discarded
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // and decoder reset).
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, interfaces.rtp_rtcp->SetLocalSSRC(video_channel, 12345));
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, interfaces.capture->ConnectCaptureDevice(
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      capture_id, video_channel));
119a0f23f156822760eab87325c52216be18f3b72bdstefan@webrtc.org  ConfigureRtpRtcp(interfaces.rtp_rtcp, protection_method, video_channel);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ::TestFullStack(interfaces, capture_id, video_channel, width, height,
122137ed6cceec64fbed8ac72fcbbf44b6e2bb15fa5stefan@webrtc.org                  bit_rate_kbps, network, frame_drop_detector,
123137ed6cceec64fbed8ac72fcbbf44b6e2bb15fa5stefan@webrtc.org                  remote_file_renderer, local_file_renderer);
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_TRUE(fake_camera.StopCamera());
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
126