vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Jul 8 20:20:09 2018 +0300| [a17540a52174bd77f4e958d31aead357b2cbb8c5] | committer: Rémi Denis-Courmont
block: move callback to separate const structure > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a17540a52174bd77f4e958d31aead357b2cbb8c5 --- include/vlc_block.h | 10 ++++++---- modules/access/screen/win32.c | 7 ++++++- modules/codec/avcodec/audio.c | 7 ++++++- modules/codec/avcodec/encoder.c | 7 ++++++- src/misc/block.c | 39 ++++++++++++++++++++++++++++++++------- 5 files changed, 56 insertions(+), 14 deletions(-) diff --git a/include/vlc_block.h b/include/vlc_block.h index e6aae5e56b..55a05a666d 100644 --- a/include/vlc_block.h +++ b/include/vlc_block.h @@ -107,7 +107,10 @@ #define BLOCK_FLAG_PRIVATE_MASK 0xff000000 #define BLOCK_FLAG_PRIVATE_SHIFT 24 -typedef void (*block_free_t) (block_t *); +struct vlc_block_callbacks +{ + void (*free)(block_t *); +}; struct block_t { @@ -125,8 +128,7 @@ struct block_t vlc_tick_t i_dts; vlc_tick_t i_length; - /* Rudimentary support for overloading block (de)allocation. */ - block_free_t pf_release; + const struct vlc_block_callbacks *cbs; }; VLC_API void block_Init( block_t *, void *, size_t ); @@ -181,7 +183,7 @@ VLC_API block_t *block_Realloc(block_t *, ssize_t pre, size_t body) VLC_USED; */ static inline void block_Release(block_t *block) { - block->pf_release(block); + block->cbs->free(block); } static inline void block_CopyProperties( block_t *dst, block_t *src ) diff --git a/modules/access/screen/win32.c b/modules/access/screen/win32.c index 03cbdaf284..067e166879 100644 --- a/modules/access/screen/win32.c +++ b/modules/access/screen/win32.c @@ -193,6 +193,11 @@ static void CaptureBlockRelease( block_t *p_block ) free( p_block ); } +static const struct vlc_block_callbacks CaptureBlockCallbacks = +{ + CaptureBlockRelease, +}; + static block_t *CaptureBlockNew( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; @@ -260,7 +265,7 @@ static block_t *CaptureBlockNew( demux_t *p_demux ) ( ( ( ( p_sys->fmt.video.i_width * p_sys->fmt.video.i_bits_per_pixel ) + 31 ) & ~31 ) >> 3 ); i_buffer = i_stride * p_sys->fmt.video.i_height; block_Init( &p_block->self, p_buffer, i_buffer ); - p_block->self.pf_release = CaptureBlockRelease; + p_block->self.cbs = &CaptureBlockCallbacks; p_block->hbmp = hbmp; return &p_block->self; diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c index 4be9d979f3..d9948f0814 100644 --- a/modules/codec/avcodec/audio.c +++ b/modules/codec/avcodec/audio.c @@ -169,6 +169,11 @@ static void vlc_av_frame_Release(block_t *block) free(b); } +static const struct vlc_block_callbacks vlc_av_frame_cbs = +{ + vlc_av_frame_Release, +}; + static block_t *vlc_av_frame_Wrap(AVFrame *frame) { for (unsigned i = 1; i < AV_NUM_DATA_POINTERS; i++) @@ -185,7 +190,7 @@ static block_t *vlc_av_frame_Wrap(AVFrame *frame) block_Init(block, frame->extended_data[0], frame->linesize[0]); block->i_nb_samples = frame->nb_samples; - block->pf_release = vlc_av_frame_Release; + block->cbs = &vlc_av_frame_cbs; b->frame = frame; return block; } diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c index 893146f6f0..0853d47f0c 100644 --- a/modules/codec/avcodec/encoder.c +++ b/modules/codec/avcodec/encoder.c @@ -1069,6 +1069,11 @@ static void vlc_av_packet_Release(block_t *block) free(b); } +static const struct vlc_block_callbacks vlc_av_packet_cbs = +{ + vlc_av_packet_Release, +}; + static block_t *vlc_av_packet_Wrap(AVPacket *packet, vlc_tick_t i_length, AVCodecContext *context ) { if ( packet->data == NULL && @@ -1085,7 +1090,7 @@ static block_t *vlc_av_packet_Wrap(AVPacket *packet, vlc_tick_t i_length, AVCode block_Init( p_block, packet->data, packet->size ); p_block->i_nb_samples = 0; - p_block->pf_release = vlc_av_packet_Release; + p_block->cbs = &vlc_av_packet_cbs; b->packet = *packet; p_block->i_length = i_length; diff --git a/src/misc/block.c b/src/misc/block.c index 3fa279ccd1..3c75d81f4c 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -43,6 +43,11 @@ static void BlockNoRelease( block_t *b ) abort(); } +static const struct vlc_block_callbacks block_invalid_cbs = +{ + BlockNoRelease, +}; + static void block_Check (block_t *block) { while (block != NULL) @@ -52,7 +57,7 @@ static void block_Check (block_t *block) unsigned char *bufstart = block->p_buffer; unsigned char *bufend = block->p_buffer + block->i_buffer; - assert (block->pf_release != BlockNoRelease); + assert(block->cbs != &block_invalid_cbs); assert (start <= end); assert (bufstart <= bufend); assert (bufstart >= start); @@ -66,7 +71,7 @@ static void block_Invalidate (block_t *block) { block->p_next = NULL; block_Check (block); - block->pf_release = BlockNoRelease; + block->cbs = &block_invalid_cbs; } #else # define block_Check(b) ((void)(b)) @@ -87,7 +92,7 @@ void block_Init( block_t *restrict b, void *buf, size_t size ) b->i_dts = VLC_TICK_INVALID; b->i_length = 0; #ifndef NDEBUG - b->pf_release = BlockNoRelease; + b->cbs = &block_invalid_cbs; #endif } @@ -99,6 +104,11 @@ static void block_generic_Release (block_t *block) free (block); } +static const struct vlc_block_callbacks block_generic_cbs = +{ + block_generic_Release, +}; + static void BlockMetaCopy( block_t *restrict out, const block_t *in ) { out->p_next = in->p_next; @@ -141,7 +151,7 @@ block_t *block_Alloc (size_t size) b->p_buffer += BLOCK_PADDING + BLOCK_ALIGN - 1; b->p_buffer = (void *)(((uintptr_t)b->p_buffer) & ~(BLOCK_ALIGN - 1)); b->i_buffer = size; - b->pf_release = block_generic_Release; + b->cbs = &block_generic_cbs; return b; } @@ -251,6 +261,11 @@ static void block_heap_Release (block_t *block) free (block); } +static const struct vlc_block_callbacks block_heap_cbs = +{ + block_heap_Release, +}; + block_t *block_heap_Alloc (void *addr, size_t length) { block_t *block = malloc (sizeof (*block)); @@ -261,7 +276,7 @@ block_t *block_heap_Alloc (void *addr, size_t length) } block_Init (block, addr, length); - block->pf_release = block_heap_Release; + block->cbs = &block_heap_cbs; return block; } @@ -275,6 +290,11 @@ static void block_mmap_Release (block_t *block) free (block); } +static const struct vlc_block_callbacks block_mmap_cbs = +{ + block_mmap_Release, +}; + block_t *block_mmap_Alloc (void *addr, size_t length) { if (addr == MAP_FAILED) @@ -294,7 +314,7 @@ block_t *block_mmap_Alloc (void *addr, size_t length) block_Init (block, ((char *)addr) - left, left + length + right); block->p_buffer = addr; block->i_buffer = length; - block->pf_release = block_mmap_Release; + block->cbs = &block_mmap_cbs; return block; } #else @@ -321,6 +341,11 @@ static void block_shm_Release (block_t *block) free (p_sys); } +static const struct vlc_block_callbacks block_shm_cbs = +{ + block_shm_Release, +}; + block_t *block_shm_Alloc (void *addr, size_t length) { block_shm_t *block = malloc (sizeof (*block)); @@ -331,7 +356,7 @@ block_t *block_shm_Alloc (void *addr, size_t length) } block_Init (&block->self, (uint8_t *)addr, length); - block->self.pf_release = block_shm_Release; + block->self.cbs = &block_shm_cbs; block->base_addr = addr; return &block->self; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
