我一直在搜索高低选项,强制avcodec为其AVFrame数据使用未对齐的内存。
根据像素格式,AVFrame->数据的水平平面可以填充额外的数据,以便与内存对齐以提高性能。
例如:每像素4字节的1920 * 1080视频每个平面将有1920 * 4 = 7680字节。
使用avcodec,如果您正在解码此视频,它将为每个平面创建7808个字节。
这增加了7808 - 7680 = 128字节的额外填充。
出于我的目的,我想强制avcodec使用未对齐的数据,这样我就可以复制整个连续的帧数据块,而不是一次一个地复制和格式化较小的块到一个连续的块。
标题中包含以下标志:
/* encoding support
These flags can be passed in AVCodecContext.flags before initialization.
Note: Not everything is supported yet.
*/
/**
* Allow decoders to produce frames with data planes that are not aligned
* to CPU requirements (e.g. due to cropping).
*/
#define CODEC_FLAG_UNALIGNED 0x0001
将此AVCodecContext.flags设置为CODEC_FLAG_UNALIGNED,假设AVFrame->数据现在未对齐,情况并非如此。
我不确定我是在正确的位置还是正确使用此标志。
此致
好奇的乔治
答案 0 :(得分:2)
解码后,您可以使用swrescale将像素格式化为您提供的内存缓冲区。只需将输入和输出分辨率设置为相同,分配一块内存,并将行间距设置为等于帧宽。
答案 1 :(得分:0)
ffmpeg
的一个重要事情是始终检查任何实际关心已定义选项的内容。看起来好像很多编解码器实际使用这个标志:
~/sources/ffmpeg-2.1.1> find libavcodec/ -name \*.c | xargs grep CODEC_FLAG_UNALIGNED
libavcodec/hevc_ps.c: !(s->avctx->flags & CODEC_FLAG_UNALIGNED)) {
libavcodec/h264_ps.c: !(h->avctx->flags & CODEC_FLAG_UNALIGNED)) {
~/sources/ffmpeg-2.1.1>