[vlc-devel] [PATCH v3 09/12] picture: pass the clone destructor via a structure

Steve Lhomme robux4 at ycbcr.xyz
Tue Aug 18 08:24:50 CEST 2020


Rather than internal fields in a bigger structure. It's really meant to release
the resources of the picture. This is also the format used to store the callback.

Always set the gc opaque to the resource p_sys.

Set picture_priv_t.gc outside of picture_InitPrivate().
---
 src/misc/picture.c      | 22 ++++++++++++----------
 src/misc/picture.h      | 16 +++++++++-------
 src/misc/picture_pool.c |  4 ++--
 3 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/src/misc/picture.c b/src/misc/picture.c
index 5aee1241e90..6b03ed7e4be 100644
--- a/src/misc/picture.c
+++ b/src/misc/picture.c
@@ -203,11 +203,7 @@ static bool picture_InitPrivate(const video_format_t *restrict p_fmt,
     atomic_init(&p_picture->refs, 1);
 
     if ( p_resource != NULL)
-    {
         p_picture->p_sys = p_resource->p_sys;
-        priv->gc.opaque  = p_resource->p_sys;
-        priv->gc.destroy = p_resource->pf_destroy;
-    }
 
     return true;
 }
@@ -224,6 +220,11 @@ picture_t *picture_NewFromResource( const video_format_t *p_fmt, const picture_r
         return NULL;
     }
 
+    if ( p_resource != NULL)
+    {
+        priv->gc = (picture_gc_t) { p_resource->pf_destroy, p_resource->p_sys };
+    }
+
     return &priv->picture;
 }
 
@@ -247,7 +248,6 @@ picture_t *picture_NewFromFormat(const video_format_t *restrict fmt)
 
     picture_resource_t pic_res = {
         .p_sys = res,
-        .pf_destroy = picture_DestroyFromFormat,
     };
 
     picture_priv_t *priv = &privbuf->priv;
@@ -255,6 +255,9 @@ picture_t *picture_NewFromFormat(const video_format_t *restrict fmt)
         goto error;
 
     picture_t *pic = &priv->picture;
+
+    priv->gc = (picture_gc_t) { picture_DestroyFromFormat, NULL };
+
     if (pic->i_planes == 0) {
         pic->p_sys = NULL; // not compatible with picture_DestroyFromFormat
         return pic;
@@ -401,12 +404,10 @@ static void picture_DestroyClone(picture_t *clone)
     picture_Release(picture);
 }
 
-picture_t *picture_InternalClone(picture_t *picture,
-                                 void (*pf_destroy)(picture_t *), void *opaque)
+picture_t *picture_InternalClone(picture_t *picture, picture_gc_t *pic_gc)
 {
     picture_resource_t res = {
         .p_sys = picture->p_sys,
-        .pf_destroy = pf_destroy,
     };
 
     picture_t *clone = picture_NewFromResource(&picture->format, &res);
@@ -414,7 +415,7 @@ picture_t *picture_InternalClone(picture_t *picture,
         for (int i = 0; i < picture->i_planes; i++) {
             clone->p[i] = picture->p[i];
         }
-        ((picture_priv_t *)clone)->gc.opaque = opaque;
+        ((picture_priv_t *)clone)->gc = *pic_gc;
         picture_Hold(picture);
     }
     return clone;
@@ -422,7 +423,8 @@ picture_t *picture_InternalClone(picture_t *picture,
 
 picture_t *picture_Clone(picture_t *picture)
 {
-    picture_t *clone = picture_InternalClone(picture, picture_DestroyClone, picture);
+    picture_gc_t gc = { picture_DestroyClone, picture };
+    picture_t *clone = picture_InternalClone(picture, &gc);
     if (likely(clone != NULL)) {
         if (picture->context != NULL)
             clone->context = picture->context->copy(picture->context);
diff --git a/src/misc/picture.h b/src/misc/picture.h
index 684eb2ada69..0afaca95f44 100644
--- a/src/misc/picture.h
+++ b/src/misc/picture.h
@@ -25,15 +25,17 @@
 
 typedef struct
 {
-    picture_t picture;
-    struct
-    {
-        void (*destroy)(picture_t *);
-        void *opaque;
-    } gc;
+    void (*destroy)(picture_t *);
+    void *opaque;
+} picture_gc_t;
+
+typedef struct
+{
+    picture_t    picture;
+    picture_gc_t gc;
 } picture_priv_t;
 
 void *picture_Allocate(int *, size_t);
 void picture_Deallocate(int, void *, size_t);
 
-picture_t * picture_InternalClone(picture_t *, void (*pf_destroy)(picture_t *), void *);
+picture_t * picture_InternalClone(picture_t *, picture_gc_t *);
diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
index 988df70fb8d..0a2e4eaa433 100644
--- a/src/misc/picture_pool.c
+++ b/src/misc/picture_pool.c
@@ -90,8 +90,8 @@ static picture_t *picture_pool_ClonePicture(picture_pool_t *pool,
     picture_t *picture = pool->picture[offset];
     uintptr_t sys = ((uintptr_t)pool) + offset;
 
-    picture_t *clone = picture_InternalClone(picture, picture_pool_ReleaseClone,
-                                 (void*)sys);
+    picture_gc_t gc = { picture_pool_ReleaseClone, (void*)sys };
+    picture_t *clone = picture_InternalClone(picture, &gc);
     if (clone != NULL) {
         assert(clone->p_next == NULL);
         atomic_fetch_add_explicit(&pool->refs, 1, memory_order_relaxed);
-- 
2.26.2



More information about the vlc-devel mailing list