Post FinishedSignal to UIThead
[platform/core/uifw/dali-extension.git] / dali-extension / video-player / ecore-wl2 / tizen-video-player-ecore-wl2.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <tizen-video-player.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/devel-api/common/stage.h>
23 #include <dali/devel-api/threading/mutex.h>
24 #include <dali/integration-api/debug.h>
25 #include <system_info.h>
26
27 // INTERNAL INCLUDES
28
29 // The plugin factories
30 extern "C" DALI_EXPORT_API Dali::VideoPlayerPlugin* CreateVideoPlayerPlugin(Dali::Actor actor, Dali::VideoSyncMode syncMode)
31 {
32   return new Dali::Plugin::TizenVideoPlayer(actor, syncMode);
33 }
34
35 extern "C" DALI_EXPORT_API void DestroyVideoPlayerPlugin(Dali::VideoPlayerPlugin* plugin)
36 {
37   if(plugin != NULL)
38   {
39     delete plugin;
40   }
41 }
42
43 namespace Dali
44 {
45 namespace Plugin
46 {
47 namespace
48 {
49 const int TIMER_INTERVAL(20);
50
51 static void MediaPacketVideoDecodedCb(media_packet_h packet, void* user_data)
52 {
53   TizenVideoPlayer* player = static_cast<TizenVideoPlayer*>(user_data);
54
55   if(player == NULL)
56   {
57     DALI_LOG_ERROR("Decoded callback got Null pointer as user_data.\n");
58     return;
59   }
60
61   player->PushPacket(packet);
62 }
63
64 static GMainContext* GetTizenGlibContext()
65 {
66   static GMainContext* context = nullptr;
67
68   if(!context)
69   {
70     const char* env = getenv("TIZEN_GLIB_CONTEXT");
71     if(env)
72     {
73       context = (GMainContext*)strtoul(env, nullptr, 10);
74     }
75   }
76
77   return context;
78 }
79
80 static void EmitPlaybackFinishedSignal(void* user_data)
81 {
82   TizenVideoPlayer* player = static_cast<TizenVideoPlayer*>(user_data);
83
84   if(player == NULL)
85   {
86     DALI_LOG_ERROR("Decoded callback got Null pointer as user_data.\n");
87     return;
88   }
89
90   if(!player->mFinishedSignal.Empty())
91   {
92     DALI_LOG_ERROR("EmitPlaybackFinishedSignal.\n");
93
94     // This function is invoked on the main thread from MMFW.
95     // So the FinishedSignal has to be posted to UIThread when UIThread is enabled.
96     // If not, it causes an assertion in the timer.
97     // The timer has to run on the same thread as the adaptor's
98     GMainContext* context = GetTizenGlibContext();
99     if(context)
100     {
101       GSource* source = g_idle_source_new();
102       g_source_set_callback(
103         source,
104         [](gpointer userData) -> gboolean
105         {
106           auto* player = static_cast<TizenVideoPlayer*>(userData);
107           player->mFinishedSignal.Emit();
108           player->Stop();
109           return G_SOURCE_REMOVE;
110         },
111         player,
112         nullptr);
113       g_source_attach(source, context);
114       g_source_unref(source);
115     }
116     else
117     {
118       player->mFinishedSignal.Emit();
119       player->Stop();
120     }
121   }
122 }
123
124 // ToDo: VD player_set_play_position() doesn't work when callback pointer is NULL.
125 // We should check whether this callback is needed in platform.
126 static void PlayerSeekCompletedCb(void* data)
127 {
128 }
129
130 int LogPlayerError(int error)
131 {
132   int ret = 0;
133   if(error != PLAYER_ERROR_NONE)
134   {
135     ret = error;
136     switch(error)
137     {
138       case PLAYER_ERROR_OUT_OF_MEMORY:
139       {
140         DALI_LOG_ERROR("Player error: Out of memory\n");
141       }
142       break;
143       case PLAYER_ERROR_INVALID_PARAMETER:
144       {
145         DALI_LOG_ERROR("Player error: Invalid parameter\n");
146       }
147       break;
148       case PLAYER_ERROR_NO_SUCH_FILE:
149       {
150         DALI_LOG_ERROR("Player error: No such file\n");
151       }
152       break;
153       case PLAYER_ERROR_INVALID_OPERATION:
154       {
155         DALI_LOG_ERROR("Player error: Invalid operation\n");
156       }
157       break;
158       case PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE:
159       {
160         DALI_LOG_ERROR("Player error: No space on device\n");
161       }
162       break;
163       case PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE:
164       {
165         DALI_LOG_ERROR("Player error: Not supported feature on device\n");
166       }
167       break;
168       case PLAYER_ERROR_SEEK_FAILED:
169       {
170         DALI_LOG_ERROR("Player error: Seek failed\n");
171       }
172       break;
173       case PLAYER_ERROR_INVALID_STATE:
174       {
175         DALI_LOG_ERROR("Player error: Invalid state\n");
176       }
177       break;
178       case PLAYER_ERROR_NOT_SUPPORTED_FILE:
179       {
180         DALI_LOG_ERROR("Player error: Not supported file\n");
181       }
182       break;
183       case PLAYER_ERROR_INVALID_URI:
184       {
185         DALI_LOG_ERROR("Player error: Invalid uri\n");
186       }
187       break;
188       case PLAYER_ERROR_SOUND_POLICY:
189       {
190         DALI_LOG_ERROR("Player error: Sound policy\n");
191       }
192       break;
193       case PLAYER_ERROR_CONNECTION_FAILED:
194       {
195         DALI_LOG_ERROR("Player error: Connection failed\n");
196       }
197       break;
198       case PLAYER_ERROR_VIDEO_CAPTURE_FAILED:
199       {
200         DALI_LOG_ERROR("Player error: Video capture failed\n");
201       }
202       break;
203       case PLAYER_ERROR_DRM_EXPIRED:
204       {
205         DALI_LOG_ERROR("Player error: DRM expired\n");
206       }
207       break;
208       case PLAYER_ERROR_DRM_NO_LICENSE:
209       {
210         DALI_LOG_ERROR("Player error: No license\n");
211       }
212       break;
213       case PLAYER_ERROR_DRM_FUTURE_USE:
214       {
215         DALI_LOG_ERROR("Player error: License for future use\n");
216       }
217       break;
218       case PLAYER_ERROR_DRM_NOT_PERMITTED:
219       {
220         DALI_LOG_ERROR("Player error: Format not permitted\n");
221       }
222       break;
223       case PLAYER_ERROR_RESOURCE_LIMIT:
224       {
225         DALI_LOG_ERROR("Player error: Resource limit\n");
226       }
227       break;
228       case PLAYER_ERROR_PERMISSION_DENIED:
229       {
230         DALI_LOG_ERROR("Player error: Permission denied\n");
231       }
232       break;
233       case PLAYER_ERROR_SERVICE_DISCONNECTED:
234       {
235         DALI_LOG_ERROR("Player error: Service disconnected\n");
236       }
237       break;
238       case PLAYER_ERROR_BUFFER_SPACE:
239       {
240         DALI_LOG_ERROR("Player error: Buffer space\n");
241       }
242       break;
243       case PLAYER_ERROR_NOT_SUPPORTED_VIDEO_CODEC:
244       {
245         DALI_LOG_ERROR("Player error: The target should not support the codec type\n");
246       }
247       break;
248       default:
249       {
250         DALI_LOG_ERROR("Player error: Unknown error code ( %d ) \n", error);
251       }
252       break;
253     }
254   }
255   return ret;
256 }
257
258 const char* const VIDEO_PLAYER_SIZE_NAME("videoPlayerSize");
259
260 struct VideoPlayerSyncConstraint
261 {
262 public:
263   VideoPlayerSyncConstraint(Ecore_Wl2_Subsurface* ecoreSubVideoWindow, int screenWidth, int screenHeight)
264   {
265     mEcoreSubVideoWindow = ecoreSubVideoWindow;
266     mHalfScreenWidth     = static_cast<float>(screenWidth) / 2;
267     mHalfScreenHeight    = static_cast<float>(screenHeight) / 2;
268   }
269
270   void operator()(Vector3& current, const PropertyInputContainer& inputs)
271   {
272     const Vector3& size          = inputs[0]->GetVector3();
273     const Vector3& worldScale    = inputs[1]->GetVector3();
274     const Vector3& worldPosition = inputs[2]->GetVector3();
275
276     Vector3 actorSize = size * worldScale;
277     Vector2 screenPosition(mHalfScreenWidth + worldPosition.x, mHalfScreenHeight + worldPosition.y);
278
279     DisplayArea area;
280     area.x      = screenPosition.x - actorSize.x / 2;
281     area.y      = screenPosition.y - actorSize.y / 2;
282     area.width  = actorSize.x;
283     area.height = actorSize.y;
284
285     if(mEcoreSubVideoWindow)
286     {
287       ecore_wl2_subsurface_video_surface_destination_set(mEcoreSubVideoWindow, area.x, area.y, area.width, area.height);
288     }
289   }
290
291 private:
292   Ecore_Wl2_Subsurface* mEcoreSubVideoWindow;
293   float                 mHalfScreenWidth;
294   float                 mHalfScreenHeight;
295 };
296
297 /**
298  * @brief Whether set play positoin accurately or not.
299  *  If true, we set play position to the nearest frame position. but this might be considerably slow, accurately.
300  *  If false, we set play position to the nearest key frame position. this might be faster but less accurate.
301  * see player_set_play_position()
302  */
303 constexpr bool ACCURATE_PLAY_POSITION_SET = true;
304
305 } // unnamed namespace
306
307 TizenVideoPlayer::TizenVideoPlayer(Dali::Actor actor, Dali::VideoSyncMode syncMode)
308 : mUrl(),
309   mPlayer(NULL),
310   mPlayerState(PLAYER_STATE_NONE),
311   mTbmSurface(NULL),
312   mPacket(NULL),
313   mNativeImageSourcePtr(NULL),
314   mTimer(),
315   mBackgroundColor(Dali::Vector4(1.0f, 1.0f, 1.0f, 0.0f)),
316   mTargetType(NATIVE_IMAGE),
317   mPacketMutex(),
318   mPacketVector(),
319   mStreamInfo(NULL),
320   mStreamType(SOUND_STREAM_TYPE_MEDIA),
321   mCodecType(PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT),
322   mEcoreWlWindow(nullptr),
323   mEcoreSubVideoWindow(nullptr),
324   mSyncActor(actor),
325   mVideoSizePropertyIndex(Property::INVALID_INDEX),
326   mSyncMode(syncMode),
327   mIsInitForSyncMode(false)
328 {
329 }
330
331 TizenVideoPlayer::~TizenVideoPlayer()
332 {
333   DestroyConstraint();
334   if(mEcoreSubVideoWindow)
335   {
336     ecore_wl2_subsurface_del(mEcoreSubVideoWindow);
337     mEcoreSubVideoWindow = nullptr;
338   }
339
340   DestroyPlayer();
341 }
342
343 void TizenVideoPlayer::GetPlayerState(player_state_e* state) const
344 {
345   if(mPlayer != NULL && player_get_state(mPlayer, state) != PLAYER_ERROR_NONE)
346   {
347     DALI_LOG_ERROR("player_get_state error: Invalid parameter\n");
348     *state = PLAYER_STATE_NONE;
349   }
350 }
351
352 void TizenVideoPlayer::SetUrl(const std::string& url)
353 {
354   int ret = 0;
355   if(mUrl != url)
356   {
357     int error = PLAYER_ERROR_NONE;
358
359     mUrl = url;
360
361     GetPlayerState(&mPlayerState);
362
363     if(mPlayerState != PLAYER_STATE_NONE && mPlayerState != PLAYER_STATE_IDLE)
364     {
365       if(mNativeImageSourcePtr)
366       {
367         error = player_unset_media_packet_video_frame_decoded_cb(mPlayer);
368         ret   = LogPlayerError(error);
369         if(ret)
370         {
371           DALI_LOG_ERROR("SetUrl, player_unset_media_packet_video_frame_decoded_cb() is failed\n");
372         }
373       }
374       Stop();
375
376       error = player_unprepare(mPlayer);
377       ret   = LogPlayerError(error);
378       if(ret)
379       {
380         DALI_LOG_ERROR("SetUrl, player_unprepare() is failed\n");
381       }
382
383       if(mNativeImageSourcePtr)
384       {
385         error = player_set_media_packet_video_frame_decoded_cb(mPlayer, MediaPacketVideoDecodedCb, this);
386         ret   = LogPlayerError(error);
387         if(ret)
388         {
389           DALI_LOG_ERROR("SetUrl, player_set_media_packet_video_frame_decoded_cb() is failed\n");
390         }
391       }
392       else
393       {
394         int                width, height;
395         Ecore_Wl2_Display* wl2_display = ecore_wl2_connected_display_get(NULL);
396         ecore_wl2_display_screen_size_get(wl2_display, &width, &height);
397
398         if(mSyncMode == Dali::VideoSyncMode::ENABLED)
399         {
400           if(mIsInitForSyncMode)
401           {
402             InitializeEnableSyncMode(mEcoreWlWindow);
403           }
404           else
405           {
406             if(!ecore_wl2_subsurface_video_surface_destination_set(mEcoreSubVideoWindow, 0, 0, width, height))
407             {
408               DALI_LOG_ERROR("SetUrl, ecore_wl2_subsurface_video_surface_destination_set() is failed\n");
409             }
410           }
411         }
412         else
413         {
414           error = player_set_ecore_wl_display(mPlayer, PLAYER_DISPLAY_TYPE_OVERLAY, mEcoreWlWindow, 0, 0, width, height);
415           ret   = LogPlayerError(error);
416           if(ret)
417           {
418             DALI_LOG_ERROR("SetUrl, player_set_ecore_wl_display() is failed\n");
419           }
420         }
421       }
422       GetPlayerState(&mPlayerState);
423       ret = LogPlayerError(error);
424       if(ret)
425       {
426         DALI_LOG_ERROR("SetUrl, GetPlayerState() is failed\n");
427       }
428     }
429
430     if(mPlayerState == PLAYER_STATE_IDLE)
431     {
432       error = player_set_uri(mPlayer, mUrl.c_str());
433       ret   = LogPlayerError(error);
434       if(ret)
435       {
436         DALI_LOG_ERROR("SetUrl, player_set_uri() is failed\n");
437       }
438
439       error = player_prepare(mPlayer);
440       ret   = LogPlayerError(error);
441       if(ret)
442       {
443         DALI_LOG_ERROR("SetUrl, player_prepare() is failed\n");
444       }
445     }
446   }
447 }
448
449 std::string TizenVideoPlayer::GetUrl()
450 {
451   return mUrl;
452 }
453
454 void TizenVideoPlayer::SetRenderingTarget(Any target)
455 {
456   DestroyPlayer();
457
458   mNativeImageSourcePtr = NULL;
459
460   if(target.GetType() == typeid(Dali::NativeImageSourcePtr))
461   {
462     if(mSyncMode == Dali::VideoSyncMode::ENABLED)
463     {
464       DestroyConstraint();
465     }
466     mTargetType = TizenVideoPlayer::NATIVE_IMAGE;
467
468     Dali::NativeImageSourcePtr nativeImageSourcePtr = AnyCast<Dali::NativeImageSourcePtr>(target);
469
470     InitializeTextureStreamMode(nativeImageSourcePtr);
471   }
472   else if(target.GetType() == typeid(Ecore_Wl2_Window*))
473   {
474     mTargetType = TizenVideoPlayer::WINDOW_SURFACE;
475
476     InitializeUnderlayMode(Dali::AnyCast<Ecore_Wl2_Window*>(target));
477
478     if(mSyncMode == Dali::VideoSyncMode::ENABLED)
479     {
480       CreateConstraint();
481     }
482   }
483   else
484   {
485     DALI_LOG_ERROR("SetRenderingTarget, Video rendering target is unknown\n");
486   }
487 }
488
489 void TizenVideoPlayer::SetLooping(bool looping)
490 {
491   GetPlayerState(&mPlayerState);
492
493   if(mPlayerState != PLAYER_STATE_NONE)
494   {
495     int error = player_set_looping(mPlayer, looping);
496     int ret   = LogPlayerError(error);
497     if(ret)
498     {
499       DALI_LOG_ERROR("SetLooping, player_set_looping() is failed\n");
500     }
501   }
502 }
503
504 bool TizenVideoPlayer::IsLooping()
505 {
506   GetPlayerState(&mPlayerState);
507
508   bool looping = false;
509   if(mPlayerState != PLAYER_STATE_NONE)
510   {
511     int error = player_is_looping(mPlayer, &looping);
512     int ret   = LogPlayerError(error);
513     if(ret)
514     {
515       DALI_LOG_ERROR("IsLooping, player_is_looping() is failed\n");
516     }
517   }
518
519   return looping;
520 }
521
522 void TizenVideoPlayer::Play()
523 {
524   GetPlayerState(&mPlayerState);
525
526   if(mPlayerState == PLAYER_STATE_READY || mPlayerState == PLAYER_STATE_PAUSED)
527   {
528     if(mNativeImageSourcePtr && mTimer)
529     {
530       mTimer.Start();
531     }
532
533     int error = player_start(mPlayer);
534     int ret   = LogPlayerError(error);
535     if(ret)
536     {
537       DALI_LOG_ERROR("Play, player_start() is failed\n");
538     }
539   }
540 }
541
542 void TizenVideoPlayer::Pause()
543 {
544   GetPlayerState(&mPlayerState);
545   int ret = 0;
546   if(mPlayerState == PLAYER_STATE_PLAYING)
547   {
548     int error = player_pause(mPlayer);
549     ret       = LogPlayerError(error);
550     if(ret)
551     {
552       DALI_LOG_ERROR("Pause, player_pause() is failed\n");
553     }
554
555     if(mNativeImageSourcePtr && mTimer)
556     {
557       mTimer.Stop();
558       DestroyPackets();
559     }
560   }
561 }
562
563 void TizenVideoPlayer::Stop()
564 {
565   GetPlayerState(&mPlayerState);
566
567   if(mPlayerState == PLAYER_STATE_PLAYING || mPlayerState == PLAYER_STATE_PAUSED)
568   {
569     int error = player_stop(mPlayer);
570     int ret   = LogPlayerError(error);
571     if(ret)
572     {
573       DALI_LOG_ERROR("Stop, player_stop() is failed\n");
574     }
575
576     if(mNativeImageSourcePtr && mTimer)
577     {
578       mTimer.Stop();
579       DestroyPackets();
580     }
581   }
582 }
583
584 void TizenVideoPlayer::SetMute(bool muted)
585 {
586   GetPlayerState(&mPlayerState);
587
588   if(mPlayerState == PLAYER_STATE_IDLE ||
589      mPlayerState == PLAYER_STATE_READY ||
590      mPlayerState == PLAYER_STATE_PLAYING ||
591      mPlayerState == PLAYER_STATE_PAUSED)
592   {
593     int error = player_set_mute(mPlayer, muted);
594     int ret   = LogPlayerError(error);
595     if(ret)
596     {
597       DALI_LOG_ERROR("SetMute, player_set_mute() is failed\n");
598     }
599   }
600 }
601
602 bool TizenVideoPlayer::IsMuted()
603 {
604   GetPlayerState(&mPlayerState);
605   bool muted = false;
606
607   if(mPlayerState == PLAYER_STATE_IDLE ||
608      mPlayerState == PLAYER_STATE_READY ||
609      mPlayerState == PLAYER_STATE_PLAYING ||
610      mPlayerState == PLAYER_STATE_PAUSED)
611   {
612     int error = player_is_muted(mPlayer, &muted);
613     int ret   = LogPlayerError(error);
614     if(ret)
615     {
616       DALI_LOG_ERROR("IsMuted, player_is_muted() is failed\n");
617     }
618   }
619
620   return muted;
621 }
622
623 void TizenVideoPlayer::SetVolume(float left, float right)
624 {
625   GetPlayerState(&mPlayerState);
626
627   int error = player_set_volume(mPlayer, left, right);
628   int ret   = LogPlayerError(error);
629   if(ret)
630   {
631     DALI_LOG_ERROR("SetVolume, player_set_volume() is failed\n");
632   }
633 }
634
635 void TizenVideoPlayer::GetVolume(float& left, float& right)
636 {
637   GetPlayerState(&mPlayerState);
638
639   int error = player_get_volume(mPlayer, &left, &right);
640   int ret   = LogPlayerError(error);
641   if(ret)
642   {
643     DALI_LOG_ERROR("GetVolume, player_get_volume() is failed\n");
644   }
645 }
646
647 void TizenVideoPlayer::SetPlayPosition(int millisecond)
648 {
649   int error;
650   int ret = 0;
651
652   GetPlayerState(&mPlayerState);
653
654   if(mPlayerState == PLAYER_STATE_IDLE)
655   {
656     error = player_prepare(mPlayer);
657     ret   = LogPlayerError(error);
658     if(ret)
659     {
660       DALI_LOG_ERROR("SetPlayPosition, player_prepare() is failed\n");
661     }
662
663     GetPlayerState(&mPlayerState); // Check the status again.
664   }
665
666   if(mPlayerState == PLAYER_STATE_READY ||
667      mPlayerState == PLAYER_STATE_PLAYING ||
668      mPlayerState == PLAYER_STATE_PAUSED)
669   {
670     error = player_set_play_position(mPlayer, millisecond, ACCURATE_PLAY_POSITION_SET, PlayerSeekCompletedCb, NULL);
671     ret   = LogPlayerError(error);
672     if(ret)
673     {
674       DALI_LOG_ERROR("SetPlayPosition, player_set_play_position() is failed\n");
675     }
676   }
677 }
678
679 int TizenVideoPlayer::GetPlayPosition()
680 {
681   int error;
682   int millisecond = 0;
683
684   GetPlayerState(&mPlayerState);
685
686   if(mPlayerState == PLAYER_STATE_IDLE ||
687      mPlayerState == PLAYER_STATE_READY ||
688      mPlayerState == PLAYER_STATE_PLAYING ||
689      mPlayerState == PLAYER_STATE_PAUSED)
690   {
691     error   = player_get_play_position(mPlayer, &millisecond);
692     int ret = LogPlayerError(error);
693     if(ret)
694     {
695       DALI_LOG_ERROR("GetPlayPosition, player_get_play_position() is failed\n");
696     }
697   }
698
699   return millisecond;
700 }
701
702 void TizenVideoPlayer::SetDisplayRotation(Dali::VideoPlayerPlugin::DisplayRotation rotation)
703 {
704   if(mNativeImageSourcePtr)
705   {
706     DALI_LOG_ERROR("SetDisplayRotation is only for window rendering target.\n");
707     return;
708   }
709
710   int error;
711   if(mPlayerState != PLAYER_STATE_NONE)
712   {
713     error   = player_set_display_rotation(mPlayer, static_cast<player_display_rotation_e>(rotation));
714     int ret = LogPlayerError(error);
715     if(ret)
716     {
717       DALI_LOG_ERROR("SetDisplayRotation, player_set_display_rotation() is failed\n");
718     }
719   }
720 }
721
722 Dali::VideoPlayerPlugin::DisplayRotation TizenVideoPlayer::GetDisplayRotation()
723 {
724   if(mNativeImageSourcePtr)
725   {
726     DALI_LOG_ERROR("GetDisplayRotation is only for window rendering target.\n");
727     return Dali::VideoPlayerPlugin::ROTATION_NONE;
728   }
729
730   int                       error;
731   player_display_rotation_e rotation = PLAYER_DISPLAY_ROTATION_NONE;
732   if(mPlayerState != PLAYER_STATE_NONE)
733   {
734     error   = player_get_display_rotation(mPlayer, &rotation);
735     int ret = LogPlayerError(error);
736     if(ret)
737     {
738       DALI_LOG_ERROR("GetDisplayRotation, player_get_display_rotation() is failed\n");
739     }
740   }
741   return static_cast<Dali::VideoPlayerPlugin::DisplayRotation>(rotation);
742 }
743
744 Dali::VideoPlayerPlugin::VideoPlayerSignalType& TizenVideoPlayer::FinishedSignal()
745 {
746   return mFinishedSignal;
747 }
748
749 void TizenVideoPlayer::InitializeTextureStreamMode(Dali::NativeImageSourcePtr nativeImageSourcePtr)
750 {
751   int error;
752   int ret = 0;
753
754   mNativeImageSourcePtr = nativeImageSourcePtr;
755
756   if(mPlayerState == PLAYER_STATE_NONE)
757   {
758     error = player_create(&mPlayer);
759     ret   = LogPlayerError(error);
760     if(ret)
761     {
762       DALI_LOG_ERROR("InitializeTextureStreamMode, player_create() is failed\n");
763     }
764   }
765
766   GetPlayerState(&mPlayerState);
767
768   if(mPlayerState == PLAYER_STATE_IDLE)
769   {
770     error = player_set_completed_cb(mPlayer, EmitPlaybackFinishedSignal, this);
771     ret   = LogPlayerError(error);
772     if(ret)
773     {
774       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_completed_cb() is failed\n");
775     }
776
777     error = player_set_media_packet_video_frame_decoded_cb(mPlayer, MediaPacketVideoDecodedCb, this);
778     ret   = LogPlayerError(error);
779     if(ret)
780     {
781       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_media_packet_video_frame_decoded_cb() is failed\n");
782     }
783
784     error = sound_manager_create_stream_information(mStreamType, NULL, NULL, &mStreamInfo);
785     ret   = LogPlayerError(error);
786     if(ret)
787     {
788       DALI_LOG_ERROR("InitializeTextureStreamMode, sound_manager_create_stream_information() is failed\n");
789     }
790
791     error = player_set_sound_stream_info(mPlayer, mStreamInfo);
792     ret   = LogPlayerError(error);
793     if(ret)
794     {
795       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_sound_stream_info() is failed\n");
796     }
797
798     error = player_set_display_mode(mPlayer, PLAYER_DISPLAY_MODE_FULL_SCREEN);
799     ret   = LogPlayerError(error);
800     if(ret)
801     {
802       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_display_mode() is failed\n");
803     }
804
805     error = player_set_display(mPlayer, PLAYER_DISPLAY_TYPE_NONE, NULL);
806     ret   = LogPlayerError(error);
807     if(ret)
808     {
809       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_display() is failed\n");
810     }
811
812     error = player_set_video_codec_type_ex(mPlayer, mCodecType);
813     ret   = LogPlayerError(error);
814     if(ret)
815     {
816       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_video_codec_type_ex() is failed\n");
817     }
818     error = player_set_display_visible(mPlayer, true);
819     ret   = LogPlayerError(error);
820     if(ret)
821     {
822       DALI_LOG_ERROR("InitializeTextureStreamMode, player_set_display_visible() is failed\n");
823     }
824
825     mTimer = Dali::Timer::New(TIMER_INTERVAL);
826     mTimer.TickSignal().Connect(this, &TizenVideoPlayer::Update);
827   }
828 }
829
830 void TizenVideoPlayer::InitializeEnableSyncMode(Ecore_Wl2_Window* ecoreWlWindow)
831 {
832   int error;
833   int ret = 0;
834
835   if(mEcoreWlWindow != ecoreWlWindow)
836   {
837     mEcoreWlWindow = ecoreWlWindow;
838     // check previous video subsurface and destroy
839     if(mEcoreSubVideoWindow)
840     {
841       ecore_wl2_subsurface_del(mEcoreSubVideoWindow);
842     }
843
844     // Crate ecore_wl2 sursurface
845     mEcoreSubVideoWindow = ecore_wl2_subsurface_new(mEcoreWlWindow);
846     if(!mEcoreSubVideoWindow)
847     {
848       DALI_LOG_ERROR("InitializeEnableSyncMode, ecore_wl2_subsurface_new() is failed\n");
849       return;
850     }
851
852     // ecore_wl2_subsurface_video_surface_prepare
853     if(!ecore_wl2_subsurface_video_surface_prepare(mEcoreSubVideoWindow))
854     {
855       ecore_wl2_subsurface_del(mEcoreSubVideoWindow);
856       DALI_LOG_ERROR("InitializeEnableSyncMode, : ecore_wl2_subsurface_video_surface_prepare() is failed\n");
857       return;
858     }
859
860     DALI_LOG_RELEASE_INFO("InitializeEnableSyncMode, desync VideoPlayer\n");
861     ecore_wl2_subsurface_sync_set(mEcoreSubVideoWindow, EINA_FALSE);
862   }
863
864   if(mPlayerState == PLAYER_STATE_NONE)
865   {
866     error = player_create(&mPlayer);
867     ret   = LogPlayerError(error);
868     if(ret)
869     {
870       DALI_LOG_ERROR("InitializeEnableSyncMode, player_create() is failed\n");
871     }
872   }
873
874   GetPlayerState(&mPlayerState);
875   if(mPlayerState == PLAYER_STATE_IDLE)
876   {
877     error = player_set_completed_cb(mPlayer, EmitPlaybackFinishedSignal, this);
878     ret   = LogPlayerError(error);
879     if(ret)
880     {
881       DALI_LOG_ERROR("InitializeEnableSyncMode, player_set_completed_cb() is failed\n");
882     }
883
884     error = sound_manager_create_stream_information(mStreamType, NULL, NULL, &mStreamInfo);
885     ret   = LogPlayerError(error);
886     if(ret)
887     {
888       DALI_LOG_ERROR("InitializeEnableSyncMode, sound_manager_create_stream_information() is failed\n");
889     }
890
891     error = player_set_sound_stream_info(mPlayer, mStreamInfo);
892     ret   = LogPlayerError(error);
893     if(ret)
894     {
895       DALI_LOG_ERROR("InitializeEnableSyncMode, player_set_sound_stream_info() is failed\n");
896     }
897
898     error = player_set_video_codec_type_ex(mPlayer, mCodecType);
899     ret   = LogPlayerError(error);
900     if(ret)
901     {
902       DALI_LOG_ERROR("InitializeEnableSyncMode, player_set_video_codec_type_ex() is failed\n");
903     }
904
905     int                width, height;
906     Ecore_Wl2_Display* wl2_display = ecore_wl2_connected_display_get(NULL);
907     ecore_wl2_display_screen_size_get(wl2_display, &width, &height);
908     ecore_wl2_window_alpha_set(mEcoreWlWindow, false);
909
910     if(!ecore_wl2_subsurface_video_surface_destination_set(mEcoreSubVideoWindow, 0, 0, width, height))
911     {
912       DALI_LOG_ERROR("InitializeEnableSyncMode, ecore_wl2_subsurface_video_surface_destination_set() is failed\n");
913     }
914     error = player_set_display(mPlayer, PLAYER_DISPLAY_TYPE_OVERLAY, mEcoreWlWindow);
915     ret   = LogPlayerError(error);
916     if(ret)
917     {
918       DALI_LOG_ERROR("InitializeEnableSyncMode, player_set_display() is failed\n");
919     }
920
921     mIsInitForSyncMode = true;
922   }
923 }
924
925 void TizenVideoPlayer::InitializeUnderlayMode(Ecore_Wl2_Window* ecoreWlWindow)
926 {
927   int error;
928   int ret = 0;
929
930   if(mSyncMode == Dali::VideoSyncMode::ENABLED)
931   {
932     DALI_LOG_RELEASE_INFO("InitializeUnderlayMode, \n");
933     InitializeEnableSyncMode(ecoreWlWindow);
934     return;
935   }
936
937   mEcoreWlWindow = ecoreWlWindow;
938
939   if(mPlayerState == PLAYER_STATE_NONE)
940   {
941     error = player_create(&mPlayer);
942     ret   = LogPlayerError(error);
943     if(ret)
944     {
945       DALI_LOG_ERROR("InitializeUnderlayMode, player_create() is failed\n");
946     }
947   }
948
949   GetPlayerState(&mPlayerState);
950   if(mPlayerState == PLAYER_STATE_IDLE)
951   {
952     error = player_set_completed_cb(mPlayer, EmitPlaybackFinishedSignal, this);
953     ret   = LogPlayerError(error);
954     if(ret)
955     {
956       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_completed_cb() is failed\n");
957     }
958
959     error = sound_manager_create_stream_information(mStreamType, NULL, NULL, &mStreamInfo);
960     ret   = LogPlayerError(error);
961     if(ret)
962     {
963       DALI_LOG_ERROR("InitializeUnderlayMode, sound_manager_create_stream_information() is failed\n");
964     }
965
966     error = player_set_sound_stream_info(mPlayer, mStreamInfo);
967     ret   = LogPlayerError(error);
968     if(ret)
969     {
970       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_sound_stream_info() is failed\n");
971     }
972
973     error = player_set_video_codec_type_ex(mPlayer, mCodecType);
974     ret   = LogPlayerError(error);
975     if(ret)
976     {
977       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_video_codec_type_ex() is failed\n");
978     }
979
980     int                width, height;
981     Ecore_Wl2_Display* wl2_display = ecore_wl2_connected_display_get(NULL);
982     ecore_wl2_display_screen_size_get(wl2_display, &width, &height);
983     ecore_wl2_window_alpha_set(mEcoreWlWindow, false);
984
985     error = player_set_display_mode(mPlayer, PLAYER_DISPLAY_MODE_DST_ROI);
986     ret   = LogPlayerError(error);
987     if(ret)
988     {
989       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_display_mode() is failed\n");
990     }
991
992     error = player_set_display_roi_area(mPlayer, 0, 0, 1, 1);
993     ret   = LogPlayerError(error);
994     if(ret)
995     {
996       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_display_roi_area() is failed\n");
997     }
998
999     error = player_set_ecore_wl_display(mPlayer, PLAYER_DISPLAY_TYPE_OVERLAY, mEcoreWlWindow, 0, 0, width, height);
1000     ret   = LogPlayerError(error);
1001     if(ret)
1002     {
1003       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_ecore_wl_display() is failed\n");
1004     }
1005
1006     error = player_set_display_visible(mPlayer, true);
1007     ret   = LogPlayerError(error);
1008     if(ret)
1009     {
1010       DALI_LOG_ERROR("InitializeUnderlayMode, player_set_display_visible() is failed\n");
1011     }
1012   }
1013 }
1014
1015 bool TizenVideoPlayer::Update()
1016 {
1017   Dali::Mutex::ScopedLock lock(mPacketMutex);
1018
1019   int error;
1020
1021   if(mPacket != NULL)
1022   {
1023     error = media_packet_destroy(mPacket);
1024     if(error != MEDIA_PACKET_ERROR_NONE)
1025     {
1026       DALI_LOG_ERROR("Update, media_packet_destroy() is failed\n");
1027     }
1028     mPacket = NULL;
1029   }
1030
1031   if(!mPacketVector.Empty())
1032   {
1033     mPacket = static_cast<media_packet_h>(mPacketVector[0]);
1034     mPacketVector.Remove(mPacketVector.Begin());
1035   }
1036
1037   if(mPacket == NULL)
1038   {
1039     return true;
1040   }
1041
1042   error = media_packet_get_tbm_surface(mPacket, &mTbmSurface);
1043   if(error != MEDIA_PACKET_ERROR_NONE)
1044   {
1045     media_packet_destroy(mPacket);
1046     mPacket = NULL;
1047     DALI_LOG_ERROR(" error: %d\n", error);
1048     return true;
1049   }
1050
1051   Any source(mTbmSurface);
1052   mNativeImageSourcePtr->SetSource(source);
1053   Dali::Stage::GetCurrent().KeepRendering(0.0f);
1054
1055   return true;
1056 }
1057
1058 void TizenVideoPlayer::DestroyPackets()
1059 {
1060   int error;
1061   if(mPacket != NULL)
1062   {
1063     error = media_packet_destroy(mPacket);
1064     DALI_LOG_ERROR("Media packet destroy error: %d\n", error);
1065     mPacket = NULL;
1066   }
1067
1068   for(unsigned int i = 0; i < mPacketVector.Size(); ++i)
1069   {
1070     mPacket = static_cast<media_packet_h>(mPacketVector[i]);
1071     error   = media_packet_destroy(mPacket);
1072     DALI_LOG_ERROR("Media packet destroy error: %d\n", error);
1073     mPacket = NULL;
1074   }
1075   mPacketVector.Clear();
1076 }
1077
1078 void TizenVideoPlayer::PushPacket(media_packet_h packet)
1079 {
1080   Dali::Mutex::ScopedLock lock(mPacketMutex);
1081   mPacketVector.PushBack(packet);
1082 }
1083
1084 void TizenVideoPlayer::SetDisplayArea(DisplayArea area)
1085 {
1086   int ret = 0;
1087   GetPlayerState(&mPlayerState);
1088
1089   if(mNativeImageSourcePtr)
1090   {
1091     DALI_LOG_ERROR("SetDisplayArea is only for window surface target.\n");
1092     return;
1093   }
1094
1095   if(mPlayerState == PLAYER_STATE_IDLE ||
1096      mPlayerState == PLAYER_STATE_READY ||
1097      mPlayerState == PLAYER_STATE_PLAYING ||
1098      mPlayerState == PLAYER_STATE_PAUSED)
1099   {
1100     area.x = (area.x < 0) ? 0 : area.x;
1101     area.y = (area.y < 0) ? 0 : area.y;
1102     if(mSyncMode == Dali::VideoSyncMode::ENABLED)
1103     {
1104       if(!ecore_wl2_subsurface_video_surface_destination_set(mEcoreSubVideoWindow, area.x, area.y, area.width, area.height))
1105       {
1106         DALI_LOG_ERROR("SetDisplayArea, ecore_wl2_subsurface_video_surface_destination_set() is failed\n");
1107       }
1108     }
1109     else
1110     {
1111       int error = player_set_display_roi_area(mPlayer, area.x, area.y, area.width, area.height);
1112       ret       = LogPlayerError(error);
1113       if(ret)
1114       {
1115         DALI_LOG_ERROR("SetDisplayArea, player_set_display_roi_area() is failed\n");
1116       }
1117     }
1118   }
1119 }
1120
1121 void TizenVideoPlayer::Forward(int millisecond)
1122 {
1123   int error;
1124   int ret = 0;
1125
1126   GetPlayerState(&mPlayerState);
1127
1128   if(mPlayerState == PLAYER_STATE_READY ||
1129      mPlayerState == PLAYER_STATE_PLAYING ||
1130      mPlayerState == PLAYER_STATE_PAUSED)
1131   {
1132     int currentPosition = 0;
1133     int nextPosition    = 0;
1134
1135     error = player_get_play_position(mPlayer, &currentPosition);
1136     ret   = LogPlayerError(error);
1137     if(ret)
1138     {
1139       DALI_LOG_ERROR("Forward, player_get_play_position() is failed\n");
1140     }
1141
1142     nextPosition = currentPosition + millisecond;
1143
1144     error = player_set_play_position(mPlayer, nextPosition, ACCURATE_PLAY_POSITION_SET, PlayerSeekCompletedCb, NULL);
1145     ret   = LogPlayerError(error);
1146     if(ret)
1147     {
1148       DALI_LOG_ERROR("Forward, player_set_play_position() is failed\n");
1149     }
1150   }
1151 }
1152
1153 void TizenVideoPlayer::Backward(int millisecond)
1154 {
1155   int error;
1156   int ret = 0;
1157
1158   GetPlayerState(&mPlayerState);
1159
1160   if(mPlayerState == PLAYER_STATE_READY ||
1161      mPlayerState == PLAYER_STATE_PLAYING ||
1162      mPlayerState == PLAYER_STATE_PAUSED)
1163   {
1164     int currentPosition = 0;
1165     int nextPosition    = 0;
1166
1167     error = player_get_play_position(mPlayer, &currentPosition);
1168     ret   = LogPlayerError(error);
1169     if(ret)
1170     {
1171       DALI_LOG_ERROR("Backward, player_get_play_position() is failed\n");
1172     }
1173
1174     nextPosition = currentPosition - millisecond;
1175     nextPosition = (nextPosition < 0) ? 0 : nextPosition;
1176
1177     error = player_set_play_position(mPlayer, nextPosition, ACCURATE_PLAY_POSITION_SET, PlayerSeekCompletedCb, NULL);
1178     ret   = LogPlayerError(error);
1179     if(ret)
1180     {
1181       DALI_LOG_ERROR("Backward, player_set_play_position() is failed\n");
1182     }
1183   }
1184 }
1185
1186 bool TizenVideoPlayer::IsVideoTextureSupported()
1187 {
1188   bool featureFlag = true;
1189   int  error       = SYSTEM_INFO_ERROR_NONE;
1190
1191   error = system_info_get_platform_bool("tizen.org/feature/multimedia.raw_video", &featureFlag);
1192
1193   if(error != SYSTEM_INFO_ERROR_NONE)
1194   {
1195     DALI_LOG_ERROR("Plugin can't check platform feature\n");
1196     return false;
1197   }
1198
1199   return featureFlag;
1200 }
1201
1202 void TizenVideoPlayer::DestroyPlayer()
1203 {
1204   mUrl    = "";
1205   int ret = 0;
1206
1207   int error;
1208   if(mPlayerState != PLAYER_STATE_NONE)
1209   {
1210     GetPlayerState(&mPlayerState);
1211
1212     if(mPlayerState != PLAYER_STATE_IDLE)
1213     {
1214       Stop();
1215       error = player_unprepare(mPlayer);
1216       ret   = LogPlayerError(error);
1217       if(ret)
1218       {
1219         DALI_LOG_ERROR("DestroyPlayer, player_unprepare() is failed\n");
1220       }
1221     }
1222
1223     error = player_destroy(mPlayer);
1224     ret   = LogPlayerError(error);
1225     if(ret)
1226     {
1227       DALI_LOG_ERROR("DestroyPlayer, player_destroy() is failed\n");
1228     }
1229
1230     error = sound_manager_destroy_stream_information(mStreamInfo);
1231     ret   = LogPlayerError(error);
1232     if(ret)
1233     {
1234       DALI_LOG_ERROR("DestroyPlayer, sound_manager_destroy_stream_information() is failed\n");
1235     }
1236
1237     mPlayerState = PLAYER_STATE_NONE;
1238     mPlayer      = NULL;
1239   }
1240 }
1241
1242 void TizenVideoPlayer::SetCodecType(Dali::VideoPlayerPlugin::CodecType type)
1243 {
1244   int error;
1245   int ret = 0;
1246   switch(type)
1247   {
1248     case Dali::VideoPlayerPlugin::CodecType::DEFAULT:
1249     {
1250       mCodecType = PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT;
1251       break;
1252     }
1253     case Dali::VideoPlayerPlugin::CodecType::HW:
1254     {
1255       mCodecType = PLAYER_VIDEO_CODEC_TYPE_EX_HW;
1256       break;
1257     }
1258     case Dali::VideoPlayerPlugin::CodecType::SW:
1259     {
1260       mCodecType = PLAYER_VIDEO_CODEC_TYPE_EX_SW;
1261       break;
1262     }
1263   }
1264
1265   if(mPlayerState != PLAYER_STATE_NONE)
1266   {
1267     GetPlayerState(&mPlayerState);
1268
1269     if(mPlayerState == PLAYER_STATE_IDLE)
1270     {
1271       error = player_set_video_codec_type_ex(mPlayer, mCodecType);
1272       ret   = LogPlayerError(error);
1273       if(ret)
1274       {
1275         DALI_LOG_ERROR("SetCodecType, player_set_video_codec_type_ex() is failed\n");
1276       }
1277     }
1278   }
1279 }
1280
1281 Dali::VideoPlayerPlugin::CodecType TizenVideoPlayer::GetCodecType() const
1282 {
1283   Dali::VideoPlayerPlugin::CodecType type = Dali::VideoPlayerPlugin::CodecType::DEFAULT;
1284   int                                ret  = 0;
1285   if(mPlayerState != PLAYER_STATE_NONE)
1286   {
1287     player_video_codec_type_ex_e codecType = PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT;
1288     int                          error     = player_get_video_codec_type_ex(mPlayer, &codecType);
1289     if(error != PLAYER_ERROR_NONE)
1290     {
1291       ret = LogPlayerError(error);
1292       if(ret)
1293       {
1294         DALI_LOG_ERROR("GetCodecType, player_get_video_codec_type_ex() is failed\n");
1295       }
1296       return type;
1297     }
1298
1299     switch(codecType)
1300     {
1301       case PLAYER_VIDEO_CODEC_TYPE_EX_DEFAULT:
1302       {
1303         type = Dali::VideoPlayerPlugin::CodecType::DEFAULT;
1304         break;
1305       }
1306       case PLAYER_VIDEO_CODEC_TYPE_EX_HW:
1307       {
1308         type = Dali::VideoPlayerPlugin::CodecType::HW;
1309         break;
1310       }
1311       case PLAYER_VIDEO_CODEC_TYPE_EX_SW:
1312       {
1313         type = Dali::VideoPlayerPlugin::CodecType::SW;
1314         break;
1315       }
1316     }
1317   }
1318   return type;
1319 }
1320
1321 void TizenVideoPlayer::SetDisplayMode(Dali::VideoPlayerPlugin::DisplayMode::Type mode)
1322 {
1323   int error;
1324   error   = player_set_display_mode(mPlayer, static_cast<player_display_mode_e>(mode));
1325   int ret = LogPlayerError(error);
1326   if(ret)
1327   {
1328     DALI_LOG_ERROR("SetDisplayMode, player_set_display_mode() is failed\n");
1329   }
1330 }
1331
1332 Dali::VideoPlayerPlugin::DisplayMode::Type TizenVideoPlayer::GetDisplayMode() const
1333 {
1334   player_display_mode_e mode;
1335   player_get_display_mode(mPlayer, &mode);
1336   return static_cast<Dali::VideoPlayerPlugin::DisplayMode::Type>(mode);
1337 }
1338
1339 Any TizenVideoPlayer::GetMediaPlayer()
1340 {
1341   return Any((void*)mPlayer);
1342 }
1343
1344 void TizenVideoPlayer::StartSynchronization()
1345 {
1346   DALI_LOG_RELEASE_INFO("sync VideoPlayer\n");
1347   ecore_wl2_subsurface_sync_set(mEcoreSubVideoWindow, EINA_TRUE);
1348 }
1349
1350 void TizenVideoPlayer::FinishSynchronization()
1351 {
1352   // Finish
1353   DALI_LOG_RELEASE_INFO("desync VideoPlayer\n");
1354   ecore_wl2_subsurface_sync_set(mEcoreSubVideoWindow, EINA_FALSE);
1355 }
1356
1357 void TizenVideoPlayer::CreateConstraint()
1358 {
1359   if(mVideoSizePropertyIndex == Property::INVALID_INDEX)
1360   {
1361     if(mVideoSizePropertyConstraint)
1362     {
1363       mVideoSizePropertyConstraint.Remove();
1364     }
1365
1366     mVideoSizePropertyIndex = mSyncActor.RegisterProperty(VIDEO_PLAYER_SIZE_NAME, Vector3::ZERO);
1367
1368     int                width, height;
1369     Ecore_Wl2_Display* wl2_display = ecore_wl2_connected_display_get(NULL);
1370     ecore_wl2_display_screen_size_get(wl2_display, &width, &height);
1371
1372     mVideoSizePropertyConstraint = Constraint::New<Vector3>(mSyncActor,
1373                                                             mVideoSizePropertyIndex,
1374                                                             VideoPlayerSyncConstraint(mEcoreSubVideoWindow, width, height));
1375
1376     mVideoSizePropertyConstraint.AddSource(LocalSource(Actor::Property::SIZE));
1377     mVideoSizePropertyConstraint.AddSource(LocalSource(Actor::Property::WORLD_SCALE));
1378     mVideoSizePropertyConstraint.AddSource(LocalSource(Actor::Property::WORLD_POSITION));
1379
1380     mVideoSizePropertyConstraint.Apply();
1381   }
1382 }
1383
1384 void TizenVideoPlayer::DestroyConstraint()
1385 {
1386   if(mVideoSizePropertyIndex != Property::INVALID_INDEX)
1387   {
1388     mVideoSizePropertyConstraint.Remove();
1389     mVideoSizePropertyIndex = Property::INVALID_INDEX;
1390   }
1391 }
1392
1393 void TizenVideoPlayer::RaiseAbove(Any videoSurface)
1394 {
1395   Ecore_Wl2_Subsurface* surface = AnyCast<Ecore_Wl2_Subsurface*>(videoSurface);
1396   ecore_wl2_subsurface_place_surface_above(mEcoreSubVideoWindow, surface);
1397 }
1398
1399 void TizenVideoPlayer::LowerBelow(Any videoSurface)
1400 {
1401   Ecore_Wl2_Subsurface* surface = AnyCast<Ecore_Wl2_Subsurface*>(videoSurface);
1402   ecore_wl2_subsurface_place_surface_below(mEcoreSubVideoWindow, surface);
1403 }
1404
1405 void TizenVideoPlayer::RaiseToTop()
1406 {
1407   ecore_wl2_subsurface_place_surface_above(mEcoreSubVideoWindow, NULL);
1408 }
1409
1410 void TizenVideoPlayer::LowerToBottom()
1411 {
1412   ecore_wl2_subsurface_place_surface_below(mEcoreSubVideoWindow, NULL);
1413 }
1414
1415 Any TizenVideoPlayer::GetVideoPlayerSurface()
1416 {
1417   return mEcoreSubVideoWindow;
1418 }
1419
1420 } // namespace Plugin
1421 } // namespace Dali