| /* |
| * This file is part of FFmpeg. |
| * |
| * FFmpeg is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * FFmpeg is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with FFmpeg; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #ifndef AVUTIL_BUFFER_INTERNAL_H |
| #define AVUTIL_BUFFER_INTERNAL_H |
| |
| #include <stdatomic.h> |
| #include <stdint.h> |
| |
| #include "buffer.h" |
| #include "thread.h" |
| |
| /** |
| * The buffer was av_realloc()ed, so it is reallocatable. |
| */ |
| #define BUFFER_FLAG_REALLOCATABLE (1 << 0) |
| |
| struct AVBuffer { |
| uint8_t *data; /**< data described by this buffer */ |
| int size; /**< size of data in bytes */ |
| |
| /** |
| * number of existing AVBufferRef instances referring to this buffer |
| */ |
| atomic_uint refcount; |
| |
| /** |
| * a callback for freeing the data |
| */ |
| void (*free)(void *opaque, uint8_t *data); |
| |
| /** |
| * an opaque pointer, to be used by the freeing callback |
| */ |
| void *opaque; |
| |
| /** |
| * A combination of AV_BUFFER_FLAG_* |
| */ |
| int flags; |
| |
| /** |
| * A combination of BUFFER_FLAG_* |
| */ |
| int flags_internal; |
| }; |
| |
| typedef struct BufferPoolEntry { |
| uint8_t *data; |
| |
| /* |
| * Backups of the original opaque/free of the AVBuffer corresponding to |
| * data. They will be used to free the buffer when the pool is freed. |
| */ |
| void *opaque; |
| void (*free)(void *opaque, uint8_t *data); |
| |
| AVBufferPool *pool; |
| struct BufferPoolEntry *next; |
| } BufferPoolEntry; |
| |
| struct AVBufferPool { |
| AVMutex mutex; |
| BufferPoolEntry *pool; |
| |
| /* |
| * This is used to track when the pool is to be freed. |
| * The pointer to the pool itself held by the caller is considered to |
| * be one reference. Each buffer requested by the caller increases refcount |
| * by one, returning the buffer to the pool decreases it by one. |
| * refcount reaches zero when the buffer has been uninited AND all the |
| * buffers have been released, then it's safe to free the pool and all |
| * the buffers in it. |
| */ |
| atomic_uint refcount; |
| |
| int size; |
| void *opaque; |
| AVBufferRef* (*alloc)(int size); |
| AVBufferRef* (*alloc2)(void *opaque, int size); |
| void (*pool_free)(void *opaque); |
| }; |
| |
| #endif /* AVUTIL_BUFFER_INTERNAL_H */ |