From 5b8564d7baf7ae6dbd281c53f2ee2291c38be38b Mon Sep 17 00:00:00 2001 From: raster Date: Fri, 15 Apr 2005 07:27:02 +0000 Subject: [PATCH] simon treney's emotion patches - THANKs :o) git-svn-id: http://svn.enlightenment.org/svn/e/trunk/e17/libs/emotion@14208 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/emotion_private.h | 7 +- src/lib/emotion_smart.c | 61 ++++---- src/modules/emotion_xine.c | 347 +++++++++++++++++++-------------------------- src/modules/emotion_xine.h | 5 +- 4 files changed, 182 insertions(+), 238 deletions(-) diff --git a/src/lib/emotion_private.h b/src/lib/emotion_private.h index 50fc8c5..ea745f0 100644 --- a/src/lib/emotion_private.h +++ b/src/lib/emotion_private.h @@ -19,9 +19,9 @@ typedef struct _Emotion_Video_Module Emotion_Video_Module; struct _Emotion_Video_Module { - int (*init) (void); - int (*shutdown) (void); - void * (*file_open) (const char *file, Evas_Object *obj); + unsigned char (*init) (Evas_Object *obj, void **video); + int (*shutdown) (void *video); + unsigned char (*file_open) (const char *file, Evas_Object *obj, void *video); void (*file_close) (void *ef); void (*play) (void *ef, double pos); void (*stop) (void *ef); @@ -75,6 +75,7 @@ void _emotion_frame_new(Evas_Object *obj); void _emotion_video_pos_update(Evas_Object *obj, double pos, double len); void _emotion_frame_resize(Evas_Object *obj, int w, int h, double ratio); void _emotion_decode_stop(Evas_Object *obj); +void _emotion_playback_finished(Evas_Object *obj); void _emotion_channels_change(Evas_Object *obj); void _emotion_title_set(Evas_Object *obj, char *title); void _emotion_progress_set(Evas_Object *obj, char *info, double stat); diff --git a/src/lib/emotion_smart.c b/src/lib/emotion_smart.c index 031ac79..12df051 100644 --- a/src/lib/emotion_smart.c +++ b/src/lib/emotion_smart.c @@ -88,8 +88,8 @@ static void _smart_clip_unset(Evas_Object * obj); /**********************************/ static Evas_Smart *smart = NULL; -static Emotion_Video_Module * -_emotion_module_open(const char *name) +static unsigned char +_emotion_module_open(const char *name, Evas_Object *obj, Emotion_Video_Module **mod, void **video) { void *handle; char buf[4096]; @@ -98,34 +98,31 @@ _emotion_module_open(const char *name) handle = dlopen(buf, RTLD_NOW | RTLD_GLOBAL); if (handle) { - Emotion_Video_Module *(*func_module_open) (void); + unsigned char (*func_module_open)(Evas_Object *, Emotion_Video_Module **, void **); func_module_open = dlsym(handle, "module_open"); if (func_module_open) { - Emotion_Video_Module *mod; - - mod = func_module_open(); - if (mod) + if (func_module_open(obj, mod, video)) { - mod->handle = handle; - return mod; + (*mod)->handle = handle; + return 1; } } dlclose(handle); } - return NULL; + return 0; } static void -_emotion_module_close(Emotion_Video_Module *mod) +_emotion_module_close(Emotion_Video_Module *mod, void *video) { void *handle; - void (*module_close) (Emotion_Video_Module *module); + void (*module_close) (Emotion_Video_Module *module, void *); handle = mod->handle; module_close = dlsym(handle, "module_close"); - if (module_close) module_close(mod); + if (module_close) module_close(mod, video); dlclose(handle); } @@ -168,24 +165,23 @@ emotion_object_file_set(Evas_Object *obj, const char *file) int w, h; sd->file = strdup(file); - if ((sd->video) && (sd->module)) + if (sd->module) { sd->module->file_close(sd->video); - sd->video = NULL; evas_object_image_size_set(sd->obj, 0, 0); } - if (sd->module) _emotion_module_close(sd->module); - sd->module = _emotion_module_open("emotion_decoder_xine.so"); - if (!sd->module) return; - sd->video = sd->module->file_open(sd->file, obj); - if (sd->video) - { - sd->module->size_get(sd->video, &w, &h); - evas_object_image_size_set(sd->obj, w, h); - sd->ratio = sd->module->ratio_get(sd->video); - sd->pos = 0.0; - if (sd->play) sd->module->play(sd->video, 0.0); - } + if (!sd->module || !sd->video) + { + if (!_emotion_module_open("emotion_decoder_xine.so", obj, &sd->module, &sd->video)) + return; + } + if (!sd->module->file_open(sd->file, obj, sd->video)) + return; + sd->module->size_get(sd->video, &w, &h); + evas_object_image_size_set(sd->obj, w, h); + sd->ratio = sd->module->ratio_get(sd->video); + sd->pos = 0.0; + if (sd->play) sd->module->play(sd->video, 0.0); } else { @@ -195,8 +191,6 @@ emotion_object_file_set(Evas_Object *obj, const char *file) sd->video = NULL; evas_object_image_size_set(sd->obj, 0, 0); } - if (sd->module) _emotion_module_close(sd->module); - sd->module = NULL; } } @@ -811,6 +805,12 @@ _emotion_decode_stop(Evas_Object *obj) } void +_emotion_playback_finished(Evas_Object *obj) +{ + evas_object_smart_callback_call(obj, "playback_finished", NULL); +} + +void _emotion_channels_change(Evas_Object *obj) { Smart_Data *sd; @@ -1025,11 +1025,10 @@ static void _smart_del(Evas_Object * obj) { Smart_Data *sd; - sd = evas_object_smart_data_get(obj); if (!sd) return; if (sd->video) sd->module->file_close(sd->video); - if (sd->module) _emotion_module_close(sd->module); + if (sd->module) _emotion_module_close(sd->module, sd->video); evas_object_del(sd->obj); if (sd->file) free(sd->file); if (sd->job) ecore_job_del(sd->job); diff --git a/src/modules/emotion_xine.c b/src/modules/emotion_xine.c index 100aa2b..bc94cba 100644 --- a/src/modules/emotion_xine.c +++ b/src/modules/emotion_xine.c @@ -2,11 +2,9 @@ #include "emotion_private.h" #include "emotion_xine.h" -static int init_count = 0; - -static int em_init(void); -static int em_shutdown(void); -static void *em_file_open(const char *file, Evas_Object *obj); +static unsigned char em_init(Evas_Object *obj, void **emotion_video); +static int em_shutdown(void *video); +static unsigned char em_file_open(const char *file, Evas_Object *obj, void *video); static void em_file_close(void *ef); static void em_play(void *ef, double pos); static void em_stop(void *ef); @@ -60,42 +58,27 @@ static int _em_timer (void *data); static void *_em_get_pos_len_th(void *par); static void _em_get_pos_len (Emotion_Xine_Video *ev); -static int -em_init(void) -{ - init_count++; - if (init_count > 1) return init_count; - return init_count; -} - -static int -em_shutdown(void) -{ - init_count--; - if (init_count > 0) return init_count; - return 0; -} - -static void * -em_file_open(const char *file, Evas_Object *obj) +static unsigned char +em_init(Evas_Object *obj, void **emotion_video) { Emotion_Xine_Video *ev; - int pos_stream = 0; - int pos_time = 0; - int length_time = 0; - uint32_t v; + int fds[2]; + + if (!emotion_video) + return; ev = calloc(1, sizeof(Emotion_Xine_Video)); - if (!ev) return NULL; + if (!ev) return 0; ev->obj = obj; ev->decoder = xine_new(); if (!ev->decoder) - { - free(ev); - return NULL; - } + { + free(ev); + return 0; + } xine_init(ev->decoder); + xine_init(ev->decoder); if (1) { xine_cfg_entry_t cf; @@ -222,39 +205,25 @@ em_file_open(const char *file, Evas_Object *obj) printf("MRL: %s\n", auto_play_mrls[i]); } } + + if (pipe(fds) == 0) { - int fds[2]; - - if (pipe(fds) == 0) - { - ev->fd_read = fds[0]; - ev->fd_write = fds[1]; - fcntl(ev->fd_read, F_SETFL, O_NONBLOCK); - ev->fd_handler = ecore_main_fd_handler_add(ev->fd_read, - ECORE_FD_READ, - _em_fd_active, - ev, - NULL, - NULL); - ecore_main_fd_handler_active_set(ev->fd_handler, ECORE_FD_READ); - } + ev->fd_read = fds[0]; + ev->fd_write = fds[1]; + fcntl(ev->fd_read, F_SETFL, O_NONBLOCK); + ev->fd_handler = ecore_main_fd_handler_add(ev->fd_read, + ECORE_FD_READ, _em_fd_active, ev, NULL, NULL); + ecore_main_fd_handler_active_set(ev->fd_handler, ECORE_FD_READ); } + + if (pipe(fds) == 0) { - int fds[2]; - - if (pipe(fds) == 0) - { - ev->fd_ev_read = fds[0]; - ev->fd_ev_write = fds[1]; - fcntl(ev->fd_ev_read, F_SETFL, O_NONBLOCK); - ev->fd_ev_handler = ecore_main_fd_handler_add(ev->fd_ev_read, - ECORE_FD_READ, - _em_fd_ev_active, - ev, - NULL, - NULL); - ecore_main_fd_handler_active_set(ev->fd_ev_handler, ECORE_FD_READ); - } + ev->fd_ev_read = fds[0]; + ev->fd_ev_write = fds[1]; + fcntl(ev->fd_ev_read, F_SETFL, O_NONBLOCK); + ev->fd_ev_handler = ecore_main_fd_handler_add(ev->fd_ev_read, + ECORE_FD_READ, _em_fd_ev_active, ev, NULL, NULL); + ecore_main_fd_handler_active_set(ev->fd_ev_handler, ECORE_FD_READ); } ev->fd = ev->fd_write; @@ -266,21 +235,51 @@ em_file_open(const char *file, Evas_Object *obj) ev->stream = xine_stream_new(ev->decoder, ev->audio, ev->video); ev->queue = xine_event_new_queue(ev->stream); xine_event_create_listener_thread(ev->queue, _em_event, ev); + *emotion_video = ev; + + return 1; +} + +static int +em_shutdown(void *video) +{ + Emotion_Xine_Video *ev; + + ev = (Emotion_Xine_Video *)video; + + printf("EX dispose\n"); + xine_dispose(ev->stream); + printf("EX dispose evq\n"); + xine_event_dispose_queue(ev->queue); + printf("EX close video drv\n"); + if (ev->video) xine_close_video_driver(ev->decoder, ev->video); + printf("EX close audio drv\n"); + if (ev->audio) xine_close_audio_driver(ev->decoder, ev->audio); + printf("EX del fds\n"); + ecore_main_fd_handler_del(ev->fd_handler); + close(ev->fd_write); + close(ev->fd_read); + ecore_main_fd_handler_del(ev->fd_ev_handler); + close(ev->fd_ev_write); + close(ev->fd_ev_read); + xine_exit(ev->decoder); + free(ev); +} + +static unsigned char +em_file_open(const char *file, Evas_Object *obj, void *video) +{ + Emotion_Xine_Video *ev = (Emotion_Xine_Video *)video; + int pos_stream = 0; + int pos_time = 0; + int length_time = 0; + uint32_t v; + + if (!ev) + return 0; + if (!xine_open(ev->stream, file)) - { - ecore_main_fd_handler_del(ev->fd_handler); - close(ev->fd_write); - close(ev->fd_read); - ecore_main_fd_handler_del(ev->fd_ev_handler); - close(ev->fd_ev_write); - close(ev->fd_ev_read); - xine_dispose(ev->stream); - if (ev->video) xine_close_video_driver(ev->decoder, ev->video); - if (ev->audio) xine_close_audio_driver(ev->decoder, ev->audio); - xine_event_dispose_queue(ev->queue); - free(ev); - return NULL; - } + return 0; if (xine_get_pos_length(ev->stream, &pos_stream, &pos_time, &length_time)) { if (length_time == 0) @@ -295,6 +294,11 @@ em_file_open(const char *file, Evas_Object *obj) ev->len = (double)length_time / 1000.0; } } + else + { + ev->pos = 0.0; + ev->len = 1.0; + } v = xine_get_stream_info(ev->stream, XINE_STREAM_INFO_FRAME_DURATION); if (v > 0) ev->fps = 90000.0 / (double)v; v = xine_get_stream_info(ev->stream, XINE_STREAM_INFO_VIDEO_WIDTH); @@ -305,27 +309,20 @@ em_file_open(const char *file, Evas_Object *obj) ev->ratio = (double)v / 10000.0; ev->just_loaded = 1; ev->get_poslen = 0; + ev->seek_to = 0; - { - pthread_attr_t thattr; - - pthread_cond_init(&(ev->seek_cond), NULL); - pthread_cond_init(&(ev->get_pos_len_cond), NULL); - pthread_mutex_init(&(ev->seek_mutex), NULL); - pthread_mutex_init(&(ev->get_pos_len_mutex), NULL); - - pthread_attr_init(&thattr); - pthread_create(&ev->seek_th, NULL, _em_seek, ev); - pthread_attr_destroy(&thattr); - - pthread_attr_init(&thattr); - pthread_create(&ev->get_pos_len_th, NULL, _em_get_pos_len_th, ev); - pthread_attr_destroy(&thattr); - + ev->delete_me = 0; ev->get_pos_thread_deleted = 0; - } + ev->seek_thread_deleted = 0; + pthread_cond_init(&(ev->seek_cond), NULL); + pthread_cond_init(&(ev->get_pos_len_cond), NULL); + pthread_mutex_init(&(ev->seek_mutex), NULL); + pthread_mutex_init(&(ev->get_pos_len_mutex), NULL); + pthread_create(&ev->seek_th, NULL, _em_seek, ev); + pthread_create(&ev->get_pos_len_th, NULL, _em_get_pos_len_th, ev); + // em_debug(ev); - return ev; + return 1; } static void @@ -336,52 +333,38 @@ em_file_close(void *ef) ev = (Emotion_Xine_Video *)ef; ev->delete_me = 1; // pthread_mutex_lock(&(ev->seek_mutex)); - pthread_cond_broadcast(&(ev->seek_cond)); - while (ev->seek_to); + if (!ev->seek_thread_deleted) + { + printf("closing seek thread\n"); + pthread_cond_broadcast(&(ev->seek_cond)); + while (ev->seek_to); + } // pthread_mutex_lock(&(ev->get_pos_len_mutex)); if (!ev->get_pos_thread_deleted) - { - pthread_cond_broadcast(&(ev->get_pos_len_cond)); - while (ev->get_poslen); - } + { + printf("closing get_pos thread\n"); + pthread_cond_broadcast(&(ev->get_pos_len_cond)); + while (ev->get_poslen); + } printf("EX pause end...\n"); if (!emotion_object_play_get(ev->obj)) // if (xine_get_param(ev->stream, XINE_PARAM_SPEED) == XINE_SPEED_PAUSE) { - printf("sync...\n"); - while (xine_get_param(ev->stream, XINE_PARAM_SPEED) == XINE_SPEED_NORMAL); - printf("sync...\n"); - while (xine_get_param(ev->stream, XINE_PARAM_SPEED) == XINE_SPEED_PAUSE) - { - printf(" ... unpause\n"); - xine_set_param(ev->stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL); - } + printf(" ... unpause\n"); + xine_set_param(ev->stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL); } printf("EX stop\n"); xine_stop(ev->stream); printf("EX close\n"); xine_close(ev->stream); - printf("EX dispose\n"); - xine_dispose(ev->stream); - printf("EX dispose evq\n"); - xine_event_dispose_queue(ev->queue); - printf("EX close video drv\n"); - if (ev->video) xine_close_video_driver(ev->decoder, ev->video); - printf("EX close audio drv\n"); - if (ev->audio) xine_close_audio_driver(ev->decoder, ev->audio); printf("EX del timer\n"); - if (ev->timer) ecore_timer_del(ev->timer); - printf("EX del fds\n"); - ecore_main_fd_handler_del(ev->fd_handler); - close(ev->fd_write); - close(ev->fd_read); - ecore_main_fd_handler_del(ev->fd_ev_handler); - close(ev->fd_ev_write); - close(ev->fd_ev_read); - xine_exit(ev->decoder); - free(ev); + if (ev->timer) + { + ecore_timer_del(ev->timer); + ev->timer = NULL; + } } static void @@ -473,7 +456,7 @@ em_pos_set(void *ef, double pos) // if (xine_get_stream_info(ev->stream, XINE_STREAM_INFO_SEEKABLE)) { ev->seek_to_pos = pos; - ev->seek_to++; + ev->seek_to = 1; pthread_cond_broadcast(&(ev->seek_cond)); } } @@ -1010,13 +993,6 @@ em_meta_get(Emotion_Xine_Video *ev, int meta) return NULL; } - - - - - - - static void * _em_seek(void *par) { @@ -1026,30 +1002,29 @@ _em_seek(void *par) pthread_mutex_lock(&(ev->seek_mutex)); for (;;) { - double ppos = -1.0; + double ppos; pthread_cond_wait(&(ev->seek_cond), &(ev->seek_mutex)); - while (ev->seek_to > 0) + if (ev->seek_to) { - again: ppos = ev->seek_to_pos; - if (ppos > ev->len) ppos = ev->len; + if (ppos > ev->len) + ppos = ev->len; if (ev->no_time) xine_play(ev->stream, ppos * 65535, 0); else xine_play(ev->stream, 0, ppos * 1000); ev->seek_to = 0; - if (ev->delete_me) return NULL; + + if (!ev->play) + xine_set_param(ev->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE); } - if (!ev->play) + if (ev->delete_me) { - xine_set_param(ev->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE); + ev->seek_thread_deleted = 1; + return NULL; } - if (ev->delete_me) return NULL; - usleep(1000000 / 10); - if (ppos != ev->seek_to_pos) - goto again; - } + } return NULL; } @@ -1146,6 +1121,8 @@ _em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh) { case XINE_EVENT_UI_PLAYBACK_FINISHED: { + if ((ev->pos / ev->len) < 0.999) + break; if (ev->timer) { ecore_timer_del(ev->timer); @@ -1153,6 +1130,7 @@ _em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh) } ev->play = 0; _emotion_decode_stop(ev->obj); + _emotion_playback_finished(ev->obj); } break; case XINE_EVENT_UI_CHANNELS_CHANGED: @@ -1277,16 +1255,13 @@ _em_get_pos_len_th(void *par) for (;;) { pthread_cond_wait(&(ev->get_pos_len_cond), &(ev->get_pos_len_mutex)); - while (ev->get_poslen > 0 || ev->delete_me) + if (ev->get_poslen) { int pos_stream = 0; int pos_time = 0; int length_time = 0; - if (xine_get_pos_length(ev->stream, - &pos_stream, - &pos_time, - &length_time)) + if (xine_get_pos_length(ev->stream, &pos_stream, &pos_time, &length_time)) { if (length_time == 0) { @@ -1301,15 +1276,13 @@ _em_get_pos_len_th(void *par) ev->no_time = 0; } } - if (ev->delete_me) - { - ev->get_poslen = 0; - ev->get_pos_thread_deleted = 1; - return NULL; - } ev->get_poslen = 0; -// printf("get pos %3.3f\n", ev->pos); - usleep(1000000 / 15); + //printf("get pos %3.3f\n", ev->pos); + } + if (ev->delete_me) + { + ev->get_pos_thread_deleted = 1; + return NULL; } } return NULL; @@ -1319,30 +1292,10 @@ static void _em_get_pos_len(Emotion_Xine_Video *ev) { if (ev->get_poslen) return; - ev->get_poslen++; + ev->get_poslen = 1; pthread_cond_broadcast(&(ev->get_pos_len_cond)); } - - - - - - - - - - - - - - - - - - - - static Emotion_Video_Module em_module = { em_init, /* init */ @@ -1394,35 +1347,25 @@ static Emotion_Video_Module em_module = em_meta_get /* meta_get */ }; -Emotion_Video_Module * -module_open(void) +unsigned char +module_open(Evas_Object *obj, Emotion_Video_Module **module, void **video) { - em_module.init(); - return &em_module; + if (!module) + return 0; + + if (!em_module.init(obj, video)) + return 0; + + *module = &em_module; + return 1; } void -module_close(Emotion_Video_Module *module) +module_close(Emotion_Video_Module *module, void *video) { - em_module.shutdown(); + em_module.shutdown(video); } - - - - - - - - - - - - - - - - #if 0 void em_debug(Emotion_Xine_Video *ev) diff --git a/src/modules/emotion_xine.h b/src/modules/emotion_xine.h index 8025cad..f796bc9 100644 --- a/src/modules/emotion_xine.h +++ b/src/modules/emotion_xine.h @@ -49,6 +49,7 @@ struct _Emotion_Xine_Video pthread_cond_t get_pos_len_cond; pthread_mutex_t seek_mutex; pthread_mutex_t get_pos_len_mutex; + unsigned char seek_thread_deleted : 1; unsigned char get_pos_thread_deleted : 1; }; @@ -71,7 +72,7 @@ struct _Emotion_Xine_Event char *xine_event; }; -Emotion_Video_Module *module_open (void); -void module_close(Emotion_Video_Module *module); +unsigned char module_open(Evas_Object *obj, Emotion_Video_Module **module, void **video); +void module_close(Emotion_Video_Module *module, void *video); #endif -- 2.7.4