[FFmpeg-devel] [PATCH 21/42] avcodec/refstruct: Allow to always return zeroed pool entries

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Tue Sep 19 22:57:13 EEST 2023


This is in preparation for the following commit.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/refstruct.c | 10 ++++++++++
 libavcodec/refstruct.h |  8 ++++++++
 2 files changed, 18 insertions(+)

diff --git a/libavcodec/refstruct.c b/libavcodec/refstruct.c
index 7539b7942e..f8d040874d 100644
--- a/libavcodec/refstruct.c
+++ b/libavcodec/refstruct.c
@@ -262,6 +262,10 @@ static int refstruct_pool_get_ext(void *datap, FFRefStructPool *pool)
         }
     }
     atomic_fetch_add_explicit(&pool->refcount, 1, memory_order_relaxed);
+
+    if (pool->pool_flags & FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME)
+        memset(ret, 0, pool->size);
+
     memcpy(datap, &ret, sizeof(ret));
 
     return 0;
@@ -334,6 +338,12 @@ FFRefStructPool *ff_refstruct_pool_alloc_ext_c(size_t size, unsigned flags,
         flags &= ~FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR;
     pool->pool_flags    = flags;
 
+    if (flags & FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME) {
+        // We will zero the buffer before every use, so zeroing
+        // upon allocating the buffer is unnecessary.
+        pool->entry_flags |= FF_REFSTRUCT_FLAG_NO_ZEROING;
+    }
+
     atomic_init(&pool->refcount, 1);
 
     err = pthread_mutex_init(&pool->mutex, NULL);
diff --git a/libavcodec/refstruct.h b/libavcodec/refstruct.h
index e2fe45e77d..ce3830977f 100644
--- a/libavcodec/refstruct.h
+++ b/libavcodec/refstruct.h
@@ -207,6 +207,14 @@ typedef struct FFRefStructPool FFRefStructPool;
  * the callbacks applied earlier (init_cb potentially followed by reset_cb).
  */
 #define FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR                    (1 << 17)
+/**
+ * If this flag is set, the entries will be zeroed before
+ * being returned to the user (after the init or reset callbacks
+ * have been called (if provided)). Furthermore, it also makes
+ * the pool behave as if the FF_REFSTRUCT_POOL_FLAG_NO_ZEROING
+ * flag had been provided.
+ */
+#define FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME                       (1 << 18)
 
 /**
  * Equivalent to ff_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
-- 
2.34.1



More information about the ffmpeg-devel mailing list