summaryrefslogblamecommitdiff
path: root/legacy/emotion/src/bin/emotion_test_main.c
blob: b65f2f47a8a021f19db7fba35d681c94e4e0d3ea (plain) (tree)
1
2
3
4
5
6
7






                                                       











                       



                                      

                              









                                                                

                                                  



                                                                                   




                                      
 
                                      
                                                  




                                 
 




                                                                            
               










                                                                        
 

















                                                                    



                                              




                                                                     

           
                     

                                                                              
      
                          
                 
                                                                       
      
                      
                 
                                                             
      

                                                                            
 














                                                                           
 







                                  

                                   







                           
 







                                                      



                                          
                                                                   

                         














                                   
                                                                            


                                         
                       













                                                                                

                    
 

                                               





                                                                      

                  
 










































                                                

                                                                                       


                                                 

                                                                                       


                                      
                                           
           

                                                   
                 
                                                   



                                      
                                           
           
                                                  
                
                                                      



                                     
                                                      





                                      
                                           
           



                                                                                   



































                                                     






                                               
                                                                        


                              

                                      


                                               
                                           
           
                                 
 
                                                              
                           
                                              



                                   
                                                    
                                                                              
                                       


                





















                                                                           
 
                  
                                                






                                                                         
 
                  
                                                  





                                                                           
 



                        
 







                                                          
 







                                                          
                                                           
 
                          


                                  


                                             

                                                                       








                                                                        






                                                                         
 





















                                                                         
                                            










                                                                          

                                     
 



                                                                            

 






                                                                    

                                         




























                                                                     
                                     

































                                                                       






                                                                                              
 








                                                                                               
 








                                                                                              
 









                                                                                              
              
               
 












                                                                                               
 

                                                      
                 
                                                 
                                           







                                                                                                          
 











                                                                                                         
 








                                                                                                            
 











                                                                                                           
 







                                                                                                    
 



                                              
 








                                                                    
 









                                                                    
                                                        





                       


                                
                                                
            
                                  
                                        





                                                                  
 
 
                                                
 

                                        
 
                                      
 

                                              
                                                                                   







                                                                                  
 


                                                                                      
                                                                                          







                                                                                       
 










                                                                                                            
 
                                                                


                                                           
 








                          
 










                                                  


                           

                        
 
                                        
                                                                



                       


                           
                         
         
 


                                             
                            
 










                                                                  
                                                                                                         







                                         


                                         

                                           
                                      


                                                
                                           
           



                                          



                                                                
            
           

                                                         

           
 
                                            
                                             





                           






                                                                           
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#if defined(HAVE_ECORE_X_H) || defined(HAVE_ECORE_FB_H)

#include <Evas.h>
#include <Ecore.h>
#ifndef FB_ONLY
#include <Ecore_X.h>
#else
#include <Ecore_Fb.h>
#endif
#include <Ecore_Evas.h>
#include <Edje.h>

#include "Emotion.h"

typedef struct _Frame_Data Frame_Data;

struct _Frame_Data
{
   unsigned char moving : 1;
   unsigned char resizing : 1;
   int        button;
   Evas_Coord x, y;
};

static int  main_start(int argc, char **argv);
static void main_stop(void);
static void main_resize(Ecore_Evas *ee);
static int  main_signal_exit(void *data, int ev_type, void *ev);
static void main_delete_request(Ecore_Evas *ee);

static void bg_setup(void);
static void bg_resize(Evas_Coord w, Evas_Coord h);
static void bg_key_down(void *data, Evas * e, Evas_Object * obj, void *event_info);

static Evas_Object *o_bg = NULL;

static double       start_time = 0.0;
static Ecore_Evas  *ecore_evas = NULL;
static Evas        *evas       = NULL;
static int          startw     = 800;
static int          starth     = 600;

static Eina_List   *video_objs = NULL;
static Emotion_Vis  vis        = EMOTION_VIS_NONE;

static int
main_start(int argc, char **argv)
{
   int mode = 0;

   start_time = ecore_time_get();
   if (!ecore_init()) return -1;
   ecore_app_args_set(argc, (const char **)argv);
   ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, main_signal_exit, NULL);
   if (!ecore_evas_init()) return -1;
