[vlc-commits] picture_pool: handle non-pool pictures

Rémi Denis-Courmont git at videolan.org
Thu Dec 27 13:07:35 CET 2018


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Dec 27 14:04:53 2018 +0200| [52ff06c69b68290bd8386595ca60356efd5de12d] | committer: Rémi Denis-Courmont

picture_pool: handle non-pool pictures

This works around picture_pool_OwnsPic() crashing on non-pooled
pictures. The brittle kludge works for the time being because only
pooling and cloning use non-NULL picture_priv_T.gc.opaque.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=52ff06c69b68290bd8386595ca60356efd5de12d
---

 include/vlc_video_splitter.h     | 22 +++++++++++++---------
 modules/video_output/Makefile.am |  2 ++
 src/misc/picture_pool.c          |  3 +++
 src/video_output/display.c       | 23 -----------------------
 4 files changed, 18 insertions(+), 32 deletions(-)

diff --git a/include/vlc_video_splitter.h b/include/vlc_video_splitter.h
index 9118cfb903..c03034335f 100644
--- a/include/vlc_video_splitter.h
+++ b/include/vlc_video_splitter.h
@@ -97,9 +97,6 @@ struct video_splitter_t
                                   const vlc_mouse_t *p_old, const vlc_mouse_t *p_new );
 
     void *p_sys;
-
-    /* Buffer allocation */
-    int  (*pf_picture_new) ( video_splitter_t *, picture_t *pp_picture[] );
     void *p_owner;
 };
 
@@ -111,13 +108,20 @@ struct video_splitter_t
  *
  * If VLC_SUCCESS is not returned, pp_picture values are undefined.
  */
-static inline int video_splitter_NewPicture( video_splitter_t *p_splitter,
-                                             picture_t *pp_picture[] )
+static inline int video_splitter_NewPicture(video_splitter_t *splitter,
+                                            picture_t *pics[])
 {
-    int i_ret = p_splitter->pf_picture_new( p_splitter, pp_picture );
-    if( i_ret )
-        msg_Warn( p_splitter, "can't get output pictures" );
-    return i_ret;
+    for (int i = 0; i < splitter->i_output; i++) {
+        pics[i] = picture_NewFromFormat(&splitter->p_output[i].fmt);
+        if (pics[i] == NULL) {
+            for (int j = 0; j < i; j++)
+                picture_Release(pics[j]);
+
+            msg_Warn(splitter, "can't get output pictures");
+            return VLC_EGENERIC;
+        }
+    }
+    return VLC_SUCCESS;
 }
 
 /**
diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index bd3363954e..6c95e621ca 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -513,6 +513,7 @@ libflaschen_plugin_la_SOURCES = video_output/flaschen.c
 libflaschen_plugin_la_LIBADD = $(SOCKET_LIBS)
 
 libvdummy_plugin_la_SOURCES = video_output/vdummy.c
+libvideo_splitter_plugin_la_SOURCES = video_output/splitter.c
 libvmem_plugin_la_SOURCES = video_output/vmem.c
 libwdummy_plugin_la_SOURCES = video_output/wdummy.c
 libyuv_plugin_la_SOURCES = video_output/yuv.c
@@ -521,6 +522,7 @@ libvgl_plugin_la_SOURCES = video_output/vgl.c
 vout_LTLIBRARIES += \
 	libflaschen_plugin.la \
 	libvdummy_plugin.la \
+	libvideo_splitter_plugin.la \
 	libvmem_plugin.la \
 	libwdummy_plugin.la \
 	libvgl_plugin.la \
diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
index 948c67bba5..e0fbdd7333 100644
--- a/src/misc/picture_pool.c
+++ b/src/misc/picture_pool.c
@@ -292,6 +292,9 @@ bool picture_pool_OwnsPic(picture_pool_t *pool, picture_t *pic)
     picture_priv_t *priv = (picture_priv_t *)pic;
 
     while (priv->gc.destroy != picture_pool_ReleasePicture) {
+        if (priv->gc.opaque == NULL)
+            return false; /* not a pooled picture */
+
         pic = priv->gc.opaque;
         priv = (picture_priv_t *)pic;
     }
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 5f6f07a31a..b9a65267fb 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -1120,28 +1120,6 @@ static int SplitterControl(vout_display_t *vd, int query, va_list args)
     return VLC_EGENERIC;
 }
 
-static int SplitterPictureNew(video_splitter_t *splitter, picture_t *picture[])
-{
-    vout_display_t *wrapper = splitter->p_owner;
-    vout_display_sys_t *wsys = wrapper->sys;
-
-    for (int i = 0; i < wsys->count; i++) {
-        if (vout_IsDisplayFiltered(wsys->display[i])) {
-            /* TODO use a pool ? */
-            picture[i] = picture_NewFromFormat(&wsys->display[i]->source);
-        } else {
-            picture_pool_t *pool = vout_GetPool(wsys->display[i], 3);
-            picture[i] = pool ? picture_pool_Get(pool) : NULL;
-        }
-        if (!picture[i]) {
-            for (int j = 0; j < i; j++)
-                picture_Release(picture[j]);
-            return VLC_EGENERIC;
-        }
-    }
-    return VLC_SUCCESS;
-}
-
 static void SplitterClose(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -1197,7 +1175,6 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout,
 
     /* */
     splitter->p_owner = wrapper;
-    splitter->pf_picture_new = SplitterPictureNew;
 
     /* */
     TAB_INIT(sys->count, sys->display);



More information about the vlc-commits mailing list