diff --git a/legacy/emotion/src/examples/emotion_generic_example.c b/legacy/emotion/src/examples/emotion_generic_example.c index 33c1686a56..bef1501db1 100644 --- a/legacy/emotion/src/examples/emotion_generic_example.c +++ b/legacy/emotion/src/examples/emotion_generic_example.c @@ -95,6 +95,11 @@ _on_key_down(void *data, Evas *e, Evas_Object *o, void *event_info) { evas_object_del(em); } + else if (!strcmp(ev->keyname, "l")) + { + // force frame dropping + sleep(5); + } else { fprintf(stderr, "unhandled key: %s\n", ev->keyname); diff --git a/legacy/emotion/src/generic_players/vlc/emotion_generic_vlc.c b/legacy/emotion/src/generic_players/vlc/emotion_generic_vlc.c index b3e1eb1d1c..dfa0962132 100644 --- a/legacy/emotion/src/generic_players/vlc/emotion_generic_vlc.c +++ b/legacy/emotion/src/generic_players/vlc/emotion_generic_vlc.c @@ -253,17 +253,6 @@ _lock(void *data, void **pixels) static void _unlock(void *data, void *id, void *const *pixels) { - struct _App *app = data; - - if (!app->playing) - return; - - sem_wait(&app->vs->lock); - app->vs->frame.last = app->vs->frame.player; - app->vs->frame.player = app->vs->frame.next; - app->vs->frame.next = app->vs->frame.last; - - sem_post(&app->vs->lock); } static void @@ -273,7 +262,13 @@ _display(void *data, void *id) if (!app->playing) return; - _send_cmd(app, EM_RESULT_FRAME_NEW); + sem_wait(&app->vs->lock); + app->vs->frame.last = app->vs->frame.player; + app->vs->frame.player = app->vs->frame.next; + app->vs->frame.next = app->vs->frame.last; + if (!app->vs->frame_drop++) + _send_cmd(app, EM_RESULT_FRAME_NEW); + sem_post(&app->vs->lock); } static void * diff --git a/legacy/emotion/src/modules/generic/Emotion_Generic_Plugin.h b/legacy/emotion/src/modules/generic/Emotion_Generic_Plugin.h index b418ebca35..cb0a399994 100644 --- a/legacy/emotion/src/modules/generic/Emotion_Generic_Plugin.h +++ b/legacy/emotion/src/modules/generic/Emotion_Generic_Plugin.h @@ -89,6 +89,7 @@ struct _Emotion_Generic_Video_Shared int next; } frame; sem_t lock; + int frame_drop; }; inline int diff --git a/legacy/emotion/src/modules/generic/emotion_generic.c b/legacy/emotion/src/modules/generic/emotion_generic.c index eee92bd195..d8876e03cf 100644 --- a/legacy/emotion/src/modules/generic/emotion_generic.c +++ b/legacy/emotion/src/modules/generic/emotion_generic.c @@ -173,6 +173,7 @@ _create_shm_data(Emotion_Generic_Video *ev, const char *shmname) vs->frame.player = 1; vs->frame.last = 2; vs->frame.next = 2; + vs->frame_drop = 0; sem_init(&vs->lock, 1, 1); ev->frame.frames[0] = (unsigned char *)vs + sizeof(*vs); ev->frame.frames[1] = (unsigned char *)vs + sizeof(*vs) + vs->height * vs->width * vs->pitch; @@ -190,8 +191,7 @@ _player_new_frame(Emotion_Generic_Video *ev) { if (ev->opening || ev->closing) return; - if (!ev->drop++) - _emotion_frame_new(ev->obj); + _emotion_frame_new(ev->obj); } static void @@ -1103,6 +1103,10 @@ em_bgra_data_get(void *data, unsigned char **bgra_data) } *bgra_data = ev->frame.frames[ev->shared->frame.emotion]; + if (ev->shared->frame_drop > 1) + WRN("dropped frames: %d", ev->shared->frame_drop - 1); + ev->shared->frame_drop = 0; + // unlock frame here sem_post(&ev->shared->lock); ev->drop = 0;