From 03d7b90b8a8721ca536999d4b1a037f414907211 Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 21 Aug 2012 09:17:38 +0000 Subject: [PATCH] emotion: fix priority_set/get Patch by Sohyun Kim git-svn-id: http://svn.enlightenment.org/svn/e/trunk/emotion@75495 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- ChangeLog | 4 ++++ NEWS | 1 + src/generic_players/vlc/emotion_generic_vlc.c | 14 ++++++++++--- src/modules/generic/Emotion_Generic_Plugin.h | 1 + src/modules/generic/emotion_generic.c | 4 ++++ src/modules/gstreamer/emotion_gstreamer.c | 29 +++++++++++++++++++++++++-- 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d5d458..10d7684 100644 --- a/ChangeLog +++ b/ChangeLog @@ -37,3 +37,7 @@ 2012-08-01 Cedric Bail * Fix race condition in gstreamer render function. + +2012-08-10 Sohyun Kim + + * Fix priority set/get for gstreamer. diff --git a/NEWS b/NEWS index fceec4b..8aa8f74 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ Fixes: - build out of tree. - stride of all YUV video - fix race condition in gstreamer render function on shutdown and file set. + - fix priority set/get for gstreamer. Improvements: diff --git a/src/generic_players/vlc/emotion_generic_vlc.c b/src/generic_players/vlc/emotion_generic_vlc.c index 7ec0a6f..f415064 100644 --- a/src/generic_players/vlc/emotion_generic_vlc.c +++ b/src/generic_players/vlc/emotion_generic_vlc.c @@ -25,6 +25,7 @@ enum _Thread_Events { EM_THREAD_POSITION_CHANGED, EM_THREAD_PLAYBACK_STARTED, EM_THREAD_PLAYBACK_STOPPED, + EM_THREAD_EOF, EM_THREAD_LAST }; @@ -311,6 +312,7 @@ _play(struct _App *app) else { libvlc_time_t new_time = pos * 1000; + fprintf(stderr, "pos %f\n", pos); libvlc_media_player_set_time(app->mp, new_time); libvlc_media_player_play(app->mp); app->playing = 1; @@ -371,9 +373,11 @@ _event_cb(const struct libvlc_event_t *ev, void *data) _send_file_set(app); break; case libvlc_MediaPlayerEndReached: - thread_event = EM_THREAD_PLAYBACK_STOPPED; - write(app->fd_write, &thread_event, sizeof(thread_event)); - break; + thread_event = EM_THREAD_EOF; + write(app->fd_write, &thread_event, sizeof(thread_event)); + /* thread_event = EM_THREAD_PLAYBACK_STOPPED; */ + /* write(app->fd_write, &thread_event, sizeof(thread_event)); */ + break; } } @@ -739,6 +743,10 @@ _process_thread_events(struct _App *app) case EM_THREAD_PLAYBACK_STARTED: _send_cmd(app, EM_RESULT_PLAYBACK_STARTED); break; + case EM_THREAD_EOF: + _send_cmd(app, EM_RESULT_FILE_EOF); + app->playing = 0; + break; case EM_THREAD_PLAYBACK_STOPPED: libvlc_media_player_stop(app->mp); app->playing = 0; diff --git a/src/modules/generic/Emotion_Generic_Plugin.h b/src/modules/generic/Emotion_Generic_Plugin.h index 17bd7e9..e481305 100644 --- a/src/modules/generic/Emotion_Generic_Plugin.h +++ b/src/modules/generic/Emotion_Generic_Plugin.h @@ -56,6 +56,7 @@ enum _Emotion_Generic_Result EM_RESULT_SPU_TRACK_INFO, // param: current spu, spu count, spu_id, spu_name, spu_id2, spu_name2, ... // (int, int, int, string, int, string, ...) EM_RESULT_META_INFO, // param: title, artist, album, year, genre, comments, disc id, count (all int) + EM_RESULT_FILE_EOF, // param: none EM_RESULT_LAST }; diff --git a/src/modules/generic/emotion_generic.c b/src/modules/generic/emotion_generic.c index 549c179..147fb8e 100644 --- a/src/modules/generic/emotion_generic.c +++ b/src/modules/generic/emotion_generic.c @@ -587,6 +587,10 @@ _player_cmd_process(Emotion_Generic_Video *ev) case EM_RESULT_META_INFO: _player_meta_info_read(ev); break; + case EM_RESULT_FILE_EOF: + _emotion_decode_stop(ev->obj); + _emotion_playback_finished(ev->obj); + break; default: WRN("received wrong command: %d", ev->cmd.type); } diff --git a/src/modules/gstreamer/emotion_gstreamer.c b/src/modules/gstreamer/emotion_gstreamer.c index 3383ce9..df29de8 100644 --- a/src/modules/gstreamer/emotion_gstreamer.c +++ b/src/modules/gstreamer/emotion_gstreamer.c @@ -36,6 +36,8 @@ int _emotion_gstreamer_log_domain = -1; Eina_Bool debug_fps = EINA_FALSE; Eina_Bool _ecore_x_available = EINA_FALSE; +static Ecore_Idler *restart_idler; + /* Callbacks to get the eos */ static void _for_each_tag (GstTagList const* list, gchar const* tag, void *data); static void _free_metadata (Emotion_Gstreamer_Metadata *m); @@ -201,6 +203,8 @@ static GstBusSyncReply _eos_sync_fct(GstBus *bus, GstMessage *message, gpointer data); +static Eina_Bool _em_restart_stream(void *data); + /* Module interface */ static Emotion_Video_Module em_module = @@ -439,6 +443,12 @@ em_cleanup(Emotion_Gstreamer_Video *ev) #endif } + if (restart_idler) + { + ecore_idler_del(restart_idler); + restart_idler = NULL; + } + EINA_LIST_FREE(ev->audio_streams, astream) free(astream); EINA_LIST_FREE(ev->video_streams, vstream) @@ -1275,6 +1285,19 @@ em_priority_set(void *video, Eina_Bool pri) ev = video; if (priority_overide > 3) return ; /* If we failed to much to create that pipeline, let's don't wast our time anymore */ + + if (ev->priority != pri && ev->pipeline) + { + if (ev->threads) + { + Ecore_Thread *t; + + EINA_LIST_FREE(ev->threads, t) + ecore_thread_cancel(t); + } + em_cleanup(ev); + restart_idler = ecore_idler_add(_em_restart_stream, ev); + } ev->priority = pri; } @@ -1284,7 +1307,7 @@ em_priority_get(void *video) Emotion_Gstreamer_Video *ev; ev = video; - return ev->stream; + return !ev->stream; } #ifdef HAVE_ECORE_X @@ -1606,6 +1629,8 @@ _em_restart_stream(void *data) gst_bus_set_sync_handler(ev->eos_bus, _eos_sync_fct, ev); } + restart_idler = NULL; + return ECORE_CALLBACK_CANCEL; } @@ -1723,7 +1748,7 @@ _eos_main_fct(void *data) ev->priority = EINA_FALSE; priority_overide++; - ecore_idler_add(_em_restart_stream, ev); + restart_idler = ecore_idler_add(_em_restart_stream, ev); } break; default: -- 2.7.4