[vlc-commits] vout: drop pictures owned by old vouts
Thomas Guillem
git at videolan.org
Sun Sep 24 12:57:28 CEST 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Sat Sep 23 15:53:46 2017 +0200| [1172b7c3eec0aebe36c2e1f3d6476ae97fc6a792] | committer: Thomas Guillem
vout: drop pictures owned by old vouts
See FIXME comment.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1172b7c3eec0aebe36c2e1f3d6476ae97fc6a792
---
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
@@ -155,6 +155,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.
*
* When the new pool is released, pictures are returned to the master pool.
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);
+ }
}
/* */
More information about the vlc-commits
mailing list