static int starth = 600;
static Evas_List *video_objs = NULL;
+static Emotion_Vis vis = EMOTION_VIS_NONE;
static int
main_start(int argc, char **argv)
{
mode = 3;
}
+ else if ((!strcmp(argv[i], "-vis")) && (i < (argc - 1)))
+ {
+ vis = atoi(argv[i + 1]);
+ i++;
+ }
}
}
#if HAVE_ECORE_EVAS_X
printf("done\n");
}
}
+ else if (!strcmp(ev->keyname, "z"))
+ {
+ Evas_List *l;
+
+ vis = (vis + 1) % EMOTION_VIS_LAST;
+ printf("new visualization: %d\n", vis);
+
+
+ for (l = video_objs; l; l = l->next)
+ {
+ Evas_Object *obj;
+ Evas_Bool supported;
+
+ obj = l->data;
+ supported = emotion_object_vis_supported(obj, vis);
+ if (supported)
+ emotion_object_vis_set(obj, vis);
+ else
+ {
+ const char *file;
+
+ file = emotion_object_file_get(obj);
+ printf("object %p (%s) does not support visualization %d\n",
+ obj, file, vis);
+ }
+ }
+ }
else
{
printf("UNHANDLED: %s\n", ev->keyname);
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);
(!strcmp(argv[i], "--help"))))
{
printf("Usage:\n");
- printf(" %s [-gl] [-g WxH] [-xine] [-gstreamer] filename\n", argv[0]);
+ printf(" %s [-gl] [-g WxH] [-vis NUMBER] [-xine] [-gstreamer] filename\n", argv[0]);
exit(-1);
}
else if (!strcmp(argv[i], "-gl"))
{
module_filename = "gstreamer";
}
+ else if ((!strcmp(argv[i], "-vis")) && (i < (argc - 1)))
+ {
+ i++;
+ }
else
{
printf ("module : %s\n", module_filename);
EMOTION_META_INFO_TRACK_COUNT
};
+enum _Emotion_Vis
+{
+ EMOTION_VIS_NONE,
+ EMOTION_VIS_GOOM,
+ EMOTION_VIS_LIBVISUAL_BUMPSCOPE,
+ EMOTION_VIS_LIBVISUAL_CORONA,
+ EMOTION_VIS_LIBVISUAL_DANCING_PARTICLES,
+ EMOTION_VIS_LIBVISUAL_GDKPIXBUF,
+ EMOTION_VIS_LIBVISUAL_G_FORCE,
+ EMOTION_VIS_LIBVISUAL_GOOM,
+ EMOTION_VIS_LIBVISUAL_INFINITE,
+ EMOTION_VIS_LIBVISUAL_JAKDAW,
+ EMOTION_VIS_LIBVISUAL_JESS,
+ EMOTION_VIS_LIBVISUAL_LV_ANALYSER,
+ EMOTION_VIS_LIBVISUAL_LV_FLOWER,
+ EMOTION_VIS_LIBVISUAL_LV_GLTEST,
+ EMOTION_VIS_LIBVISUAL_LV_SCOPE,
+ EMOTION_VIS_LIBVISUAL_MADSPIN,
+ EMOTION_VIS_LIBVISUAL_NEBULUS,
+ EMOTION_VIS_LIBVISUAL_OINKSIE,
+ EMOTION_VIS_LIBVISUAL_PLASMA,
+ EMOTION_VIS_LAST /* sentinel */
+};
+
typedef enum _Emotion_Module Emotion_Module;
typedef enum _Emotion_Event Emotion_Event;
typedef enum _Emotion_Meta_Info Emotion_Meta_Info;
+typedef enum _Emotion_Vis Emotion_Vis;
#define EMOTION_CHANNEL_AUTO -1
#define EMOTION_CHANNEL_DEFAULT 0
EAPI int emotion_object_spu_button_get (Evas_Object *obj);
EAPI const char *emotion_object_meta_info_get (Evas_Object *obj, Emotion_Meta_Info meta);
+EAPI void emotion_object_vis_set (Evas_Object *obj, Emotion_Vis visualization);
+EAPI Emotion_Vis emotion_object_vis_get (Evas_Object *obj);
+EAPI Evas_Bool emotion_object_vis_supported (Evas_Object *obj, Emotion_Vis visualization);
+
#ifdef __cplusplus
}
#endif
#include <Ecore_Job.h>
#include <Ecore_Data.h>
#include <Ecore_Str.h>
+#include <Emotion.h>
#include <stdlib.h>
#include <stdio.h>
#define META_TRACK_COUNT 8
typedef enum _Emotion_Format Emotion_Format;
-typedef enum _Emotion_Vis Emotion_Vis;
typedef struct _Emotion_Video_Module Emotion_Video_Module;
typedef struct _Emotion_Module_Options Emotion_Module_Options;
EMOTION_FORMAT_BGRA
};
-enum _Emotion_Vis
-{
- EMOTION_VIS_GOOM,
- EMOTION_VIS_LIBVISUAL_BUMPSCOPE,
- EMOTION_VIS_LIBVISUAL_CORONA,
- EMOTION_VIS_LIBVISUAL_DANCING_PARTICLES,
- EMOTION_VIS_LIBVISUAL_GDKPIXBUF,
- EMOTION_VIS_LIBVISUAL_G_FORCE,
- EMOTION_VIS_LIBVISUAL_GOOM,
- EMOTION_VIS_LIBVISUAL_INFINITE,
- EMOTION_VIS_LIBVISUAL_JAKDAW,
- EMOTION_VIS_LIBVISUAL_JESS,
- EMOTION_VIS_LIBVISUAL_LV_ANALYSER,
- EMOTION_VIS_LIBVISUAL_LV_FLOWER,
- EMOTION_VIS_LIBVISUAL_LV_GLTEST,
- EMOTION_VIS_LIBVISUAL_LV_SCOPE,
- EMOTION_VIS_LIBVISUAL_MADSPIN,
- EMOTION_VIS_LIBVISUAL_NEBULUS,
- EMOTION_VIS_LIBVISUAL_OINKSIE,
- EMOTION_VIS_LIBVISUAL_PLASMA
-};
-
struct _Emotion_Module_Options
{
unsigned char no_video : 1;
void (*stop) (void *ef);
void (*size_get) (void *ef, int *w, int *h);
void (*pos_set) (void *ef, double pos);
- void (*vis_set) (void *ef, Emotion_Vis vis);
double (*len_get) (void *ef);
int (*fps_num_get) (void *ef);
int (*fps_den_get) (void *ef);
double (*fps_get) (void *ef);
double (*pos_get) (void *ef);
+ void (*vis_set) (void *ef, Emotion_Vis vis);
Emotion_Vis (*vis_get) (void *ef);
+ Evas_Bool (*vis_supported) (void *ef, Emotion_Vis vis);
double (*ratio_get) (void *ef);
int (*video_handled) (void *ef);
int (*audio_handled) (void *ef);
return NULL;
}
+EAPI void
+emotion_object_vis_set(Evas_Object *obj, Emotion_Vis visualization)
+{
+ Smart_Data *sd;
+
+ E_SMART_OBJ_GET(sd, obj, E_OBJ_NAME);
+ if (!sd->module) return;
+ if (!sd->video) return;
+ if (!sd->module->vis_set) return;
+ sd->module->vis_set(sd->video, visualization);
+}
+
+EAPI Emotion_Vis
+emotion_object_vis_get(Evas_Object *obj)
+{
+ Smart_Data *sd;
+
+ E_SMART_OBJ_GET_RETURN(sd, obj, E_OBJ_NAME, EMOTION_VIS_NONE);
+ if (!sd->module) return EMOTION_VIS_NONE;
+ if (!sd->video) return EMOTION_VIS_NONE;
+ if (!sd->module->vis_get) return EMOTION_VIS_NONE;
+ return sd->module->vis_get(sd->video);
+}
+EAPI Evas_Bool
+emotion_object_vis_supported(Evas_Object *obj, Emotion_Vis visualization)
+{
+ Smart_Data *sd;
+ E_SMART_OBJ_GET_RETURN(sd, obj, E_OBJ_NAME, 0);
+ if (!sd->module) return 0;
+ if (!sd->video) return 0;
+ if (!sd->module->vis_supported) return 0;
+ return sd->module->vis_supported(sd->video, visualization);
+}
static void em_pos_set (void *video,
double pos);
-static void em_vis_set (void *video,
- Emotion_Vis vis);
static double em_len_get (void *video);
static double em_pos_get (void *video);
+static void em_vis_set (void *video,
+ Emotion_Vis vis);
+
static Emotion_Vis em_vis_get (void *video);
+static Evas_Bool em_vis_supported (void *video,
+ Emotion_Vis vis);
+
static double em_ratio_get (void *video);
static int em_video_handled (void *video);
em_stop, /* stop */
em_size_get, /* size_get */
em_pos_set, /* pos_set */
- em_vis_set, /* vis_set */
em_len_get, /* len_get */
em_fps_num_get, /* fps_num_get */
em_fps_den_get, /* fps_den_get */
em_fps_get, /* fps_get */
em_pos_get, /* pos_get */
+ em_vis_set, /* vis_set */
em_vis_get, /* vis_get */
+ em_vis_supported, /* vis_supported */
em_ratio_get, /* ratio_get */
em_video_handled, /* video_handled */
em_audio_handled, /* audio_handled */
ev->ratio = 1.0;
ev->video_sink_nbr = 0;
ev->audio_sink_nbr = 0;
- ev->vis = EMOTION_VIS_GOOM;
+ ev->vis = EMOTION_VIS_NONE;
/* Create the file descriptors */
if (pipe(fds) == 0)
}
}
-static void
-em_vis_set(void *video,
- Emotion_Vis vis)
-{
- Emotion_Gstreamer_Video *ev;
-
- ev = (Emotion_Gstreamer_Video *)video;
-
- if (ev->vis == vis) return;
- ev->vis = vis;
-}
-
static double
em_len_get(void *video)
{
return ev->position;
}
+static void
+em_vis_set(void *video,
+ Emotion_Vis vis)
+{
+ Emotion_Gstreamer_Video *ev;
+
+ ev = (Emotion_Gstreamer_Video *)video;
+
+ if (ev->vis == vis) return;
+ ev->vis = vis;
+}
+
static Emotion_Vis
em_vis_get(void *video)
{
return ev->vis;
}
+static Evas_Bool
+em_vis_supported(void *ef, Emotion_Vis vis)
+{
+ const char *name;
+ GstElementFactory *factory;
+
+ if (vis == EMOTION_VIS_NONE)
+ return 1;
+
+ name = emotion_visualization_element_name_get(vis);
+ if (!name)
+ return 0;
+
+ factory = gst_element_factory_find(name);
+ if (!factory)
+ return 0;
+
+ gst_object_unref(factory);
+ return 1;
+}
+
static double
em_ratio_get(void *video)
{
return tracks_count;
}
+const char *
+emotion_visualization_element_name_get(Emotion_Vis visualisation)
+{
+ switch (visualisation)
+ {
+ case EMOTION_VIS_NONE:
+ return NULL;
+ case EMOTION_VIS_GOOM:
+ return "goom";
+ case EMOTION_VIS_LIBVISUAL_BUMPSCOPE:
+ return "libvisual_bumpscope";
+ case EMOTION_VIS_LIBVISUAL_CORONA:
+ return "libvisual_corona";
+ case EMOTION_VIS_LIBVISUAL_DANCING_PARTICLES:
+ return "libvisual_dancingparticles";
+ case EMOTION_VIS_LIBVISUAL_GDKPIXBUF:
+ return "libvisual_gdkpixbuf";
+ case EMOTION_VIS_LIBVISUAL_G_FORCE:
+ return "libvisual_G-Force";
+ case EMOTION_VIS_LIBVISUAL_GOOM:
+ return "libvisual_goom";
+ case EMOTION_VIS_LIBVISUAL_INFINITE:
+ return "libvisual_infinite";
+ case EMOTION_VIS_LIBVISUAL_JAKDAW:
+ return "libvisual_jakdaw";
+ case EMOTION_VIS_LIBVISUAL_JESS:
+ return "libvisual_jess";
+ case EMOTION_VIS_LIBVISUAL_LV_ANALYSER:
+ return "libvisual_lv_analyzer";
+ case EMOTION_VIS_LIBVISUAL_LV_FLOWER:
+ return "libvisual_lv_flower";
+ case EMOTION_VIS_LIBVISUAL_LV_GLTEST:
+ return "libvisual_lv_gltest";
+ case EMOTION_VIS_LIBVISUAL_LV_SCOPE:
+ return "libvisual_lv_scope";
+ case EMOTION_VIS_LIBVISUAL_MADSPIN:
+ return "libvisual_madspin";
+ case EMOTION_VIS_LIBVISUAL_NEBULUS:
+ return "libvisual_nebulus";
+ case EMOTION_VIS_LIBVISUAL_OINKSIE:
+ return "libvisual_oinksie";
+ case EMOTION_VIS_LIBVISUAL_PLASMA:
+ return "libvisual_plazma";
+ default:
+ return "goom";
+ }
+}
+
GstElement *
emotion_audio_sink_create(Emotion_Gstreamer_Video *ev, int index)
{
/* visualisation part */
{
- GstElement *vis = NULL;
- char *vis_name;
+ const char *vis_name = emotion_visualization_element_name_get(ev->vis);
- switch (ev->vis)
+ if (vis_name)
{
- case EMOTION_VIS_GOOM:
- vis_name = "goom";
- break;
- case EMOTION_VIS_LIBVISUAL_BUMPSCOPE:
- vis_name = "libvisual_bumpscope";
- break;
- case EMOTION_VIS_LIBVISUAL_CORONA:
- vis_name = "libvisual_corona";
- break;
- case EMOTION_VIS_LIBVISUAL_DANCING_PARTICLES:
- vis_name = "libvisual_dancingparticles";
- break;
- case EMOTION_VIS_LIBVISUAL_GDKPIXBUF:
- vis_name = "libvisual_gdkpixbuf";
- break;
- case EMOTION_VIS_LIBVISUAL_G_FORCE:
- vis_name = "libvisual_G-Force";
- break;
- case EMOTION_VIS_LIBVISUAL_GOOM:
- vis_name = "libvisual_goom";
- break;
- case EMOTION_VIS_LIBVISUAL_INFINITE:
- vis_name = "libvisual_infinite";
- break;
- case EMOTION_VIS_LIBVISUAL_JAKDAW:
- vis_name = "libvisual_jakdaw";
- break;
- case EMOTION_VIS_LIBVISUAL_JESS:
- vis_name = "libvisual_jess";
- break;
- case EMOTION_VIS_LIBVISUAL_LV_ANALYSER:
- vis_name = "libvisual_lv_analyzer";
- break;
- case EMOTION_VIS_LIBVISUAL_LV_FLOWER:
- vis_name = "libvisual_lv_flower";
- break;
- case EMOTION_VIS_LIBVISUAL_LV_GLTEST:
- vis_name = "libvisual_lv_gltest";
- break;
- case EMOTION_VIS_LIBVISUAL_LV_SCOPE:
- vis_name = "libvisual_lv_scope";
- break;
- case EMOTION_VIS_LIBVISUAL_MADSPIN:
- vis_name = "libvisual_madspin";
- break;
- case EMOTION_VIS_LIBVISUAL_NEBULUS:
- vis_name = "libvisual_nebulus";
- break;
- case EMOTION_VIS_LIBVISUAL_OINKSIE:
- vis_name = "libvisual_oinksie";
- break;
- case EMOTION_VIS_LIBVISUAL_PLASMA:
- vis_name = "libvisual_plazma";
- break;
- default:
- vis_name = "goom";
- break;
- }
+ GstElement *vis;
- g_snprintf(buf, 128, "vis%d", index);
- if ((vis = gst_element_factory_make(vis_name, buf)))
- {
- GstElement *queue;
- GstElement *conv;
- GstElement *cspace;
- GstElement *sink;
- GstPad *vispad;
- GstCaps *caps;
-
- g_snprintf(buf, 128, "visbin%d", index);
- visbin = gst_bin_new(buf);
-
- queue = gst_element_factory_make("queue", NULL);
- conv = gst_element_factory_make("audioconvert", NULL);
- cspace = gst_element_factory_make("ffmpegcolorspace", NULL);
- g_snprintf(buf, 128, "vissink%d", index);
- sink = gst_element_factory_make("fakesink", buf);
-
- gst_bin_add_many(GST_BIN(visbin),
- queue, conv, vis, cspace, sink, NULL);
- gst_element_link_many(queue, conv, vis, cspace, NULL);
- caps = gst_caps_new_simple("video/x-raw-rgb",
- "bpp", G_TYPE_INT, 32,
- "width", G_TYPE_INT, 320,
- "height", G_TYPE_INT, 200,
- NULL);
- gst_element_link_filtered(cspace, sink, caps);
-
- vispad = gst_element_get_pad(queue, "sink");
- gst_element_add_pad(visbin, gst_ghost_pad_new("sink", vispad));
- gst_object_unref(vispad);
+ g_snprintf(buf, 128, "vis%d", index);
+ vis = gst_element_factory_make(vis_name, buf);
+ if (vis)
+ {
+ GstElement *queue;
+ GstElement *conv;
+ GstElement *cspace;
+ GstElement *sink;
+ GstPad *vispad;
+ GstCaps *caps;
+
+ g_snprintf(buf, 128, "visbin%d", index);
+ visbin = gst_bin_new(buf);
+
+ queue = gst_element_factory_make("queue", NULL);
+ conv = gst_element_factory_make("audioconvert", NULL);
+ cspace = gst_element_factory_make("ffmpegcolorspace", NULL);
+ g_snprintf(buf, 128, "vissink%d", index);
+ sink = gst_element_factory_make("fakesink", buf);
+
+ gst_bin_add_many(GST_BIN(visbin),
+ queue, conv, vis, cspace, sink, NULL);
+ gst_element_link_many(queue, conv, vis, cspace, NULL);
+ caps = gst_caps_new_simple("video/x-raw-rgb",
+ "bpp", G_TYPE_INT, 32,
+ "width", G_TYPE_INT, 320,
+ "height", G_TYPE_INT, 200,
+ NULL);
+ gst_element_link_filtered(cspace, sink, caps);
+
+ vispad = gst_element_get_pad(queue, "sink");
+ gst_element_add_pad(visbin, gst_ghost_pad_new("sink", vispad));
+ gst_object_unref(vispad);
+ }
}
}
gboolean last,
gpointer user_data);
+const char *emotion_visualization_element_name_get(Emotion_Vis visualisation);
+
#endif /* __EMOTION_GSTREAMER_PIPELINE_H__ */
static void em_stop (void *ef);
static void em_size_get (void *ef, int *w, int *h);
static void em_pos_set (void *ef, double pos);
-static void em_vis_set (void *ef, Emotion_Vis vis);
static double em_len_get (void *ef);
static int em_fps_num_get (void *ef);
static int em_fps_den_get (void *ef);
static double em_fps_get (void *ef);
static double em_pos_get (void *ef);
+static void em_vis_set (void *ef, Emotion_Vis vis);
static Emotion_Vis em_vis_get (void *ef);
+static Evas_Bool em_vis_supported (void *ef, Emotion_Vis vis);
static double em_ratio_get (void *ef);
static int em_seekable (void *ef);
static void em_frame_done (void *ef);
_em_slave_event(ev, 6, ppos);
}
-static void
-em_vis_set(void *ef,
- Emotion_Vis vis)
-{
- Emotion_Xine_Video *ev;
-
- ev = (Emotion_Xine_Video *)ef;
- if (ev->vis == vis) return;
- ev->vis = vis;
-}
-
static double
em_len_get(void *ef)
{
return ev->pos;
}
+static void
+em_vis_set(void *ef, Emotion_Vis vis)
+{
+ Emotion_Xine_Video *ev;
+
+ ev = (Emotion_Xine_Video *)ef;
+ if (ev->vis == vis) return;
+ ev->vis = vis;
+}
+
static Emotion_Vis
em_vis_get(void *ef)
{
return ev->vis;
}
+static Evas_Bool
+em_vis_supported(void *ef, Emotion_Vis vis)
+{
+ return 0;
+}
+
static double
em_ratio_get(void *ef)
{
em_stop, /* stop */
em_size_get, /* size_get */
em_pos_set, /* pos_set */
- em_vis_set, /* vis_set */
em_len_get, /* len_get */
em_fps_num_get, /* fps_num_get */
em_fps_den_get, /* fps_den_get */
em_fps_get, /* fps_get */
em_pos_get, /* pos_get */
+ em_vis_set, /* vis_set */
em_vis_get, /* vis_get */
+ em_vis_supported, /* vis_supported */
em_ratio_get, /* ratio_get */
em_video_handled, /* video_handled */
em_audio_handled, /* audio_handled */