2 * Copyright (c) [2012] Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
19 #include "mp-video-log.h"
20 #include "video-player.h"
21 #include "mp-video-value-define.h"
22 #include "mp-video-service-ctrl.h"
23 #include "mp-video-progressbar.h"
25 #define PROGRESS_BAR_START_TERM 130
26 #define PROGRESS_BAR_WIDTH_TERM 200
28 #define PROGRESS_ADJUSTMENT_TIME_INTERVAL 2.0
29 #define PROGRESS_ADJUSTMENT_RUN_INTERVAL 0.3
31 #define PROGRESS_ADJUSTMENT_MOVE_LIMIT 20
32 #define PROGRESS_ADJUSTMENT_MODE_LIMIT 20
35 static Evas_Object *pProgressbarEdj = NULL;
36 static Ecore_Timer *pProgressbarTimer = NULL;
38 static Ecore_Timer *pProgressAdjustCheckTimer = NULL;
39 static Ecore_Timer *pProgressAdjustRunTimer = NULL;
41 static bool bIsEventSkip = FALSE;
42 static bool bIsDrag = FALSE;
43 static int nDragPosition = 0;
45 static bool bIsAdjustmentMode = FALSE;
46 static int nDownPosX = 0;
47 static int nOldPosX = 0;
48 static bool bPrevAdjustment = FALSE;
51 static void MpVideoProgressbarSetAdjustmentMode(bool bShow)
56 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_ADJUSTMENT_SHOW, "*");
59 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_ADJUSTMENT_HIDE, "*");
64 static void MpVideoProgressbarSetPointerVisible(bool bVisible)
69 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_POINTER_SHOW, "*");
72 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_POINTER_HIDE, "*");
79 static Eina_Bool MpVideoProgressbarUpdateValue(void *pUserData)
84 VideoLogInfo("[ERR] No exist userdata.");
88 VideoAppData *pAppData = (VideoAppData *)pUserData;
90 double nPlayedRatio = 0.0;
91 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
93 nPlayedRatio = ((double)nDragPosition / (double)pAppData->nDuration);
95 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT,
96 PLAY_TIME_ARGS(nDragPosition / 1000));
98 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing",
101 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played",
104 if(bIsAdjustmentMode) {
105 edje_object_part_text_set(pProgressbarEdj, "progress.adjustment.txt",
112 static void MpVideoProgressbarUpdateBufferingValue(void *pUserData)
117 VideoLogInfo("[ERR] No exist userdata.");
121 VideoAppData *pAppData = (VideoAppData *)pUserData;
123 double buffering_ratio = 0.0;
125 VideoAppCtrlCallbackFunc.VideoAppCtrlGetBufferingPosition(pAppData);
127 buffering_ratio = ((double)pAppData->nBufferingPosition / (double)100);
129 //VideoLogInfo("%d:%lf", pAppData->nBufferingPosition, buffering_ratio);
131 edje_object_part_drag_value_set(pProgressbarEdj, "progress.buffering",
132 buffering_ratio, 0.0);
138 static Eina_Bool MpVideoProgressbarTimerCb(void *pUserData)
140 /* VideoLogInfo(""); */
143 VideoLogInfo("[ERR] No exist userdata.");
147 VideoAppData *pAppData = (VideoAppData *)pUserData;
149 if (pAppData->nDuration < 1) {
150 VideoLogInfo("Try to update duration time.");
151 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReqDurationTime(pAppData);
155 if (bIsEventSkip || bIsDrag)
158 double nPlayedRatio = 0.0;
159 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
161 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
163 nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
164 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
166 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
167 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
169 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
170 if(nTmpPlayerType == MP_STREAMING_PLAYER)
172 MpVideoProgressbarUpdateBufferingValue(pUserData);
178 static Eina_Bool MpVideoProgressbarAdjustmentTimerCb(void *pUserData)
183 VideoLogError("[ERR] No exist userdata.");
186 VideoAppData *pAppData = (VideoAppData *)pUserData;
188 bIsAdjustmentMode = TRUE;
190 VideoLogInfo("%d, %d",pAppData->nCurPosition , nDragPosition);
192 pAppData->nSetPosition = nDragPosition;
193 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
195 MpVideoProgressbarSetAdjustmentMode(bIsAdjustmentMode);
196 MpVideoProgressbarUpdateValue(pUserData);
200 static Eina_Bool MpVideoProgressbarAdjustmentRunTimerCb(void *pUserData)
205 VideoLogInfo("[ERR] No exist userdata.");
209 VideoAppData *pAppData = (VideoAppData *)pUserData;
212 if(bPrevAdjustment) {
213 pAppData->nSetPosition = nDragPosition - 1000;
216 pAppData->nSetPosition = nDragPosition + 1000;
219 if (pAppData->nSetPosition < 0) {
220 pAppData->nSetPosition = 0;
223 if (pAppData->nSetPosition > pAppData->nDuration) {
224 pAppData->nSetPosition = pAppData->nDuration;
227 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
229 nDragPosition = pAppData->nSetPosition;
231 MpVideoProgressbarUpdateValue((void *)pAppData);
240 static void MpVideoProgressbarDownCb(void *pUserData, Evas * e,
241 Evas_Object *obj, void *event_info)
246 VideoLogInfo("[ERR]");
251 VideoLogInfo("[ERR]");
258 MpVideoProgressbarDeleteTimer();
259 MpVideoProgressbarSetPointerVisible(TRUE);
261 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
262 if(nTmpPlayerType != MP_STREAMING_PLAYER)
264 if(pProgressAdjustCheckTimer) {
265 ecore_timer_del(pProgressAdjustCheckTimer);
266 pProgressAdjustCheckTimer = NULL;
269 if(pProgressAdjustRunTimer) {
270 ecore_timer_del(pProgressAdjustRunTimer);
271 pProgressAdjustRunTimer = NULL;
274 pProgressAdjustCheckTimer = ecore_timer_add(PROGRESS_ADJUSTMENT_TIME_INTERVAL,
275 MpVideoProgressbarAdjustmentTimerCb, (void *)pUserData);
280 VideoAppData *pAppData = (VideoAppData *)pUserData;
281 Evas_Event_Mouse_Up *ev = event_info;
282 Evas_Object *progressbar = obj;
283 int w = 0, current = 0;
291 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
292 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
293 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
294 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
295 nDownPosX = ev->canvas.x;
296 nOldPosX = ev->canvas.x;;
297 current = ev->canvas.x - term;
301 else if (current > w)
304 ratio = (double)current / w;
306 nDragPosition = ratio * pAppData->nDuration;
307 pAppData->nSetPosition = nDragPosition;
309 if(nTmpPlayerType != MP_STREAMING_PLAYER)
311 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
312 pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
313 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
314 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
315 pAppData->nSeekPlayerState = MP_PLAYER_STATE_PAUSE;
317 pAppData->bSeekComplete = FALSE;
318 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
321 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
322 pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
323 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
324 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
328 MpVideoProgressbarUpdateValue(pUserData);
332 static void MpVideoProgressbarUpCb(void *pUserData, Evas * e, Evas_Object *obj,
338 VideoLogInfo("[ERR]");
343 VideoLogInfo("[ERR]");
352 VideoAppData *pAppData = (VideoAppData *)pUserData;
353 MpVideoProgressbarSetPointerVisible(FALSE);
355 if(pProgressAdjustRunTimer) {
356 ecore_timer_del(pProgressAdjustRunTimer);
357 pProgressAdjustRunTimer = NULL;
360 if(pProgressAdjustCheckTimer) {
361 ecore_timer_del(pProgressAdjustCheckTimer);
362 pProgressAdjustCheckTimer = NULL;
364 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
365 if(nTmpPlayerType != MP_STREAMING_PLAYER)
367 if(bIsAdjustmentMode) {
368 bIsAdjustmentMode = FALSE;
369 MpVideoProgressbarSetAdjustmentMode(bIsAdjustmentMode);
371 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
373 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
374 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
375 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
376 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
377 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
384 Evas_Event_Mouse_Up *ev = event_info;
385 Evas_Object *progressbar = obj;
386 int w = 0, current = 0;
394 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
395 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
396 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
398 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
399 current = ev->canvas.x - term;
404 else if (current > w)
407 ratio = (double)current / w;
409 pAppData->nSetPosition = (int)pAppData->nDuration * ratio;
411 if (pAppData->nSetPosition > pAppData->nDuration)
412 pAppData->nSetPosition = pAppData->nDuration;
414 if (pAppData->nSetPosition < 0)
415 pAppData->nSetPosition = 0;
417 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
419 MpVideoProgressbarCreateTimer((void *)pAppData);
421 if(nTmpPlayerType != MP_STREAMING_PLAYER)
424 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
425 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
426 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
427 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
428 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
431 if(!pAppData->bSeekComplete)
433 pAppData->nSeekPosition = pAppData->nSetPosition;
434 if((pAppData->nCurPosition < pAppData->nSeekPosition + 5000) &&
435 (pAppData->nCurPosition > pAppData->nSeekPosition - 5000))
437 VideoLogError("Skip for same position");
438 pAppData->nSeekPosition = 0;
443 if((pAppData->nCurPosition < pAppData->nSetPosition + 5000) &&
444 (pAppData->nCurPosition > pAppData->nSetPosition - 5000))
446 VideoLogError("Skip for same position");
450 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
456 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
457 MpVideoProgressbarCreateTimer((void *)pAppData);
459 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
460 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
461 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
462 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
467 static void MpVideoProgressbarMoveCb(void *pUserData, Evas * e,
468 Evas_Object *obj, void *event_info)
473 VideoLogInfo("[ERR]");
478 VideoLogInfo("[ERR]");
482 if (bIsEventSkip || bIsDrag == FALSE)
485 VideoAppData *pAppData = (VideoAppData *)pUserData;
486 Evas_Event_Mouse_Up *ev = event_info;
487 Evas_Object *progressbar = obj;
488 int w = 0, current = 0;
496 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
497 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
498 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
500 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
501 if(bIsAdjustmentMode) {
502 if((nOldPosX + PROGRESS_ADJUSTMENT_MODE_LIMIT) < ev->canvas.x) {
503 if(bPrevAdjustment == TRUE) {
504 if(pProgressAdjustRunTimer) {
505 ecore_timer_del(pProgressAdjustRunTimer);
506 pProgressAdjustRunTimer = NULL;
509 bPrevAdjustment = FALSE;
510 nOldPosX = ev->canvas.x;
512 else if((nOldPosX - PROGRESS_ADJUSTMENT_MODE_LIMIT) > ev->canvas.x) {
513 if(bPrevAdjustment == FALSE) {
514 if(pProgressAdjustRunTimer) {
515 ecore_timer_del(pProgressAdjustRunTimer);
516 pProgressAdjustRunTimer = NULL;
519 bPrevAdjustment = TRUE;
520 nOldPosX = ev->canvas.x;
523 if(pProgressAdjustRunTimer == NULL) {
524 pProgressAdjustRunTimer = ecore_timer_add(PROGRESS_ADJUSTMENT_RUN_INTERVAL,
525 MpVideoProgressbarAdjustmentRunTimerCb, (void *)pAppData);
531 if(((nDownPosX + PROGRESS_ADJUSTMENT_MOVE_LIMIT) < ev->canvas.x ) ||
532 ((nDownPosX - PROGRESS_ADJUSTMENT_MOVE_LIMIT) > ev->canvas.x)) {
533 VideoLogInfo("Adjustment Off");
535 if(pProgressAdjustCheckTimer) {
536 ecore_timer_del(pProgressAdjustCheckTimer);
537 pProgressAdjustCheckTimer = NULL;
540 if(pProgressAdjustRunTimer) {
541 ecore_timer_del(pProgressAdjustRunTimer);
542 pProgressAdjustRunTimer = NULL;
545 current = ev->canvas.x - term;
550 else if (current > w)
553 ratio = (double)current / w;
554 nDragPosition = ratio * pAppData->nDuration;
555 pAppData->nSetPosition = nDragPosition;
556 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
557 if(nTmpPlayerType != MP_STREAMING_PLAYER)
559 if(pAppData->bSeekComplete) {
560 pAppData->bSeekComplete = FALSE;
561 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
564 MpVideoProgressbarUpdateValue(pUserData);
571 void MpVideoProgressbarSetSkipEvent(bool bSkip)
575 bIsEventSkip = bSkip;
578 void *MpVideoProgressbarGetEdjHandle(void)
582 if (pProgressbarEdj) {
583 return (void *)pProgressbarEdj;
585 VideoLogInfo("Progressbar edj handle is null.");
590 void *MpVideoProgressbarInit(void *pUserData)
595 VideoLogInfo("[ERR]");
599 VideoAppData *pAppData = (VideoAppData *)pUserData;
601 Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow);
603 pProgressbarEdj = (Evas_Object *)MpUtilLoadEdjFile(pMainWindowEvas,
604 VIDEO_PLAYER_PROGRESS_EDJ,
607 evas_object_event_callback_add(pProgressbarEdj,
608 EVAS_CALLBACK_MOUSE_DOWN,
609 MpVideoProgressbarDownCb, pAppData);
611 evas_object_event_callback_add(pProgressbarEdj,
612 EVAS_CALLBACK_MOUSE_UP,
613 MpVideoProgressbarUpCb, pAppData);
615 evas_object_event_callback_add(pProgressbarEdj,
616 EVAS_CALLBACK_MOUSE_MOVE,
617 MpVideoProgressbarMoveCb, pAppData);
619 MpVideoProgressbarUpdateDurationTime("--:--:--");
621 return (void *)pProgressbarEdj;
624 void MpVideoProgressbarDestroy(void)
628 if (pProgressbarEdj) {
629 evas_object_del(pProgressbarEdj);
630 pProgressbarEdj = NULL;
633 if (pProgressbarTimer) {
634 ecore_timer_del(pProgressbarTimer);
635 pProgressbarTimer = NULL;
638 if(pProgressAdjustCheckTimer) {
639 ecore_timer_del(pProgressAdjustCheckTimer);
640 pProgressAdjustCheckTimer = NULL;
643 if(pProgressAdjustRunTimer) {
644 ecore_timer_del(pProgressAdjustRunTimer);
645 pProgressAdjustRunTimer = NULL;
648 bIsEventSkip = FALSE;
652 void MpVideoProgressbarCreateTimer(void *pUserData)
657 VideoLogInfo("[ERR]");
661 VideoAppData *pAppData = (VideoAppData *)pUserData;
663 if (pProgressbarTimer) {
664 ecore_timer_del(pProgressbarTimer);
665 pProgressbarTimer = NULL;
671 double nPlayedRatio = 0.0;
672 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
674 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
676 nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
677 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
679 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
680 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
682 pProgressbarTimer = ecore_timer_add(0.3, MpVideoProgressbarTimerCb, (void *)pAppData);
685 void MpVideoProgressbarDeleteTimer(void)
689 if (pProgressbarTimer) {
690 ecore_timer_del(pProgressbarTimer);
691 pProgressbarTimer = NULL;
694 if(pProgressAdjustCheckTimer) {
695 ecore_timer_del(pProgressAdjustCheckTimer);
696 pProgressAdjustCheckTimer = NULL;
699 if(pProgressAdjustRunTimer) {
700 ecore_timer_del(pProgressAdjustRunTimer);
701 pProgressAdjustRunTimer = NULL;
705 void MpVideoProgressbarUpdateDurationTime(char *szDurationTime)
709 if (!szDurationTime) {
710 VideoLogInfo("Fail to ser duration time");
714 edje_object_part_text_set(pProgressbarEdj, "progress.txt.total",
718 void MpVideoProgressbarBeginOfStream(void *pUserData)
723 VideoLogInfo("[ERR]");
727 VideoAppData *pAppData = (VideoAppData *)pUserData;
729 MpVideoProgressbarDeleteTimer();
731 pAppData->nCurPosition = 0;
732 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
733 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");
735 MpVideoProgressbarCreateTimer(pUserData);
738 void MpVideoProgressbarReset(void *pUserData)
743 VideoLogInfo("[ERR]");
747 MpVideoProgressbarDeleteTimer();
749 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
750 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");