gpt4 book ai didi

c++ - C++/FFMPEG 中的宏

转载 作者:行者123 更新时间:2023-12-04 23:23:03 26 4
gpt4 key购买 nike

我是 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 文件中使用的这个 C 宏(不是 C++)pcm_encode_frame功能。不同 channel 配置和字节序的 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);
}
}

希望有帮助。

关于c++ - C++/FFMPEG 中的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60853150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com