ffmpeg中AVFrame解码linesize确定

一 测试环境

机型:Intel(R) Xeon(R) Gold 5218

ffmpeg版本4.3-dev

解码视频分辨率 720x1280 , 解码后 AVFrame linesize 768

解码视频分辨率 480x640, 解码后AVFrame linesize 512

二 linesize计算过程

avcodec_default_get_buffer2

-->update_frame_pool()

-->video_get_buffer()

video_get_buffer()-->

for (i = 0; i < 4 && pool->pools[i]; i++) {

pic->linesize[i] = pool->linesize[i];

由上面代码可见,AVFrame的linesize源自于 pool的linesize

pool linesize计算过程

update_frame_pool()

case AVMEDIA_TYPE_VIDEO: {

int linesize[4];

int w = frame->width;

int h = frame->height;

int unaligned;

ptrdiff_t linesize1[4];

size_t size[4];

avcodec_align_dimensions2(avctx, &w, &h, pool->stride_align);

do {

// NOTE: do not align linesizes individually, this breaks e.g. assumptions

// that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2

ret = av_image_fill_linesizes(linesize, avctx->pix_fmt, w);

if (ret < 0)

goto fail;

// increase alignment of w for next try (rhs gives the lowest bit set in w)

w += w & ~(w - 1);

unaligned = 0;

for (i = 0; i < 4; i++)

unaligned |= linesize[i] % pool->stride_align[i];

} while (unaligned);

for (i = 0; i < 4; i++)

linesize1[i] = linesize[i];

ret = av_image_fill_plane_sizes(size, avctx->pix_fmt, h, linesize1);

if (ret < 0)

goto fail;

for (i = 0; i < 4; i++) {

pool->linesize[i] = linesize[i]; //这里赋值给pool的linesize

linesize列表 通过 av_image_fill_linesizes获取,基本就是等于 width。

循环中

w += w & ~(w - 1); //每次将最低有效二进制位+1,这样做的目的,比如当前是16的整数倍,调整为32的整数倍。然后64的整数倍。

直到最终对 stride_align[i]取余为0.

avcodec_align_dimensions2(avctx, &w, &h, pool->stride_align);

函数获取 stride_align

for (i = 0; i < 4; i++)

linesize_align[i] = STRIDE_ALIGN;

#if HAVE_SIMD_ALIGN_64

define STRIDE_ALIGN 64 /* AVX-512 */

#elif HAVE_SIMD_ALIGN_32

define STRIDE_ALIGN 32

#elif HAVE_SIMD_ALIGN_16

define STRIDE_ALIGN 16

#else

define STRIDE_ALIGN 8

#endif

当机器支持avx512, STRIDE_ALIGN 64.

总结:ffmpeg的AVFrame linesize对齐方式和机器支持的simd有关,avx512就是64字节,avx256就是32字节

相关推荐
海天鹰1 小时前
ffmpeg区域颜色覆盖
ffmpeg
@Crazy Snail14 小时前
C# Winform--ffmpeg图片合成视频以及参数设置
开发语言·ffmpeg·c#
runing_an_min14 小时前
ffmpeg 视频滤镜:高斯模糊-gblur
ffmpeg·音视频·高斯模糊·gblur
disgare14 小时前
FFmpegFrameRecorder 切分视频文件时结束条件设置不当导致切分后的文件过短问题
ffmpeg
Tech Synapse14 小时前
Java中使用FFmpeg拉取RTSP流
java·开发语言·ffmpeg
oushaojun215 小时前
ubuntu中使用ffmpeg和nginx推http hls视频流
nginx·ubuntu·ffmpeg·hls
cuijiecheng20182 天前
FFmpeg源码:ffio_read_indirect函数分析
ffmpeg
黑客KKKing3 天前
网络安全-企业环境渗透2-wordpress任意文件读&&FFmpeg任意文件读
安全·web安全·ffmpeg
oushaojun23 天前
win10中使用ffmpeg和MediaMTX 推流rtsp视频
ffmpeg·rtsp·mediamtx
lxkj_20244 天前
使用线程局部存储解决ffmpeg中多实例调用下自定义日志回调问题
ffmpeg