2 * To apply the Flora License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
4 * Copyright [2012] [JongDong Lee <jongdong.lee@samsung.com>, ChangSun Lee <cs78.lee@samsung.com>]
6 * Licensed under the Flora License, Version 1.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.tizenopensource.org/license
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include "mp-video-log.h"
22 #include "video-player.h"
23 #include "mp-video-value-define.h"
24 #include "mp-video-service-ctrl.h"
25 #include "mp-video-progressbar.h"
27 #define PROGRESS_BAR_START_TERM 130
28 #define PROGRESS_BAR_WIDTH_TERM 200
30 #define PROGRESS_ADJUSTMENT_TIME_INTERVAL 2.0
31 #define PROGRESS_ADJUSTMENT_RUN_INTERVAL 0.3
33 #define PROGRESS_ADJUSTMENT_MOVE_LIMIT 10
34 #define PROGRESS_ADJUSTMENT_MODE_LIMIT 10
37 static Evas_Object *pProgressbarEdj = NULL;
38 static Ecore_Timer *pProgressbarTimer = NULL;
40 static Ecore_Timer *pProgressAdjustCheckTimer = NULL;
41 static Ecore_Timer *pProgressAdjustRunTimer = NULL;
43 static bool bIsEventSkip = FALSE;
44 static bool bIsDrag = FALSE;
45 static int nDragPosition = 0;
47 static bool bIsAdjustmentMode = FALSE;
48 static int nDownPosX = 0;
49 static int nOldPosX = 0;
50 static bool bPrevAdjustment = FALSE;
53 static void MpVideoProgressbarSetAdjustmentMode(bool bShow)
58 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_ADJUSTMENT_SHOW, "*");
61 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_ADJUSTMENT_HIDE, "*");
69 static Eina_Bool MpVideoProgressbarUpdateValue(void *pUserData)
74 VideoLogInfo("[ERR] No exist userdata.");
78 VideoAppData *pAppData = (VideoAppData *)pUserData;
80 double nPlayedRatio = 0.0;
81 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
83 nPlayedRatio = ((double)nDragPosition / (double)pAppData->nDuration);
85 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT,
86 PLAY_TIME_ARGS(nDragPosition / 1000));
88 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing",
91 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played",
94 if(bIsAdjustmentMode) {
95 edje_object_part_text_set(pProgressbarEdj, "progress.adjustment.txt",
102 static void MpVideoProgressbarUpdateBufferingValue(void *pUserData)
107 VideoLogInfo("[ERR] No exist userdata.");
111 VideoAppData *pAppData = (VideoAppData *)pUserData;
113 double buffering_ratio = 0.0;
115 VideoAppCtrlCallbackFunc.VideoAppCtrlGetBufferingPosition(pAppData);
117 buffering_ratio = ((double)pAppData->nBufferingPosition / (double)100);
119 //VideoLogInfo("%d:%lf", pAppData->nBufferingPosition, buffering_ratio);
121 edje_object_part_drag_value_set(pProgressbarEdj, "progress.buffering",
122 buffering_ratio, 0.0);
128 static Eina_Bool MpVideoProgressbarTimerCb(void *pUserData)
130 /* VideoLogInfo(""); */
133 VideoLogInfo("[ERR] No exist userdata.");
137 VideoAppData *pAppData = (VideoAppData *)pUserData;
139 if (pAppData->nDuration < 1) {
140 VideoLogInfo("Try to update duration time.");
141 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReqDurationTime(pAppData);
145 if (bIsEventSkip || bIsDrag)
148 double nPlayedRatio = 0.0;
149 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
151 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
153 nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
154 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
156 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
157 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
159 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
160 if(nTmpPlayerType == MP_STREAMING_PLAYER)
162 MpVideoProgressbarUpdateBufferingValue(pUserData);
168 static Eina_Bool MpVideoProgressbarAdjustmentTimerCb(void *pUserData)
173 VideoLogInfo("[ERR] No exist userdata.");
176 VideoAppData *pAppData = (VideoAppData *)pUserData;
178 bIsAdjustmentMode = TRUE;
180 VideoLogInfo("%d, %d",pAppData->nCurPosition , nDragPosition);
182 pAppData->nSetPosition = nDragPosition;
183 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
185 MpVideoProgressbarSetAdjustmentMode(bIsAdjustmentMode);
186 MpVideoProgressbarUpdateValue(pUserData);
190 static Eina_Bool MpVideoProgressbarAdjustmentRunTimerCb(void *pUserData)
195 VideoLogInfo("[ERR] No exist userdata.");
199 VideoAppData *pAppData = (VideoAppData *)pUserData;
202 if(bPrevAdjustment) {
203 pAppData->nSetPosition = nDragPosition - 1000;
206 pAppData->nSetPosition = nDragPosition + 1000;
209 if (pAppData->nSetPosition < 0) {
210 pAppData->nSetPosition = 0;
213 if (pAppData->nSetPosition > pAppData->nDuration) {
214 pAppData->nSetPosition = pAppData->nDuration;
217 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
219 nDragPosition = pAppData->nSetPosition;
221 MpVideoProgressbarUpdateValue((void *)pAppData);
230 static void MpVideoProgressbarDownCb(void *pUserData, Evas * e,
231 Evas_Object *obj, void *event_info)
236 VideoLogInfo("[ERR]");
241 VideoLogInfo("[ERR]");
249 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
250 if(nTmpPlayerType != MP_STREAMING_PLAYER)
252 if(pProgressAdjustCheckTimer) {
253 ecore_timer_del(pProgressAdjustCheckTimer);
254 pProgressAdjustCheckTimer = NULL;
257 if(pProgressAdjustRunTimer) {
258 ecore_timer_del(pProgressAdjustRunTimer);
259 pProgressAdjustRunTimer = NULL;
262 pProgressAdjustCheckTimer = ecore_timer_add(PROGRESS_ADJUSTMENT_TIME_INTERVAL,
263 MpVideoProgressbarAdjustmentTimerCb, (void *)pUserData);
267 MpVideoProgressbarDeleteTimer();
269 VideoAppData *pAppData = (VideoAppData *)pUserData;
270 Evas_Event_Mouse_Up *ev = event_info;
271 Evas_Object *progressbar = obj;
272 int w = 0, current = 0;
280 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
281 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
282 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
283 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
284 nDownPosX = ev->canvas.x;
285 nOldPosX = ev->canvas.x;;
286 current = ev->canvas.x - term;
290 else if (current > w)
293 ratio = (double)current / w;
295 nDragPosition = ratio * pAppData->nDuration;
296 pAppData->nSetPosition = nDragPosition;
298 if(nTmpPlayerType != MP_STREAMING_PLAYER)
300 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
301 pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
302 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
303 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
304 pAppData->nSeekPlayerState = MP_PLAYER_STATE_PAUSE;
306 pAppData->bSeekComplete = FALSE;
307 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
310 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
311 pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
312 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
313 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
317 MpVideoProgressbarUpdateValue(pUserData);
321 static void MpVideoProgressbarUpCb(void *pUserData, Evas * e, Evas_Object *obj,
327 VideoLogInfo("[ERR]");
332 VideoLogInfo("[ERR]");
341 VideoAppData *pAppData = (VideoAppData *)pUserData;
343 if(pProgressAdjustRunTimer) {
344 ecore_timer_del(pProgressAdjustRunTimer);
345 pProgressAdjustRunTimer = NULL;
348 if(pProgressAdjustCheckTimer) {
349 ecore_timer_del(pProgressAdjustCheckTimer);
350 pProgressAdjustCheckTimer = NULL;
353 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
354 if(nTmpPlayerType != MP_STREAMING_PLAYER)
356 if(bIsAdjustmentMode) {
357 bIsAdjustmentMode = FALSE;
358 MpVideoProgressbarSetAdjustmentMode(bIsAdjustmentMode);
360 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
362 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
363 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
364 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
365 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
366 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
373 Evas_Event_Mouse_Up *ev = event_info;
374 Evas_Object *progressbar = obj;
375 int w = 0, current = 0;
383 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
384 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
385 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
387 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
388 current = ev->canvas.x - term;
393 else if (current > w)
396 ratio = (double)current / w;
398 pAppData->nSetPosition = (int)pAppData->nDuration * ratio;
400 if (pAppData->nSetPosition > pAppData->nDuration)
401 pAppData->nSetPosition = pAppData->nDuration;
403 if (pAppData->nSetPosition < 0)
404 pAppData->nSetPosition = 0;
406 if(nTmpPlayerType != MP_STREAMING_PLAYER)
408 if(!pAppData->bSeekComplete)
410 pAppData->nSeekPosition = pAppData->nSetPosition;
414 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
415 MpVideoProgressbarCreateTimer((void *)pAppData);
418 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
419 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
420 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
421 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
422 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
427 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
428 MpVideoProgressbarCreateTimer((void *)pAppData);
430 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
431 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
432 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
433 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
438 static void MpVideoProgressbarMoveCb(void *pUserData, Evas * e,
439 Evas_Object *obj, void *event_info)
444 VideoLogInfo("[ERR]");
449 VideoLogInfo("[ERR]");
456 VideoAppData *pAppData = (VideoAppData *)pUserData;
457 Evas_Event_Mouse_Up *ev = event_info;
458 Evas_Object *progressbar = obj;
459 int w = 0, current = 0;
467 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
468 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
469 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
471 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
472 if(bIsAdjustmentMode) {
473 if((nOldPosX + PROGRESS_ADJUSTMENT_MODE_LIMIT) < ev->canvas.x) {
474 if(bPrevAdjustment == TRUE) {
475 if(pProgressAdjustRunTimer) {
476 ecore_timer_del(pProgressAdjustRunTimer);
477 pProgressAdjustRunTimer = NULL;
480 bPrevAdjustment = FALSE;
481 nOldPosX = ev->canvas.x;
483 else if((nOldPosX - PROGRESS_ADJUSTMENT_MODE_LIMIT) > ev->canvas.x) {
484 if(bPrevAdjustment == FALSE) {
485 if(pProgressAdjustRunTimer) {
486 ecore_timer_del(pProgressAdjustRunTimer);
487 pProgressAdjustRunTimer = NULL;
490 bPrevAdjustment = TRUE;
491 nOldPosX = ev->canvas.x;
494 if(pProgressAdjustRunTimer == NULL) {
495 pProgressAdjustRunTimer = ecore_timer_add(PROGRESS_ADJUSTMENT_RUN_INTERVAL,
496 MpVideoProgressbarAdjustmentRunTimerCb, (void *)pAppData);
502 if(((nDownPosX + PROGRESS_ADJUSTMENT_MOVE_LIMIT) < ev->canvas.x ) ||
503 ((nDownPosX - PROGRESS_ADJUSTMENT_MOVE_LIMIT) > ev->canvas.x)) {
504 VideoLogInfo("Adjustment Off");
506 if(pProgressAdjustCheckTimer) {
507 ecore_timer_del(pProgressAdjustCheckTimer);
508 pProgressAdjustCheckTimer = NULL;
511 if(pProgressAdjustRunTimer) {
512 ecore_timer_del(pProgressAdjustRunTimer);
513 pProgressAdjustRunTimer = NULL;
516 current = ev->canvas.x - term;
521 else if (current > w)
524 ratio = (double)current / w;
525 nDragPosition = ratio * pAppData->nDuration;
526 pAppData->nSetPosition = nDragPosition;
527 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
528 if(nTmpPlayerType != MP_STREAMING_PLAYER)
530 if(pAppData->bSeekComplete) {
531 pAppData->bSeekComplete = FALSE;
532 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
535 MpVideoProgressbarUpdateValue(pUserData);
542 void MpVideoProgressbarSetSkipEvent(bool bSkip)
546 bIsEventSkip = bSkip;
549 void *MpVideoProgressbarGetEdjHandle(void)
553 if (pProgressbarEdj) {
554 return (void *)pProgressbarEdj;
556 VideoLogInfo("Progressbar edj handle is null.");
561 void *MpVideoProgressbarInit(void *pUserData)
566 VideoLogInfo("[ERR]");
570 VideoAppData *pAppData = (VideoAppData *)pUserData;
572 Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow);
574 pProgressbarEdj = (Evas_Object *)MpUtilLoadEdjFile(pMainWindowEvas,
575 VIDEO_PLAYER_PROGRESS_EDJ,
578 evas_object_event_callback_add(pProgressbarEdj,
579 EVAS_CALLBACK_MOUSE_DOWN,
580 MpVideoProgressbarDownCb, pAppData);
582 evas_object_event_callback_add(pProgressbarEdj,
583 EVAS_CALLBACK_MOUSE_UP,
584 MpVideoProgressbarUpCb, pAppData);
586 evas_object_event_callback_add(pProgressbarEdj,
587 EVAS_CALLBACK_MOUSE_MOVE,
588 MpVideoProgressbarMoveCb, pAppData);
590 MpVideoProgressbarUpdateDurationTime("--:--:--");
592 return (void *)pProgressbarEdj;
595 void MpVideoProgressbarDestroy(void)
599 if (pProgressbarEdj) {
600 evas_object_del(pProgressbarEdj);
601 pProgressbarEdj = NULL;
604 if (pProgressbarTimer) {
605 ecore_timer_del(pProgressbarTimer);
606 pProgressbarTimer = NULL;
609 if(pProgressAdjustCheckTimer) {
610 ecore_timer_del(pProgressAdjustCheckTimer);
611 pProgressAdjustCheckTimer = NULL;
614 if(pProgressAdjustRunTimer) {
615 ecore_timer_del(pProgressAdjustRunTimer);
616 pProgressAdjustRunTimer = NULL;
619 bIsEventSkip = FALSE;
623 void MpVideoProgressbarCreateTimer(void *pUserData)
628 VideoLogInfo("[ERR]");
632 VideoAppData *pAppData = (VideoAppData *)pUserData;
634 if (pProgressbarTimer) {
635 ecore_timer_del(pProgressbarTimer);
636 pProgressbarTimer = NULL;
639 if(pProgressAdjustCheckTimer) {
640 ecore_timer_del(pProgressAdjustCheckTimer);
641 pProgressAdjustCheckTimer = NULL;
644 if(pProgressAdjustRunTimer) {
645 ecore_timer_del(pProgressAdjustRunTimer);
646 pProgressAdjustRunTimer = NULL;
649 double nPlayedRatio = 0.0;
650 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
652 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
654 nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
655 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
657 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
658 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
660 pProgressbarTimer = ecore_timer_add(0.3, MpVideoProgressbarTimerCb, (void *)pAppData);
663 void MpVideoProgressbarDeleteTimer(void)
667 if (pProgressbarTimer) {
668 ecore_timer_del(pProgressbarTimer);
669 pProgressbarTimer = NULL;
672 if(pProgressAdjustCheckTimer) {
673 ecore_timer_del(pProgressAdjustCheckTimer);
674 pProgressAdjustCheckTimer = NULL;
677 if(pProgressAdjustRunTimer) {
678 ecore_timer_del(pProgressAdjustRunTimer);
679 pProgressAdjustRunTimer = NULL;
683 void MpVideoProgressbarUpdateDurationTime(char *szDurationTime)
687 if (!szDurationTime) {
688 VideoLogInfo("Fail to ser duration time");
692 edje_object_part_text_set(pProgressbarEdj, "progress.txt.total",
696 void MpVideoProgressbarBeginOfStream(void *pUserData)
701 VideoLogInfo("[ERR]");
705 VideoAppData *pAppData = (VideoAppData *)pUserData;
707 MpVideoProgressbarDeleteTimer();
709 pAppData->nCurPosition = 0;
710 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
711 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");
713 MpVideoProgressbarCreateTimer(pUserData);
716 void MpVideoProgressbarReset(void *pUserData)
721 VideoLogInfo("[ERR]");
725 MpVideoProgressbarDeleteTimer();
727 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
728 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");