libaom 源码分析:twopass_encoder.c 文件
libaom
libaom 是 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现,并被广泛用于多种生产系统中。libaom 支持多种功能,包括可扩展视频编码(SVC)、实时通信(RTC)优化等,并定期进行更新以提高压缩效率和编码速度 。
libaom 的一些关键特性包括:
- 多空间层和时间层编码:通过
aom_svc_layer_id_t结构体支持空间层和时间层的ID标识,允许视频在不同的分辨率和帧率下进行编码 。- 编码参数配置:通过
aom_svc_params_t结构体等配置编码参数,如空间层数量、时间层数量、量化器、缩放因子等 。- 基础编码参数:
aom_codec_enc_cfg_t结构体用于配置编码器的基础参数,如使用方式、时间基准、编码通道、帧重采样等 。- 多遍编码模式:支持多遍编码模式,包括单遍、双遍和多遍编码,以优化编码效率和质量 。
- 帧超分采样:支持帧超分辨率模式,通过
rc_superres_mode枚举值控制放大过程 。- 关键帧放置:支持关键帧放置模式,通过
kf_mode枚举值决定是否自动放置关键帧 。- SVC 编码参数:支持 SVC 编码的参数类型配置,如层数量、量化器、缩放因子等 。
libaom 的更新通常每三个月进行一次,最近的更新包括对 SVC 丢帧模式的支持、新的构建配置以减小二进制文件大小、以及对 RTC 屏幕内容压缩效率的显著提升 。此外,libaom 还提供了对 AV1 视频压缩格式的支持,包括实时编码模式和对不同质量控制策略的优化 。
twopass_encoder.c 介绍
- 功能:两遍编码循环的 demo 输入yv12 格式,输出 ivf 格式。
- 文件位置:libaom/examples/twopass_encoder.c
函数关系

结构体
- FILE:文件结构体
- aom_codec_ctx_t:编解码上下文结构体
- aom_codec_enc_cfg_t:编码器配置结构体
- aom_image_t:输入图像结构体
- aom_codec_err_t:算法返回编码状态码结构体
- aom_fixed_buf_t:产生固定大小 buffer 结构体
- aom_codec_iface_t:编解码接口结构体
- AvxVideoInfo:av1 编码视频信息结构体
- AvxVideoWriter:视频信息写入结构体
2pass 编码原理
- 数据流转图

