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;
           }

-- 


Reply via email to