From 1172b7c3eec0aebe36c2e1f3d6476ae97fc6a792 Mon Sep 17 00:00:00 2001 From: Thomas Guillem Date: Sat, 23 Sep 2017 15:53:46 +0200 Subject: [PATCH] vout: drop pictures owned by old vouts See FIXME comment. --- include/vlc_picture_pool.h | 7 +++++++ src/misc/picture_pool.c | 8 ++++++++ src/video_output/video_output.c | 14 ++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/include/vlc_picture_pool.h b/include/vlc_picture_pool.h index 679e98682c..8b04370bfb 100644 --- a/include/vlc_picture_pool.h +++ b/include/vlc_picture_pool.h @@ -154,6 +154,13 @@ VLC_API void picture_pool_Enum( picture_pool_t *, */ void picture_pool_Cancel( picture_pool_t *, bool canceled ); +/** + * Test if a picture belongs to the picture pool + * + * FIXME: remove this function when the vout_PutPicture() hack is fixed. + */ +bool picture_pool_OwnsPic( picture_pool_t *, picture_t *); + /** * Reserves pictures from a pool and creates a new pool with those. * diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c index 17bf3b7b82..bb957c4af5 100644 --- a/src/misc/picture_pool.c +++ b/src/misc/picture_pool.c @@ -296,6 +296,14 @@ void picture_pool_Cancel(picture_pool_t *pool, bool canceled) vlc_mutex_unlock(&pool->lock); } +bool picture_pool_OwnsPic(picture_pool_t *pool, picture_t *pic) +{ + picture_priv_t *priv = (picture_priv_t *)pic; + uintptr_t sys = (uintptr_t)priv->gc.opaque; + picture_pool_t *picpool = (void *)(sys & ~(POOL_MAX - 1)); + return pool == picpool; +} + unsigned picture_pool_GetSize(const picture_pool_t *pool) { return pool->picture_count; diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index c432c70aa0..efb342de9f 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -425,9 +425,19 @@ picture_t *vout_GetPicture(vout_thread_t *vout) void vout_PutPicture(vout_thread_t *vout, picture_t *picture) { picture->p_next = NULL; - picture_fifo_Push(vout->p->decoder_fifo, picture); + if (picture_pool_OwnsPic(vout->p->decoder_pool, picture)) + { + picture_fifo_Push(vout->p->decoder_fifo, picture); - vout_control_Wake(&vout->p->control); + vout_control_Wake(&vout->p->control); + } + else + { + /* FIXME: HACK: Drop this picture because the vout changed. The old + * picture pool need to be kept by the new vout. This requires a major + * "vout display" API change. */ + picture_Release(picture); + } } /* */