apply FSL(Flora Software License)
[apps/core/preloaded/video-player.git] / src / mp-video-progressbar.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  * 
8  *     http://www.tizenopensource.org/license
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
19
20 #include "mp-util.h"
21 #include "mp-video-log.h"
22 #include "video-player.h"
23 #include "mp-video-value-define.h"
24 #include "mp-video-progressbar.h"
25
26 static Evas_Object *pProgressbarEdj = NULL;
27 Ecore_Timer *pProgressbarTimer = NULL;
28
29 static bool bIsEventSkip = FALSE;
30 static bool bIsDrag = FALSE;
31 static int nDragPosition = 0;
32
33 #define PROGRESS_BAR_TERM                       40
34
35 /*
36  * Internal function
37  */
38 static Eina_Bool MpVideoProgressbarUpdateValue(void *pUserData)
39 {
40         if (!pUserData) {
41                 VideoLogInfo("[ERR] No exist userdata.");
42                 return EINA_TRUE;
43         }
44
45         VideoAppData *pAppData = (VideoAppData *)pUserData;
46
47         double nPlayedRatio = 0.0;
48         char szPlayingTime[PLAY_TIME_LENGTH] = { 0 };
49
50         nPlayedRatio = ((double)nDragPosition / (double)pAppData->nDuration);
51
52         snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT,
53                  PLAY_TIME_ARGS(nDragPosition / 1000));
54
55         edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing",
56                                         nPlayedRatio, 0.0);
57
58         edje_object_part_text_set(pProgressbarEdj, "progress.txt.played",
59                                   szPlayingTime);
60
61         return EINA_TRUE;
62 }
63
64 static void MpVideoProgressbarUpdateBufferingValue(void *pUserData)
65 {
66         if (!pUserData) {
67                 VideoLogInfo("[ERR] No exist userdata.");
68                 return;
69         }
70
71         VideoAppData *pAppData = (VideoAppData *)pUserData;
72
73         double buffering_ratio = 0.0;
74         pAppData->
75             VideoAppCtrlCallbackFunc.VideoAppCtrlGetBufferingPosition(pAppData);
76
77         buffering_ratio = ((double)pAppData->nBufferingPosition / (double)100);
78
79         edje_object_part_drag_value_set(pProgressbarEdj, "progress.buffering",
80                                         buffering_ratio, 0.0);
81 }
82
83 /*
84  * Callback function.
85  */
86 static Eina_Bool MpVideoProgressbarTimerCb(void *pUserData)
87 {
88
89         if (!pUserData) {
90                 VideoLogInfo("[ERR] No exist userdata.");
91                 return EINA_TRUE;
92         }
93
94         VideoAppData *pAppData = (VideoAppData *)pUserData;
95
96         if (pAppData->nDuration < 1) {
97                 VideoLogInfo("Try to update duration time.");
98                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlReqDurationTime(pAppData);
99                 return EINA_TRUE;
100         }
101
102         if (bIsDrag || bIsEventSkip)
103                 return EINA_TRUE;
104
105         double nPlayedRatio = 0.0;
106         char szPlayingTime[PLAY_TIME_LENGTH] = { 0 };
107
108         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlGetPosition(pAppData);
109
110         nPlayedRatio = ((double)pAppData->nCurPosition / (double)pAppData->nDuration);
111         snprintf(szPlayingTime, PLAY_TIME_LENGTH, "%" PLAY_TIME_FORMAT, PLAY_TIME_ARGS(pAppData->nCurPosition / 1000));
112
113         edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", nPlayedRatio, 0.0);
114         edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", szPlayingTime);
115
116         if (pAppData->nCurPlayerType == MP_STREAMING_PLAYER )
117                 MpVideoProgressbarUpdateBufferingValue(pUserData);
118
119         return EINA_TRUE;
120 }
121
122 static void MpVideoProgressbarDownCb(void *pUserData, Evas * e,
123                                      Evas_Object *obj, void *event_info)
124 {
125         VideoLogInfo("");
126
127         if (!pUserData) {
128                 VideoLogInfo("[ERR]");
129                 return;
130         }
131
132         if (!event_info) {
133                 VideoLogInfo("[ERR]");
134                 return;
135         }
136
137         if (bIsEventSkip)
138                 return;
139
140         VideoAppData *pAppData = (VideoAppData *)pUserData;
141         Evas_Event_Mouse_Up *ev = event_info;
142         Evas_Object *progressbar = obj;
143         int w = 0, current = 0;
144         double ratio = 0.0;
145
146         bIsDrag = TRUE;
147
148         evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
149         current = ev->canvas.x - PROGRESS_BAR_TERM;
150         if (current < 0)
151                 current = 0;
152         else if (current > w)
153                 current = w;
154
155         ratio = (double)current / w;
156
157         if (pAppData->nCurPlayerState == MP_PLAYER_STATE_PLAY ||
158             pAppData->nCurPlayerState == MP_PLAYER_STATE_RESUME) {
159                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
160                 pAppData->nPrePlayerState = MP_PLAYER_STATE_RESUME;
161         }
162
163         nDragPosition = ratio * pAppData->nDuration;
164
165         MpVideoProgressbarUpdateValue(pUserData);
166
167 }
168
169 static void MpVideoProgressbarUpCb(void *pUserData, Evas * e, Evas_Object *obj,
170                                    void *event_info)
171 {
172         VideoLogInfo("");
173
174         if (!pUserData) {
175                 VideoLogInfo("[ERR]");
176                 return;
177         }
178
179         if (!event_info) {
180                 VideoLogInfo("[ERR]");
181                 return;
182         }
183
184         if (bIsEventSkip)
185                 return;
186
187         VideoAppData *pAppData = (VideoAppData *)pUserData;
188         Evas_Event_Mouse_Up *ev = event_info;
189         Evas_Object *progressbar = obj;
190         int w = 0, current = 0;
191         double ratio = 0.0;
192
193         evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
194         current = ev->canvas.x - PROGRESS_BAR_TERM;
195         if (current < 0)
196                 current = 0;
197         else if (current > w)
198                 current = w;
199
200         ratio = (double)current / w;
201
202         pAppData->nSetPosition = (int)pAppData->nDuration * ratio;
203
204         if (pAppData->nSetPosition > pAppData->nDuration)
205                 pAppData->nSetPosition = pAppData->nDuration;
206
207         if (pAppData->nSetPosition < 0)
208                 pAppData->nSetPosition = 0;
209
210         pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlSetPosition(pAppData);
211
212         if (pAppData->nPrePlayerState == MP_PLAYER_STATE_PLAY ||
213             pAppData->nPrePlayerState == MP_PLAYER_STATE_RESUME) {
214                 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
215                 pAppData->nPrePlayerState = MP_PLAYER_STATE_PAUSE;
216         }
217
218         bIsDrag = FALSE;
219 }
220
221 static void MpVideoProgressbarMoveCb(void *pUserData, Evas * e,
222                                      Evas_Object *obj, void *event_info)
223 {
224         VideoLogInfo("");
225
226         if (!pUserData) {
227                 VideoLogInfo("[ERR]");
228                 return;
229         }
230
231         if (!event_info) {
232                 VideoLogInfo("[ERR]");
233                 return;
234         }
235
236         if (bIsEventSkip)
237                 return;
238
239         VideoAppData *pAppData = (VideoAppData *)pUserData;
240         Evas_Event_Mouse_Up *ev = event_info;
241         Evas_Object *progressbar = obj;
242         int w = 0, current = 0;
243         double ratio = 0.0;
244
245         evas_object_geometry_get(progressbar, NULL, NULL, &w, NULL);
246         current = ev->canvas.x - PROGRESS_BAR_TERM;
247         if (current < 0)
248                 current = 0;
249         else if (current > w)
250                 current = w;
251
252         ratio = (double)current / w;
253         nDragPosition = ratio * pAppData->nDuration;
254
255         MpVideoProgressbarUpdateValue(pUserData);
256
257 }
258
259 /*
260  * External function
261  */
262 void MpVideoProgressbarSetSkipEvent(bool bSkip)
263 {
264         VideoLogInfo("");
265
266         bIsEventSkip = bSkip;
267 }
268
269 void *MpVideoProgressbarGetEdjHandle(void)
270 {
271         VideoLogInfo("");
272
273         if (pProgressbarEdj) {
274                 return (void *)pProgressbarEdj;
275         } else {
276                 VideoLogInfo("Progressbar edj handle is null.");
277                 return NULL;
278         }
279 }
280
281 void *MpVideoProgressbarInit(void *pUserData)
282 {
283         VideoLogInfo("");
284
285         if (!pUserData) {
286                 VideoLogInfo("[ERR]");
287                 return NULL;
288         }
289
290         VideoAppData *pAppData = (VideoAppData *)pUserData;
291
292         Evas *pMainWindowEvas = evas_object_evas_get(pAppData->pMainWindow);
293
294         pProgressbarEdj = (Evas_Object *)MpUtilLoadEdjFile(pMainWindowEvas,
295                                                            VIDEO_PLAYER_PROGRESS_EDJ,
296                                                            PROGRESS_EDJ_GROUP);
297
298         evas_object_event_callback_add(pProgressbarEdj,
299                                        EVAS_CALLBACK_MOUSE_DOWN,
300                                        MpVideoProgressbarDownCb, pAppData);
301
302         evas_object_event_callback_add(pProgressbarEdj,
303                                        EVAS_CALLBACK_MOUSE_UP,
304                                        MpVideoProgressbarUpCb, pAppData);
305
306         evas_object_event_callback_add(pProgressbarEdj,
307                                        EVAS_CALLBACK_MOUSE_MOVE,
308                                        MpVideoProgressbarMoveCb, pAppData);
309
310         MpVideoProgressbarUpdateDurationTime("--:--:--");
311
312         return (void *)pProgressbarEdj;
313 }
314
315 void MpVideoProgressbarDestroy(void)
316 {
317         VideoLogInfo("");
318
319         if (pProgressbarEdj) {
320                 evas_object_del(pProgressbarEdj);
321                 pProgressbarEdj = NULL;
322         }
323
324         if (pProgressbarTimer) {
325                 ecore_timer_del(pProgressbarTimer);
326                 pProgressbarTimer = NULL;
327         }
328
329         bIsEventSkip = FALSE;
330         bIsDrag = FALSE;
331         nDragPosition = 0;
332 }
333
334 void MpVideoProgressbarCreateTimer(void *pUserData)
335 {
336         VideoLogInfo("");
337
338         if (!pUserData) {
339                 VideoLogInfo("[ERR]");
340                 return;
341         }
342
343         VideoAppData *pAppData = (VideoAppData *)pUserData;
344
345         if (pProgressbarTimer) {
346                 ecore_timer_del(pProgressbarTimer);
347                 pProgressbarTimer = NULL;
348         }
349
350         pProgressbarTimer = ecore_timer_add(0.3, MpVideoProgressbarTimerCb, (void *)pAppData);
351 }
352
353 void MpVideoProgressbarDeleteTimer(void)
354 {
355         VideoLogInfo("");
356
357         if (pProgressbarTimer) {
358                 ecore_timer_del(pProgressbarTimer);
359                 pProgressbarTimer = NULL;
360         }
361 }
362
363 void MpVideoProgressbarUpdateDurationTime(char *szDurationTime)
364 {
365         VideoLogInfo("");
366
367         if (!szDurationTime) {
368                 VideoLogInfo("Fail to ser duration time");
369                 return;
370         }
371
372         edje_object_part_text_set(pProgressbarEdj, "progress.txt.total",
373                                   szDurationTime);
374 }
375
376 void MpVideoProgressbarBeginOfStream(void *pUserData)
377 {
378         VideoLogInfo("");
379
380         if (!pUserData) {
381                 VideoLogInfo("[ERR]");
382                 return;
383         }
384
385         VideoAppData *pAppData = (VideoAppData *)pUserData;
386
387         MpVideoProgressbarDeleteTimer();
388
389         pAppData->nCurPosition = 0;
390         edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
391         edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");
392
393         MpVideoProgressbarCreateTimer(pUserData);
394 }
395
396 void MpVideoProgressbarReset(void *pUserData)
397 {
398         VideoLogInfo("");
399
400         if (!pUserData) {
401                 VideoLogInfo("[ERR]");
402                 return;
403         }
404
405         MpVideoProgressbarDeleteTimer();
406
407         edje_object_part_drag_value_set(pProgressbarEdj, "progress.playing", 0.0, 0.0);
408         edje_object_part_text_set(pProgressbarEdj, "progress.txt.played", "00:00:00");
409 }
410