[英]Macros in C++ / FFMPEG
我是 C++ 新手,正在嘗試為 FFMPEG 構建自定義編解碼器。 我正在嘗試將其作為 PCM 的基礎,但只有一種類型。 我遇到了一個宏,我不知道它編譯后會變成什么。 宏看起來像這樣:
#define ENCODE_PLANAR(type, endian, dst, n, shift, offset) \
n /= avctx->channels; \
for (c = 0; c < avctx->channels; c++) { \
int i; \
samples_ ## type = (const type *) frame->extended_data[c]; \
for (i = n; i > 0; i--) { \
register type v = (*samples_ ## type++ >> shift) + offset; \
bytestream_put_ ## endian(&dst, v); \
} \
}
如果 endian = byte 和 type = uint8_t,samples_ 聲明行和 bytestream_put 行是否等於我在下面放置的內容?
uint8_t samples_ = (const uint8_t *) frame->extended_data[c];
bytestream_put_byte(&dst, v);
我覺得這很令人困惑,我不確定這是否正確。
FFmpeg 的 pcm.c 文件pcm_encode_frame
函數中使用的這個 C 宏(不是 C++)。 PCM 音頻幀(8、16、24 或 32 位)在各種通道配置和字節序下以打包(交錯)或平面格式存儲。 這個宏(在文件中清楚地看到)用於將緩沖區填充為平面格式。
擴展示例如下(對於 AV_CODEC_ID_PCM_S16LE_PLANAR):
n /= avctx->channels;
for (c = 0; c < avctx->channels; c++) {
int i;
samples_int16_t = (const int16_t *) frame->extended_data[c];
for (i = n; i > 0; i--) {
register int16_t v = (*samples_int16_t++ >> 0) + 0;
bytestream_put_le16(&dst, v);
}
}
希望有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.