SVT-AV1 整体架构

一 梳理SVT-AV1编码器的完整线程/处理链及与各阶段的数据流,并对提供的热点
按照SVT-AV1实际FIFO数据流,enc_handle.c 各fifo注释,把整条编码路径串起来,并说明每一级主要读写的数据集,最后再把perf里的符号按照阶段归类。

1总览:从应用到码流

EbBufferHeaderType 输入YUV,EbSvtAvtEncConfiguretion

->Resource Coordination svt_aom_resource_coordination_kernel

->Picture Analysis (svt_aom_picture_analysis_kernel, 可以多线程)

->Picture Decision svt_aom_picture_decision_kernel 显示序重排, + GOP类型

->Motion Estimation svt_aom_motion_estimation_kernel 可多段

->Initial Rate Control svt_aom_initial_rate_control_kernel

->Source Based Operations svt_aom_source_based_operations_kernel

->TPL Dispenser svt_aom_tpl_disp_kernel, 按波前并行

->Picture Manager svt_aom_picture_manager_kernel, 子图调度,参考关系

->Rate Control svt_aom_rate_control_kernel,与PicMgr/EC 有任务往返

->Mode Decision Configuration svt_aom_mode_decision_configuration_kernel

->EncDec / Mode Decision svt_aom_mode_decision_kernel, 按SB波前多线程

Deblock svt_aom_dlf_kernel

CDEF svt_aom_cdef_kernel

Restoration svt_aom_rest_kernel

Entropy Coding svt_aom_entropy_coding_kernel

Packetization svt_aom_packetization_kernel

App: EbBufferHeaderType 压缩码流

复制代码
scs->picture_analysis_fifo_init_count            =` `MIN(max_fifo, scs->picture_control_set_pool_init_count);` `// output from pic analysis to PD process (single threaded)`
    `...`
`    scs->picture_decision_fifo_init_count            =` `MIN(max_fifo, scs->picture_control_set_pool_init_count *` `MAX(tot_me_segs, tot_tf_segs));`
`    scs->motion_estimation_fifo_init_count           =` `MIN(max_fifo, scs->picture_control_set_pool_init_count);` `// output from ME to init_rc_process (single threaded)`
`    scs->initial_rate_control_fifo_init_count        =` `MIN(max_fifo, scs->picture_control_set_pool_init_count);` `// output from irc to src_ops (single threaded)`
`    scs->tpl_disp_fifo_init_count                    =` `MIN(max_fifo, scs->picture_control_set_pool_init_count * tot_tpl_segs);` `// TPL dispenser`
    `...`
`    scs->picture_demux_fifo_init_count =`
        `MIN(max_fifo, scs->picture_control_set_pool_init_count +` `2` `* scs->picture_control_set_pool_init_count_child);` `// input to pic mgr from src ops, rest, and packetization`
    `...`
