如何强制avcodec使用未对齐的帧数据平面?

时间:2014-01-28 11:51:57

标签: c++ c memory ffmpeg avcodec

我一直在搜索高低选项,强制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->数据现在未对齐,情况并非如此。

我不确定我是在正确的位置还是正确使用此标志。

此致

好奇的乔治

2 个答案:

答案 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>