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 20
34 #define PROGRESS_ADJUSTMENT_MODE_LIMIT 20
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, "*");
66 static void MpVideoProgressbarSetPointerVisible(bool bVisible)
71 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_POINTER_SHOW, "*");
74 edje_object_signal_emit(pProgressbarEdj, SIGNAL_PROGRESS_POINTER_HIDE, "*");
81 static Eina_Bool MpVideoProgressbarUpdateValue(void *pUserData)
86 VideoLogInfo("[ERR] No exist userdata.");
90 VideoAppData *pAppData = (VideoAppData *)pUserData;
92 double nPlayedRatio = 0.0;
93 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
95 nPlayedRatio = ((double)nDragPosition / (double)pAppData->nDuration);
97 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT,
98 PLAY_TIME_ARGS(nDragPosition / 1000));
100 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing",
103 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played",
106 if(bIsAdjustmentMode) {
107 edje_object_part_text_set(pProgressbarEdj, "progress.adjustment.txt",
114 static void MpVideoProgressbarUpdateBufferingValue(void *pUserData)
119 VideoLogInfo("[ERR] No exist userdata.");
123 VideoAppData *pAppData = (VideoAppData *)pUserData;
125 double buffering_ratio = 0.0;
127 VideoAppCtrlCallbackFunc.VideoAppCtrlGetBufferingPosition(pAppData);
129 buffering_ratio = ((double)pAppData->nBufferingPosition / (double)100);
131 //VideoLogInfo("%d:%lf", pAppData->nBufferingPosition, buffering_ratio);
133 edje_object_part_drag_value_set(pProgressbarEdj, "progress.buffering",
134 buffering_ratio, 0.0);
140 static Eina_Bool MpVideoProgressbarTimerCb(void *pUserData)
142 /* VideoLogInfo(""); */
145 VideoLogInfo("[ERR] No exist userdata.");
149 VideoAppData *pAppData = (VideoAppData *)pUserData;
151 if (pAppData->nDuration < 1) {
152 VideoLogInfo("Try to update duration time.");
153 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReqDurationTime(pAppData);
157 if (bIsEventSkip || bIsDrag)
160 double nPlayedRatio = 0.0;
161 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
163 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
165 nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
166 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
168 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
169 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
171 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
172 if(nTmpPlayerType == MP_STREAMING_PLAYER)
174 MpVideoProgressbarUpdateBufferingValue(pUserData);
180 static Eina_Bool MpVideoProgressbarAdjustmentTimerCb(void *pUserData)
185 VideoLogError("[ERR] No exist userdata.");
188 VideoAppData *pAppData = (VideoAppData *)pUserData;
190 bIsAdjustmentMode = TRUE;
192 VideoLogInfo("%d, %d",pAppData->nCurPosition , nDragPosition);
194 pAppData->nSetPosition = nDragPosition;
195 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
197 MpVideoProgressbarSetAdjustmentMode(bIsAdjustmentMode);
198 MpVideoProgressbarUpdateValue(pUserData);
202 static Eina_Bool MpVideoProgressbarAdjustmentRunTimerCb(void *pUserData)
207 VideoLogInfo("[ERR] No exist userdata.");
211 VideoAppData *pAppData = (VideoAppData *)pUserData;
214 if(bPrevAdjustment) {
215 pAppData->nSetPosition = nDragPosition - 1000;
218 pAppData->nSetPosition = nDragPosition + 1000;
221 if (pAppData->nSetPosition < 0) {
222 pAppData->nSetPosition = 0;
225 if (pAppData->nSetPosition > pAppData->nDuration) {
226 pAppData->nSetPosition = pAppData->nDuration;
229 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
231 nDragPosition = pAppData->nSetPosition;
233 MpVideoProgressbarUpdateValue((void *)pAppData);
242 static void MpVideoProgressbarDownCb(void *pUserData, Evas * e,
243 Evas_Object *obj, void *event_info)
248 VideoLogInfo("[ERR]");
253 VideoLogInfo("[ERR]");
260 MpVideoProgressbarDeleteTimer();
261 MpVideoProgressbarSetPointerVisible(TRUE);
263 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
264 if(nTmpPlayerType != MP_STREAMING_PLAYER)
266 if(pProgressAdjustCheckTimer) {
267 ecore_timer_del(pProgressAdjustCheckTimer);
268 pProgressAdjustCheckTimer = NULL;
271 if(pProgressAdjustRunTimer) {
272 ecore_timer_del(pProgressAdjustRunTimer);
273 pProgressAdjustRunTimer = NULL;
276 pProgressAdjustCheckTimer = ecore_timer_add(PROGRESS_ADJUSTMENT_TIME_INTERVAL,
277 MpVideoProgressbarAdjustmentTimerCb, (void *)pUserData);
282 VideoAppData *pAppData = (VideoAppData *)pUserData;
283 Evas_Event_Mouse_Up *ev = event_info;
284 Evas_Object *progressbar = obj;
285 int w = 0, current = 0;
293 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
294 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
295 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
296 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
297 nDownPosX = ev->canvas.x;
298 nOldPosX = ev->canvas.x;;
299 current = ev->canvas.x - term;
303 else if (current > w)
306 ratio = (double)current / w;
308 nDragPosition = ratio * pAppData->nDuration;
309 pAppData->nSetPosition = nDragPosition;
311 if(nTmpPlayerType != MP_STREAMING_PLAYER)
313 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
314 pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
315 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
316 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
317 pAppData->nSeekPlayerState = MP_PLAYER_STATE_PAUSE;
319 pAppData->bSeekComplete = FALSE;
320 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
323 if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
324 pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
325 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
326 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
330 MpVideoProgressbarUpdateValue(pUserData);
334 static void MpVideoProgressbarUpCb(void *pUserData, Evas * e, Evas_Object *obj,
340 VideoLogInfo("[ERR]");
345 VideoLogInfo("[ERR]");
354 VideoAppData *pAppData = (VideoAppData *)pUserData;
355 MpVideoProgressbarSetPointerVisible(FALSE);
357 if(pProgressAdjustRunTimer) {
358 ecore_timer_del(pProgressAdjustRunTimer);
359 pProgressAdjustRunTimer = NULL;
362 if(pProgressAdjustCheckTimer) {
363 ecore_timer_del(pProgressAdjustCheckTimer);
364 pProgressAdjustCheckTimer = NULL;
366 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
367 if(nTmpPlayerType != MP_STREAMING_PLAYER)
369 if(bIsAdjustmentMode) {
370 bIsAdjustmentMode = FALSE;
371 MpVideoProgressbarSetAdjustmentMode(bIsAdjustmentMode);
373 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
375 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
376 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
377 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
378 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
379 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
386 Evas_Event_Mouse_Up *ev = event_info;
387 Evas_Object *progressbar = obj;
388 int w = 0, current = 0;
396 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
397 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
398 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
400 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
401 current = ev->canvas.x - term;
406 else if (current > w)
409 ratio = (double)current / w;
411 pAppData->nSetPosition = (int)pAppData->nDuration * ratio;
413 if (pAppData->nSetPosition > pAppData->nDuration)
414 pAppData->nSetPosition = pAppData->nDuration;
416 if (pAppData->nSetPosition < 0)
417 pAppData->nSetPosition = 0;
419 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
421 MpVideoProgressbarCreateTimer((void *)pAppData);
423 if(nTmpPlayerType != MP_STREAMING_PLAYER)
426 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
427 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
428 //pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
429 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
430 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
433 if(!pAppData->bSeekComplete)
435 pAppData->nSeekPosition = pAppData->nSetPosition;
436 if((pAppData->nCurPosition < pAppData->nSeekPosition + 5000) &&
437 (pAppData->nCurPosition > pAppData->nSeekPosition - 5000))
439 VideoLogError("Skip for same position");
440 pAppData->nSeekPosition = 0;
445 if((pAppData->nCurPosition < pAppData->nSetPosition + 5000) &&
446 (pAppData->nCurPosition > pAppData->nSetPosition - 5000))
448 VideoLogError("Skip for same position");
452 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
458 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
459 MpVideoProgressbarCreateTimer((void *)pAppData);
461 if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
462 pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
463 pAppData->nSeekPlayerState = MP_PLAYER_STATE_RESUME;
464 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
469 static void MpVideoProgressbarMoveCb(void *pUserData, Evas * e,
470 Evas_Object *obj, void *event_info)
475 VideoLogInfo("[ERR]");
480 VideoLogInfo("[ERR]");
484 if (bIsEventSkip || bIsDrag == FALSE)
487 VideoAppData *pAppData = (VideoAppData *)pUserData;
488 Evas_Event_Mouse_Up *ev = event_info;
489 Evas_Object *progressbar = obj;
490 int w = 0, current = 0;
498 ecore_x_window_size_get(ecore_x_window_root_first_get(),&width, &height);
499 term = PROGRESS_BAR_START_TERM * width/DEFAULT_SCALE_WIDTH;
500 w_term = PROGRESS_BAR_WIDTH_TERM * width/DEFAULT_SCALE_WIDTH;
502 evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
503 if(bIsAdjustmentMode) {
504 if((nOldPosX + PROGRESS_ADJUSTMENT_MODE_LIMIT) < ev->canvas.x) {
505 if(bPrevAdjustment == TRUE) {
506 if(pProgressAdjustRunTimer) {
507 ecore_timer_del(pProgressAdjustRunTimer);
508 pProgressAdjustRunTimer = NULL;
511 bPrevAdjustment = FALSE;
512 nOldPosX = ev->canvas.x;
514 else if((nOldPosX - PROGRESS_ADJUSTMENT_MODE_LIMIT) > ev->canvas.x) {
515 if(bPrevAdjustment == FALSE) {
516 if(pProgressAdjustRunTimer) {
517 ecore_timer_del(pProgressAdjustRunTimer);
518 pProgressAdjustRunTimer = NULL;
521 bPrevAdjustment = TRUE;
522 nOldPosX = ev->canvas.x;
525 if(pProgressAdjustRunTimer == NULL) {
526 pProgressAdjustRunTimer = ecore_timer_add(PROGRESS_ADJUSTMENT_RUN_INTERVAL,
527 MpVideoProgressbarAdjustmentRunTimerCb, (void *)pAppData);
533 if(((nDownPosX + PROGRESS_ADJUSTMENT_MOVE_LIMIT) < ev->canvas.x ) ||
534 ((nDownPosX - PROGRESS_ADJUSTMENT_MOVE_LIMIT) > ev->canvas.x)) {
535 VideoLogInfo("Adjustment Off");
537 if(pProgressAdjustCheckTimer) {
538 ecore_timer_del(pProgressAdjustCheckTimer);
539 pProgressAdjustCheckTimer = NULL;
542 if(pProgressAdjustRunTimer) {
543 ecore_timer_del(pProgressAdjustRunTimer);
544 pProgressAdjustRunTimer = NULL;
547 current = ev->canvas.x - term;
552 else if (current > w)
555 ratio = (double)current / w;
556 nDragPosition = ratio * pAppData->nDuration;
557 pAppData->nSetPosition = nDragPosition;
558 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerTypeWithoutLog();
559 if(nTmpPlayerType != MP_STREAMING_PLAYER)
561 if(pAppData->bSeekComplete) {
562 pAppData->bSeekComplete = FALSE;
563 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
566 MpVideoProgressbarUpdateValue(pUserData);
573 void MpVideoProgressbarSetSkipEvent(bool bSkip)
577 bIsEventSkip = bSkip;
580 void *MpVideoProgressbarGetEdjHandle(void)
584 if (pProgressbarEdj) {
585 return (void *)pProgressbarEdj;
587 VideoLogInfo("Progressbar edj handle is null.");
592 void *MpVideoProgressbarInit(void *pUserData)
597 VideoLogInfo("[ERR]");
601 VideoAppData *pAppData = (VideoAppData *)pUserData;
603 Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow);
605 pProgressbarEdj = (Evas_Object *)MpUtilLoadEdjFile(pMainWindowEvas,
606 VIDEO_PLAYER_PROGRESS_EDJ,
609 evas_object_event_callback_add(pProgressbarEdj,
610 EVAS_CALLBACK_MOUSE_DOWN,
611 MpVideoProgressbarDownCb, pAppData);
613 evas_object_event_callback_add(pProgressbarEdj,
614 EVAS_CALLBACK_MOUSE_UP,
615 MpVideoProgressbarUpCb, pAppData);
617 evas_object_event_callback_add(pProgressbarEdj,
618 EVAS_CALLBACK_MOUSE_MOVE,
619 MpVideoProgressbarMoveCb, pAppData);
621 MpVideoProgressbarUpdateDurationTime("--:--:--");
623 return (void *)pProgressbarEdj;
626 void MpVideoProgressbarDestroy(void)
630 if (pProgressbarEdj) {
631 evas_object_del(pProgressbarEdj);
632 pProgressbarEdj = NULL;
635 if (pProgressbarTimer) {
636 ecore_timer_del(pProgressbarTimer);
637 pProgressbarTimer = NULL;
640 if(pProgressAdjustCheckTimer) {
641 ecore_timer_del(pProgressAdjustCheckTimer);
642 pProgressAdjustCheckTimer = NULL;
645 if(pProgressAdjustRunTimer) {
646 ecore_timer_del(pProgressAdjustRunTimer);
647 pProgressAdjustRunTimer = NULL;
650 bIsEventSkip = FALSE;
654 void MpVideoProgressbarCreateTimer(void *pUserData)
659 VideoLogInfo("[ERR]");
663 VideoAppData *pAppData = (VideoAppData *)pUserData;
665 if (pProgressbarTimer) {
666 ecore_timer_del(pProgressbarTimer);
667 pProgressbarTimer = NULL;
673 double nPlayedRatio = 0.0;
674 char szPlayingTime[PLAY_TIME_LENGTH] = { 0, };
676 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
678 nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
679 snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
681 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
682 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
684 pProgressbarTimer = ecore_timer_add(0.3, MpVideoProgressbarTimerCb, (void *)pAppData);
687 void MpVideoProgressbarDeleteTimer(void)
691 if (pProgressbarTimer) {
692 ecore_timer_del(pProgressbarTimer);
693 pProgressbarTimer = NULL;
696 if(pProgressAdjustCheckTimer) {
697 ecore_timer_del(pProgressAdjustCheckTimer);
698 pProgressAdjustCheckTimer = NULL;
701 if(pProgressAdjustRunTimer) {
702 ecore_timer_del(pProgressAdjustRunTimer);
703 pProgressAdjustRunTimer = NULL;
707 void MpVideoProgressbarUpdateDurationTime(char *szDurationTime)
711 if (!szDurationTime) {
712 VideoLogInfo("Fail to ser duration time");
716 edje_object_part_text_set(pProgressbarEdj, "progress.txt.total",
720 void MpVideoProgressbarBeginOfStream(void *pUserData)
725 VideoLogInfo("[ERR]");
729 VideoAppData *pAppData = (VideoAppData *)pUserData;
731 MpVideoProgressbarDeleteTimer();
733 pAppData->nCurPosition = 0;
734 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
735 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");
737 MpVideoProgressbarCreateTimer(pUserData);
740 void MpVideoProgressbarReset(void *pUserData)
745 VideoLogInfo("[ERR]");
749 MpVideoProgressbarDeleteTimer();
751 edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
752 edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");