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