什么是"线大小对齐"?
what is 'linesize alignment' meaning?
我正在 http://dranger.com/ffmpeg/tutorial01.html 遵循ffmpeg教程。
我刚刚发现avpicture_get_size
函数已被弃用。
所以我检查了ffmpeg的文档(https://www.ffmpeg.org/doxygen/3.0/group__lavu__picture.html#ga24a67963c3ae0054a2a4bab35930e694)并找到了替代av_image_get_buffer_size
。
但我无法理解align
参数的含义是"线大小对齐"......
这是什么意思?
FFmpeg的某些部分,特别是libavcodec,需要对齐的linesize[],这意味着它需要:
assert(linesize[0] % 32 == 0);
assert(linesize[1] % 32 == 0);
assert(linesize[2] % 32 == 0);
这允许它使用快速/对齐的 SIMD 例程(例如 SSE2/AVX2 movdqa
或vmovdqa
指令)进行数据访问,而不是较慢的未对齐对应项。
此av_image_get_buffer_size
函数的align
参数是此行对齐,您需要它,因为缓冲区的大小受其影响。 例如,YUV 缓冲区中 Y 平面的大小实际上不是宽度 * 高度,而是线大小[0] * 高度。您将看到(特别是对于不是 16 或 32 的倍数的图像大小),当您将 align
增加到更高的 2 的幂时,返回值会慢慢增加。
实际上,如果您要将此图片用作调用的输出缓冲区,例如 avcodec_decode_video2
,这应该是 32。对于 swscale/avfilter,我相信没有绝对的要求,但建议你仍然让它变成 32。
我的实践:
1.avpicture 已弃用的问题,我用 AVFrame 和 imgutils 函数替换了 avpicture 函数。代码示例:
//AVPicture _picture;
AVFrame *_pictureFrame;
uint8_t *_pictureFrameData;
。
//_pictureValid = avpicture_alloc(&_picture,
// AV_PIX_FMT_RGB24,
// _videoCodecCtx->width,
// _videoCodecCtx->height) == 0;
_pictureFrame = av_frame_alloc();
_pictureFrame->width = _videoCodecCtx->width;
_pictureFrame->height = _videoCodecCtx->height;
_pictureFrame->format = AV_PIX_FMT_RGB24;
int size = av_image_get_buffer_size(_pictureFrame->format,
_pictureFrame->width,
_pictureFrame->height,
1);
//dont forget to free _pictureFrameData at last
_pictureFrameData = (uint8_t*)av_malloc(size);
av_image_fill_arrays(_pictureFrame->data,
_pictureFrame->linesize,
_pictureFrameData,
_pictureFrame->format,
_pictureFrame->width,
_pictureFrame->height,
1);
。
if (_pictureFrame) {
av_free(_pictureFrame);
if (_pictureFrameData) {
free(_pictureFrameData);
}
}
2.对齐参数
首先,我将对齐设置为 32,但对于某些视频流,它不起作用,导致图像失真。然后我将其设置为 16(我的环境:mac、Xcode、iPhone6),一些流运行良好。但是最后我将对齐设置为 1,因为我发现这个
Fill in the AVPicture fields, always assume a linesize alignment of 1.
如果您查看版本 3.2 中 avpicture_get_size 的定义,您会看到以下代码:
int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height)
{
return av_image_get_buffer_size(pix_fmt, width, height, 1);
}
它只是调用建议的函数:av_image_get_buffer_size
,align
参数设置为 1
。我没有进一步找出为什么1
用于折旧功能的全部意义。与ffmpeg一样,人们可以通过阅读正确的代码和足够的代码(通过一些代码实验)来弄清楚。
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- C++ 类层次结构中的"对齐"是什么意思?
- libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?
- 标准全局默认运算符新的对齐限制是什么?
- 在C++11中,推荐的对齐内存的方法是什么
- 大小和对齐有什么区别?
- 什么是"线大小对齐"?
- 对齐C++指针位置的目的是什么
- InterlockedCompareExchange - 确切的对齐要求是什么以及如何强制执行
- 从字符[]访问对齐的T和的最有效方法是什么?
- 新 char[] 产生对齐内存的标准要求C++背后的意图是什么?
- Boost aligned_allocator的对齐参数是什么意思?
- 使用对齐符展开参数包的语法是什么?