#ifndef FB_ONLY
     {
        int i;

        for (i = 1; i < argc; i++)
          {
	     if (((!strcmp(argv[i], "-g")) ||
		  (!strcmp(argv[i], "-geometry")) ||
		  (!strcmp(argv[i], "--geometry"))) && (i < (argc - 1)))
	       {
		  int n, w, h;
		  char buf[16], buf2[16];

		  n = sscanf(argv[i +1], "%10[^x]x%10s", buf, buf2);
		  if (n == 2)
		    {
		       w = atoi(buf);
		       h = atoi(buf2);
		       startw = w;
		       starth = h;
		    }
		  i++;
	       }
             else if (!strcmp(argv[i], "-gl"))
               {
		  mode = 1;
               }
             else if (!strcmp(argv[i], "-fb"))
               {
		  mode = 2;
               }
             else if (!strcmp(argv[i], "-xr"))
               {
		  mode = 3;
               }
	     else if ((!strcmp(argv[i], "-vis")) && (i < (argc - 1)))
	       {
		  vis = atoi(argv[i + 1]);
		  i++;
	       }
          }
     }
#if HAVE_ECORE_EVAS_X
   if (mode == 0)
     ecore_evas = ecore_evas_software_x11_new(NULL, 0,  0, 0, startw, starth);
#endif
#if HAVE_ECORE_EVAS_X11_GL
   if (mode == 1)
     ecore_evas = ecore_evas_gl_x11_new(NULL, 0, 0, 0, startw, starth);
#endif
#if HAVE_ECORE_EVAS_FB
   if (mode == 2)
     ecore_evas = ecore_evas_fb_new(NULL, 0, startw, starth);
#endif
   if (mode == 3)
     ecore_evas = ecore_evas_xrender_x11_new(NULL, 0, 0, 0, startw, starth);

#else
   startw = 240;
   starth = 320;
   ecore_evas = ecore_evas_fb_new(NULL, 270,  startw, starth);
#endif
   if (!ecore_evas) return -1;
   ecore_evas_callback_delete_request_set(ecore_evas, main_delete_request);
   ecore_evas_callback_resize_set(ecore_evas, main_resize);
   ecore_evas_title_set(ecore_evas, "Evas Media Test Program");
   ecore_evas_name_class_set(ecore_evas, "evas_media_test", "main");
   ecore_evas_show(ecore_evas);
   evas = ecore_evas_get(ecore_evas);
   evas_image_cache_set(evas, 8 * 1024 * 1024);
   evas_font_cache_set(evas, 1 * 1024 * 1024);
   evas_font_path_append(evas, PACKAGE_DATA_DIR"/data/fonts");

   edje_init();
   edje_frametime_set(1.0 / 30.0);
   return 1;
}

static void
main_stop(void)
{
   main_signal_exit(NULL, 0, NULL);
   edje_shutdown();
   ecore_evas_shutdown();
   ecore_shutdown();
}

static void
main_resize(Ecore_Evas *ee)
{
   Evas_Coord w, h;

   evas_output_viewport_get(evas, NULL, NULL, &w, &h);
   bg_resize(w, h);
}

static int
main_signal_exit(void *data, int ev_type, void *ev)
{
   ecore_main_loop_quit();
   while (video_objs)
     {
	printf("del obj!\n");
	evas_object_del(video_objs->data);
	video_objs = eina_list_remove_list(video_objs, video_objs);
	printf("done\n");
     }
   return 1;
}

static void
main_delete_request(Ecore_Evas *ee)
{
   ecore_main_loop_quit();
}

void
bg_setup(void)
{
   Evas_Object *o;

   o = edje_object_add(evas);
   edje_object_file_set(o, PACKAGE_DATA_DIR"/data/theme.edj", "background");
   evas_object_move(o, 0, 0);
   evas_object_resize(o, startw, starth);
   evas_object_layer_set(o, -999);
   evas_object_show(o);
   evas_object_focus_set(o, 1);
   evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, bg_key_down, NULL);
   o_bg = o;
}

void
bg_resize(Evas_Coord w, Evas_Coord h)
{
   evas_object_resize(o_bg, w, h);
}

static void
broadcast_event(Emotion_Event ev)
{
   Eina_List *l;
   Evas_Object *obj;

   EINA_LIST_FOREACH(video_objs, l, obj)
     emotion_object_event_simple_send(obj, ev);
}

