]> git.sesse.net Git - vlc/commitdiff
vout: fix picture lock/unlock with private pool
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 1 Nov 2014 13:59:55 +0000 (15:59 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 1 Nov 2014 13:59:55 +0000 (15:59 +0200)
include/vlc_picture_pool.h
src/misc/picture_pool.c
src/video_output/vout_wrapper.c

index ad8835efb325ddcaddf7cc19c927494407e99c04..72278c9ab4600516b248084c13f5fa20992fc188 100644 (file)
@@ -133,6 +133,7 @@ VLC_USED;
  */
 VLC_API unsigned picture_pool_GetSize(const picture_pool_t *);
 
+bool picture_pool_NeedsLocking(const picture_pool_t *);
 
 #endif /* VLC_PICTURE_POOL_H */
 
index e899f9eabbc5e46ea945822500a438a384c83dfc..15d07919aebd29ab3905bf61e79f0547e7a4016e 100644 (file)
@@ -208,6 +208,8 @@ error:
 
 picture_pool_t *picture_pool_Reserve(picture_pool_t *master, unsigned count)
 {
+    assert(master->pic_unlock == NULL);
+
     picture_t *picture[count ? count : 1];
     unsigned i;
 
@@ -221,8 +223,6 @@ picture_pool_t *picture_pool_Reserve(picture_pool_t *master, unsigned count)
     if (!pool)
         goto error;
 
-    pool->pic_lock   = master->pic_lock;
-    pool->pic_unlock = master->pic_unlock;
     return pool;
 
 error:
@@ -330,3 +330,8 @@ unsigned picture_pool_GetSize(const picture_pool_t *pool)
 {
     return pool->picture_count;
 }
+
+bool picture_pool_NeedsLocking(const picture_pool_t *pool)
+{
+    return pool->pic_lock != NULL || pool->pic_unlock != NULL;
+}
index d172bcca0bfdacc9ebc5c7979a1f10850e7092c9..8b5174a235f245f975e9c4271dfb8661c69b0d53 100644 (file)
@@ -133,8 +133,8 @@ int vout_InitWrapper(vout_thread_t *vout)
     picture_pool_t *display_pool =
         vout_display_Pool(vd, allow_dr ? __MAX(VOUT_MAX_PICTURES,
                                                reserved_picture + decoder_picture) : 3);
-    if (allow_dr &&
-        picture_pool_GetSize(display_pool) >= reserved_picture + decoder_picture) {
+    if (allow_dr && !picture_pool_NeedsLocking(display_pool)
+     && picture_pool_GetSize(display_pool) >= reserved_picture + decoder_picture) {
         sys->dpb_size     = picture_pool_GetSize(display_pool) - reserved_picture;
         sys->decoder_pool = display_pool;
         sys->display_pool = display_pool;