`    scs->rate_control_tasks_fifo_init_count          =` `MIN(max_fifo,` `2` `* scs->picture_control_set_pool_init_count_child);` `// inputs to rc form pic manager and EC/packetization`
`    scs->rate_control_fifo_init_count                =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child);` `// inputs to MDC from rc`
`    scs->mode_decision_configuration_fifo_init_count =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child * tot_tiles * tot_enc_dec_segs *` `(1` `+ allow_recode + is_superres));` `// input to MD from MDC`
`    scs->enc_dec_fifo_init_count                     =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child);` `// TODO: Add DLF segments`
`    scs->dlf_fifo_init_count                         =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child * tot_cdef_segs);` `// input to CDEF from DLF`
`    scs->cdef_fifo_init_count                        =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child * tot_rest_segs);` `// input to rest from CDEF`
`    scs->rest_fifo_init_count                        =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child * tot_tiles);` `// input to EC from rest`
`    scs->entropy_coding_fifo_init_count              =` `MIN(max_fifo, scs->picture_control_set_pool_init_count_child);` `// EC outputs to packetization (single threaded)`
`

二 按阶段:分支 + 数据集 读写什么

下面 数据集 指该阶段主要依赖填充的控制结构与图像缓冲

|-----------------------|---------------------------------------------------------------------------------------------|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 阶段 | 核心对象/分支 | 主要输入数据 | 主要输出数据 |
| Resource Coordination | 每帧从应用取一帧 | EbBufferHeaderType,scs->static_config | 分配/绑定PictureParentControlSet, enhanced_pic, EOS等协调结果->送给PA |
| Picture Analysis | 普通帧,完整PA,Overlay, 可走initialize_overylay_frame->perform_simple_picture_analysis_for_overlay | pcs->enhanced_pic, PaReferenceObject 池,scs | Padding: 可选 film grain/去噪, |
| Picture Decision | Random Access vs Low Delay 场景切换,Intra插入,相关的调度 | 多帧PA统计,重排序队列 | 帧类型,层次,RPS,pred_structure 释放给ME的PCS状态 |
| Motion Estimation | 多ME segment并行,I帧等仍然以PCS为承载 | 下采样参考,源input_padded_pic, PD定的列表 | MV候选/代价,SAD/失真等ME结果,IRC |
| Initial RC | 开环粗估 | ME/统计汇总 | 初始复杂度,进入Source Based Ops的元数据 |
| Source Based Ops | 内容分类,部分策略信号 | PCS + 源/统计 | 后续TPL/PicMgr/RC用的picture级特征 |
| TPL Dispenser | 按64像素波前 | 参考与当前源块 | tpl_mc_flow 相关:运动补偿流、失真/代价供 RC/MD (你热点里的 tpl_mc_flow*) |
| Picture Manager | 子图 child PCS, 参考刷新,与Packetization/REST的demux | picture demux多源 | 调度closed-loop,RC发任务,产出待MDC的子图 |
| Rate Control | 与PicMgr,EC任务FIFO交互,可能多pass | 缓冲占用,复杂度,TPL等 | picture/segment QP,码空状态,MDC |
| EncDec | 多MD state 多候选类,Palette等模式 | ME结果,QP,块邻域 | 划分+帧内/帧间模式,变换类型,量化系数,临时重建md_encode_block, md_stage_0, full_loop_core, tx_type_search, svt_aom_quantize_*, av1_write_coeffs_txb_*, svt_av1_cost_coeffs_txb |
| DLF | 按segment | 重建样点 + 环路滤波开关 | 去块后缓冲 |
| CDEF | segment网格 | DLF后样点 | CDEF后缓冲(热点:svt_cdef_filter_block_*) |
| REST | segment x tile | CDEF后 | 恢复滤波后最终重建参考 |
| Entropy Coding | 子图级并行 | 系数+语法 | 码流片段,供Packetization 的EC结果 |
| Packetization | 重排序队列 | EC结果 | 完整AU/包,回调应用:并向PicMgr/RC回馈 |

3 和热点列表的对应关系

|------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------------------------------------|
| 看到的符号 | 大致所属阶段 | 说明 |
| apply_denoise_2d, flat block, FFT/FFT,window,noise_tx_filter,add_block_observations,optimizine_b, pointwise_multiply | Picture Analysis->film grain/Wiener 噪声建模 | 都在svt_aom_denoise_and_model_run 与编码环路无关 |
| svt_aad_loop_kernel*, svt_ext_all_sad_*,svt_aom_motion_estimation_b64,sub_pixel_variance*,find_best_sub_pixel_tree_pruned | Motion Estimation 亚像素精度相关的搜索 | 参考与源做SAD 方差 |
| tpl_mc_flow,tpl_mc_flow_dispenser_sb_generic | TPL Dispenser | 时域预测流,为码空/决策服务 |
| md_encode_block, md_stage_0, generate_md_stage_0_cand,full_loop_core,tx_type_search | EncDec/Mode Decision | 分阶段选块,RDO |
| svt_aom_fwd_txfm2d*,fdctav1_fdct64_new** | EncDec | 正变换 |
| svt_aom_quantize*, svt_av1_quantize_fp* | EncDec | 量化 |
| svt_av1_cost_coeffs_txb, av1_write_coeffs_txb* | EncDec 熵代价模型 | 系数代价与辅助 |
| svt_aom_inter_prediction, enc_make_inter_predictor, jnt_convolve*, convolve_2d_* | EncDec | 帧间预测,插值卷积 |
| svt_coeff_filter_block* | CDEF | 约束定向滤波 |
| svt_aom_encdec_update, neighbor_array_unit_mde_write | EncDec 环路状态, | SB级上下文,领域表更新 |
| is_valid_palette_nb_colors | EncDec | Palette模式合法性 |
| svt_memcpy_intrin_sse, memset/memmove | 各阶段 | 缓冲拷贝/清零,不单独对应某一算法 |

4 重要说明 避免误解

1 线程创建顺序 != 单帧严格串行:同一时刻多帧在流水线上,不同线程的ME/TPL/EncDec/EC 会同时贡献CPU,

2 分支的数据集,在实现里主要是SequenceControlSet + PictureParentControlSet + 子图,PictureControlSet + 各类PictureBufferDesc/EbPaReferenceObject 邻域数组/ME 与RC附加结构,而不是再套一层独立schema;上表是按控制流阶段对同一套结构,不同字段/缓冲的读写分工

3 若关掉film-grain denoise 你列表里前几名FFT/flat-block/apply_denoise_2d 会显著下降,其余SAD/MD/TPL/CDEF 仍反映正常编码主路径

相关推荐
jwybobo20072 小时前
AV1 码流 RTP 封装
音视频·av1
一个有温度的技术博主2 小时前
Redis集群实战:如何实现节点的弹性伸缩与数据迁移?
redis·分布式·缓存·架构
永霖光电_UVLED3 小时前
氧化镓高体积热容的特性,集成高介电常数界面的结侧冷却架构
人工智能·生成对抗网络·架构·汽车·制造
onebyte8bits4 小时前
NestJS 系列教程(十八):文件上传与对象存储架构(Multer + S3/OSS + 访问控制)
前端·架构·node.js·状态模式·nestjs
2501_948114244 小时前
从 Claude Code 源码泄露看 2026 年 Agent 架构演进与工程化实践
大数据·人工智能·架构
AI问答工程师4 小时前
用 Paperclip 搭了一个 3 人 AI 团队,自动写代码 + 审查 + 部署(踩了 4 个坑)
人工智能·架构
A_QXBlms4 小时前
多账号轮询架构 — 利用企销宝iPad协议突破单账号群发次数限制
ios·架构·ipad
百结2144 小时前
初识Flask架构
python·架构·flask