static void
bg_key_down(void *data, Evas * e, Evas_Object * obj, void *event_info)
{
   Evas_Event_Key_Down *ev;
   Eina_List *l;
   Evas_Object *o;

   ev = (Evas_Event_Key_Down *)event_info;
   if      (!strcmp(ev->keyname, "Escape"))
     ecore_main_loop_quit();
   else if (!strcmp(ev->keyname, "Up"))
     broadcast_event(EMOTION_EVENT_UP);
   else if (!strcmp(ev->keyname, "Down"))
     broadcast_event(EMOTION_EVENT_DOWN);
   else if (!strcmp(ev->keyname, "Left"))
     broadcast_event(EMOTION_EVENT_LEFT);
   else if (!strcmp(ev->keyname, "Right"))
     broadcast_event(EMOTION_EVENT_RIGHT);
   else if (!strcmp(ev->keyname, "Return"))
     broadcast_event(EMOTION_EVENT_SELECT);
   else if (!strcmp(ev->keyname, "m"))
     broadcast_event(EMOTION_EVENT_MENU1);
   else if (!strcmp(ev->keyname, "Prior"))
     broadcast_event(EMOTION_EVENT_PREV);
   else if (!strcmp(ev->keyname, "Next"))
     broadcast_event(EMOTION_EVENT_NEXT);
   else if (!strcmp(ev->keyname, "0"))
     broadcast_event(EMOTION_EVENT_0);
   else if (!strcmp(ev->keyname, "1"))
     broadcast_event(EMOTION_EVENT_1);
   else if (!strcmp(ev->keyname, "2"))
     broadcast_event(EMOTION_EVENT_2);
   else if (!strcmp(ev->keyname, "3"))
     broadcast_event(EMOTION_EVENT_3);
   else if (!strcmp(ev->keyname, "4"))
     broadcast_event(EMOTION_EVENT_4);
   else if (!strcmp(ev->keyname, "5"))
     broadcast_event(EMOTION_EVENT_5);
   else if (!strcmp(ev->keyname, "6"))
     broadcast_event(EMOTION_EVENT_6);
   else if (!strcmp(ev->keyname, "7"))
     broadcast_event(EMOTION_EVENT_7);
   else if (!strcmp(ev->keyname, "8"))
     broadcast_event(EMOTION_EVENT_8);
   else if (!strcmp(ev->keyname, "9"))
     broadcast_event(EMOTION_EVENT_9);
   else if (!strcmp(ev->keyname, "-"))
     broadcast_event(EMOTION_EVENT_10);
   else if (!strcmp(ev->keyname, "bracketleft"))
     {
	EINA_LIST_FOREACH(video_objs, l, o)
	  emotion_object_audio_volume_set(o, emotion_object_audio_volume_get(o) - 0.1);
     }
   else if (!strcmp(ev->keyname, "bracketright"))
     {
        EINA_LIST_FOREACH(video_objs, l, o)
	  emotion_object_audio_volume_set(o, emotion_object_audio_volume_get(o) + 0.1);
     }
   else if (!strcmp(ev->keyname, "v"))
     {
        EINA_LIST_FOREACH(video_objs, l, o)
	  {
	     if (emotion_object_video_mute_get(o))
	       emotion_object_video_mute_set(o, 0);
	     else
	       emotion_object_video_mute_set(o, 1);
	  }
     }
   else if (!strcmp(ev->keyname, "a"))
     {
        EINA_LIST_FOREACH(video_objs, l, o)
	  {
	     if (emotion_object_audio_mute_get(o))
	       {
		  emotion_object_audio_mute_set(o, 0);
		  printf("unmute\n");
	       }
	     else
	       {
		  emotion_object_audio_mute_set(o, 1);
		  printf("mute\n");
	       }
	  }
     }
   else if (!strcmp(ev->keyname, "i"))
     {
	EINA_LIST_FOREACH(video_objs, l, o)
	  {
	     printf("audio channels: %i\n", emotion_object_audio_channel_count(o));
	     printf("video channels: %i\n", emotion_object_video_channel_count(o));
	     printf("spu channels: %i\n", emotion_object_spu_channel_count(o));
	     printf("seekable: %i\n", emotion_object_seekable_get(o));
	  }
     }
   else if (!strcmp(ev->keyname, "f"))
     {
	if (!ecore_evas_fullscreen_get(ecore_evas))
	  ecore_evas_fullscreen_set(ecore_evas, 1);
	else
	  ecore_evas_fullscreen_set(ecore_evas, 0);
     }
   else if (!strcmp(ev->keyname, "d"))
     {
	if (!ecore_evas_avoid_damage_get(ecore_evas))
	  ecore_evas_avoid_damage_set(ecore_evas, 1);
	else
	  ecore_evas_avoid_damage_set(ecore_evas, 0);
     }
   else if (!strcmp(ev->keyname, "s"))
     {
	if (!ecore_evas_shaped_get(ecore_evas))
	  {
	     ecore_evas_shaped_set(ecore_evas, 1);
	     evas_object_hide(o_bg);
	  }
	else
	  {
	     ecore_evas_shaped_set(ecore_evas, 0);
	     evas_object_show(o_bg);
	  }
     }
   else if (!strcmp(ev->keyname, "b"))
     {
	if (!ecore_evas_borderless_get(ecore_evas))
	  ecore_evas_borderless_set(ecore_evas, 1);
	else
	  ecore_evas_borderless_set(ecore_evas, 0);
     }
   else if (!strcmp(ev->keyname, "q"))
     {
	ecore_main_loop_quit();
	while (video_objs)
	  {
	     printf("del obj!\n");
	     evas_object_del(video_objs->data);
	     video_objs = eina_list_remove_list(video_objs, video_objs);
	     printf("done\n");
	  }
     }
   else if (!strcmp(ev->keyname, "z"))
     {
	vis = (vis + 1) % EMOTION_VIS_LAST;
	printf("new visualization: %d\n", vis);

	EINA_LIST_FOREACH(video_objs, l, o)
	  {
	     Eina_Bool supported;

	     supported = emotion_object_vis_supported(o, vis);
	     if (supported)
	       emotion_object_vis_set(o, vis);
	     else
	       {
		  const char *file;

		  file = emotion_object_file_get(o);
		  printf("object %p (%s) does not support visualization %d\n",
			 o, file, vis);
	       }
	  }
     }
   else
     {
	printf("UNHANDLED: %s\n", ev->keyname);
     }
}

