Condivisione della tecnologia

Strutture relative al buffer di dati di conteggio dei riferimenti FFmpeg: introduzione a AVBuffer e AVBufferRef

2024-07-08

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

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

Analisi del codice sorgente relativo alla gestione della memoria di FFmpeg:

Codice sorgente relativo all'allocazione e al rilascio della memoria in FFmpeg: analisi della funzione av_malloc, funzione av_mallocz, funzione av_free e funzione av_freep

Strutture relative al buffer di dati di conteggio dei riferimenti FFmpeg: introduzione a AVBuffer e AVBufferRef

Codice sorgente FFmpeg: buffer_create, av_buffer_create, av_buffer_default_free, av_buffer_alloc, analisi della funzione av_buffer_allocz

Codice sorgente FFmpeg: av_buffer_ref, analisi della funzione av_buffer_unref

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

I. Introduzione

Molte strutture nel codice sorgente di FFmpeg, come AVPacket e AVFrame, utilizzano AVBufferRef e AVBuffer per gestire i buffer. AVBuffer registra il numero di utilizzi delle risorse tramite la variabile membro refcount e controlla il rilascio delle risorse. Questo articolo fornisce un'introduzione alle strutture AVBuffer e AVBufferRef.

2. Dichiarazione della struttura AVBuffer

AVBuffer è un'interfaccia di programmazione dell'applicazione per buffer di dati con conteggio di riferimento, che rappresentano il buffer di dati stesso. È opaco e non è possibile accedervi direttamente dagli utenti che utilizzano l'API FFmpeg. Gli utenti possono accedervi solo indirettamente tramite AVBufferRef. Ma puoi verificare se due riferimenti diversi descrivono lo stesso buffer di dati confrontando due puntatori AVBuffer.

La struttura AVBuffer è dichiarata nel file di intestazione libavutil/buffer_internal.h del codice sorgente di FFmpeg (la versione del codice sorgente di FFmpeg utilizzata per la dimostrazione in questo articolo è 5.0.3):

struct AVBuffer {
    uint8_t *data; /**