vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sat Oct 27 18:40:45 2018 +0300| [51d234921297443b5c067f77681203962cc17e01] | committer: Rémi Denis-Courmont
picture: allow overriding the default allocator This keeps track of the underlying memory allocation, and makes room for non-anonymous memory allocation. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=51d234921297443b5c067f77681203962cc17e01 --- include/vlc_picture.h | 8 ++++++++ src/misc/picture.c | 38 ++++++++++++++++++++++++++++++++------ src/misc/picture.h | 3 +++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/include/vlc_picture.h b/include/vlc_picture.h index f9d55b3175..6aca13bca0 100644 --- a/include/vlc_picture.h +++ b/include/vlc_picture.h @@ -64,6 +64,14 @@ typedef struct picture_context_t struct picture_context_t *(*copy)(struct picture_context_t *); } picture_context_t; +typedef struct picture_buffer_t +{ + int fd; + void *base; + size_t size; + off_t offset; +} picture_buffer_t; + /** * Video picture */ diff --git a/src/misc/picture.c b/src/misc/picture.c index 4cdbf8193a..b373ebd21f 100644 --- a/src/misc/picture.c +++ b/src/misc/picture.c @@ -62,10 +62,27 @@ static void picture_DestroyFromResource( picture_t *p_picture ) /** * Destroys a picture allocated with picture_NewFromFormat(). */ -static void picture_Destroy( picture_t *p_picture ) +static void picture_Destroy(picture_t *pic) { - aligned_free( p_picture->p[0].p_pixels ); - free( p_picture ); + picture_buffer_t *res = pic->p_sys; + + if (res != NULL) + picture_Deallocate(res->fd, res->base, res->size); + free(pic); +} + +VLC_WEAK void *picture_Allocate(int *restrict fdp, size_t size) +{ + assert((size % 16) == 0); + *fdp = -1; + return aligned_alloc(16, size); +} + +VLC_WEAK void picture_Deallocate(int fd, void *base, size_t size) +{ + assert(fd == -1); + aligned_free(base); + assert((size % 16) == 0); } /***************************************************************************** @@ -235,15 +252,17 @@ picture_t *picture_NewFromResource( const video_format_t *p_fmt, const picture_r picture_t *picture_NewFromFormat(const video_format_t *restrict fmt) { - picture_priv_t *priv = picture_NewPrivate(fmt, 0); + picture_priv_t *priv = picture_NewPrivate(fmt, sizeof (picture_buffer_t)); if (unlikely(priv == NULL)) return NULL; priv->gc.destroy = picture_Destroy; picture_t *pic = &priv->picture; - if (pic->i_planes == 0) + if (pic->i_planes == 0) { + pic->p_sys = NULL; return pic; + } /* Calculate how big the new image should be */ size_t plane_sizes[PICTURE_PLANE_MAX]; @@ -261,10 +280,17 @@ picture_t *picture_NewFromFormat(const video_format_t *restrict fmt) if (unlikely(pic_size >= PICTURE_SW_SIZE_MAX)) goto error; - uint8_t *buf = aligned_alloc(16, pic_size); + picture_buffer_t *res = (void *)priv->extra; + + unsigned char *buf = picture_Allocate(&res->fd, pic_size); if (unlikely(buf == NULL)) goto error; + res->base = buf; + res->size = pic_size; + res->offset = 0; + pic->p_sys = res; + /* Fill the p_pixels field for each plane */ for (int i = 0; i < pic->i_planes; i++) { diff --git a/src/misc/picture.h b/src/misc/picture.h index a838144a6c..633d2a3abb 100644 --- a/src/misc/picture.h +++ b/src/misc/picture.h @@ -35,3 +35,6 @@ typedef struct max_align_t extra[]; } picture_priv_t; + +void *picture_Allocate(int *, size_t); +void picture_Deallocate(int, void *, size_t); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
