[vlc-devel] [PATCH v2 11/14] picture: pass the opaque pointer to the destroy callback rather than the picture

Steve Lhomme robux4 at ycbcr.xyz
Fri Aug 14 14:01:46 CEST 2020


The resource desctrutor shouldn't have to know much about the picture nor if
it's still allocated or not.

This avoids some container_of in the picture_pool.
---
 include/vlc_picture.h                    |  2 +-
 modules/hw/vaapi/vlc_vaapi.c             |  4 ++--
 modules/hw/vdpau/picture.c               |  4 ++--
 modules/video_chroma/copy.c              |  5 ++---
 modules/video_output/android/display.c   |  4 ++--
 modules/video_output/opengl/interop_sw.c |  4 ++--
 modules/video_output/win32/direct3d11.c  |  4 ++--
 src/misc/picture.c                       | 10 +++++-----
 src/misc/picture_pool.c                  |  5 ++---
 9 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/include/vlc_picture.h b/include/vlc_picture.h
index 11c2fc70ac9..178118633d0 100644
--- a/include/vlc_picture.h
+++ b/include/vlc_picture.h
@@ -206,7 +206,7 @@ typedef struct
  */
 typedef struct
 {
-    void (*destroy)(picture_t *);
+    void (*destroy)(void *opaque);
     void *opaque;
 } picture_gc_t;
 
diff --git a/modules/hw/vaapi/vlc_vaapi.c b/modules/hw/vaapi/vlc_vaapi.c
index 53ff13a50d4..dcf09fed374 100644
--- a/modules/hw/vaapi/vlc_vaapi.c
+++ b/modules/hw/vaapi/vlc_vaapi.c
@@ -421,9 +421,9 @@ typedef struct
 } picture_sys_t;
 
 static void
-pool_pic_destroy_cb(picture_t *pic)
+pool_pic_destroy_cb(void *opaque)
 {
-    picture_sys_t *p_sys = pic->p_sys;
+    picture_sys_t *p_sys = opaque;
     struct pic_sys_vaapi_instance *instance = p_sys->instance;
 
     if (atomic_fetch_sub(&instance->pic_refcount, 1) == 1)
diff --git a/modules/hw/vdpau/picture.c b/modules/hw/vdpau/picture.c
index 495897e32f6..4a6406d1899 100644
--- a/modules/hw/vdpau/picture.c
+++ b/modules/hw/vdpau/picture.c
@@ -137,9 +137,9 @@ VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface,
     return VDP_STATUS_OK;
 }
 
-static void vlc_vdp_output_surface_destroy(picture_t *pic)
+static void vlc_vdp_output_surface_destroy(void *opaque)
 {
-    vlc_vdp_output_surface_t *sys = pic->p_sys;
+    vlc_vdp_output_surface_t *sys = opaque;
 
     vdp_output_surface_destroy(sys->vdp, sys->surface);
     vdp_release_x11(sys->vdp);
diff --git a/modules/video_chroma/copy.c b/modules/video_chroma/copy.c
index 9d82f51b630..717e20ddf7f 100644
--- a/modules/video_chroma/copy.c
+++ b/modules/video_chroma/copy.c
@@ -1095,9 +1095,9 @@ static void piccheck(picture_t *pic, const vlc_chroma_description_t *dsc,
     }
 }
 
-static void pic_rsc_destroy(picture_t *pic)
+static void pic_rsc_destroy(void *opaque)
 {
-    pic_test_resource *rsc = pic->p_sys;
+    pic_test_resource *rsc = opaque;
     for (int i = 0; i < rsc->i_planes; i++)
         free(rsc->p[i].p_pixels);
     free(rsc);
@@ -1119,7 +1119,6 @@ static picture_t *pic_new_unaligned(const video_format_t *fmt)
         free(rsc);
         return NULL;
     }
-    pic->p_sys = rsc;
     rsc->i_planes = dsc->plane_count;
     for (int i = 0; i < rsc->i_planes; i++)
     {
diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c
index 8c457c12614..cbc34c57f65 100644
--- a/modules/video_output/android/display.c
+++ b/modules/video_output/android/display.c
@@ -172,9 +172,9 @@ static int UpdateVideoSize(vout_display_sys_t *sys, video_format_t *p_fmt)
     return 0;
 }
 
