From dfd943c0f4131ee005158c9a3c6149ea2b81ea8a Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 17 Jun 2014 14:52:08 +0200 Subject: [PATCH] SDL: recycle free frames --- gpujpeg | 2 +- src/video_display/sdl.cpp | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gpujpeg b/gpujpeg index d70ece53b..371fad450 160000 --- a/gpujpeg +++ b/gpujpeg @@ -1 +1 @@ -Subproject commit d70ece53bc1f14bd6a82fc1f1effd0b285d20fb5 +Subproject commit 371fad4502eda564f4c41d1263e3f08794935bca diff --git a/src/video_display/sdl.cpp b/src/video_display/sdl.cpp index bdeef8f08..cd8e300eb 100644 --- a/src/video_display/sdl.cpp +++ b/src/video_display/sdl.cpp @@ -97,6 +97,7 @@ struct state_sdl { bool play_audio; queue frame_queue; + queue free_frame_queue; struct video_desc current_desc; struct video_desc current_display_desc; mutex lock; @@ -275,7 +276,9 @@ void display_sdl_run(void *arg) SDL_DisplayYUVOverlay(s->yuv_image, &(s->dst_rect)); } - vf_free(frame); + s->lock.lock(); + s->free_frame_queue.push(frame); + s->lock.unlock(); s->frames++; gettimeofday(&tv, NULL); @@ -510,6 +513,12 @@ void display_sdl_done(void *state) autorelease_pool_destroy(s->autorelease_pool); #endif + while (s->free_frame_queue.size() > 0) { + struct video_frame *buffer = s->free_frame_queue.front(); + s->free_frame_queue.pop(); + vf_free(buffer); + } + delete s; } @@ -518,6 +527,18 @@ struct video_frame *display_sdl_getf(void *state) struct state_sdl *s = (struct state_sdl *)state; assert(s->magic == MAGIC_SDL); + lock_guard lock(s->lock); + + while (s->free_frame_queue.size() > 0) { + struct video_frame *buffer = s->free_frame_queue.front(); + s->free_frame_queue.pop(); + if (video_desc_eq(video_desc_from_frame(buffer), s->current_desc)) { + return buffer; + } else { + vf_free(buffer); + } + } + return vf_alloc_desc_data(s->current_desc); }