当前位置: 首页 > news >正文

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 = 0i < 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&hpool->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(linesizeavctx->pix_fmtw);

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 = 0i < 4i++)

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

        } while (unaligned);

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

linesize1[i= linesize[i];

ret = av_image_fill_plane_sizes(sizeavctx->pix_fmthlinesize1);

if (ret < 0)

goto fail;

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

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&hpool->stride_align);

函数获取 stride_align

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

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

http://www.lryc.cn/news/285882.html

相关文章:

  • 数据可视化 | 期末复习 | 补档
  • 【Docker】使用Docker安装Nginx及部署前后端分离项目应用
  • 28、web攻防——通用漏洞SQL注入HTTP头XFFCOOKIEPOST请求
  • c++:类和对象(1),封装
  • 三、安全工程—安全架构(CISSP)
  • Linux:shell脚本:基础使用(9)《数组》
  • TCP高并发服务器简介(select、poll、epoll实现与区别)
  • Linux中的软件包管理器yum
  • 如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试
  • 解决子元素的click事件会触发父元素的dbclick事件
  • 算法训练营Day38(动态规划1)
  • 基于Harris角点的多视角图像全景拼接算法matlab仿真
  • 数学建模--PageRank算法的Python实现
  • samba服务搭建,并将共享目录映射到windows
  • golang 中使用 statik 将静态资源编译进二进制文件中
  • 北京住总集团携手云轴科技ZStack获行业云平台领航者创新实践奖
  • 【漏洞攻击之文件上传条件竞争】
  • Buttton样式设置background属性失效的问题
  • 使用vue-pdf插件加载pdf
  • BP蓝图映射到C++笔记1
  • 龙芯+RT-Thread+LVGL实战笔记(30)——电子琴演奏
  • Python Process创建进程(2种方法)详解
  • 树莓派4B 使用树莓派官方烧录器烧录ubuntu20.04.5 排坑
  • 鸿蒙开发(五)鸿蒙UI开发概览
  • 应用层—HTTP详解(抓包工具、报文格式、构造http等……)
  • ISA Server 2006部署网站对比nginx
  • CHAPTER 9: 《DESIGN A WEB CRAWLER》第9章 《设计一个web爬虫》
  • java SSM网上小卖部管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • Java中集合元素的删除
  • HNU-数据挖掘-实验2-数据降维与可视化