static void
video_obj_in_cb(void *data, Evas *ev, Evas_Object *obj, void *event_info)
{
//   evas_object_color_set(obj, 255, 255, 255, 100);
}

static void
video_obj_out_cb(void *data, Evas *ev, Evas_Object *obj, void *event_info)
{
//   evas_object_color_set(obj, 255, 255, 255, 200);
}

static void
video_obj_down_cb(void *data, Evas *ev, Evas_Object *obj, void *event_info)
{
   Evas_Event_Mouse_Down *e;

   e = event_info;
   evas_object_color_set(obj, 200, 50, 40, 200);
   evas_object_raise(obj);
}

static void
video_obj_up_cb(void *data, Evas *ev, Evas_Object *obj, void *event_info)
{
   Evas_Event_Mouse_Up *e;

   e = event_info;
   evas_object_color_set(obj, 100, 100, 100, 100);
}

static void
video_obj_move_cb(void *data, Evas *ev, Evas_Object *obj, void *event_info)
{
   Evas_Event_Mouse_Move *e;

   e = event_info;
   if (e->buttons & 0x1)
     {
	Evas_Coord x, y;

	evas_object_geometry_get(obj, &x, &y, NULL, NULL);
	x += e->cur.canvas.x - e->prev.canvas.x;
	y += e->cur.canvas.y - e->prev.canvas.y;
	evas_object_move(obj, x, y);
     }
   else if (e->buttons & 0x4)
     {
	Evas_Coord w, h;

	evas_object_geometry_get(obj, NULL, NULL, &w, &h);
	w += e->cur.canvas.x - e->prev.canvas.x;
	h += e->cur.canvas.y - e->prev.canvas.y;
	evas_object_resize(obj, w, h);
     }
}

static void
video_obj_time_changed(Evas_Object *obj, Evas_Object *edje)
{
   double pos, len, scale;
   char buf[256];
   int ph, pm, ps, pf, lh, lm, ls;

   pos = emotion_object_position_get(obj);
   len = emotion_object_play_length_get(obj);
//   printf("%3.3f, %3.3f\n", pos, len);
   scale = (len > 0.0) ? pos / len : 0.0;
   edje_object_part_drag_value_set(edje, "video_progress", scale, 0.0);
   lh = len / 3600;
   lm = len / 60 - (lh * 60);
   ls = len - (lm * 60);
   ph = pos / 3600;
   pm = pos / 60 - (ph * 60);
   ps = pos - (pm * 60);
   pf = pos * 100 - (ps * 100) - (pm * 60 * 100) - (ph * 60 * 60 * 100);
   snprintf(buf, sizeof(buf), "%i:%02i:%02i.%02i / %i:%02i:%02i",
	    ph, pm, ps, pf, lh, lm, ls);
   edje_object_part_text_set(edje, "video_progress_txt", buf);
}

