express: Start on media support for movies
Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
70b3a178cb
commit
fd8e9efa2b
285
src/bin/media.c
285
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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue