2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <dali-toolkit/dali-toolkit.h>
22 #include <dali-toolkit/public-api/controls/video-view/video-view.h>
23 #include <dali-toolkit/devel-api/controls/video-view/video-view-devel.h>
26 using namespace Dali::Toolkit;
30 const char* const TEST_FILE( "test.mp4" );
31 const char* const VOLUME_LEFT( "volumeLeft" );
32 const char* const VOLUME_RIGHT( "volumeRight" );
33 const char* const RENDERING_TYPE( "renderingTarget" );
35 const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
36 attribute mediump vec2 aPosition;\n
37 varying mediump vec2 vTexCoord;\n
38 uniform mediump mat4 uMvpMatrix;\n
39 uniform mediump vec3 uSize;\n
43 mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
44 vertexPosition.xyz *= uSize;\n
45 vertexPosition = uMvpMatrix * vertexPosition;\n
47 vTexCoord = aPosition + vec2(0.5);\n
48 gl_Position = vertexPosition;\n
52 const char* fragmentShaderPrefix( "#extension GL_OES_EGL_image_external:require\n" );
53 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
54 varying mediump vec2 vTexCoord;\n
55 uniform samplerExternalOES sTexture;\n
56 uniform lowp vec4 uColor;\n
60 gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
66 void video_view_startup(void)
68 test_return_value = TET_UNDEF;
71 void video_view_cleanup(void)
73 test_return_value = TET_PASS;
76 // Negative test case for a method
77 int UtcDaliVideoViewUninitialized(void)
79 ToolkitTestApplication application;
80 tet_infoline(" UtcDaliVideoViewUninitialized");
82 Toolkit::VideoView view;
86 // New() must be called to create a VideoView or it wont be valid.
87 Actor a = Actor::New();
89 DALI_TEST_CHECK( false );
91 catch (Dali::DaliException& e)
93 // Tests that a negative test of an assertion succeeds
94 DALI_TEST_PRINT_ASSERT( e );
95 DALI_TEST_CHECK(!view);
100 // Positive test case for a method
101 int UtcDaliVideoViewNew(void)
103 ToolkitTestApplication application;
104 tet_infoline(" UtcDaliVideoViewNew");
106 Toolkit::VideoView view = Toolkit::VideoView::New();
107 DALI_TEST_CHECK( view );
109 Toolkit::VideoView view2 = Toolkit::VideoView::New( "" );
110 DALI_TEST_CHECK( view2 );
114 // Positive test case for a method
115 int UtcDaliVideoViewDownCast(void)
117 ToolkitTestApplication application;
118 tet_infoline(" UtcDaliVideoViewDownCast");
120 Toolkit::VideoView view = Toolkit::VideoView::New();
121 BaseHandle handle(view);
123 Toolkit::VideoView view2 = Toolkit::VideoView::DownCast( handle );
124 DALI_TEST_CHECK( view );
125 DALI_TEST_CHECK( view2 );
126 DALI_TEST_CHECK( view == view2 );
130 // Positive test case for a method
131 int UtcDaliVideoViewProperty1(void)
133 ToolkitTestApplication application;
134 tet_infoline(" UtcDaliVideoViewProperty1");
136 Toolkit::VideoView view = Toolkit::VideoView::New();
137 DALI_TEST_CHECK( view );
140 view.SetProperty( VideoView::Property::VIDEO, TEST_FILE );
141 Property::Value val = view.GetProperty( VideoView::Property::VIDEO );
142 DALI_TEST_CHECK( val.Get( file ) );
143 DALI_TEST_CHECK( file == TEST_FILE );
147 // Positive test case for a method
148 int UtcDaliVideoViewProperty1b(void)
150 ToolkitTestApplication application;
151 tet_infoline(" UtcDaliVideoViewProperty1");
153 Toolkit::VideoView view = Toolkit::VideoView::New();
154 DALI_TEST_CHECK( view );
155 Stage stage = Stage::GetCurrent();
160 view.SetProperty( VideoView::Property::VIDEO, Property::Map()
161 .Add("rendererType", "IMAGE")
162 .Add("url", "video.mpg") // Note, videoView doesn't use this url
163 .Add("RENDERING_TARGET", "windowSurfaceTarget" )
165 .Add("height", 100) );
169 Property::Value val = view.GetProperty( VideoView::Property::VIDEO );
170 Property::Map* resultMap = val.GetMap();
172 DALI_TEST_CHECK( resultMap );
173 Property::Value* value = resultMap->Find("url");
174 DALI_TEST_CHECK( value );
175 DALI_TEST_EQUALS( value->Get<std::string>(), "video.mpg", TEST_LOCATION );
177 stage.Remove( view );
182 int UtcDaliVideoViewProperty2(void)
184 ToolkitTestApplication application;
185 tet_infoline(" UtcDaliVideoViewProperty2");
187 Toolkit::VideoView view = Toolkit::VideoView::New();
188 DALI_TEST_CHECK( view );
191 Property::Value val = view.GetProperty( VideoView::Property::LOOPING );
192 DALI_TEST_CHECK( val.Get( looping ) );
193 DALI_TEST_CHECK( !looping );
195 view.SetProperty( VideoView::Property::LOOPING, true );
196 val = view.GetProperty( VideoView::Property::LOOPING );
197 DALI_TEST_CHECK( val.Get( looping ) );
198 DALI_TEST_CHECK( looping );
202 int UtcDaliVideoViewProperty3(void)
204 ToolkitTestApplication application;
205 tet_infoline(" UtcDaliVideoViewProperty3");
207 Toolkit::VideoView view = Toolkit::VideoView::New();
208 DALI_TEST_CHECK( view );
211 Property::Value val = view.GetProperty( VideoView::Property::MUTED );
212 DALI_TEST_CHECK( val.Get( muted ) );
213 DALI_TEST_CHECK( !muted );
215 view.SetProperty( VideoView::Property::MUTED, true );
216 val = view.GetProperty( VideoView::Property::MUTED );
217 DALI_TEST_CHECK( val.Get( muted ) );
218 DALI_TEST_CHECK( muted );
223 int UtcDaliVideoViewProperty4(void)
225 ToolkitTestApplication application;
226 tet_infoline(" UtcDaliVideoViewProperty4");
228 Toolkit::VideoView view = Toolkit::VideoView::New();
229 DALI_TEST_CHECK( view );
235 map.Insert( VOLUME_LEFT, 0.5f );
236 map.Insert( VOLUME_RIGHT, 0.5f );
238 view.SetProperty( VideoView::Property::VOLUME, map );
239 Property::Value val = view.GetProperty( VideoView::Property::VOLUME );
242 DALI_TEST_CHECK( val.Get( map2 ) );
244 Property::Value* volumeLeft = map2.Find( VOLUME_LEFT );
245 Property::Value* volumeRight = map2.Find( VOLUME_RIGHT );
247 DALI_TEST_CHECK( volumeLeft && volumeLeft->Get( left ) );
248 DALI_TEST_CHECK( volumeRight && volumeRight->Get( right ) );
249 DALI_TEST_CHECK( left == 0.5f );
250 DALI_TEST_CHECK( right == 0.5f );
255 int UtcDaliVideoViewCopyAndAssignment(void)
257 ToolkitTestApplication application;
259 VideoView view = Toolkit::VideoView::New();
260 DALI_TEST_CHECK( view );
262 VideoView copy( view );
263 DALI_TEST_CHECK( view == copy );
266 DALI_TEST_CHECK( !assign );
269 DALI_TEST_CHECK( assign == view );
274 int UtcDaliVideoViewTypeRegistry(void)
276 ToolkitTestApplication application;
278 TypeRegistry typeRegistry = TypeRegistry::Get();
279 DALI_TEST_CHECK( typeRegistry );
281 TypeInfo typeInfo = typeRegistry.GetTypeInfo( "VideoView" );
282 DALI_TEST_CHECK( typeInfo );
284 BaseHandle handle = typeInfo.CreateInstance();
285 DALI_TEST_CHECK( handle );
287 VideoView view = VideoView::DownCast( handle );
288 DALI_TEST_CHECK( view );
293 int UtcDaliVideoViewMethodsForCoverage(void)
295 ToolkitTestApplication application;
297 VideoView videoView = VideoView::New();
298 DALI_TEST_CHECK( videoView );
303 videoView.Forward(10);
304 videoView.Backward(10);
306 Toolkit::DevelVideoView::GetMediaPlayer( videoView );
308 VideoView::VideoViewSignalType& signal = videoView.FinishedSignal();
309 DALI_TEST_EQUALS( 0, signal.GetConnectionCount(), TEST_LOCATION );
314 int UtcDaliVideoViewMethodsForRenderType(void)
316 ToolkitTestApplication application;
317 VideoView videoView = VideoView::New();
318 DALI_TEST_CHECK( videoView );
320 Property::Map windowSurfaceTarget;
321 Property::Map nativeImageTarget;
323 windowSurfaceTarget.Insert( RENDERING_TYPE, "windowSurfaceTarget" );
324 nativeImageTarget.Insert( RENDERING_TYPE, "nativeImageTarget" );
327 Property::Value value;
328 videoView.SetProperty( VideoView::Property::VIDEO, windowSurfaceTarget );
330 value = videoView.GetProperty( VideoView::Property::VIDEO );
331 DALI_TEST_CHECK( value.Get( map ) );
333 Property::Value* type = map.Find( RENDERING_TYPE );
334 DALI_TEST_CHECK( type );
335 DALI_TEST_EQUALS( "windowSurfaceTarget", type->Get<std::string>(), TEST_LOCATION );
337 videoView.SetProperty( VideoView::Property::VIDEO, nativeImageTarget );
339 value = videoView.GetProperty( VideoView::Property::VIDEO );
340 DALI_TEST_CHECK( value.Get( map ) );
341 type = map.Find( RENDERING_TYPE );
343 DALI_TEST_CHECK( type );
344 DALI_TEST_EQUALS( "nativeImageTarget", type->Get<std::string>(), TEST_LOCATION );
349 int UtcDaliVideoViewCustomShaderForCoverage(void)
351 ToolkitTestApplication application;
352 VideoView videoView = VideoView::New();
353 DALI_TEST_CHECK( videoView );
355 ToolkitApplication::DECODED_IMAGES_SUPPORTED = true;
357 videoView.SetProperty( Toolkit::VideoView::Property::UNDERLAY, false );
358 bool isUnderlay = videoView.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
359 DALI_TEST_CHECK( !isUnderlay );
361 Stage::GetCurrent().Add( videoView );
362 videoView.SetProperty( VideoView::Property::VIDEO, "testvideo" );
364 Property::Map customShader;
365 customShader.Insert( "vertexShader", VERTEX_SHADER );
366 customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
369 map.Insert( "shader", customShader );
371 videoView.SetProperty( VideoView::Property::VIDEO, map );
374 Property::Value value = videoView.GetProperty( VideoView::Property::VIDEO );
376 DALI_TEST_CHECK( !value.Get( map2 ) );
380 int UtcDaliVideoViewMethodsForCoverage2(void)
382 ToolkitTestApplication application;
383 VideoView videoView = VideoView::New();
384 DALI_TEST_CHECK( videoView );
386 Property::Map windowSurfaceTarget;
388 windowSurfaceTarget.Insert( RENDERING_TYPE, "windowSurfaceTarget" );
390 Stage::GetCurrent().Add( videoView );
392 application.SendNotification();
393 application.Render();
396 Property::Value value;
397 videoView.SetProperty( VideoView::Property::VIDEO, windowSurfaceTarget );
399 value = videoView.GetProperty( VideoView::Property::VIDEO );
400 DALI_TEST_CHECK( value.Get( map ) );
402 Property::Value* type = map.Find( RENDERING_TYPE );
403 DALI_TEST_CHECK( type );
404 DALI_TEST_EQUALS( "windowSurfaceTarget", type->Get<std::string>(), TEST_LOCATION );
406 Vector3 vector(100.0f, 100.0f, 0.0f);
408 DALI_TEST_CHECK(vector != videoView.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ));
409 videoView.SetProperty( Actor::Property::SIZE, vector );
411 application.SendNotification();
412 application.Render();
414 // Check the size in the new frame
415 DALI_TEST_CHECK(vector == videoView.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ));
420 int UtcDaliVideoViewPropertyUnderlay(void)
422 ToolkitTestApplication application;
423 tet_infoline("UtcDaliVideoViewPropertyUnderlay");
424 ToolkitApplication::DECODED_IMAGES_SUPPORTED = true;
426 VideoView view = VideoView::New();
427 DALI_TEST_CHECK( view );
429 Stage::GetCurrent().Add( view );
432 application.SendNotification();
433 application.Render();
435 bool isUnderlay = view.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
436 DALI_TEST_CHECK( isUnderlay );
439 view.SetProperty( Toolkit::VideoView::Property::UNDERLAY, false );
440 isUnderlay = view.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
441 DALI_TEST_CHECK( !isUnderlay );
444 view.SetProperty( Toolkit::VideoView::Property::UNDERLAY, true );
445 isUnderlay = view.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
446 DALI_TEST_CHECK( isUnderlay );
448 // If platform api doesn't provide any API or feature for decoded images of video,
449 // UNDERLAY should be true
450 ToolkitApplication::DECODED_IMAGES_SUPPORTED = false;
452 view.SetProperty( Toolkit::VideoView::Property::UNDERLAY, false );
453 isUnderlay = view.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
454 DALI_TEST_CHECK( isUnderlay );
457 ToolkitApplication::DECODED_IMAGES_SUPPORTED = true;
459 view.SetProperty( Toolkit::VideoView::Property::UNDERLAY, true );
460 view.SetProperty( Toolkit::VideoView::Property::UNDERLAY, false );
461 isUnderlay = view.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
462 DALI_TEST_CHECK( !isUnderlay );
469 int UtcDaliVideoViewPropertyPlayPosition(void)
471 ToolkitTestApplication application;
472 tet_infoline("UtcDaliVideoViewPropertyPlayPosition");
474 VideoView view = VideoView::New();
475 DALI_TEST_CHECK( view );
477 Stage::GetCurrent().Add( view );
480 application.SendNotification();
481 application.Render();
483 int playPos = view.GetProperty( Toolkit::VideoView::Property::PLAY_POSITION ).Get< int >();
484 DALI_TEST_CHECK( playPos == 0 );
486 view.SetProperty( Toolkit::VideoView::Property::PLAY_POSITION, 10 );
487 playPos = view.GetProperty( Toolkit::VideoView::Property::PLAY_POSITION ).Get< int >();
488 // Actually setting play position will be async
489 // Actual platform result may be different.
490 DALI_TEST_CHECK( playPos == 10 );
496 int UtcDaliVideoViewNew2(void)
498 ToolkitTestApplication application;
499 tet_infoline("UtcDaliVideoViewNew2");
501 VideoView view = VideoView::New( true );
502 DALI_TEST_CHECK( view );
504 Stage::GetCurrent().Add( view );
507 application.SendNotification();
508 application.Render();
510 VideoView view2 = VideoView::New( "", false );
511 DALI_TEST_CHECK( view2 );
513 Stage::GetCurrent().Add( view2 );
516 application.SendNotification();
517 application.Render();
522 int UtcDaliVideoViewPropertyDisplayMode(void)
524 ToolkitTestApplication application;
525 tet_infoline("UtcDaliVideoViewPropertyDisplayMode");
527 VideoView view = VideoView::New();
528 DALI_TEST_CHECK( view );
530 Stage::GetCurrent().Add( view );
533 application.SendNotification();
534 application.Render();
536 view.SetProperty( Toolkit::VideoView::Property::DISPLAY_MODE, Toolkit::VideoView::DisplayMode::DST_ROI );
537 int displayMode = view.GetProperty( Toolkit::VideoView::Property::DISPLAY_MODE ).Get< int >();
538 DALI_TEST_CHECK( displayMode == Toolkit::VideoView::DisplayMode::DST_ROI );
544 int UtcDaliVideoViewCustomShader(void)
546 ToolkitTestApplication application;
547 tet_infoline( "VideoView with custom shader" );
549 VideoView view = VideoView::New();
550 DALI_TEST_CHECK( view );
552 ToolkitApplication::DECODED_IMAGES_SUPPORTED = true;
554 view.SetProperty( Toolkit::VideoView::Property::UNDERLAY, false );
555 bool isUnderlay = view.GetProperty( Toolkit::VideoView::Property::UNDERLAY ).Get< bool >();
556 DALI_TEST_CHECK( !isUnderlay );
558 Stage::GetCurrent().Add( view );
559 view.SetProperty( VideoView::Property::VIDEO, "testvideo" );
561 /* insert custom shader */
562 Property::Map customShader;
563 std::string fragmentShaderString;
564 fragmentShaderString.reserve( strlen( fragmentShaderPrefix ) + strlen( FRAGMENT_SHADER ) );
565 fragmentShaderString.append( fragmentShaderPrefix );
566 fragmentShaderString.append( FRAGMENT_SHADER );
567 customShader.Insert( "vertexShader", VERTEX_SHADER );
568 customShader.Insert( "fragmentShader", fragmentShaderString );
571 map.Insert( "shader", customShader );
573 view.SetProperty( VideoView::Property::VIDEO, map );
575 /* do render for check custom shader */
576 Stage::GetCurrent().Add( view );
579 application.SendNotification();
580 application.Render();
583 DALI_TEST_CHECK( view.GetRendererCount() == 1u );
584 Renderer renderer = view.GetRendererAt( 0 );
585 Shader shader = renderer.GetShader();
586 DALI_TEST_CHECK( shader );
588 Property::Value value = shader.GetProperty(Shader::Property::PROGRAM);
589 Property::Map* shaderMap = value.GetMap();
590 DALI_TEST_CHECK( shaderMap );
592 Property::Value* fragment = shaderMap->Find( "fragment" ); // fragment key name from shader-impl.cpp
593 DALI_TEST_EQUALS( fragmentShaderString, fragment->Get<std::string>(), TEST_LOCATION );
595 Property::Value* vertex = shaderMap->Find( "vertex" ); // vertex key name from shader-impl.cpp
596 DALI_TEST_EQUALS( VERTEX_SHADER, vertex->Get<std::string>(), TEST_LOCATION );