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