Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/videolan/dav1d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/ref.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2018-09-28 20:27:07 +0300
committerRonald S. Bultje <rsbultje@gmail.com>2018-09-28 20:30:03 +0300
commitf53749e12241e6d61d9d2bd51666302c59962fc9 (patch)
tree21862cf534c2639c45c82c9e7f6426416cba379e /src/ref.c
parentf4e88f25f56f5c3ae6650d4c42afc265428f0459 (diff)
Wrappable data structure
Diffstat (limited to 'src/ref.c')
-rw-r--r--src/ref.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/ref.c b/src/ref.c
index b0bf7ac..ed19ff6 100644
--- a/src/ref.c
+++ b/src/ref.c
@@ -31,6 +31,10 @@
#include "src/ref.h"
+static void default_free_callback(uint8_t *const data, void *const user_data) {
+ dav1d_free_aligned(data);
+}
+
Dav1dRef *dav1d_ref_create(const size_t size) {
Dav1dRef *res = malloc(sizeof(Dav1dRef));
void *data = dav1d_alloc_aligned(size, 32);
@@ -44,6 +48,23 @@ Dav1dRef *dav1d_ref_create(const size_t size) {
res->size = size;
atomic_init(&res->ref_cnt, 1);
res->data = data;
+ res->free_callback = default_free_callback;
+
+ return res;
+}
+
+Dav1dRef *dav1d_ref_wrap(uint8_t *const ptr, const size_t sz,
+ void (*free_callback)(uint8_t *data, void *user_data),
+ void *user_data)
+{
+ Dav1dRef *res = malloc(sizeof(Dav1dRef));
+ if (!res) return NULL;
+
+ res->data = ptr;
+ res->size = sz;
+ atomic_init(&res->ref_cnt, 1);
+ res->free_callback = free_callback;
+ res->user_data = user_data;
return res;
}
@@ -54,7 +75,7 @@ void dav1d_ref_inc(Dav1dRef *const ref) {
void dav1d_ref_dec(Dav1dRef *const ref) {
if (atomic_fetch_sub(&ref->ref_cnt, 1) == 1) {
- dav1d_free_aligned(ref->data);
+ ref->free_callback(ref->data, ref->user_data);
free(ref);
}
}