一、AVBuffer結構體的聲明
AVBuffer是一個用于引用計數數據緩沖區的應用程序編程接口,它表示數據緩沖區本身。它是不透明的,不能被直接訪問調用,只能通過AVBufferRef間接訪問它。但是可以通過比較兩個AVBuffer指針來檢查是否兩個不同的引用都描述了相同的數據緩沖區。
AVBuffer結構體聲明在FFmpeg源碼(本文演示用的FFmpeg源碼版本為5.0.3)的頭文件libavutil/buffer_internal.h中:
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;
};
成員變量data:指針,指向該緩沖區描述的數據。
成員變量size:data指向的緩沖區的大小,單位為字節。
成員變量refcount:refcount表示引用該緩沖區的現有AVBufferRef實例的數目,為atomic_uint(支持原子操作)的類型。atomic_uint類型表示每次操作refcount這個變量,包括讀取其值、更改其值,這次操作中執行的唯一一條指令是原子的,從而保護這個變量refcount不臟讀臟寫,線程安全。
成員變量void (*free)(void *opaque, uint8_t *data):函數指針,指向釋放數據的回調函數。
成員變量opaque:一個不透明的指針,由釋放數據的回調函數(函數指針void (*free)(void *opaque, uint8_t *data)指向的函數)使用。
成員變量flags:AV_BUFFER_FLAG_*的組合。
成員變量flags_internal:BUFFER_FLAG_*的組合。
二、AVBufferRef結構體的聲明
AVBufferRef是指向數據緩沖區的引用。這個結構體的大小不是公共應用程序二進制接口的一部分,也不意味著可以直接被分配。AVBufferRef對AVBuffer進行了一層封裝,實現了安全機制。用戶應通過AVBufferRef來訪問AVBuffer,而不是直接訪問AVBuffer,來保證安全。
AVBufferRef結構體聲明在FFmpeg源碼的頭文件libavutil/buffer.h中:
/*** A reference to a data buffer.** The size of this struct is not a part of the public ABI and it is not meant* to be allocated directly.*/
typedef struct AVBufferRef {AVBuffer *buffer;/*** The data buffer. It is considered writable if and only if* this is the only reference to the buffer, in which case* av_buffer_is_writable() returns 1.*/uint8_t *data;/*** Size of data in bytes.*/size_t size;
} AVBufferRef;
成員變量buffer:AVBuffer類型,為數據緩沖區本身。
成員變量data:數據緩沖區。當且僅當這是對緩沖區的唯一引用時,它才被認為是可寫的,在這種情況下函數av_buffer_is_writable()返回1。
成員變量:data指向的緩沖區的大小,單位為字節。