Compartir tecnología

Estructuras relacionadas con el búfer de datos de recuento de referencias de FFmpeg: Introducción a AVBuffer y AVBufferRef

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

=================================================================

Análisis de código fuente relacionado con la gestión de memoria FFmpeg:

Código fuente relacionado con la asignación y liberación de memoria en FFmpeg: análisis de la función av_malloc, función av_mallocz, función av_free y función av_freep

Estructuras relacionadas con el búfer de datos de recuento de referencias de FFmpeg: Introducción a AVBuffer y AVBufferRef

Código fuente de FFmpeg: buffer_create, av_buffer_create, av_buffer_default_free, av_buffer_alloc, análisis de funciones av_buffer_allocz

Código fuente de FFmpeg: av_buffer_ref, análisis de funciones av_buffer_unref

=================================================================

I. Introducción

Muchas estructuras en el código fuente de FFmpeg, como AVPacket y AVFrame, usan AVBufferRef y AVBuffer para administrar los buffers. AVBuffer registra la cantidad de usos de recursos a través de la variable miembro refcount y controla la liberación de recursos. Este artículo proporciona una introducción a las estructuras AVBuffer y AVBufferRef.

2. Declaración de estructura AVBuffer

AVBuffer es una interfaz de programación de aplicaciones para búferes de datos contados por referencia, que representan el búfer de datos en sí. Es opaco y los usuarios que utilizan la API FFmpeg no pueden acceder directamente a él. Los usuarios sólo pueden acceder a él indirectamente a través de AVBufferRef. Pero puedes comprobar si dos referencias diferentes describen el mismo búfer de datos comparando dos punteros AVBuffer.

La estructura AVBuffer se declara en el archivo de encabezado libavutil/buffer_internal.h del código fuente de FFmpeg (la versión del código fuente de FFmpeg utilizada para la demostración en este artículo es 5.0.3):

struct AVBuffer {
    uint8_t *data; /**