- 核心原理:第一遍编码产生的aom_fixed_buf_t数据赋值给aom_codec_enc_cfg_t中的 rc_twopass_stats_in(aom_fixed_buf_t) 供第二遍编码使用;
- aom_fixed_buf_t 结构体:
/*!\brief Generic fixed size buffer structure** This structure is able to hold a reference to any fixed size buffer.*/
typedef struct aom_fixed_buf {void *buf; /**< Pointer to the data. Does NOT own the data! */size_t sz; /**< Length of the buffer, in chars */
} aom_fixed_buf_t; /**< alias for struct aom_fixed_buf */
- 在 pass0 函数中的get_frame_stats函数对aom_fixed_buf_t结构体进行赋值;
static int get_frame_stats(aom_codec_ctx_t *ctx, const aom_image_t *img,aom_codec_pts_t pts, unsigned int duration,aom_enc_frame_flags_t flags,aom_fixed_buf_t *stats) {int got_pkts = 0;aom_codec_iter_t iter = NULL;const aom_codec_cx_pkt_t *pkt = NULL;const aom_codec_err_t res = aom_codec_encode(ctx, img, pts, duration, flags);if (res != AOM_CODEC_OK) die_codec(ctx, "Failed to get frame stats.");while ((pkt = aom_codec_get_cx_data(ctx, &iter)) != NULL) {got_pkts = 1;if (pkt->kind == AOM_CODEC_STATS_PKT) {const uint8_t *const pkt_buf = pkt->data.twopass_stats.buf;const size_t pkt_size = pkt->data.twopass_stats.sz;stats->buf = realloc(stats->buf, stats->sz + pkt_size);if (!stats->buf) die("Failed to allocate frame stats buffer.");memcpy((uint8_t *)stats->buf + stats->sz, pkt_buf, pkt_size);stats->sz += pkt_size;}}return got_pkts;
}
- 在函数 set_encoder_config 中对aom_codec_enc_cfg_t中的 rc_twopass_stats_in(aom_fixed_buf_t) 进行应用;根据aom_fixed_buf_t的 sz 大小除以每个包的状态大小FIRSTPASS_STATS,作为输入配置中的 limit 变量的值;
if (cfg->g_pass >= AOM_RC_SECOND_PASS) {const size_t packet_sz = sizeof(FIRSTPASS_STATS);const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz);input_cfg->limit = n_packets - 1;} else {input_cfg->limit = cfg->g_limit;}
- 在 validate_config 函数中对FIRSTPASS_STATS进行赋值,用来访问第一遍编码的统计信息。
if (cfg->g_pass >= AOM_RC_SECOND_PASS) {const size_t packet_sz = sizeof(FIRSTPASS_STATS);const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz);const FIRSTPASS_STATS *stats;if (cfg->rc_twopass_stats_in.buf == NULL)ERROR("rc_twopass_stats_in.buf not set.");if (cfg->rc_twopass_stats_in.sz % packet_sz)ERROR("rc_twopass_stats_in.sz indicates truncated packet.");if (cfg->rc_twopass_stats_in.sz < 2 * packet_sz)ERROR("rc_twopass_stats_in requires at least two packets.");stats =(const FIRSTPASS_STATS *)cfg->rc_twopass_stats_in.buf + n_packets - 1;if ((int)(stats->count + 0.5) != n_packets - 1)ERROR("rc_twopass_stats_in missing EOS stats packet");}
- FIRSTPASS_STATS的定义如下,这个结构体用于在视频编码的第一遍(分析遍)中累积帧统计信息。这些统计数据有助于在第二遍(编码遍)中优化码率分配和提高编码质量,该结构体包含了帧、权重、mv 相关、帧编码信息等等变量。
/*!* \brief The stucture of acummulated frame stats in the first pass.** Errors (coded_error, intra_error, etc.) and counters (new_mv_count) are* normalized to each MB. MV related stats (MVc, MVr, etc.) are normalized to* the frame width and height. See function normalize_firstpass_stats.*/
typedef struct FIRSTPASS_STATS {/*!* Frame number in display order, if stats are for a single frame.* No real meaning for a collection of frames.*/double frame;/*!* Weight assigned to this frame (or total weight for the collection of* frames) currently based on intra factor and brightness factor. This is used* to distribute bits betweeen easier and harder frames.*/double weight;/*!* Intra prediction error.*/double intra_error;/*!* Average wavelet energy computed using Discrete Wavelet Transform (DWT).*/double frame_avg_wavelet_energy;/*!* Best of intra pred error and inter pred error using last frame as ref.*/double coded_error;/*!* Best of intra pred error and inter pred error using golden frame as ref.*/double sr_coded_error;/*!* Percentage of blocks with inter pred error < intra pred error.*/double pcnt_inter;/*!* Percentage of blocks using (inter prediction and) non-zero motion vectors.*/double pcnt_motion;/*!* Percentage of blocks where golden frame was better than last or intra:* inter pred error using golden frame < inter pred error using last frame and* inter pred error using golden frame < intra pred error*/double pcnt_second_ref;/*!* Percentage of blocks where intra and inter prediction errors were very* close. Note that this is a 'weighted count', that is, the so blocks may be* weighted by how close the two errors were.*/double pcnt_neutral;/*!* Percentage of blocks that have almost no intra error residual* (i.e. are in effect completely flat and untextured in the intra* domain). In natural videos this is uncommon, but it is much more* common in animations, graphics and screen content, so may be used* as a signal to detect these types of content.*/double intra_skip_pct;/*!* Image mask rows top and bottom.*/double inactive_zone_rows;/*!* Image mask columns at left and right edges.*/double inactive_zone_cols;/*!* Average of row motion vectors.*/double MVr;/*!* Mean of absolute value of row motion vectors.*/double mvr_abs;/*!* Mean of column motion vectors.*/double MVc;/*!* Mean of absolute value of column motion vectors.*/double mvc_abs;/*!* Variance of row motion vectors.*/double MVrv;/*!* Variance of column motion vectors.*/double MVcv;/*!* Value in range [-1,1] indicating fraction of row and column motion vectors* that point inwards (negative MV value) or outwards (positive MV value).* For example, value of 1 indicates, all row/column MVs are inwards.*/double mv_in_out_count;/*!* Count of unique non-zero motion vectors.*/double new_mv_count;/*!* Duration of the frame / collection of frames.*/double duration;/*!* 1.0 if stats are for a single frame, OR* Number of frames in this collection for which the stats are accumulated.*/double count;/*!* standard deviation for (0, 0) motion prediction error*/double raw_error_stdev;/*!* Whether the frame contains a flash*/int64_t is_flash;/*!* Estimated noise variance*/double noise_var;/*!* Correlation coefficient with the previous frame*/double cor_coeff;/*!* log of intra_error*/double log_intra_error;/*!* log of coded_error*/double log_coded_error;
} FIRSTPASS_STATS;
相关文章:
libaom 源码分析:twopass_encoder.c 文件
libaom libaom 是 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现,并被广泛用于多种生产系统中。libaom 支持多种功能,包括可扩展视频编码(SVC)、实时通信…...
ruoyi同时支持mysql+sqlserver+oracle+postgresql
需求背景 最近需要一个小demo,项目中需要同时连接sqlserver和mysql数据库。 操作教程 1、pom.xml -- 修改common/pom.xml<!-- 动态数据源 --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-star…...
微信小程序绘制轨迹
1、map | uni-app官网 根据官网描述:通过从数据库获取POI数据,并通过 uni-id-common 内的路线规划API,计算路线、距离、时间。 2、 <map style"width:100%;height:96%;" id"myMap" :scale"scale" :longi…...
UNION 联合查询
1.UNION ALL联合查询 同样为了演示方便,先向 teacher 表插入多条测试数据: INSERT INTO teacher (name,age,id_number,email) VALUES (姓名一,17,42011720200604077X,NULL), (姓名二,18,42011720200604099X,123qq.com), (姓名三,19,42011720200604020X…...
blender 理解 积木组合 动画制作 学习笔记
一、学习blender视频教程链接 案例2:积木组合_动画制作_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Bt4y1E7qn?vd_sourced0ea58f1127eed138a4ba5421c577eb1&p10&spm_id_from333.788.videopod.episodes 二、说明 之前已经学习了如何制作积木组…...
关于 FreeSWITCH mod_sofia 注册过期时间的测试
FreeSWITCH 版本:1.10.12,以下简称 Fs SIP 终端:Eyebeam 1.5.14.4 Eyebeam 设置注册的过期时间为 30 Fs 设置为 120,下面是详细配置: <param name"sip-force-expires-max" value"120"/>…...
【LeetCode:349. 两个数组的交集 + 哈希表】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
根据语音生成视频33搜帧
33搜帧,是一个能根据语音生成视频的网站,33搜帧 - 视频帧画面搜索引擎 33搜帧是一个使用AI技术构建的视频帧画面搜索引擎,和一般素材平台通过视频标签来搜索视频不同,33搜帧能搜索到视频素材中的每一帧画面,这个功能可…...
目标检测数据集图片及标签同步锐化
在目标检测任务中,数据集的质量直接影响到模型的性能。数据增强作为提升数据集多样性和模型泛化能力的常用手段,在图像处理过程中扮演着重要角色。锐化(Sharpening)技术是常见的图像增强方法之一,能够突出图像中的细节…...
滚雪球学Redis[6.4讲]:Redis消息队列:构建高效的消息通信与任务调度系统
全文目录: 🎉前言🚦Redis消息队列的使用场景🐳1. 异步任务处理🐋2. 任务调度🐬3. 模块解耦 ⚙️实现发布/订阅模型🐟️1. 发布者发布消息🐠2. 订阅者订阅频道🐡3. 实际应…...
《计算机视觉》—— 换脸
效果如下: 完整代码: import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…...
【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)
前言 🌟🌟本期讲解关于CAS的补充和JUC中有用的类,这里涉及到高频面试题哦~~~ 🌈上期博客在这里:【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&…...
复习:react 中的 refs,怎么使用,有哪些使用场景
在 React 中,refs(引用)是一个重要的特性,它允许开发者直接访问 DOM 元素或者 React 组件的实例。以下是对 React 中 refs 的使用及其使用场景的详细解释: 一、refs 的使用方法 字符串引用 在早期的 React 版本中,可以通过字符串来设置 ref。然而,这种方法已经被废弃,…...
Python OpenCV精讲系列 - 目标检测与识别深入理解(二十)
💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识…...
golang中的上下文
背景 在Go语言中,使用context包来管理跨API和进程间的请求生命周期是常见的做法。特别是在涉及到并发编程时,如启动协程(goroutine)来处理异步任务,正确地传递和监听context变得尤为重要。比如,在gin框架中…...
Navigation2 算法流程
转自 https://zhuanlan.zhihu.com/p/405670882 此文仅作学习笔记 启动流程 在仿真环境中启动导航包的示例程序,执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能,本文件…...
OpenAI swarm+ Ollama快速构建本地多智能体服务 - 1. 服务构建教程
OpenAI开源了多智能体编排的工程swarm,今天介绍一下swarm与OLLAMA如何结合使用的教程,在本地构建自己的多智能体服务,并给大家实践演示几个案例。 安装步骤 安装ollama,在官网下载对应操作系统的版本即可,下载后用ol…...
HTB:Wifinetic[WriteUP]
目录 连接至HTB并启动靶机 1.What is the name of the OpenWRT backup file accessible over FTP? 使用nmap对靶机21、22端口进行脚本、服务信息扫描 2.Whats the WiFi password for SSID OpenWRT? 3.Which user reused the WiFi password on thier local account? 4.…...
专业学习|马尔可夫链(概念、变体以及例题)
一、马尔可夫链的概念及组成 (一)学习资料分享 来源:024-一张图,但讲懂马尔可夫决策过程_哔哩哔哩_bilibili 马尔可夫链提供了一种建模随机过程的方法,具有广泛的应用。在实际问题中,通过转移概率矩阵及初…...
RK3576 安卓SDK编译环境搭建
编译 Android14 对机器的配置要求较高: 建议预留500G存储 多分配CPU和内存 建议使用 Ubuntu 20.04 操作系统或更高版本 sudo apt-get updatesudo apt-get install make gcc sudo apt-get install g++ patchelf gawk texinfo chrpath diffstat binfmt-support sudo apt-get …...
智能体商业化基础:SaaS、私有化、定制化模式
文章目录前言一、2026智能体元年,别再死磕demo了,商业化才是技术的终极归宿二、智能体商业化三大核心模式,从逻辑到落地一次讲透2.1 SaaS订阅模式:标准化规模化的最优解,占据行业半壁江山2.1.1 核心逻辑:一…...
脑机接口爆发:测试工程师的黄金机遇
当前,脑机接口(BCI)技术正从实验室走向产业化,市场规模呈指数级增长。据权威预测,中国脑机接口市场规模将从2024年的32亿元跃升至2030年的120亿元(资料5/6)。这一爆发式增长背后,是国…...
终极指南:如何利用NVS在CI/CD环境中实现多版本Node.js自动化测试
终极指南:如何利用NVS在CI/CD环境中实现多版本Node.js自动化测试 【免费下载链接】nvs Node Version Switcher - A cross-platform tool for switching between versions and forks of Node.js 项目地址: https://gitcode.com/gh_mirrors/nv/nvs 在现代软件开…...
DamaiHelper:终极多平台自动化抢票助手完整指南
DamaiHelper:终极多平台自动化抢票助手完整指南 【免费下载链接】damaihelper 支持大麦网,淘票票、缤玩岛等多个平台,演唱会演出抢票脚本 项目地址: https://gitcode.com/gh_mirrors/dam/damaihelper 在演唱会门票秒杀战中,…...
蓝牙channel sounding - 蓝牙信道探测的PBR测距
一、PBR测距方法PBR的全称是Phase-Based Ranging,PBR测距方法的本质是通过测量无线信号在传播路径上的相位变化从而估计出两个设备间的距离,蓝牙低功耗设备通过在特定频率传输交换CS TONE得到Initiator和Reflector之间的相位差,通过相位差得到…...
终极免费在线PPT制作工具:如何在浏览器中打造专业级演示文稿
终极免费在线PPT制作工具:如何在浏览器中打造专业级演示文稿 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allow…...
recycleview列表多种样式,列表为空的设置,列表刷新
刷新列表:尽量使用:adapter.notifyItemRangeChanged(0,list.size()),或者类似方法,有动画;adapterpublic class Adapter2 extends RecyclerView.Adapter<Adapter2.ViewHolder2>…...
港科夜闻 | 香港科大与泰晤士高等教育合办亚洲大学高峰会2026
关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大与泰晤士高等教育(THE)合办“亚洲大学高峰会2026”,以“推动全球变革:亚洲的领导力”为主题,探讨亚洲高等教育在推动全球创新及应对迫切社会挑战方面的关键…...
ARM FPGA信号架构与存储子系统设计解析
1. ARM FPGA信号架构解析在ARM Integrator/LM-XCV400逻辑模块中,FPGA作为可编程逻辑核心与ARM架构处理器协同工作。这种设计允许开发者通过硬件描述语言(HDL)定制外设接口和加速器,同时保持与标准ARM总线协议的兼容性。该模块采用Xilinx Virtex XCV400 F…...
14个核心概念一次讲透!小白也能轻松入门大模型,速收藏!
本文用日常场景类比,解释了大模型的14个核心概念,如大模型是超级大脑、预训练是打基础、微调是专精技能、提示词是明确指令等,帮助新手轻松理解大模型的核心逻辑和运作方式。 1. 大模型(Large Language Model, LLM)大白…...