static void
video_obj_frame_decode_cb(void *data, Evas_Object *obj, void *event_info)
{
   video_obj_time_changed(obj, data);

   if (0)
     {
	double t;
	static double pt = 0.0;
	t = ecore_time_get();
	printf("FPS: %3.3f\n", 1.0 / (t - pt));
	pt = t;
     }
}

static void
video_obj_frame_resize_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;
   int iw, ih;
   Evas_Coord w, h;
   double ratio;

   oe = data;
   emotion_object_size_get(obj, &iw, &ih);
   ratio = emotion_object_ratio_get(obj);
   printf("HANDLE %ix%i @ %3.3f\n", iw, ih, ratio);
   if (ratio > 0.0) iw = (ih * ratio) + 0.5;
   edje_extern_object_min_size_set(obj, iw, ih);
   edje_object_part_swallow(oe, "video_swallow", obj);
   edje_object_size_min_calc(oe, &w, &h);
   evas_object_resize(oe, w, h);
   edje_extern_object_min_size_set(obj, 0, 0);
   edje_object_part_swallow(oe, "video_swallow", obj);
}

static void
video_obj_length_change_cb(void *data, Evas_Object *obj, void *event_info)
{
   video_obj_time_changed(obj, data);
}

static void
video_obj_position_update_cb(void *data, Evas_Object *obj, void *event_info)
{
   video_obj_time_changed(obj, data);
}

static void
video_obj_stopped_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("video stopped!\n");
   emotion_object_position_set(obj, 0.0);
   emotion_object_play_set(obj, 1);
}

static void
video_obj_channels_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("channels changed: [AUD %i][VID %i][SPU %i]\n",
	  emotion_object_audio_channel_count(obj),
	  emotion_object_video_channel_count(obj),
	  emotion_object_spu_channel_count(obj));
}

static void
video_obj_title_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("video title to: \"%s\"\n", emotion_object_title_get(obj));
}

static void
video_obj_progress_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("progress: \"%s\" %3.3f\n",
	  emotion_object_progress_info_get(obj),
	  emotion_object_progress_status_get(obj));
}

static void
video_obj_ref_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("video ref to: \"%s\" %i\n",
	  emotion_object_ref_file_get(obj),
	  emotion_object_ref_num_get(obj));
}

static void
video_obj_button_num_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("video spu buttons to: %i\n",
	  emotion_object_spu_button_count_get(obj));
}

static void
video_obj_button_cb(void *data, Evas_Object *obj, void *event_info)
{
   Evas_Object *oe;

   oe = data;
   printf("video selected spu button: %i\n",
	  emotion_object_spu_button_get(obj));
}



static void
video_obj_signal_play_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Evas_Object *ov;

   ov = data;
   emotion_object_play_set(ov, 1);
   edje_object_signal_emit(o, "video_state", "play");
}

static void
video_obj_signal_pause_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Evas_Object *ov;

   ov = data;
   emotion_object_play_set(ov, 0);
   edje_object_signal_emit(o, "video_state", "pause");
}

static void
video_obj_signal_stop_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Evas_Object *ov;

   ov = data;
   emotion_object_play_set(ov, 0);
   emotion_object_position_set(ov, 0);
   edje_object_signal_emit(o, "video_state", "stop");
}

static void
video_obj_signal_jump_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Evas_Object *ov;
   double len;
   double x, y;

   ov = data;
   edje_object_part_drag_value_get(o, source, &x, &y);
   len = emotion_object_play_length_get(ov);
   emotion_object_position_set(ov, x * len);
}

static void
video_obj_signal_speed_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Evas_Object *ov;
   double spd;
   double x, y;
   char buf[256];

   ov = data;
   edje_object_part_drag_value_get(o, source, &x, &y);
   spd = 255 * y;
   evas_object_color_set(ov, spd, spd, spd, spd);
   snprintf(buf, sizeof(buf), "%.0f", spd);
   edje_object_part_text_set(o, "video_speed_txt", buf);
}

