Spaces:
Runtime error
Runtime error
| /* | |
| * 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 | |
| */ | |
| /** | |
| * The buffer was av_realloc()ed, so it is reallocatable. | |
| */ | |
| /** | |
| * The AVBuffer structure is part of a larger structure | |
| * and should not be freed. | |
| */ | |
| struct AVBuffer { | |
| uint8_t *data; /**< data described by this buffer */ | |
| size_t 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; | |
| /* | |
| * An AVBuffer structure to (re)use as AVBuffer for subsequent uses | |
| * of this BufferPoolEntry. | |
| */ | |
| AVBuffer buffer; | |
| } 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; | |
| size_t size; | |
| void *opaque; | |
| AVBufferRef* (*alloc)(size_t size); | |
| AVBufferRef* (*alloc2)(void *opaque, size_t size); | |
| void (*pool_free)(void *opaque); | |
| }; | |