Partage de technologie

Structures liées au tampon de données de comptage de références FFmpeg : introduction à AVBuffer et AVBufferRef

2024-07-08

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

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

Analyse du code source liée à la gestion de la mémoire FFmpeg :

Code source lié à l'allocation et à la libération de mémoire dans FFmpeg : analyse de la fonction av_malloc, de la fonction av_mallocz, de la fonction av_free et de la fonction av_freep

Structures liées au tampon de données de comptage de références FFmpeg : introduction à AVBuffer et AVBufferRef

Code source FFmpeg : buffer_create, av_buffer_create, av_buffer_default_free, av_buffer_alloc, analyse de fonction av_buffer_allocz

Code source FFmpeg : analyse de fonction av_buffer_ref, av_buffer_unref

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

Introduction

De nombreuses structures du code source de FFmpeg, telles que AVPacket et AVFrame, utilisent AVBufferRef et AVBuffer pour gérer les tampons. AVBuffer enregistre le nombre d'utilisations de ressources via la variable membre refcount et contrôle la libération des ressources. Cet article fournit une introduction aux structures AVBuffer et AVBufferRef.

2. Déclaration de la structure AVBuffer

AVBuffer est une interface de programmation d'application pour les tampons de données comptés par référence, qui représentent le tampon de données lui-même. Il est opaque et n'est pas directement accessible aux utilisateurs utilisant l'API FFmpeg. Les utilisateurs ne peuvent y accéder qu'indirectement via AVBufferRef. Mais vous pouvez vérifier si deux références différentes décrivent le même tampon de données en comparant deux pointeurs AVBuffer.

La structure AVBuffer est déclarée dans le fichier d'en-tête libavutil/buffer_internal.h du code source de FFmpeg (la version du code source de FFmpeg utilisée pour la démonstration dans cet article est 5.0.3) :

struct AVBuffer {
    uint8_t *data; /**