static void
video_obj_signal_frame_move_start_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Frame_Data *fd;
   Evas_Coord x, y;

   fd = evas_object_data_get(o, "frame_data");
   fd->moving = 1;
   evas_pointer_canvas_xy_get(evas_object_evas_get(o), &x, &y);
   fd->x = x;
   fd->y = y;
   evas_object_raise(o);
}

static void
video_obj_signal_frame_move_stop_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Frame_Data *fd;

   fd = evas_object_data_get(o, "frame_data");
   fd->moving = 0;
}

static void
video_obj_signal_frame_resize_start_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Frame_Data *fd;
   Evas_Coord x, y;

   fd = evas_object_data_get(o, "frame_data");
   fd->resizing = 1;
   evas_pointer_canvas_xy_get(evas_object_evas_get(o), &x, &y);
   fd->x = x;
   fd->y = y;
   evas_object_raise(o);
}

static void
video_obj_signal_frame_resize_stop_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Frame_Data *fd;

   fd = evas_object_data_get(o, "frame_data");
   fd->resizing = 0;
}

static void
video_obj_signal_frame_move_cb(void *data, Evas_Object *o, const char *emission, const char *source)
{
   Frame_Data *fd;

   fd = evas_object_data_get(o, "frame_data");
   if (fd->moving)
     {
	Evas_Coord x, y, ox, oy;

	evas_pointer_canvas_xy_get(evas_object_evas_get(o), &x, &y);
	evas_object_geometry_get(o, &ox, &oy, NULL, NULL);
	evas_object_move(o, ox + (x - fd->x), oy + (y - fd->y));
	fd->x = x;
	fd->y = y;
     }
   else if (fd->resizing)
     {
	Evas_Coord x, y, ow, oh;

	evas_pointer_canvas_xy_get(evas_object_evas_get(o), &x, &y);
	evas_object_geometry_get(o, NULL, NULL, &ow, &oh);
	evas_object_resize(o, ow + (x - fd->x), oh + (y - fd->y));
	fd->x = x;
	fd->y = y;
     }
}


static void
init_video_object(char *module_filename, char *filename)
{
   Evas_Object *o, *oe;
   int iw, ih;
   Evas_Coord w, h;
   Frame_Data *fd;


/* basic video object setup */
   o = emotion_object_add(evas);
   if (!emotion_object_init(o, module_filename))
     return;
   emotion_object_vis_set(o, vis);
   emotion_object_file_set(o, filename);
   emotion_object_play_set(o, 1);
   evas_object_move(o, 0, 0);
   evas_object_resize(o, 320, 240);
   emotion_object_smooth_scale_set(o, 1);
   evas_object_show(o);
/* end basic video setup. all the rest here is just to be fancy */


   video_objs = eina_list_append(video_objs, o);

   emotion_object_size_get(o, &iw, &ih);
   w = iw; h = ih;

   fd = calloc(1, sizeof(Frame_Data));

   oe = edje_object_add(evas);
   evas_object_data_set(oe, "frame_data", fd);
   edje_object_file_set(oe, PACKAGE_DATA_DIR"/data/theme.edj", "video_controller");
   edje_extern_object_min_size_set(o, w, h);
   edje_object_part_swallow(oe, "video_swallow", o);
   edje_object_size_min_calc(oe, &w, &h);
//   evas_object_move(oe, rand() % (int)(startw - w), rand() % (int)(starth - h));
   evas_object_move(oe, 0, 0);
   evas_object_resize(oe, w, h);
   edje_extern_object_min_size_set(o, 0, 0);
   edje_object_part_swallow(oe, "video_swallow", o);

   evas_object_smart_callback_add(o, "frame_decode", video_obj_frame_decode_cb, oe);
   evas_object_smart_callback_add(o, "frame_resize", video_obj_frame_resize_cb, oe);
   evas_object_smart_callback_add(o, "length_change", video_obj_length_change_cb, oe);
   evas_object_smart_callback_add(o, "position_update", video_obj_position_update_cb, oe);

   evas_object_smart_callback_add(o, "decode_stop", video_obj_stopped_cb, oe);
   evas_object_smart_callback_add(o, "channels_change", video_obj_channels_cb, oe);
   evas_object_smart_callback_add(o, "title_change", video_obj_title_cb, oe);
   evas_object_smart_callback_add(o, "progress_change", video_obj_progress_cb, oe);
   evas_object_smart_callback_add(o, "ref_change", video_obj_ref_cb, oe);
   evas_object_smart_callback_add(o, "button_num_change", video_obj_button_num_cb, oe);
   evas_object_smart_callback_add(o, "button_change", video_obj_button_cb, oe);

   edje_object_signal_callback_add(oe, "video_control", "play", video_obj_signal_play_cb, o);
   edje_object_signal_callback_add(oe, "video_control", "pause", video_obj_signal_pause_cb, o);
   edje_object_signal_callback_add(oe, "video_control", "stop", video_obj_signal_stop_cb, o);
   edje_object_signal_callback_add(oe, "drag", "video_progress", video_obj_signal_jump_cb, o);
   edje_object_signal_callback_add(oe, "drag", "video_speed", video_obj_signal_speed_cb, o);

   edje_object_signal_callback_add(oe, "frame_move", "start", video_obj_signal_frame_move_start_cb, oe);
   edje_object_signal_callback_add(oe, "frame_move", "stop", video_obj_signal_frame_move_stop_cb, oe);
   edje_object_signal_callback_add(oe, "frame_resize", "start", video_obj_signal_frame_resize_start_cb, oe);
   edje_object_signal_callback_add(oe, "frame_resize", "stop", video_obj_signal_frame_resize_stop_cb, oe);
   edje_object_signal_callback_add(oe, "mouse,move", "*", video_obj_signal_frame_move_cb, oe);

   edje_object_part_drag_value_set(oe, "video_speed", 0.0, 1.0);
   edje_object_part_text_set(oe, "video_speed_txt", "1.0");

   edje_object_signal_emit(o, "video_state", "play");

   evas_object_show(oe);
}

