[vlc-commits] codec: vt_utils: add cvpxpic_attach_with_cb
Thomas Guillem
git at videolan.org
Fri Nov 24 13:12:07 CET 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Nov 24 09:18:24 2017 +0100| [884476a90e4a1237d57d29503510667a82f610b6] | committer: Thomas Guillem
codec: vt_utils: add cvpxpic_attach_with_cb
In order to be notified when the cvpx buffer is released.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=884476a90e4a1237d57d29503510667a82f610b6
---
modules/codec/vt_utils.c | 46 ++++++++++++++++++++++++++++++++++------------
modules/codec/vt_utils.h | 4 ++++
2 files changed, 38 insertions(+), 12 deletions(-)
diff --git a/modules/codec/vt_utils.c b/modules/codec/vt_utils.c
index d670d44860..0b428fabda 100644
--- a/modules/codec/vt_utils.c
+++ b/modules/codec/vt_utils.c
@@ -22,6 +22,8 @@
# include "config.h"
#endif
+#include <vlc_atomic.h>
+
#include "vt_utils.h"
CFMutableDictionaryRef
@@ -44,6 +46,10 @@ struct cvpxpic_ctx
{
picture_context_t s;
CVPixelBufferRef cvpx;
+
+ atomic_uint ref_count;
+ void (*on_released_cb)(void *);
+ void *on_released_data;
};
static void
@@ -51,25 +57,27 @@ cvpxpic_destroy_cb(picture_context_t *opaque)
{
struct cvpxpic_ctx *ctx = (struct cvpxpic_ctx *)opaque;
- CFRelease(ctx->cvpx);
- free(opaque);
+ if (atomic_fetch_sub(&ctx->ref_count, 1) == 1)
+ {
+ CFRelease(ctx->cvpx);
+ if (ctx->on_released_cb)
+ ctx->on_released_cb(ctx->on_released_data);
+ free(opaque);
+ }
}
static picture_context_t *
cvpxpic_copy_cb(struct picture_context_t *opaque)
{
- struct cvpxpic_ctx *src_ctx = (struct cvpxpic_ctx *)opaque;
- struct cvpxpic_ctx *dst_ctx = malloc(sizeof(struct cvpxpic_ctx));
- if (dst_ctx == NULL)
- return NULL;
- *dst_ctx = *src_ctx;
- dst_ctx->cvpx = CVPixelBufferRetain(dst_ctx->cvpx);
- return &dst_ctx->s;
+ struct cvpxpic_ctx *ctx = (struct cvpxpic_ctx *)opaque;
+ atomic_fetch_add(&ctx->ref_count, 1);
+ return opaque;
}
static int
cvpxpic_attach_common(picture_t *p_pic, CVPixelBufferRef cvpx,
- void (*pf_destroy)(picture_context_t *))
+ void (*pf_destroy)(picture_context_t *),
+ void (*on_released_cb)(void *), void *on_released_data)
{
struct cvpxpic_ctx *ctx = malloc(sizeof(struct cvpxpic_ctx));
if (ctx == NULL)
@@ -80,6 +88,11 @@ cvpxpic_attach_common(picture_t *p_pic, CVPixelBufferRef cvpx,
ctx->s.destroy = pf_destroy;
ctx->s.copy = cvpxpic_copy_cb;
ctx->cvpx = CVPixelBufferRetain(cvpx);
+ atomic_init(&ctx->ref_count, 1);
+
+ ctx->on_released_cb = on_released_cb;
+ ctx->on_released_data = on_released_data;
+
p_pic->context = &ctx->s;
return VLC_SUCCESS;
@@ -88,7 +101,15 @@ cvpxpic_attach_common(picture_t *p_pic, CVPixelBufferRef cvpx,
int
cvpxpic_attach(picture_t *p_pic, CVPixelBufferRef cvpx)
{
- return cvpxpic_attach_common(p_pic, cvpx, cvpxpic_destroy_cb);
+ return cvpxpic_attach_common(p_pic, cvpx, cvpxpic_destroy_cb, NULL, NULL);
+}
+
+int cvpxpic_attach_with_cb(picture_t *p_pic, CVPixelBufferRef cvpx,
+ void (*on_released_cb)(void *),
+ void *on_released_data)
+{
+ return cvpxpic_attach_common(p_pic, cvpx, cvpxpic_destroy_cb, on_released_cb,
+ on_released_data);
}
CVPixelBufferRef
@@ -158,7 +179,8 @@ cvpxpic_create_mapped(const video_format_t *fmt, CVPixelBufferRef cvpx,
cvpxpic_destroy_mapped_ro_cb : cvpxpic_destroy_mapped_rw_cb;
picture_t *pic = picture_NewFromResource(fmt, &rsc);
- if (pic == NULL || cvpxpic_attach_common(pic, cvpx, pf_destroy) != VLC_SUCCESS)
+ if (pic == NULL
+ || cvpxpic_attach_common(pic, cvpx, pf_destroy, NULL, NULL) != VLC_SUCCESS)
{
CVPixelBufferUnlockBaseAddress(cvpx, lock);
return NULL;
diff --git a/modules/codec/vt_utils.h b/modules/codec/vt_utils.h
index 5423c1d501..f2f31c3914 100644
--- a/modules/codec/vt_utils.h
+++ b/modules/codec/vt_utils.h
@@ -36,6 +36,10 @@ void cfdict_set_int32(CFMutableDictionaryRef dict, CFStringRef key, int value);
*/
int cvpxpic_attach(picture_t *p_pic, CVPixelBufferRef cvpx);
+int cvpxpic_attach_with_cb(picture_t *p_pic, CVPixelBufferRef cvpx,
+ void (*on_released_cb)(void *),
+ void *on_released_data);
+
/*
* Get the cvpx buffer attached to a picture
*/
More information about the vlc-commits
mailing list