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->poolsi; i++) {

pic->linesizei = pool->linesizei;

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

三 pool 的 linesize计算过程

update_frame_pool()

case AVMEDIA_TYPE_VIDEO: {

int linesize4;

int w = frame->width;

int h = frame->height;

int unaligned;

ptrdiff_t linesize14;

size_t size4;

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

do {

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

// that linesize0 == 2*linesize1 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 |= linesizei % pool->stride_aligni;

} while (unaligned);

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

linesize1i = linesizei;

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

if (ret < 0)

goto fail;

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

pool->linesizei = linesizei; //这里赋值给pool的linesize

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

循环中

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

直到最终对 stride_aligni取余为0.

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

函数获取 stride_align

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

linesize_aligni = 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字节

相关推荐
VidDown1 天前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频
可乐鸡翅yeah_2 天前
HLS 业务 Referer‑Policy 网页元标签引发播放异常排错
前端·javascript·网络·ffmpeg·php·音视频
开开心心就好3 天前
本地文件搜索工具推荐,占用小速度还快
智能手机·ffmpeg·ocr·word·音视频·网络攻击模型·安全架构
我科绝伦(Huanhuan Zhou)3 天前
oracle坏块导致备份不了
数据库·oracle·ffmpeg
RS迷途小书童3 天前
Python+FFmpeg提取大疆无人机MP4内嵌mov_text遥测SRT字幕并做完整性校验
python·ffmpeg·大疆·srt字幕·dji
开开心心就好3 天前
视频压缩工具推荐,画质效果很能打
智能手机·ffmpeg·ocr·word·排序算法·音视频·散列表
可乐鸡翅yeah_4 天前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
redfred4 天前
HyperFrames 部署教程:5.6 万 Star 开源「写 HTML 出视频」框架,Windows 从零上手(CLI 三条命令 + 7 个避坑)
ffmpeg·开源·自动化·html·音视频
Arcai10244 天前
PostgreSQL数据备份和恢复完全指南
数据库·postgresql·ffmpeg·备份一体机·备份软件·smartstor·智备科技
可乐鸡翅yeah_5 天前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8