簡體   English   中英

C++ / FFMPEG 中的宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM