2 #include "Ethumb_Plugin.h"
9 #include <Ecore_File.h>
12 #include <Edje_Edit.h>
15 struct _emotion_plugin
18 double ptotal, len, pi;
19 double total_time, tmp_time;
30 _resize_movie(struct _emotion_plugin *_plugin)
32 Ethumb *e = _plugin->e;
37 ratio = emotion_object_ratio_get(_plugin->video);
38 ethumb_calculate_aspect_from_ratio(e, ratio, &w, &h);
39 ethumb_calculate_fill_from_ratio(e, ratio, &fx, &fy, &fw, &fh);
44 ethumb_plugin_image_resize(e, _plugin->w, _plugin->h);
46 evas_object_resize(_plugin->video, fw, fh);
47 evas_object_move(_plugin->video, fx, fy);
48 emotion_object_audio_mute_set(_plugin->video, 1);
52 _frame_resized_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
58 _video_stopped_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
60 struct _emotion_plugin *_plugin = data;
65 _plugin->total_time = _plugin->tmp_time;
69 _video_pos_set(struct _emotion_plugin *_plugin)
74 pos = ethumb_video_start_get(_plugin->e);
75 interval = ethumb_video_interval_get(_plugin->e);
76 _plugin->len = emotion_object_play_length_get(_plugin->video);
81 if (pos <=0 || pos >= 1)
82 _plugin->pi = 0.2 * _plugin->len + _plugin->pcount *
83 _plugin->len * interval;
85 _plugin->pi = pos * _plugin->len + _plugin->pcount *
86 _plugin->len * interval;
88 emotion_object_position_set(_plugin->video, _plugin->pi);
92 _setup_thumbnail(struct _emotion_plugin *_plugin)
98 const char *thumb_path;
100 ethumb_thumb_path_get(_plugin->e, &thumb_path, NULL);
101 evas = ethumb_evas_get(_plugin->e);
103 if (!edje_file_group_exists(thumb_path, "movie/thumb"))
105 fprintf(stderr, "ERROR: no group 'movie/thumb' found.\n");
109 edje = edje_object_add(evas);
110 edje_object_file_set(edje, thumb_path, "movie/thumb");
111 if (!edje_object_part_exists(edje, "image"))
113 fprintf(stderr, "ERROR: no 'image' part found.\n");
114 evas_object_del(edje);
117 if (!edje_edit_program_exist(edje, "animate"))
119 fprintf(stderr, "ERROR: no 'animate' program found.\n");
120 evas_object_del(edje);
124 for (i = 0; i < _plugin->frnum; i++)
126 snprintf(buf, sizeof(buf), "images/%d", i);
127 edje_edit_image_data_add(edje, buf, i);
129 edje_edit_state_image_set(edje, "image", "default 0.00", buf);
131 edje_edit_state_tween_add(edje, "image", "default 0.00", buf);
134 edje_edit_program_transition_time_set(edje, "animate",
135 _plugin->total_time);
136 edje_edit_program_transition_time_set(edje, "animate_loop",
137 _plugin->total_time);
138 edje_edit_group_min_w_set(edje, _plugin->w);
139 edje_edit_group_max_w_set(edje, _plugin->w);
140 edje_edit_group_min_h_set(edje, _plugin->h);
141 edje_edit_group_max_h_set(edje, _plugin->h);
142 edje_edit_save(edje);
144 evas_object_del(edje);
153 _finish_thumb_generation(struct _emotion_plugin *_plugin, int success)
156 evas_object_smart_callback_del(_plugin->video, "frame_resize",
158 emotion_object_play_set(_plugin->video, 0);
159 evas_object_del(_plugin->video);
161 eet_close(_plugin->ef);
164 r = _setup_thumbnail(_plugin);
167 ethumb_finished_callback_call(_plugin->e, r);
171 _frame_grab_single(void *data)
173 struct _emotion_plugin *_plugin = data;
174 Ethumb *e = _plugin->e;
177 if (_plugin->len <= 0)
179 _video_pos_set(_plugin);
183 p = emotion_object_position_get(_plugin->video);
187 ethumb_image_save(e);
189 evas_object_smart_callback_del(_plugin->video, "frame_resize",
191 emotion_object_play_set(_plugin->video, 0);
192 evas_object_del(_plugin->video);
194 ethumb_finished_callback_call(e, 1);
200 _frame_grab(void *data)
202 struct _emotion_plugin *_plugin = data;
203 Ethumb *e = _plugin->e;
208 if (_plugin->len <= 0)
210 _video_pos_set(_plugin);
214 p = emotion_object_position_get(_plugin->video);
224 if (p > _plugin->pi + _plugin->ptotal)
226 _plugin->total_time += _plugin->tmp_time;
227 if (_plugin->pcount >= ethumb_video_ntimes_get(e))
229 _finish_thumb_generation(_plugin, EINA_TRUE);
235 _video_pos_set(_plugin);
240 _plugin->tmp_time = p - _plugin->pi;
244 Ecore_Evas *ee = ethumb_ecore_evas_get(e);
245 int quality, compress;
247 quality = ethumb_thumb_quality_get(e);
248 compress = ethumb_thumb_compress_get(e);
250 pixels = ecore_evas_buffer_pixels_get(ee);
251 snprintf(buf, sizeof(buf), "images/%d", _plugin->frnum);
252 eet_data_image_write(_plugin->ef, buf, pixels, _plugin->w, _plugin->h,
253 0, compress, quality, quality);
261 _generate_animated_thumb(struct _emotion_plugin *_plugin)
263 const char *thumb_path;
266 Ethumb *e = _plugin->e;
268 snprintf(buf, sizeof(buf), "%s/data/emotion_template.edj", PLUGINSDIR);
269 ethumb_thumb_path_get(e, &thumb_path, NULL);
270 thumb_dir = ecore_file_dir_get(thumb_path);
271 ecore_file_mkpath(thumb_dir);
273 ecore_file_cp(buf, thumb_path);
274 _plugin->ef = eet_open(thumb_path, EET_FILE_MODE_READ_WRITE);
277 fprintf(stderr, "ERROR: could not open '%s'\n", thumb_path);
278 _finish_thumb_generation(_plugin, 0);
281 ecore_timer_add(1.0 / ethumb_video_fps_get(e), _frame_grab, _plugin);
285 _generate_thumb(Ethumb *e)
291 Ethumb_Thumb_Format f;
292 struct _emotion_plugin *_plugin = calloc(sizeof(struct _emotion_plugin), 1);
294 o = emotion_object_add(ethumb_evas_get(e));
295 r = emotion_object_init(o, "xine");
298 fprintf(stderr, "ERROR: could not start emotion using gstreamer"
301 ethumb_finished_callback_call(e, 0);
308 ethumb_file_get(e, &file, NULL);
309 start = ethumb_video_start_get(e);
310 f = ethumb_thumb_format_get(e);
312 emotion_object_file_set(o, file);
317 _plugin->ptotal = ethumb_video_time_get(e) / ethumb_video_ntimes_get(e);
320 _resize_movie(_plugin);
321 evas_object_smart_callback_add(o, "frame_resize",
322 _frame_resized_cb, _plugin);
323 evas_object_smart_callback_add(o, "decode_stop",
324 _video_stopped_cb, _plugin);
326 if (f == ETHUMB_THUMB_EET)
328 _generate_animated_thumb(_plugin);
332 ecore_timer_add(0.1, _frame_grab_single, _plugin);
335 _video_pos_set(_plugin);
336 emotion_object_play_set(o, 1);
341 ethumb_plugin_get(void)
343 static const char *extensions[] = { "avi", "mp4", "ogv", "mov", NULL };
344 static Ethumb_Plugin plugin =
360 _module_shutdown(void)
364 EINA_MODULE_INIT(_module_init);
365 EINA_MODULE_SHUTDOWN(_module_shutdown);