express: Start on media support for movies

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2015-08-12 12:26:07 -04:00
parent 70b3a178cb
commit fd8e9efa2b
1 changed files with 277 additions and 8 deletions

View File

@ -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;
@ -580,6 +583,269 @@ _smooth_handler(Evas_Object *obj)
ecore_timer_add(interval * 10, _unsmooth_timeout, 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)
{
@ -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;
}