aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2022-08-06 13:04:10 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-11-01 20:13:40 +0100
commit090d9956fd092023e63f61a37bde36bba55d0258 (patch)
tree51490687f84c7d85bafd1369f01a4579537d1348 /libavcodec
parente01e30ede1d0a06df90c0c7816cb51941bcd3bc9 (diff)
downloadffmpeg-090d9956fd092023e63f61a37bde36bba55d0258.tar.gz
avcodec/refstruct: Allow to always return zeroed pool entries
This is in preparation for the following commit. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/refstruct.c10
-rw-r--r--libavcodec/refstruct.h8
2 files changed, 18 insertions, 0 deletions
diff --git a/libavcodec/refstruct.c b/libavcodec/refstruct.c
index 5603031ec3..861f847dd7 100644
--- a/libavcodec/refstruct.c
+++ b/libavcodec/refstruct.c
@@ -285,6 +285,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;
@@ -357,6 +361,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 = ff_mutex_init(&pool->mutex, NULL);
diff --git a/libavcodec/refstruct.h b/libavcodec/refstruct.h
index defdc06d52..9a22e5dca7 100644
--- a/libavcodec/refstruct.h
+++ b/libavcodec/refstruct.h
@@ -211,6 +211,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, to avoid zeroing twice
+ * 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)