12 #ifdef HAVE_EVAS_SOFWARE_X11
13 # include <Evas_Engine_Software_X11.h>
15 #ifdef HAVE_EVAS_OPENGL_X11
16 # include <Evas_Engine_GL_X11.h>
20 #include "emotion_private.h"
21 #include "emotion_vlc.h"
23 /* internal util calls */
24 static void *_em_lock (void *par);
25 static void _em_unlock (void *par);
26 static void _em_event (const libvlc_event_t *event, void* data);
27 static void _em_resize (Emotion_Vlc_Video *ev, int x, int y);
28 static Eina_Bool _em_fd_active (Emotion_Vlc_Video *ev, Ecore_Fd_Handler *fdh);
29 static int _em_reload_vlc (Emotion_Vlc_Video *ev);
30 void* _em_slave_thread (void * t);
32 void * _em_slave_thread(void * t)
35 pthread_detach(pthread_self());
36 Emotion_Vlc_Video *ev= (Emotion_Vlc_Video*)t;
37 while(read(ev->fd_slave_read, &event, sizeof(int)) > 0) {
40 _em_resize(ev, -1, -1);
43 _emotion_audio_level_change(ev->obj);
49 fprintf(stderr,"BYE BYE");
53 static unsigned char em_init(Evas_Object *obj, void **emotion_video, Emotion_Module_Options *opt)
55 Emotion_Vlc_Video *ev;
56 Emotion_Vlc_Video_Frame *ef;
58 int event = VLC_NEW_FRAME;
64 if (!emotion_video) return 0;
66 ev = (Emotion_Vlc_Video*)calloc(1, sizeof(Emotion_Vlc_Video));
67 ASSERT_EV(ev) return 0;
68 memset(ev, 0, sizeof(Emotion_Vlc_Video));
70 ef = (Emotion_Vlc_Video_Frame*)calloc(1, sizeof(Emotion_Vlc_Video_Frame));
72 memset(ef, 0, sizeof(Emotion_Vlc_Video_Frame));
74 /* init internal frames */
81 ef->frame_A = (char*)malloc(x*y*sizeof(char)*4);
82 ef->frame_B = (char*)malloc(x*y*sizeof(char)*4);
83 memset(ef->frame_A, 0x00, x*y*sizeof(char)*4);
84 memset(ef->frame_B, 0x00, x*y*sizeof(char)*4);
85 ef->frame = ef->frame_A;
87 /* update size in object */
90 ev->ratio = (double)x/(double)y;
97 ev->fd_write = fds[1];
98 fcntl(ev->fd_read, F_SETFL, O_NONBLOCK);
99 ev->fd_handler = ecore_main_fd_handler_add(ev->fd_read, ECORE_FD_READ, (Ecore_Fd_Cb)_em_fd_active, ev, NULL, NULL);
100 ecore_main_fd_handler_active_set(ev->fd_handler, ECORE_FD_READ);
105 ev->fd_slave_read = fds[0];
106 ev->fd_slave_write = fds[1];
107 fcntl(ev->fd_slave_write, F_SETFL, O_NONBLOCK);
118 ev->opt_no_audio = opt->no_audio;
119 ev->opt_no_video = opt->no_video;
125 char const *vlc_argv[] =
131 vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
132 sprintf(ev->clock, "%lld", (long long int)(intptr_t)_em_lock);
133 sprintf(ev->cunlock, "%lld", (long long int)(intptr_t)_em_unlock);
134 sprintf(ev->cdata, "%lld", (long long int)(intptr_t)ev);
135 sprintf(ev->width, "%d", WIDTH);
136 sprintf(ev->height, "%d", HEIGHT);
137 sprintf(ev->pitch, "%d", 4*WIDTH);
139 ev->vlc_player = libvlc_new(vlc_argc, vlc_argv);
145 pthread_mutex_init(&ef->frame_copy_lock, NULL);
146 pthread_create(&t_id, NULL, _em_slave_thread, ev);
149 write(ev->fd_write, &event, sizeof(void *));
155 static int em_shutdown(void *ef)
157 Emotion_Vlc_Video *ev;
158 Emotion_Vlc_Video_Frame *evvf;
160 ev = (Emotion_Vlc_Video *)ef;
161 evvf = ev->cur_frame;
163 ASSERT_EV_VLC(ev) return 0;
164 libvlc_release(ev->vlc_player);
165 ev->vlc_player = NULL;
169 ecore_main_fd_handler_del(ev->fd_handler);
178 pthread_mutex_destroy(&(evvf->frame_copy_lock));
183 close(ev->fd_slave_write);
184 close(ev->fd_slave_read);
189 static unsigned char em_file_open(const char *file, Evas_Object *obj, void *ef)
191 Emotion_Vlc_Video *ev;
194 Eina_List *methods, *l;
199 ev = (Emotion_Vlc_Video *)ef;
200 ASSERT_EV(ev) return 0;
201 ASSERT_EV_VLC(ev) return 0;
203 ev->vlc_m = libvlc_media_new_path(ev->vlc_player, file);
204 ASSERT_EV_M(ev) return 0;
205 ev->vlc_mp = libvlc_media_player_new_from_media(ev->vlc_m);
206 libvlc_media_release(ev->vlc_m);
208 ASSERT_EV_MP(ev) return 0;
210 e = evas_object_evas_get(obj);
211 method = evas_output_method_get(e);
212 methods = evas_render_method_list();
213 EINA_LIST_FOREACH(methods, l, name)
214 if (evas_render_method_lookup(name) == method) break;
216 #ifdef _WIN32 /* NOT IMPLEMENTED YET */
217 libvlc_media_player_set_hwnd(ev->vlc_mp, (void*)xid);
219 #ifdef HAVE_EVAS_SOFWARE_X11
220 if (!strcmp(name, "software_x11"))
222 Evas_Engine_Info_Software_X11 *einfo;
223 einfo = (Evas_Engine_Info_Software_X11*)evas_engine_info_get(e);
224 xid = einfo->info.drawable;
227 #ifdef HAVE_EVAS_OPENGL_X11
228 if (!strcmp(name, "gl_x11"))
230 Evas_Engine_Info_GL_X11 *einfo;
231 einfo = (Evas_Engine_Info_GL_X11*)evas_engine_info_get(e);
232 xid = einfo->info.drawable;
235 if (strcmp(name, "software_x11") && strcmp(name, "gl_x11")) /* FIXME */
237 fprintf(stderr, "FATAL: engine unsupported!\n");
240 libvlc_media_player_set_xwindow(ev->vlc_mp, xid);
243 ev->vlc_evtmngr = libvlc_media_player_event_manager (ev->vlc_mp);
245 for(i = EVENT_BEG_ID; i<EVENT_BEG_ID+NB_EVENTS; i++) {
246 libvlc_event_attach(ev->vlc_evtmngr, (libvlc_event_type_t)i, _em_event, ev);
253 ev->filename = strdup(file);
255 /* set properties to video object */
257 evas_render_method_list_free(methods);
261 static void em_file_close(void *ef)
263 Emotion_Vlc_Video *ev;
266 ev = (Emotion_Vlc_Video *)ef;
267 ASSERT_EV(ev) return;
268 ASSERT_EV_MP(ev) return;
270 for(i = EVENT_BEG_ID; i<EVENT_BEG_ID+NB_EVENTS; i++) {
271 libvlc_event_detach(ev->vlc_evtmngr, (libvlc_event_type_t)i, _em_event, ev);
273 libvlc_media_player_stop(ev->vlc_mp);
274 libvlc_media_player_release(ev->vlc_mp);
282 static void em_play(void *ef, double pos)
284 Emotion_Vlc_Video *ev;
286 ev = (Emotion_Vlc_Video *)ef;
287 ASSERT_EV(ev) return;
288 ASSERT_EV_MP(ev) return;
294 libvlc_media_player_set_time(ev->vlc_mp, (libvlc_time_t)(pos*1000));
297 libvlc_media_player_play(ev->vlc_mp);
302 static void em_stop(void *ef)
304 Emotion_Vlc_Video *ev;
306 ev = (Emotion_Vlc_Video *)ef;
307 ASSERT_EV(ev) return;
308 ASSERT_EV_MP(ev) return;
312 libvlc_media_player_pause(ev->vlc_mp);
315 static void em_size_get(void *ef, int *w, int *h)
317 Emotion_Vlc_Video *ev;
318 Emotion_Vlc_Video_Frame *fr;
320 ev = (Emotion_Vlc_Video *)ef;
321 ASSERT_EV(ev) return;
324 pthread_mutex_lock(&fr->frame_copy_lock);
327 pthread_mutex_unlock(&fr->frame_copy_lock);
330 static void em_pos_set(void *ef, double pos)
332 Emotion_Vlc_Video *ev;
334 ev = (Emotion_Vlc_Video *)ef;
335 ASSERT_EV(ev) return;
336 ASSERT_EV_MP(ev) return;
337 libvlc_media_player_set_time(ev->vlc_mp, (libvlc_time_t)(pos*1000));
340 static double em_len_get(void *ef)
342 Emotion_Vlc_Video *ev;
343 ASSERT_EV(ev) return 0;
345 ev = (Emotion_Vlc_Video *)ef;
349 static int em_fps_num_get(void *ef)
351 Emotion_Vlc_Video *ev;
353 ASSERT_EV(ev) return 0;
354 ev = (Emotion_Vlc_Video *)ef;
355 return (int)(ev->fps * 1000.0);
358 static int em_fps_den_get(void *ef)
360 Emotion_Vlc_Video *ev;
365 static double em_fps_get(void *ef)
367 Emotion_Vlc_Video *ev;
369 ASSERT_EV(ev) return 0;
370 ev = (Emotion_Vlc_Video *)ef;
374 static double em_pos_get(void *ef)
376 Emotion_Vlc_Video *ev;
378 ASSERT_EV(ev) return 0;
379 ev = (Emotion_Vlc_Video *)ef;
383 static void em_vis_set(void *ef, Emotion_Vis vis)
385 Emotion_Vlc_Video *ev;
387 ev = (Emotion_Vlc_Video *)ef;
388 ASSERT_EV(ev) return;
389 if (ev->vis == vis) return;
393 static Emotion_Vis em_vis_get(void *ef)
395 Emotion_Vlc_Video *ev;
397 ev = (Emotion_Vlc_Video *)ef;
401 static Eina_Bool em_vis_supported(void *ef, Emotion_Vis vis)
403 Emotion_Vlc_Video *ev;
405 ev = (Emotion_Vlc_Video *)ef;
409 static double em_ratio_get(void *ef)
412 Emotion_Vlc_Video *ev;
413 Emotion_Vlc_Video_Frame *fr;
415 ASSERT_EV(ev) return 0;
416 ev = (Emotion_Vlc_Video *)ef;
418 pthread_mutex_lock(&fr->frame_copy_lock);
420 pthread_mutex_unlock(&fr->frame_copy_lock);
424 static int em_video_handled(void *ef)
427 Emotion_Vlc_Video *ev;
429 ASSERT_EV(ev) return 0;
430 ASSERT_EV_MP(ev) return 0;
431 ev = (Emotion_Vlc_Video *)ef;
432 if (ev->opening || (!ev->play_ok)) return 0;
434 ret = libvlc_media_player_has_vout(ev->vlc_mp);
438 static int em_audio_handled(void *ef)
440 Emotion_Vlc_Video *ev;
442 ev = (Emotion_Vlc_Video *)ef;
443 ASSERT_EV(ev) return 0;
444 if (ev->opening || (!ev->play_ok)) return 0;
448 static int em_seekable(void *ef)
451 Emotion_Vlc_Video *ev;
453 ev = (Emotion_Vlc_Video *)ef;
454 ASSERT_EV(ev) return 0;
455 ASSERT_EV_MP(ev) return 0;
456 if (ev->opening || (!ev->play_ok)) return 0;
457 ret = libvlc_media_player_is_seekable(ev->vlc_mp);
461 static void em_frame_done(void *ef)
466 static Emotion_Format em_format_get(void *ef)
468 Emotion_Vlc_Video *ev;
470 return EMOTION_FORMAT_BGRA;
473 static void em_video_data_size_get(void *ef, int *w, int *h)
475 Emotion_Vlc_Video *ev;
477 ev = (Emotion_Vlc_Video *)ef;
478 ASSERT_EV(ev) return;
483 static int em_yuv_rows_get(void *ef, int w, int h, unsigned char **yrows, unsigned char **urows, unsigned char **vrows)
485 Emotion_Vlc_Video *ev;
486 volatile Emotion_Vlc_Video_Frame *fr;
488 ev = (Emotion_Vlc_Video *)ef;
495 // FIXME: this is wrong. see xine/gst modules
496 for (i = 0; i < h; i++) yrows[i] = fr->frame_A + (i * w);
497 for (i = 0; i < (h / 2); i++) urows[i] = fr->frame_A + (i * w);
498 for (i = 0; i < (h / 2); i++) vrows[i] = fr->frame_A + (i * w);
504 static int em_bgra_data_get(void *ef, unsigned char **bgra_data)
506 Emotion_Vlc_Video *ev;
507 Emotion_Vlc_Video_Frame *fr;
509 ev = (Emotion_Vlc_Video *)ef;
510 ASSERT_EV(ev) return 0;
515 /* wait for frame to be ready */
516 pthread_mutex_lock(&fr->frame_copy_lock);
517 /* send cur frame to emotion */
518 *bgra_data = fr->frame;
521 if(fr->frame == fr->frame_A) {
522 fr->frame = fr->frame_B;
524 fr->frame = fr->frame_A;
527 /* unlock both frames */
528 pthread_mutex_unlock(&fr->frame_copy_lock);
534 static void _em_resize(Emotion_Vlc_Video *ev, int x, int y)
540 char const *vlc_argv[] =
546 "--vmem-width", ev->width,
547 "--vmem-height", ev->height,
548 "--vmem-pitch", ev->pitch,
549 "--vmem-chroma", "RV32",
550 "--vmem-lock", ev->clock,
551 "--vmem-unlock", ev->cunlock,
552 "--vmem-data", ev->cdata,
554 Emotion_Vlc_Video_Frame *fr;
556 ASSERT_EV(ev) return;
557 ASSERT_EV_VLC(ev) return;
560 /* We look for new size if not specified */
561 if ((x == -1) || (y == -1))
562 if (!libvlc_video_get_size(ev->vlc_mp, tmp, &x, &y)) return;
564 /* stop vlc if necessary */
566 libvlc_media_player_stop(ev->vlc_mp);
567 libvlc_media_player_release(ev->vlc_mp);
570 /* update size in object */
573 ev->ratio = (double)x/(double)y;
575 /* we need to restart vlc */
576 libvlc_release(ev->vlc_player);
577 vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
578 sprintf(ev->clock, "%lld", (long long int)(intptr_t)_em_lock);
579 sprintf(ev->cunlock, "%lld", (long long int)(intptr_t)_em_unlock);
580 sprintf(ev->cdata, "%lld", (long long int)(intptr_t)ev);
581 sprintf(ev->width, "%d", ev->w);
582 sprintf(ev->height, "%d", ev->h);
583 sprintf(ev->pitch, "%d", 4*ev->w);
584 ev->vlc_player = libvlc_new(vlc_argc, vlc_argv);
586 pthread_mutex_lock(&fr->frame_copy_lock);
589 /* relaunch media and mediaplayer */
590 ev->vlc_m = libvlc_media_new_path(ev->vlc_player, ev->filename);
591 ASSERT_EV_M(ev) return;
592 ev->vlc_mp = libvlc_media_player_new_from_media(ev->vlc_m);
593 libvlc_media_release(ev->vlc_m);
595 ASSERT_EV_MP(ev) return;
597 ev->vlc_evtmngr = libvlc_media_player_event_manager (ev->vlc_mp);
599 for(i = EVENT_BEG_ID; i<EVENT_BEG_ID+NB_EVENTS; i++) {
600 libvlc_event_attach(ev->vlc_evtmngr, (libvlc_event_type_t)i, _em_event, ev);
611 fr->frame_A = malloc(ev->w*ev->h*sizeof(char)*4);
612 fr->frame_B = malloc(ev->w*ev->h*sizeof(char)*4);
613 memset(fr->frame_A, 0xFF, x*y*sizeof(char)*4);
614 memset(fr->frame_B, 0xFF, x*y*sizeof(char)*4);
615 fr->frame = fr->frame_A;
617 /* notify a new frame is available */
619 write(ev->fd_write, &event, sizeof(void *));
621 pthread_mutex_unlock(&fr->frame_copy_lock);
623 /* unlock both frames */
625 libvlc_media_player_play(ev->vlc_mp);
628 /* activate display */
632 static Eina_Bool _em_fd_active(Emotion_Vlc_Video *ev, Ecore_Fd_Handler *fdh)
634 /* this only used for ecore notification */
635 /* every other internal event should be done in _em_slave_thread */
638 Emotion_Vlc_Video_Frame *fr;
640 fd = ecore_main_fd_handler_fd_get(fdh);
641 while((len = read(fd, &event, sizeof(int))) > 0) {
642 if(len == sizeof(int)) {
645 ASSERT_EV(ev) return EINA_TRUE;
646 _emotion_frame_new(ev->obj);
649 ASSERT_EV(ev) return EINA_TRUE;
650 _emotion_frame_resize(ev->obj, ev->w, ev->h, ev->ratio);
662 static void em_event_feed(void *ef, int event)
664 Emotion_Vlc_Video *ev;
666 ev = (Emotion_Vlc_Video *)ef;
667 if ((ev->opening) || (!ev->play_ok)) return;
671 case EMOTION_EVENT_MENU1:
673 case EMOTION_EVENT_MENU2:
675 case EMOTION_EVENT_MENU3:
677 case EMOTION_EVENT_MENU4:
679 case EMOTION_EVENT_MENU5:
681 case EMOTION_EVENT_MENU6:
683 case EMOTION_EVENT_MENU7:
685 case EMOTION_EVENT_UP:
687 case EMOTION_EVENT_DOWN:
689 case EMOTION_EVENT_LEFT:
691 case EMOTION_EVENT_RIGHT:
693 case EMOTION_EVENT_SELECT:
695 case EMOTION_EVENT_NEXT:
697 case EMOTION_EVENT_PREV:
699 case EMOTION_EVENT_ANGLE_NEXT:
701 case EMOTION_EVENT_ANGLE_PREV:
703 case EMOTION_EVENT_FORCE:
705 case EMOTION_EVENT_0:
707 case EMOTION_EVENT_1:
709 case EMOTION_EVENT_2:
711 case EMOTION_EVENT_3:
713 case EMOTION_EVENT_4:
715 case EMOTION_EVENT_5:
717 case EMOTION_EVENT_6:
719 case EMOTION_EVENT_7:
721 case EMOTION_EVENT_8:
723 case EMOTION_EVENT_9:
725 case EMOTION_EVENT_10:
734 static void em_event_mouse_button_feed(void *ef, int button, int x, int y)
736 Emotion_Vlc_Video *ev;
738 ev = (Emotion_Vlc_Video *)ef;
739 if ((ev->opening) || (!ev->play_ok)) return;
743 static void em_event_mouse_move_feed(void *ef, int x, int y)
745 Emotion_Vlc_Video *ev;
747 ev = (Emotion_Vlc_Video *)ef;
748 if ((ev->opening) || (!ev->play_ok)) return;
751 static int em_video_channel_count(void *ef)
754 Emotion_Vlc_Video *ev;
755 ev = (Emotion_Vlc_Video *)ef;
756 ASSERT_EV(ev) return 0;
757 ASSERT_EV_MP(ev) return 0;
758 if (ev->opening || (!ev->play_ok)) return 0;
759 ret = libvlc_media_player_has_vout(ev->vlc_mp);
764 static void em_video_channel_set(void *ef, int channel)
770 static int em_video_channel_get(void *ef)
776 static const char * em_video_channel_name_get(void *ef, int channel)
778 Emotion_Vlc_Video *ev;
782 static void em_video_channel_mute_set(void *ef, int mute)
784 Emotion_Vlc_Video *ev;
785 ev = (Emotion_Vlc_Video*)ef;
786 ASSERT_EV(ev) return;
787 ev->video_mute = mute;
790 static int em_video_channel_mute_get(void *ef)
792 Emotion_Vlc_Video *ev;
793 ev = (Emotion_Vlc_Video*)ef;
794 ASSERT_EV(ev) return;
795 return ev->video_mute;
799 static int em_audio_channel_count(void *ef)
804 static void em_audio_channel_set(void *ef, int channel)
806 Emotion_Vlc_Video *ev;
808 ev = (Emotion_Vlc_Video *)ef;
809 ASSERT_EV(ev) return;
810 ASSERT_EV_VLC(ev) return;
811 if (channel < -1) channel = -1;
812 ev->audio_channel = channel;
813 libvlc_audio_set_channel(ev->vlc_mp, channel);
816 static int em_audio_channel_get(void *ef)
819 Emotion_Vlc_Video *ev;
821 ev = (Emotion_Vlc_Video *)ef;
822 ASSERT_EV(ev) return 0;
823 ASSERT_EV_VLC(ev) return 0;
824 if (ev->opening || (!ev->play_ok)) return 0;
825 ret = libvlc_audio_get_channel(ev->vlc_mp);
830 static const char * em_audio_channel_name_get(void *ef, int channel)
835 static void em_audio_channel_mute_set(void *ef, int mute)
837 Emotion_Vlc_Video *ev;
839 ev = (Emotion_Vlc_Video *)ef;
840 ASSERT_EV(ev) return;
841 ASSERT_EV_VLC(ev) return;
842 ev->audio_mute = mute;
843 libvlc_audio_set_mute(ev->vlc_mp, (int)(ev->audio_mute));
846 static int em_audio_channel_mute_get(void *ef)
848 Emotion_Vlc_Video *ev;
850 ev = (Emotion_Vlc_Video *)ef;
851 ASSERT_EV(ev) return 0;
852 return ev->audio_mute;
855 static void em_audio_channel_volume_set(void *ef, double vol)
857 int event = VLC_CHANGE_VOL;
858 Emotion_Vlc_Video *ev;
860 ev = (Emotion_Vlc_Video *)ef;
861 ASSERT_EV(ev) return;
862 ASSERT_EV_VLC(ev) return;
864 if (vol < 0.0) vol = 0.0;
865 if (vol > 1.0) vol = 1.0;
866 libvlc_audio_set_volume(ev->vlc_mp, (int)(vol * 200));
867 write(ev->fd_slave_write, &event, sizeof(void *));
870 static double em_audio_channel_volume_get(void *ef)
873 Emotion_Vlc_Video *ev;
875 ev = (Emotion_Vlc_Video *)ef;
876 ASSERT_EV(ev) return;
877 ASSERT_EV_VLC(ev) return;
878 if (ev->opening || (!ev->play_ok)) return 0;
879 vol = libvlc_audio_get_volume(ev->vlc_mp);
880 return (double)(vol/200.0);
884 static int em_spu_channel_count(void *ef)
889 static void em_spu_channel_set(void *ef, int channel)
891 Emotion_Vlc_Video *ev;
893 ev = (Emotion_Vlc_Video *)ef;
894 ASSERT_EV(ev) return;
895 ASSERT_EV_MP(ev) return;
896 if (channel < 0) channel = 0;
897 ev->spu_channel = channel;
898 libvlc_video_set_spu(ev->vlc_mp, ev->spu_channel);
901 static int em_spu_channel_get(void *ef)
904 Emotion_Vlc_Video *ev;
906 ev = (Emotion_Vlc_Video *)ef;
907 ASSERT_EV(ev) return 0;
908 ASSERT_EV_MP(ev) return 0;
909 if (ev->opening || (!ev->play_ok)) return 0;
910 num = libvlc_video_get_spu(ev->vlc_mp);
915 static const char * em_spu_channel_name_get(void *ef, int channel)
921 static void em_spu_channel_mute_set(void *ef, int mute)
927 static int em_spu_channel_mute_get(void *ef)
932 static int em_chapter_count(void *ef)
935 Emotion_Vlc_Video *ev;
937 ev = (Emotion_Vlc_Video *)ef;
938 ASSERT_EV(ev) return 0;
939 ASSERT_EV_MP(ev) return 0;
940 if (ev->opening || (!ev->play_ok)) return 0;
941 num = libvlc_media_player_get_chapter_count(ev->vlc_mp);
945 static void em_chapter_set(void *ef, int chapter)
947 Emotion_Vlc_Video *ev;
949 ev = (Emotion_Vlc_Video *)ef;
950 ASSERT_EV(ev) return;
951 ASSERT_EV_MP(ev) return ;
952 libvlc_media_player_set_chapter(ev->vlc_mp, chapter);
955 static int em_chapter_get(void *ef)
958 Emotion_Vlc_Video *ev;
960 ev = (Emotion_Vlc_Video *)ef;
961 ASSERT_EV(ev) return 0;
962 ASSERT_EV_MP(ev) return 0;
963 num = libvlc_media_player_get_chapter(ev->vlc_mp);
968 static const char * em_chapter_name_get(void *ef, int chapter)
973 static void em_speed_set(void *ef, double speed)
975 Emotion_Vlc_Video *ev;
977 ev = (Emotion_Vlc_Video *)ef;
978 ASSERT_EV(ev) return;
979 ASSERT_EV_MP(ev) return;
980 libvlc_media_player_set_rate(ev->vlc_mp, speed);
983 static double em_speed_get(void *ef)
986 Emotion_Vlc_Video *ev;
988 ev = (Emotion_Vlc_Video *)ef;
989 ASSERT_EV(ev) return 0;
990 ASSERT_EV_MP(ev) return 0;
991 speed = libvlc_media_player_get_rate(ev->vlc_mp);
992 return (double)speed;
995 static int em_eject(void *ef)
997 Emotion_Vlc_Video *ev;
999 ev = (Emotion_Vlc_Video *)ef;
1000 if (system("eject"))
1001 fprintf(stderr, "Eject failed!\n");
1005 static const char * em_meta_get(void *ef, int meta)
1007 char * meta_data = NULL;
1008 Emotion_Vlc_Video *ev;
1010 ev = (Emotion_Vlc_Video *)ef;
1011 ASSERT_EV(ev) return NULL;
1012 ASSERT_EV_M(ev) return NULL;
1013 if ((ev->opening) || (!ev->play_ok)) return NULL;
1016 case META_TRACK_TITLE:
1017 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_Title);
1019 case META_TRACK_ARTIST:
1020 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_Artist);
1022 case META_TRACK_GENRE:
1023 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_Genre);
1025 case META_TRACK_COMMENT:
1026 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_Description);
1028 case META_TRACK_ALBUM:
1029 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_Album);
1031 case META_TRACK_YEAR:
1032 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_Date);
1034 case META_TRACK_DISCID:
1035 meta_data = libvlc_media_get_meta(ev->vlc_m, libvlc_meta_TrackID);
1043 static void _em_event(const libvlc_event_t *event, void *data)
1045 Emotion_Vlc_Event *new_ev;
1046 Emotion_Vlc_Video *ev;
1049 ASSERT_EV(ev) return;
1050 switch (event->type) {
1051 case libvlc_MediaPlayerTimeChanged: {
1052 libvlc_time_t pos = event->u.media_player_time_changed.new_time;
1053 double time = (pos / 1000000.f);
1054 _emotion_video_pos_update(ev->obj, time, 0);
1057 pos = libvlc_media_player_get_length(ev->vlc_mp);
1058 ev->len = (double)(pos / 1000.0);
1061 case libvlc_MediaPlayerPlaying: {
1066 float total_pos = 0;
1067 libvlc_time_t time = 0;
1068 libvlc_time_t total_time = 0;
1070 /* get video properties */
1071 total_time = libvlc_media_player_get_length(ev->vlc_mp);
1072 fps = libvlc_media_player_get_fps(ev->vlc_mp);
1073 libvlc_video_get_size(ev->vlc_mp, tmp, &x, &y);
1074 /* set them to object */
1079 ev->len = (double)(total_time / 1000.0);
1081 if((x != 0) && (y != 0)) {
1082 if((ev->w != x)||(ev->h != y)) {
1085 write(ev->fd_slave_write, &event, sizeof(void *));
1089 case libvlc_MediaPlayerEndReached: {
1091 _emotion_decode_stop(ev->obj);
1092 _emotion_playback_finished(ev->obj);
1099 static void *_em_lock(void *par)
1101 Emotion_Vlc_Video *ev;
1102 Emotion_Vlc_Video_Frame *evvf;
1104 /* get current frame */
1105 ev = (Emotion_Vlc_Video*)par;
1106 evvf = ev->cur_frame;
1108 /* lock current frame */
1109 pthread_mutex_lock(&(evvf->frame_copy_lock));
1111 /* send current frame address to vlc */
1115 static void _em_unlock(void *par)
1120 Emotion_Vlc_Video *ev;
1121 Emotion_Vlc_Video_Frame *evvf;
1123 /* get current frame */
1124 ev = (Emotion_Vlc_Video*)par;
1125 evvf = ev->cur_frame;
1127 /* notify a new frame is available */
1128 event = VLC_NEW_FRAME;
1130 if(ev->video_mute == 0) {
1131 ret = write(ev->fd_write, &event, sizeof(void *));
1133 pthread_mutex_unlock(&(evvf->frame_copy_lock));
1138 static Emotion_Video_Module em_module =
1141 em_shutdown, /* shutdown */
1142 em_file_open, /* file_open */
1143 em_file_close, /* file_close */
1146 em_size_get, /* size_get */
1147 em_pos_set, /* pos_set */
1148 em_len_get, /* len_get */
1149 em_fps_num_get, /* fps_num_get */
1150 em_fps_den_get, /* fps_den_get */
1151 em_fps_get, /* fps_get */
1152 em_pos_get, /* pos_get */
1153 em_vis_set, /* vis_set */
1154 em_vis_get, /* vis_get */
1155 em_vis_supported, /* vis_supported */
1156 em_ratio_get, /* ratio_get */
1157 em_video_handled, /* video_handled */
1158 em_audio_handled, /* audio_handled */
1159 em_seekable, /* seekable */
1160 em_frame_done, /* frame_done */
1161 em_format_get, /* format_get */
1162 em_video_data_size_get, /* video_data_size_get */
1163 em_yuv_rows_get, /* yuv_rows_get */
1164 em_bgra_data_get, /* bgra_data_get */
1165 em_event_feed, /* event_feed */
1166 em_event_mouse_button_feed, /* event_mouse_button_feed */
1167 em_event_mouse_move_feed, /* event_mouse_move_feed */
1168 em_video_channel_count, /* video_channel_count */
1169 em_video_channel_set, /* video_channel_set */
1170 em_video_channel_get, /* video_channel_get */
1171 em_video_channel_name_get, /* video_channel_name_get */
1172 em_video_channel_mute_set, /* video_channel_mute_set */
1173 em_video_channel_mute_get, /* video_channel_mute_get */
1174 em_audio_channel_count, /* audio_channel_count */
1175 em_audio_channel_set, /* audio_channel_set */
1176 em_audio_channel_get, /* audio_channel_get */
1177 em_audio_channel_name_get, /* audio_channel_name_get */
1178 em_audio_channel_mute_set, /* audio_channel_mute_set */
1179 em_audio_channel_mute_get, /* audio_channel_mute_get */
1180 em_audio_channel_volume_set, /* audio_channel_volume_set */
1181 em_audio_channel_volume_get, /* audio_channel_volume_get */
1182 em_spu_channel_count, /* spu_channel_count */
1183 em_spu_channel_set, /* spu_channel_set */
1184 em_spu_channel_get, /* spu_channel_get */
1185 em_spu_channel_name_get, /* spu_channel_name_get */
1186 em_spu_channel_mute_set, /* spu_channel_mute_set */
1187 em_spu_channel_mute_get, /* spu_channel_mute_get */
1188 em_chapter_count, /* chapter_count */
1189 em_chapter_set, /* chapter_set */
1190 em_chapter_get, /* chapter_get */
1191 em_chapter_name_get, /* chapter_name_get */
1192 em_speed_set, /* speed_set */
1193 em_speed_get, /* speed_get */
1194 em_eject, /* eject */
1195 em_meta_get, /* meta_get */
1196 _emotion_object_extension_can_play_generic_get, /* can_play_get */
1201 static Eina_Bool module_open(Evas_Object *obj, const Emotion_Video_Module **module, void **video, Emotion_Module_Options *opt)
1207 if (!em_module.init(obj, video, opt)) {
1211 *module = &em_module;
1216 static void module_close(Emotion_Video_Module *module, void *video)
1218 em_module.shutdown(video);
1223 vlc_module_init(void)
1225 return _emotion_module_register("vlc", module_open, module_close);
1229 vlc_module_shutdown(void)
1231 _emotion_module_unregister("vlc");
1234 #ifndef EMOTION_STATIC_BUILD_VLC
1236 EINA_MODULE_INIT(vlc_module_init);
1237 EINA_MODULE_SHUTDOWN(vlc_module_shutdown);