-static void AndroidPicture_Destroy(picture_t *pic)
+static void AndroidPicture_Destroy(void *opaque)
 {
-    free(pic->p_sys);
+    free(opaque);
 }
 
 static picture_t *PictureAlloc(video_format_t *fmt)
diff --git a/modules/video_output/opengl/interop_sw.c b/modules/video_output/opengl/interop_sw.c
index 68953865aca..10fb1434553 100644
--- a/modules/video_output/opengl/interop_sw.c
+++ b/modules/video_output/opengl/interop_sw.c
@@ -51,9 +51,9 @@ struct priv
 };
 
 static void
-pbo_picture_destroy(picture_t *pic)
+pbo_picture_destroy(void *opaque)
 {
-    picture_sys_t *picsys = pic->p_sys;
+    picture_sys_t *picsys = opaque;
 
     picsys->DeleteBuffers(picsys->i_planes, picsys->buffers);
 
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 62f32f6c4ef..7904b7298ab 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -1242,9 +1242,9 @@ static void Direct3D11DeleteRegions(int count, picture_t **region)
     free(region);
 }
 
-static void DestroyPictureQuad(picture_t *p_picture)
+static void DestroyPictureQuad(void *opaque)
 {
-    D3D11_ReleaseQuad( (d3d_quad_t *) p_picture->p_sys );
+    D3D11_ReleaseQuad( opaque );
 }
 
 static int Direct3D11MapSubpicture(vout_display_t *vd, int *subpicture_region_count,
diff --git a/src/misc/picture.c b/src/misc/picture.c
index 87f71f6b8cd..149111d74aa 100644
--- a/src/misc/picture.c
+++ b/src/misc/picture.c
@@ -54,9 +54,9 @@ static void PictureDestroyContext( picture_t *p_picture )
 /**
  * Destroys a picture allocated with picture_NewFromFormat().
  */
-static void picture_DestroyFromFormat(picture_t *pic)
+static void picture_DestroyFromFormat(void *opaque)
 {
-    picture_buffer_t *res = pic->p_sys;
+    picture_buffer_t *res = opaque;
 
     picture_Deallocate(res->fd, res->base, res->size);
 }
@@ -338,7 +338,7 @@ void picture_Destroy(picture_t *picture)
 
     picture_priv_t *priv = container_of(picture, picture_priv_t, picture);
     if (priv->gc.destroy != NULL)
-        priv->gc.destroy(picture);
+        priv->gc.destroy(priv->gc.opaque);
     free(priv);
 }
 
@@ -409,9 +409,9 @@ void picture_Copy( picture_t *p_dst, const picture_t *p_src )
     picture_CopyProperties( p_dst, p_src );
 }
 
-static void picture_DestroyClone(picture_t *clone)
+static void picture_DestroyClone(void *opaque)
 {
-    picture_t *picture = ((picture_priv_t *)clone)->gc.opaque;
+    picture_t *picture = opaque;
 
     picture_Release(picture);
 }
diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
index 0a2e4eaa433..cf0fe6f76fe 100644
--- a/src/misc/picture_pool.c
+++ b/src/misc/picture_pool.c
@@ -65,10 +65,9 @@ void picture_pool_Release(picture_pool_t *pool)
     picture_pool_Destroy(pool);
 }
 
-static void picture_pool_ReleaseClone(picture_t *clone)
+static void picture_pool_ReleaseClone(void *opaque)
 {
-    picture_priv_t *priv = (picture_priv_t *)clone;
-    uintptr_t sys = (uintptr_t)priv->gc.opaque;
+    uintptr_t sys = (uintptr_t)opaque;
     picture_pool_t *pool = (void *)(sys & ~(POOL_MAX - 1));
     unsigned offset = sys & (POOL_MAX - 1);
     picture_t *picture = pool->picture[offset];
-- 
2.26.2



More information about the vlc-devel mailing list