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