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 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vie_autotest_render.cc 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 15281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/engine_configurations.h" 16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h" 17281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/modules/video_render/include/video_render.h" 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_capture_device.h" 23281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h" 24281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_video_channel.h" 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WIN32) 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <ddraw.h> 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <tchar.h> 29281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include <windows.h> 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(WEBRTC_LINUX) 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //From windgi.h 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org #undef RGB 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org #define RGB(r,g,b) ((unsigned long)(((unsigned char)(r)|((unsigned short)((unsigned char)(g))<<8))|(((unsigned long)(unsigned char)(b))<<16))) 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //From ddraw.h 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* typedef struct _DDCOLORKEY 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD dwColorSpaceLowValue; // low boundary of color space that is to 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DWORD dwColorSpaceHighValue; // high boundary of color space that is 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } DDCOLORKEY;*/ 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(WEBRTC_MAC) 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEAutoTestExternalRenderer: public webrtc::ExternalRenderer 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViEAutoTestExternalRenderer() : 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width(0), 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height(0) 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int FrameSizeChange(unsigned int width, unsigned int height, 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org unsigned int numberOfStreams) 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _width = width; 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _height = height; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 599d10769e109601915022fea44ec392645c3b0704wu@webrtc.org virtual int DeliverFrame(unsigned char* buffer, 609d10769e109601915022fea44ec392645c3b0704wu@webrtc.org int bufferSize, 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org uint32_t time_stamp, 629d10769e109601915022fea44ec392645c3b0704wu@webrtc.org int64_t ntp_time_ms, 63ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org int64_t render_time, 64ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org void* /*handle*/) { 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (bufferSize != CalcBufferSize(webrtc::kI420, _width, _height)) { 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("Incorrect render buffer received, of length = %d\n", 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bufferSize); 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org virtual bool IsTextureSupported() { return false; } 74ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~ViEAutoTestExternalRenderer() 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int _width, _height; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid ViEAutoTest::ViERenderStandardTest() 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //*************************************************************** 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Begin create/initialize WebRTC Video Engine for testing 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //*************************************************************** 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int rtpPort = 6000; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbInterfaces ViE("ViERenderStandardTest"); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create a video channel 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8); 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbCaptureDevice tbCapture(ViE); // Create a capture device 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.ConnectTo(tbChannel.videoChannel); 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.StartReceive(rtpPort); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.StartSend(rtpPort); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm1)); 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, _window1, 0, 0.0, 0.0, 1.0, 1.0)); 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm2)); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, _window2, 1, 0.0, 0.0, 1.0, 1.0)); 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbChannel.videoChannel)); 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nCapture device is renderered in Window 1"); 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("Remote stream is renderered in Window 2"); 1105dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StopRender(tbCapture.captureId)); 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // PIP and full screen rendering is not supported on Android 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_ANDROID 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm1)); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, _window2, 0, 0.75, 0.75, 1.0, 1.0)); 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nCapture device is now rendered in Window 2, PiP."); 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("Switching to full screen rendering in %d seconds.\n", 1245dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org kAutoTestSleepTimeMs / 1000); 1255dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbChannel.videoChannel)); 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm2)); 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Destroy render module and create new in full screen mode 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoRender::DestroyVideoRender(_vrm1); 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = NULL; 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = webrtc::VideoRender::CreateVideoRender( 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 4563, _window1, true, _renderType); 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(_vrm1 != NULL); 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm1)); 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, _window1, 0, 0.75f, 0.75f, 1.0f, 1.0f)); 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, _window1, 1, 0.0, 0.0, 1.0, 1.0)); 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbChannel.videoChannel)); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1465dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbChannel.videoChannel)); 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm1)); 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Destroy full screen render module and create new in normal mode 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoRender::DestroyVideoRender(_vrm1); 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = NULL; 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = webrtc::VideoRender::CreateVideoRender( 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 4561, _window1, false, _renderType); 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(_vrm1 != NULL); 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //*************************************************************** 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Engine ready. Begin testing class 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //*************************************************************** 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //*************************************************************** 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Testing finished. Tear down Video Engine 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org //*************************************************************** 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.Disconnect(tbChannel.videoChannel); 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid ViEAutoTest::ViERenderExtendedTest() 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int rtpPort = 6000; 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbInterfaces ViE("ViERenderExtendedTest"); 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create a video channel 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8); 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbCaptureDevice tbCapture(ViE); // Create a capture device 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.ConnectTo(tbChannel.videoChannel); 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.StartReceive(rtpPort); 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.StartSend(rtpPort); 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm1)); 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, _window1, 0, 0.0, 0.0, 1.0, 1.0)); 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm2)); 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, _window2, 1, 0.0, 0.0, 1.0, 1.0)); 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbChannel.videoChannel)); 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nCapture device is renderered in Window 1"); 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("Remote stream is renderered in Window 2"); 1965dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _WIN32 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nConfiguring Window2"); 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("you will see video only in first quadrant"); 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->ConfigureRender( 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, 0, 0.0f, 0.0f, 0.5f, 0.5f)); 2035dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("you will see video only in fourth quadrant"); 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->ConfigureRender( 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, 0, 0.5f, 0.5f, 1.0f, 1.0f)); 2085dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("normal video on Window2"); 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->ConfigureRender( 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, 0, 0.0f, 0.0f, 1.0f, 1.0f)); 2135dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("Mirroring Local Preview (Window1) Left-Right"); 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->MirrorRenderStream( 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, true, false, true)); 2195dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nMirroring Local Preview (Window1) Left-Right and Up-Down"); 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->MirrorRenderStream( 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, true, true, true)); 2245dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nMirroring Remote Window(Window2) Up-Down"); 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->MirrorRenderStream( 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, true, true, false)); 2295dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("Disabling Mirroing on Window1 and Window2"); 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->MirrorRenderStream( 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, false, false, false)); 2345dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->MirrorRenderStream( 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, false, false, false)); 2375dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nEnabling Full Screen render in 5 sec"); 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm1)); 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbChannel.videoChannel)); 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm2)); 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Destroy render module and create new in full screen mode 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoRender::DestroyVideoRender(_vrm1); 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = NULL; 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = webrtc::VideoRender::CreateVideoRender( 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 4563, _window1, true, _renderType); 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(_vrm1 != NULL); 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm1)); 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, _window1, 0, 0.0f, 0.0f, 1.0f, 1.0f)); 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 2575dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nStop renderer"); 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StopRender(tbCapture.captureId)); 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nRemove renderer"); 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm1)); 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Destroy full screen render module and create new for external rendering 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoRender::DestroyVideoRender(_vrm1); 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = NULL; 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = webrtc::VideoRender::CreateVideoRender(4564, NULL, false, 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _renderType); 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(_vrm1 != NULL); 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RegisterVideoRenderModule(*_vrm1)); 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("\nExternal Render Test"); 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViEAutoTestExternalRenderer externalRenderObj; 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, webrtc::kVideoI420, &externalRenderObj)); 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 2805dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org AutoTestSleep(kAutoTestSleepTimeMs); 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StopRender(tbCapture.captureId)); 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->DeRegisterVideoRenderModule(*_vrm1)); 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Destroy render module for external rendering and create new in normal 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // mode 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoRender::DestroyVideoRender(_vrm1); 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = NULL; 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _vrm1 = webrtc::VideoRender::CreateVideoRender( 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 4561, _window1, false, _renderType); 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_TRUE(_vrm1 != NULL); 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.Disconnect(tbChannel.videoChannel); 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid ViEAutoTest::ViERenderAPITest() { 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbInterfaces ViE("ViERenderAPITest"); 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8); 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org TbCaptureDevice tbCapture(ViE); 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.ConnectTo(tbChannel.videoChannel); 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.StartReceive(); 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.StartSend(); 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbCapture.captureId, _window1, 0, 0.0, 0.0, 1.0, 1.0)); 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbCapture.captureId)); 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->AddRenderer( 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tbChannel.videoChannel, _window2, 1, 0.0, 0.0, 1.0, 1.0)); 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StartRender(tbChannel.videoChannel)); 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Test setting HW render delay. 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Already started. 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, ViE.render->SetExpectedRenderDelay(tbChannel.videoChannel, 50)); 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->StopRender(tbChannel.videoChannel)); 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Invalid values. 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, ViE.render->SetExpectedRenderDelay(tbChannel.videoChannel, 9)); 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(-1, ViE.render->SetExpectedRenderDelay(tbChannel.videoChannel, 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 501)); 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Valid values. 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->SetExpectedRenderDelay(tbChannel.videoChannel, 11)); 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(0, ViE.render->SetExpectedRenderDelay(tbChannel.videoChannel, 499)); 323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 324