devilhorns pushed a commit to branch master. http://git.enlightenment.org/apps/express.git/commit/?id=fd8e9efa2bf049aab9d63243b4e10c30cc677894
commit fd8e9efa2bf049aab9d63243b4e10c30cc677894 Author: Chris Michael <cp.mich...@samsung.com> Date: Wed Aug 12 12:26:07 2015 -0400 express: Start on media support for movies Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/bin/media.c | 285 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 277 insertions(+), 8 deletions(-) diff --git a/src/bin/media.c b/src/bin/media.c index 25d7a4d..e020d70 100644 --- a/src/bin/media.c +++ b/src/bin/media.c @@ -33,6 +33,8 @@ struct _Media Ecore_Timer *anim_tmr; Ecore_Timer *smooth_tmr; + Ecore_Job *restart_job; + Media_Type type; struct @@ -44,6 +46,7 @@ struct _Media Eina_Bool nosmooth : 1; Eina_Bool downloading : 1; Eina_Bool queued : 1; + Eina_Bool pos_drag : 1; }; static Evas_Smart *_smart = NULL; @@ -581,6 +584,269 @@ _smooth_handler(Evas_Object *obj) } static void +_mov_type_calc(Media *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + if (!sd) return; + + evas_object_move(sd->o_ctrl, x, y); + evas_object_resize(sd->o_ctrl, w, h); + + emotion_object_size_get(sd->o_img, &(sd->iw), &(sd->ih)); + if ((w <= 0) || (h <= 0) || (sd->iw <= 0) || (sd->ih <= 0)) + { + w = 1; + h = 1; + } + else + { + int iw = 1, ih = 1; + double ratio; + + ratio = emotion_object_ratio_get(sd->o_img); + if (ratio > 0.0) sd->iw = (sd->ih * ratio) + 0.5; + else ratio = (double)sd->iw / (double)sd->ih; + + if ((sd->mode & MEDIA_SIZE_MASK) == MEDIA_BG) + { + iw = w; + ih = w / ratio; + if (ih < h) + { + ih = h; + iw = h * ratio; + if (iw < w) iw = w; + } + } + else if ((sd->mode & MEDIA_SIZE_MASK) == MEDIA_POP) + { + iw = w; + ih = w / ratio; + if (ih > h) + { + ih = h; + iw = h * ratio; + if (iw > w) iw = w; + } + } + else if ((sd->mode & MEDIA_SIZE_MASK) == MEDIA_STRETCH) + { + iw = w; + ih = h; + } + x += ((w - iw) / 2); + y += ((h - ih) / 2); + w = iw; + h = ih; + } + + evas_object_move(sd->o_img, x, y); + evas_object_resize(sd->o_img, w, h); +} + +static void +_mov_cb_frame_decode(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Media *sd; + Evas_Coord x, y, w, h; + double len, pos; + + if (!(sd = evas_object_smart_data_get(data))) return; + + evas_object_geometry_get(data, &x, &y, &w, &h); + evas_object_show(sd->o_img); + evas_object_show(sd->o_clip); + + _mov_type_calc(sd, x, y, w, h); + + if (sd->pos_drag) return; + + len = emotion_object_play_length_get(sd->o_img); + pos = emotion_object_position_get(sd->o_img); + pos /= len; + + edje_object_part_drag_value_set(sd->o_ctrl, "express.posdrag", pos, pos); +} + +static void +_mov_cb_frame_resize(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Media *sd; + Evas_Coord x, y, w, h; + + if (!(sd = evas_object_smart_data_get(data))) return; + evas_object_geometry_get(data, &x, &y, &w, &h); + _mov_type_calc(sd, x, y, w, h); +} + +static void +_mov_cb_restart(void *data) +{ + Media *sd; + + if (!(sd = evas_object_smart_data_get(data))) return; + sd->restart_job = NULL; + emotion_object_position_set(sd->o_img, 0.0); + emotion_object_play_set(sd->o_img, EINA_TRUE); +} + +static void +_mov_cb_decode_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Media *sd; + + if (!(sd = evas_object_smart_data_get(data))) return; + if (sd->restart_job) ecore_job_del(sd->restart_job); + sd->restart_job = ecore_job_add(_mov_cb_restart, data); + evas_object_smart_callback_call(data, "loop", NULL); +} + +/* static void */ +/* _mov_cb_progress(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) */ +/* { */ + +/* } */ + +static void +_mov_cb_play(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + _media_play_set(data, EINA_TRUE); +} + +static void +_mov_cb_pause(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + _media_play_set(data, EINA_FALSE); +} + +static void +_mov_cb_stop(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + _media_stop(data); +} + +static void +_mov_cb_vol(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + Media *sd; + double vx, vy; + + if (!(sd = evas_object_smart_data_get(data))) return; + + edje_object_part_drag_value_get(sd->o_ctrl, "express.voldrag", &vx, &vy); + _media_volume_set(data, vx + vy); +} + +static void +_mov_cb_pos_drag_start(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + Media *sd; + double vx, vy; + + if (!(sd = evas_object_smart_data_get(data))) return; + + sd->pos_drag = EINA_TRUE; + edje_object_part_drag_value_get(sd->o_ctrl, "express.posdrag", &vx, &vy); + _media_position_set(data, vx + vy); +} + +static void +_mov_cb_pos_drag_stop(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + Media *sd; + double pos, len; + + if (!(sd = evas_object_smart_data_get(data))) return; + if (!sd->pos_drag) return; + + sd->pos_drag = EINA_FALSE; + len = emotion_object_play_length_get(sd->o_img); + pos = emotion_object_position_get(sd->o_img); + pos /= len; + edje_object_part_drag_value_set(sd->o_ctrl, "express.posdrag", pos, pos); +} + +static void +_mov_cb_pos(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + Media *sd; + double vx, vy; + + if (!(sd = evas_object_smart_data_get(data))) return; + + edje_object_part_drag_value_get(sd->o_ctrl, "express.posdrag", &vx, &vy); + _media_position_set(data, vx + vy); +} + +static void +_mov_type_init(Evas_Object *obj) +{ + Media *sd; + double vol; + char *modules[] = { NULL, "gstreamer", "xine", "vlc", "gstreamer1" }; + char *mod = NULL; + + if (!(sd = evas_object_smart_data_get(obj))) return; + + emotion_init(); + + sd->o_img = emotion_object_add(evas_object_evas_get(obj)); + + if ((_ex_cfg->video.module >= 0) && + (_ex_cfg->video.module < (int)EINA_C_ARRAY_LENGTH(modules))) + mod = modules[_ex_cfg->video.module]; + + if (!emotion_object_init(sd->o_img, mod)) + { + ERR("Could not initialize emotion module: %s", mod); + evas_object_del(sd->o_img); + sd->o_img = NULL; + return; + } + + evas_object_smart_callback_add(sd->o_img, "frame_decode", + _mov_cb_frame_decode, obj); + evas_object_smart_callback_add(sd->o_img, "frame_resize", + _mov_cb_frame_resize, obj); + evas_object_smart_callback_add(sd->o_img, "decode_stop", + _mov_cb_decode_stop, obj); + + emotion_object_file_set(sd->o_img, sd->realf); + if (((sd->mode & MEDIA_OPTIONS_MASK) & MEDIA_RECOVER) + && (sd->type == MEDIA_TYPE_MOV) && (sd->o_img)) + emotion_object_last_position_load(sd->o_img); + else + _media_position_set(obj, 0.0); + + evas_object_smart_member_add(sd->o_img, obj); + evas_object_clip_set(sd->o_img, sd->o_clip); + evas_object_raise(sd->o_event); + + sd->o_ctrl = edje_object_add(evas_object_evas_get(obj)); + _theme_apply(sd->o_ctrl, "express/mediactrl"); + vol = emotion_object_audio_volume_get(sd->o_img); + edje_object_part_drag_value_set(sd->o_ctrl, "express.voldrag", vol, vol); + + edje_object_signal_callback_add(sd->o_ctrl, "play", "", _mov_cb_play, obj); + edje_object_signal_callback_add(sd->o_ctrl, "pause", "", _mov_cb_pause, obj); + edje_object_signal_callback_add(sd->o_ctrl, "stop", "", _mov_cb_stop, obj); + edje_object_signal_callback_add(sd->o_ctrl, "pos,drag,start", "", + _mov_cb_pos_drag_start, obj); + edje_object_signal_callback_add(sd->o_ctrl, "pos,drag,stop", "", + _mov_cb_pos_drag_stop, obj); + edje_object_signal_callback_add(sd->o_ctrl, "pos,drag", "", + _mov_cb_pos, obj); + edje_object_signal_callback_add(sd->o_ctrl, "vol,drag", "", + _mov_cb_vol, obj); + + evas_object_clip_set(sd->o_ctrl, sd->o_clip); + evas_object_show(sd->o_ctrl); + + _media_play_set(obj, EINA_TRUE); + if (_ex_cfg->video.muted) _media_mute_set(obj, EINA_TRUE); + if (_ex_cfg->video.visualized) _media_visualize_set(obj, EINA_TRUE); +} + +static void _media_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) { Media *sd; @@ -677,9 +943,9 @@ _media_cb_compl(void *data, int type EINA_UNUSED, void *event) /* case MEDIA_TYPE_EDJE: */ /* _edje_type_init(obj); */ /* break; */ - /* case MEDIA_TYPE_MOV: */ - /* _mov_type_init(obj); */ - /* break; */ + case MEDIA_TYPE_MOV: + _mov_type_init(obj); + break; default: break; } @@ -746,6 +1012,8 @@ _smart_del(Evas_Object *obj) if (sd->anim_tmr) ecore_timer_del(sd->anim_tmr); if (sd->smooth_tmr) ecore_timer_del(sd->smooth_tmr); + if (sd->restart_job) ecore_job_del(sd->restart_job); + if ((et_client) && (sd->et_req)) ethumb_client_thumb_async_cancel(et_client, sd->et_req); if (sd->queued) et_queue = eina_list_remove(et_queue, obj); @@ -794,9 +1062,9 @@ _smart_calculate(Evas_Object *obj) /* case MEDIA_TYPE_EDJE: */ /* _edje_type_calc(sd, ox, oy, ow, oh); */ /* break; */ - /* case MEDIA_TYPE_MOV: */ - /* _mov_type_calc(sd, ox, oy, ow, oh); */ - /* break; */ + case MEDIA_TYPE_MOV: + _mov_type_calc(sd, ox, oy, ow, oh); + break; case MEDIA_TYPE_THUMB: _thumb_type_calc(sd, ox, oy, ow, oh); break; @@ -999,8 +1267,9 @@ _media_add(Evas_Object *parent, const char *src, int mode, Media_Type type) break; /* case MEDIA_TYPE_EDJE: */ /* break; */ - /* case MEDIA_TYPE_MOV: */ - /* break; */ + case MEDIA_TYPE_MOV: + if (!sd->url) _mov_type_init(obj); + break; default: break; } --