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 // 12 // vie_autotest_image_process.cc 13 // 14 15 // Settings 16 #include "webrtc/engine_configurations.h" 17 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h" 18 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h" 19 20 #include "webrtc/video_engine/test/libvietest/include/tb_capture_device.h" 21 #include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h" 22 #include "webrtc/video_engine/test/libvietest/include/tb_video_channel.h" 23 24 class MyEffectFilter: public webrtc::ViEEffectFilter 25 { 26 public: 27 MyEffectFilter() {} 28 29 ~MyEffectFilter() {} 30 31 virtual int Transform(int size, 32 unsigned char* frame_buffer, 33 int64_t ntp_time_ms, 34 unsigned int timestamp, 35 unsigned int width, 36 unsigned int height) 37 { 38 // Black and white 39 memset(frame_buffer + (2 * size) / 3, 0x7f, size / 3); 40 return 0; 41 } 42 }; 43 44 void ViEAutoTest::ViEImageProcessStandardTest() 45 { 46 //*************************************************************** 47 // Begin create/initialize WebRTC Video Engine for testing 48 //*************************************************************** 49 int rtpPort = 6000; 50 // Create VIE 51 TbInterfaces ViE("ViEImageProcessAPITest"); 52 // Create a video channel 53 TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8); 54 // Create a capture device 55 TbCaptureDevice tbCapture(ViE); 56 57 tbCapture.ConnectTo(tbChannel.videoChannel); 58 tbChannel.StartReceive(rtpPort); 59 tbChannel.StartSend(rtpPort); 60 61 MyEffectFilter effectFilter; 62 63 RenderCaptureDeviceAndOutputStream(&ViE, &tbChannel, &tbCapture); 64 65 ViETest::Log("Capture device is renderered in Window 1"); 66 ViETest::Log("Remote stream is renderered in Window 2"); 67 AutoTestSleep(kAutoTestSleepTimeMs); 68 69 //*************************************************************** 70 // Engine ready. Begin testing class 71 //*************************************************************** 72 73 74 EXPECT_EQ(0, ViE.image_process->RegisterCaptureEffectFilter( 75 tbCapture.captureId, effectFilter)); 76 77 ViETest::Log("Black and white filter registered for capture device, " 78 "affects both windows"); 79 AutoTestSleep(kAutoTestSleepTimeMs); 80 81 EXPECT_EQ(0, ViE.image_process->DeregisterCaptureEffectFilter( 82 tbCapture.captureId)); 83 84 EXPECT_EQ(0, ViE.image_process->RegisterRenderEffectFilter( 85 tbChannel.videoChannel, effectFilter)); 86 87 ViETest::Log("Remove capture effect filter, adding filter for incoming " 88 "stream"); 89 ViETest::Log("Only Window 2 should be black and white"); 90 AutoTestSleep(kAutoTestSleepTimeMs); 91 92 EXPECT_EQ(0, ViE.render->StopRender(tbCapture.captureId)); 93 EXPECT_EQ(0, ViE.render->RemoveRenderer(tbCapture.captureId)); 94 95 int rtpPort2 = rtpPort + 100; 96 // Create a video channel 97 TbVideoChannel tbChannel2(ViE, webrtc::kVideoCodecVP8); 98 99 tbCapture.ConnectTo(tbChannel2.videoChannel); 100 tbChannel2.StartReceive(rtpPort2); 101 tbChannel2.StartSend(rtpPort2); 102 103 EXPECT_EQ(0, ViE.render->AddRenderer( 104 tbChannel2.videoChannel, _window1, 1, 0.0, 0.0, 1.0, 1.0)); 105 EXPECT_EQ(0, ViE.render->StartRender(tbChannel2.videoChannel)); 106 EXPECT_EQ(0, ViE.image_process->DeregisterRenderEffectFilter( 107 tbChannel.videoChannel)); 108 109 ViETest::Log("Local renderer removed, added new channel and rendering in " 110 "Window1."); 111 112 EXPECT_EQ(0, ViE.image_process->RegisterCaptureEffectFilter( 113 tbCapture.captureId, effectFilter)); 114 115 ViETest::Log("Black and white filter registered for capture device, " 116 "affects both windows"); 117 AutoTestSleep(kAutoTestSleepTimeMs); 118 119 EXPECT_EQ(0, ViE.image_process->DeregisterCaptureEffectFilter( 120 tbCapture.captureId)); 121 122 EXPECT_EQ(0, ViE.image_process->RegisterSendEffectFilter( 123 tbChannel.videoChannel, effectFilter)); 124 125 ViETest::Log("Capture filter removed."); 126 ViETest::Log("Black and white filter registered for one channel, Window2 " 127 "should be black and white"); 128 AutoTestSleep(kAutoTestSleepTimeMs); 129 130 EXPECT_EQ(0, ViE.image_process->DeregisterSendEffectFilter( 131 tbChannel.videoChannel)); 132 133 //*************************************************************** 134 // Testing finished. Tear down Video Engine 135 //*************************************************************** 136 } 137 138 void ViEAutoTest::ViEImageProcessExtendedTest() 139 { 140 } 141 142 void ViEAutoTest::ViEImageProcessAPITest() 143 { 144 TbInterfaces ViE("ViEImageProcessAPITest"); 145 TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8); 146 TbCaptureDevice tbCapture(ViE); 147 148 tbCapture.ConnectTo(tbChannel.videoChannel); 149 150 MyEffectFilter effectFilter; 151 152 // 153 // Capture effect filter 154 // 155 // Add effect filter 156 EXPECT_EQ(0, ViE.image_process->RegisterCaptureEffectFilter( 157 tbCapture.captureId, effectFilter)); 158 // Add again -> error 159 EXPECT_NE(0, ViE.image_process->RegisterCaptureEffectFilter( 160 tbCapture.captureId, effectFilter)); 161 EXPECT_EQ(0, ViE.image_process->DeregisterCaptureEffectFilter( 162 tbCapture.captureId)); 163 EXPECT_EQ(0, ViE.image_process->DeregisterCaptureEffectFilter( 164 tbCapture.captureId)); 165 166 // Non-existing capture device 167 EXPECT_NE(0, ViE.image_process->RegisterCaptureEffectFilter( 168 tbChannel.videoChannel, effectFilter)); 169 170 // 171 // Render effect filter 172 // 173 EXPECT_EQ(0, ViE.image_process->RegisterRenderEffectFilter( 174 tbChannel.videoChannel, effectFilter)); 175 EXPECT_NE(0, ViE.image_process->RegisterRenderEffectFilter( 176 tbChannel.videoChannel, effectFilter)); 177 EXPECT_EQ(0, ViE.image_process->DeregisterRenderEffectFilter( 178 tbChannel.videoChannel)); 179 EXPECT_EQ(0, ViE.image_process->DeregisterRenderEffectFilter( 180 tbChannel.videoChannel)); 181 182 // Non-existing channel id 183 EXPECT_NE(0, ViE.image_process->RegisterRenderEffectFilter( 184 tbCapture.captureId, effectFilter)); 185 186 // 187 // Send effect filter 188 // 189 EXPECT_EQ(0, ViE.image_process->RegisterSendEffectFilter( 190 tbChannel.videoChannel, effectFilter)); 191 EXPECT_NE(0, ViE.image_process->RegisterSendEffectFilter( 192 tbChannel.videoChannel, effectFilter)); 193 EXPECT_EQ(0, ViE.image_process->DeregisterSendEffectFilter( 194 tbChannel.videoChannel)); 195 EXPECT_EQ(0, ViE.image_process->DeregisterSendEffectFilter( 196 tbChannel.videoChannel)); 197 EXPECT_NE(0, ViE.image_process->RegisterSendEffectFilter( 198 tbCapture.captureId, effectFilter)); 199 200 // 201 // Deflickering 202 // 203 EXPECT_EQ(0, ViE.image_process->EnableDeflickering( 204 tbCapture.captureId, true)); 205 EXPECT_NE(0, ViE.image_process->EnableDeflickering( 206 tbCapture.captureId, true)); 207 EXPECT_EQ(0, ViE.image_process->EnableDeflickering( 208 tbCapture.captureId, false)); 209 EXPECT_NE(0, ViE.image_process->EnableDeflickering( 210 tbCapture.captureId, false)); 211 EXPECT_NE(0, ViE.image_process->EnableDeflickering( 212 tbChannel.videoChannel, true)); 213 214 // 215 // Color enhancement 216 // 217 EXPECT_EQ(0, ViE.image_process->EnableColorEnhancement( 218 tbChannel.videoChannel, false)); 219 EXPECT_EQ(0, ViE.image_process->EnableColorEnhancement( 220 tbChannel.videoChannel, true)); 221 EXPECT_EQ(0, ViE.image_process->EnableColorEnhancement( 222 tbChannel.videoChannel, false)); 223 EXPECT_NE(0, ViE.image_process->EnableColorEnhancement( 224 tbCapture.captureId, true)); 225 } 226