static int
enter_idle(void *data)
{
   double t;
   static double pt = 0.0;
   static int frames = 0;

   t = ecore_time_get();
   if (frames == 0) pt = t;
   frames++;
   if (frames == 100)
     {
//	printf("FPS: %3.3f\n", frames / (t - pt));
	frames = 0;
     }
   return 1;
}

static int
check_positions(void *data)
{
   const Eina_List *lst;
   Evas_Object *o;

   EINA_LIST_FOREACH(video_objs, lst, o)
     video_obj_time_changed(o, evas_object_smart_parent_get(o));

   return !!video_objs;
}

int
main(int argc, char **argv)
{
   char *module_filename;
   int i;

   if (main_start(argc, argv) < 1) return -1;
   bg_setup();

   module_filename = "xine";

   for (i = 1; i < argc; i++)
     {
	if (((!strcmp(argv[i], "-g")) ||
	    (!strcmp(argv[i], "-geometry")) ||
	    (!strcmp(argv[i], "--geometry"))) && (i < (argc - 1)))
	     i++;
	else if (((!strcmp(argv[i], "-h")) ||
	    (!strcmp(argv[i], "-help")) ||
	    (!strcmp(argv[i], "--help"))))
	  {
	     printf("Usage:\n");
	     printf("  %s [-gl] [-g WxH] [-vis NUMBER] [-xine] [-gstreamer] [-vlc] filename\n", argv[0]);
	     exit(-1);
	  }
	else if (!strcmp(argv[i], "-gl"))
	  {
	  }
	else if (!strcmp(argv[i], "-fb"))
	  {
	  }
	else if (!strcmp(argv[i], "-xr"))
	  {
	  }
	else if (!strcmp(argv[i], "-xine"))
	  {
             module_filename = "xine";
	  }
	else if (!strcmp(argv[i], "-gstreamer"))
	  {
             module_filename = "gstreamer";
	  }
	else if (!strcmp(argv[i], "-vlc"))
	  {
             module_filename = "vlc";
	  }
	else if ((!strcmp(argv[i], "-vis")) && (i < (argc - 1)))
	  {
	     i++;
	  }
        else
	  {
             printf ("module : %s\n", module_filename);
	     init_video_object(module_filename, argv[i]);
	  }
     }

   ecore_idle_enterer_add(enter_idle, NULL);
   ecore_animator_add(check_positions, NULL);

   ecore_main_loop_begin();
   main_stop();
   return 0;
}

#else
int main()
{
	puts("Could not find Ecore_X.h or Ecore_Fb.h so test is disabled");
	return 0;
}
#endif