Pure MoonBit port of FFmpeg n9.0.2: codec bitstream line (H.264/H.265/VP9/AV1 video, AAC/MP3/Opus/FLAC decode; AAC/MP3/Opus encode), libavutil DSP, libavformat mux/demux (MP4/MKV/Ogg/WAV/FLAC/ADTS/MPEG-TS and more), plus a unified playback facade with ffprobe-style JSON CLI commands
| 范围 | 已可用 | 主要边界 |
|---|---|---|
| H.264 | I/P/B 帧;CAVLC/CABAC;8/9/10/12/14 bit、单色及 4:2:0/4:2:2/4:4:4;多 slice、MBAFF/PAFF、参考帧管理、SEI、去块滤波;Annex B 与 MP4 avcC 入口;渐进帧与 MBAFF 帧缺失或截断 slice 的宏块补偿;两条独立 4:2:0 源的 P 帧损坏矩阵(丢 IDR/P 首 slice、丢多个 P slice、截断尾 slice,逐帧 MD5 对齐 FFmpeg) | 错误恢复的色度几何复刻 FFmpeg 的 4:2:0 硬编码(put_dc 固定 8x8 chroma/MB、uint8 语义),高位深/4:4:4/4:2:2 流的恢复输出因此与 FFmpeg 的未定义行为区域耦合,明确不在对齐范围;场图片按上游边界明确报错;SP/SI 明确不做。FMO、separate colour plane 和数据分区不在 FFmpeg 9.0.2 的可解码范围内 |
| HEVC | I/P/B 帧;8/10/12 bit、多种色度格式及单色;多 slice、WPP、tiles、去块滤波与 SAO;dependent slice segments 的帧头/CABAC/QP/邻域继承(含 WPP 或 tiles,8/10/12-bit 420 共 81 帧双滤波模式对齐,含 54 帧派生高位深流;另有原生 4:4:4/4:2:2 8/10/12-bit dependent 共 30 帧(6 组流));PCM(独立 Y/C 精度、CABAC 重启与滤波保护);transquant bypass 无损残差;implicit/explicit RDPCM(8/10/12-bit、420/422/444/单色,30 帧双滤波模式对齐 FFmpeg 单线程);跨分量预测(CCP,含 CBF=0 的纯亮度预测色度块、intra/inter 与 skip/bypass 组合,及与 dependent slice segments/PCM 的 4 组 4:4:4 组合验证);参考列表修改(ref_pic_list_modification,L0/L1 重排与越界拒绝);persistent Rice 参数自适应(按 luma/chroma × skip/bypass 四类状态跨 TU 保持,WPP 行状态保存/恢复);tiles 与 WPP 同时启用(High Throughput Intra 4:4:4,含 cabac_bypass_alignment 的符号/escape 对齐,6 组 30 帧对齐 HM 16.8 解码,含 2 组 dependent slice segments 与 1 组多独立 slice) | 当前图片引用(SCC)仍缺:FFmpeg 9.0.2 的 native HEVC 解码器对 SCC profile 直接报 PATCHWELCOME,且需要 SCC 编码器生成码流;FFmpeg 9.0.2 自身无法解码 tiles+WPP(单线程 cabac_init 用 tile-scan 索引对 picture CTB 宽度取模),该组合因此以 HM 解码输出为参考;RDPCM bypass 保留 FFmpeg 单线程残留模式语义 |
| AAC / MPEG 音频 / FLAC | AAC-LC PCM;AAC-LC 编码器(aac_encode.mbt:正弦窗长窗 + 1024 点 MDCT、逐带在码本 1..11 中选最小位耗码本(codebook 11 走 escape,量化幅度上限 8191)、整帧单标度因子 + 以参考标度因子为中心的全局 delta 二分(取仍装得下帧预算的最小 delta,按目标码率填满)、单声道 SCE / 立体声独立双 ICS + ADTS 封装;ffmpeg 9.0.2 可直接解码 44.1 kHz 立体声 9 帧流,实测 119.7 kbps(目标 128 kbps 的 93.5%)、往返 SNR 29.97 dB / PSNR 39.8 dB,ffmpeg 解码输出与本仓库解码器差 0.0008 MSE(亚 LSB);3GPP 心理声学模型独立移植(aac_psy.mbt + aac_psy_vectors/:aacpsy.c 全链路——Bark/ATH 静态系数、双向扩散、预回声控制、PE 与比特池需求、reduction 两轮估计与 linearization,5 帧×49 带对拍 FFmpeg 9.0.2 参考,整数决策逐位一致、浮点相对误差 ≤5e-4;twoloop 量化器同层移植(aac_twoloop.mbt + aac_twoloop_tables.mbt + aac_twoloop_vectors/:aaccoder_twoloop.h 的 search_for_quantizers_twoloop 全链路——逐带 find_max_val/form factor/最小码本选择、quantize_and_encode_band_cost 的 RD 成本(codebook 0 的零带短路、codebook 11 escape 分支按 165140.0*IQ 截断)、内层按帧预算收敛 30 轮与外层逐带失真调整及 band 移除,表与 pow2sf/pow34sf 由 C dumper 零转录提取;5 帧×49 带 sf_idx/band_type/zeroes 逐位一致、maxval 相对误差 ≤1e-5,连参考侧 30 轮跑满与 sf0 在 127/131/132/136/137 间振荡都复现;两者可组合成可选码率控制链(aac_encode_config_perceptual:ONLY_LONG 长窗帧(ONLY_LONG 与两个过渡窗)走 psy→twoloop→λ 严格重试,只有 8 短窗帧仍走简化模型;默认路径不变,因此 117.1 kbps / 29.05 dB 的往返指标不受影响;感知路径实测 125.8 kbps / 21.5 dB(§291 把 M/S 挪到 twoloop/PNS 之后、分析改读左右谱,比 §279 的 122.7 kbps / 20.1 dB 高 1.4 dB;§295 换上真 search_for_ms 后码长 +2 B/帧、SNR 让出 0.3 dB;§297 把 §289 偏差 2 闭环——λ 重试的每一轮都重跑 psy analyze(上游的 element 循环整个在重试 do-while 里,第二轮读到第一轮消费过的 bit reservoir),取 ABR 分支的系数恢复语义 + 严格分支的 λ 规则,只有真正重试过的帧会变,实测再 +0.49 dB、码长 −1 B/帧;§298 再把 TNS 也挪进同一轮——量化之后、PNS 之前,滤波写进本轮的谱副本、coefs 保持干净左右谱,四音指标一字不变(那内容上 TNS 不点火),共享高音夹具只有 TNS 点火的那一帧从 366 变 369 B;§299 再补上每轮的 adjust_frame_information——max_sfb 改由量化器的 zeroes[] 反推(24 kbps 下剪到 19/49)、ms_mode 补第三种取值 2(全带标记时不写掩码位)、TNS 带范围改用上一轮/上一帧的 max_sfb(因此流的第一帧必然不发滤波器);三个码率的 max_sfb 与 §298 完全相同,属结构闭环,至此感知路径与 aacenc.c 的 element 循环同构;§300 再补齐 3GPP 模型的八短窗形态——calc_thr_3gpp 的 w += 16 逐窗外层、44.1 kHz 下 14 带 × 8 窗的短窗带计划与 psy_coef[1] 短窗扩散常量、cutoff 除以窗数、PSY_3GPP_AH_THR_SHORT(按 f32 存 0.6299999952316284)、短窗那组 calc_bit_demand 斜率、只有窗口 0 读上一帧的预回声,发布布局换成 C 的 psy_bands[w * 16 + g] 槽位数组;harness 新 --short 模式(长窗输出逐字节不变)给出 5 帧 × 8 窗 × 14 带 = 560 条黄金记录,bits/alloc/fill_level 逐位一致、最坏相对误差 energy 1.7e-7 / threshold 4.9e-6,而上游那条"spread_en[0] 而不是 spread_en[w]"的怪癖也一并照抄;编码器仍只把长窗帧交给感知路径,三条端到端流与 §299 逐字节相同;§301 再把 twoloop 量化器也扩到按窗分组——新入口 AacTwoShape(1 长窗 / 8 短窗 + group_len),C 的 15 处 for (w = 0; w < num_windows; w += group_len[w]) 外层全部补齐,一个窗组共享一条标度因子与一个码本、带成本按组内 group_len 个窗累加、标度因子差链跨窗组不重置、ff_pns_bits 的回看按 (w<<4)+g-1、ff_init_nextband_map 同形;两条只在短窗才会露面的上游怪癖(形态因子那趟的分母用窗号当带号索引的 swb_sizes[w]、守卫 nzs[g] 只看第一个窗组)连同 DC 带保护与 8/group_len 瞬态降权一起照抄。harness 的 --short 现在顺手跑真实搜索并轮转 window_grouping[] 的前五个字节当分组(组大小 1/2/3 都踩到),266 条 sf/cb/zeroes 逐位一致、maxvals 相对误差 ≤1e-5,且用"同一帧换分组必须给出不同标度因子"的回归防住分组被默默忽略;把 de_psy_factor 改成常量做变异测试时,向量立刻报 frame 0 slot 96: sf 115 != 116),差距经交叉验证不是移植问题——把编码器同一份输入喂回未修改的 C,98/98 带逐位一致,属 3GPP 模型在该码率下的固有行为;用模型自身的噪声-掩蔽比衡量,感知路径 12.83 dB 优于默认路径 14.45 dB(代价是 10 dB 谱 SNR),见 §279/§280/§291/§297;PNS 可用 aac_encode_config_with_pns 开启(mark_pns → PNS-aware twoloop → search_for_pns → 码流 off_pns 独立标度因子链 + 9 位前导,三批 245 带黄金数据逐位一致,白噪声夹具 344 B/帧 vs 未开启的 357 B/帧,见 §284–§289;强度立体声可用 aac_encode_config_with_is 开启(aacenc_is.c 的简化版——FFmpeg 频率门 6100·(λ/170) 加带内互相关选带与相位,右声道该带改写为 14/15 带并走独立的 off_is 标度因子链、不写谱数据,与 M/S 的带互斥规则和上游一致,§294 起在感知路径上还能与 PNS 同时开(噪声带由 PNS 终值直接排除,同一夹具噪声带数开不开 IS 都是 81/78);感知路径已换成 aac_is_encoding_err 的真成本判据并与 FFmpeg 逐位对拍(§292:4 帧 × 49 带的 is_mask/ms_mask/右声道带类型/两个 is_ener/两相位 pass/is_mode 全等,64 个强度带,连 dist1/dist2 成本量值也逐位相等——为此把 escape 码本的 c*cbrtf(c) 从「double cbrt 再舍 f32」改成 C 侧零转录表(2196/8192 个整数输入原本差 1 ulp,§293);默认路径仍用 §290 的频率门 + 相关性下限,因为它没有 twoloop 的 sf/阈值可定价);感知路径的 M/S 掩码同层换成 FFmpeg 的 search_for_ms(aac_ms.mbt,§295:每带四轮 sid_sf_boost、ff_sfdelta_can_replace 的 ±60 标度因子链守卫、bmax = bval2bmax(g·17/num_swb)/0.0045 折扣的 side lambda、判据 dist2 <= dist1 && B1 < B0,命中即改写两声道的 sf_idx/band_type——量化与写码流都吃改写后的终值;4 帧 × 49 带的掩码/boost/两条 sf/两条 cb/dist1/dist2/mid 带成本/B1/bmax 与参考逐位相等,67 个 M/S 带;能量掩码只留在简化路径;§296 又把量化器与 PNS 链上残余的「C 单精度常量按十进制原值使用」和 int *= 1.15f 的整型截断一次扫清(C_QUANT/0.00125f/0.0125f/1.15f/1.948f/0.9f/0.7f/0.88f/0.85f,以及 options.pns || options.intensity_stereo 这条带宽补偿条件),并证明它是保真而非改行为:三批 245 带、64 强度带 + 67 M/S 带向量全绿,两个端到端夹具的 ADTS 与 §295 逐字节相同)——共享高音夹具触发 55 带、省 8.5% 码长(1748 > 1599 B),去相关夹具触发 43 带、SNR 22.52 → 24.99 dB,且每声道自己的强音原样回来(−0.13 dB)不串进另一声道(−57.6 dB);同一条码流经 ffmpeg 9.0.2 解码 0 errors 零告警,与本解码器 PCM 最大差 1.49e-7;§295 起把「感知 + M/S」与「噪声 + PNS + IS」两条流各 9 帧送同一条链路,§297 在新实现上重跑仍是 0 errors 零告警(3163 / 2980 字节),最大差 1.49e-7 / 4.47e-8(SNR 138.971 / 138.404 dB)——M/S 改写后的标度因子链、噪声带上的掩码位与 IS 的 flip 位都被 FFmpeg 自己的解码器原样接受;§297 还把 IS/M/S 夹具的选帧改成按参考侧的工具活跃度自动挑,在当前编码器状态上覆盖 72 个强度带 + 79 个 M/S 带并继续逐位相等,见 §290–§297);§302 把短窗帧也接进这条链(aac_encode_config_with_perceptual_short,默认关):psy 的 8×128 槽位带记录与按窗分组的 twoloop 终于进 encode_frame,channel_data_psy 按 w*128+offsets[b] 逐窗量化、组内共享 (sf,cb),码流沿用 scale_factor_grouping=0x7f 的一组八窗;短窗上三件仍是单窗移植的工具(PNS / IS / M-S)显式关闭,但带宽补偿条件照 C 保持与窗形状无关;因一组八窗共用一个标度因子,瞬态夹具从 31.84 掉到 25.21 dB 而短窗 NMR 尚未量化,故按 PNS/IS 先例做成 opt-in —— 开关关闭时 8 个长窗帧逐字节不变(含短窗之后的帧),三条端到端流仍是 3166/2980/727 B;开关打开后 mono 128k 3042 B 与 stereo 64k 1626 B 两条 ADTS 经 ffmpeg 9.0.2 解码,与本解码器 PCM 差 3.5e-9 / 140.5 dB、零延时偏移;§303 补上短窗 NMR 尺子并裁决不转正——重放全部帧建立预回声历史、按 8×128 谱与 psy_bands[w*16+g] 逐窗阈值测量,感知臂在两码率、八个窗全线更差(128k:14.21 vs 9.75 dB、64k:18.69 vs 15.62 dB,低频带最重——单组八窗共享一个标度因子所致),长窗的「SNR 换掩蔽余量」交易在短窗不存在,故保持 opt-in;§304 把窗分组补上——FFmpeg 真正注册的窗回调 psy_lame_window 整体移植(aac_enc_window.mbt:21 点 FIR 高通 + 18 子块峰值 + attacks/级联/喇叭抑制全链按 C float 语义逐运算 f32 化,每通道跨帧状态挂 AacEncoder.lame,同步改写口径——对本帧 MDCT 输入 buf[523..1568) 分析,恰是 C 前瞻覆盖的同一块样本;harness 新 --win 模式给出 26 帧×2 通道整数决策黄金向量,首攻块覆盖 window_grouping[] 全表 0..8,aac_win_vectors/ 逐帧整数全等),感知短帧按首攻块查表展开真实 scale_factor_grouping(CPE 取较早首攻),写侧 sf/cb 平铺 w*16+b 128 槽、sections/scalefactor/spectral 全部按组主序、sf 差分链跨组连续、adjust 逐组尾零扫描+组内归并(新鲜数组下恒等,C 的跨帧粘性 zeroes 为文档化偏差);stash 前后对拍证明 default/perceptual 流逐字节不变,分组 ADTS(4554 B/13 帧)经 ffmpeg 9.0.2 解码 0 errors、与本解码器 PCM 差 1.19e-7(≈138.5 dB);NMR 复测分组把感知臂 14.21→13.40 dB(128k)/18.69→18.26 dB(64k)改善 0.8/0.4 dB 但未翻转对简化臂(9.75/15.62 dB)的劣势;§305–§307 把短帧三件套与窗型状态机全部换上 FFmpeg 形态——mark_pns/search_for_pns、aac_is_search/aac_ms_search 按 w += group_len[w] 分组(PNS 逐窗拉 LCG 逐窗定价、IS 能量门组内求和、MS 组级 Mmax/Smax 与逐窗 bits 扣除,元素 sticky 槽状态跨帧、MS 重写回流),lame_apply_block_type 窗型机(发射存储态+短窗路径补丁,短窗运行必多一帧安静 EIGHT_SHORT 再经 LONG_STOP 回长窗)接进编码器,--win/--isms/--short --pns 三组 harness 向量(分组/窗型/槽决策逐帧逐槽全等),短窗全开流 ffmpeg 9.0.2 解码 0 errors、双解码器 PCM 一致 140 dB;§308 用真实 ffmpeg 原生编码器做第三方裁决——同夹具同尺三方对拍 128k 简化 12.74/感知 14.03/原生 14.41、64k 18.18/20.19/18.56 dB,「感知臂劣于简化臂」是 FFmpeg 短窗固有行为(原生也劣),perceptual_short 的 opt-in 定案为选 FFmpeg 语义而非更优 NMR,感知臂与原生差 <1.7 dB(128k 反超)即移植背书(aac_ffmpeg_ref_test.mbt 固化;全量 1422/1422));配置矩阵汇总在 §289)));AAC SBR(HE-AAC:显式与 ADTS 隐式信令,SBR 头/网格/包络/噪声全语法位级对拍 C 插桩 dump,QMF 分析/合成、HF 生成/调整/limit、双缓冲 Y 与 f_indexnoise/f_indexsine 跨帧状态,8/10/12 kHz 核心率全表);AAC PS 合成(HE-AACv2 两条真实流完整 PCM 对拍最大差 1;10/20/34 频带、IPD/OPD、HB 和编码负载逐缓冲对拍 C,wasm 8 帧、native 16 帧;编码负载现覆盖 header 复用、IID/ICC 关闭、fixed grid 0/1/2/4 包络与跨帧补包络、扩展开关;WAV 原始 AAC 块按解码消费字节切帧(aac_decode_raw_stream,与 ffmpeg PCM 差≤1 LSB));SBR/PS 边界新增 32 kHz stereo、44.1 kHz stereo HE-AAC 与 44.1 kHz HE-AACv2 三组真实流,逐帧 PCM 与 FFmpeg 9.0.2 最大差≤1 LSB 且 99.9% 以上样本逐位相等;多声道 SBR 覆盖 5.1、5.0、7.1(wide) 三组 libfdk_aac 真实 ADTS 流与 6.1(back)、5.1.2(back) 两组真实 MP4/ASC 流(每个 channel element 独立 SBR 上下文,无 SBR 负载的 LFE 也走纯上采样 QMF 路径),三帧 2048 样本/声道、PCM 最大差≤1 LSB 且 99.9% 以上样本逐位相等(6.1(back)/5.1.2(back) 的 ADTS 头无法表达:3-bit channel_configuration 会把 ASC 的 11/14 截成 3/6,故按原始 AU + ASC 通道配置解码);SBR 的 bs_sbr_crc_bits 与上游 aacsbr_template.c 的 TODO 一致地跳过校验;MPEG 音频 Layer I/II/III 定点 PCM;MP2 编码器(mpa_encode.mbt:移植 mpegaudioenc.c 的 mp2fixed 定点路径——32 点多相分析滤波器组(ff_mpa_enwindow 64 点窗化 + 32 点 idct32、FRAC_BITS=15)、帧长与填充按 frame_frac 累计、逐带 3 个标度因子与 25 种合并规则、固定 SMR 表驱动的贪心位分配、定点量化与 bits<0 的 3 样本打包写位;44.1 kHz 立体声 128 kbps 12 帧共 5015 字节与 ffmpeg -c:a mp2fixed 输出逐字节一致(MD5 049A7489…),ffprobe 识别 mp2、ffmpeg 9.0.2 解码无 codec 告警,补偿 962 样本延迟后对源 SNR 21.77 dB / PSNR 29.66 dB;MP3 编码器(mp3_encode.mbt + mp3_enc_subband/mdct/loop/bitstream.mbt:移植 shine 3.1.1——FFmpeg libshine.c 封装的外部 Layer III 编码器,纯定点:32 带多相分析滤波器组(512 点 enwindow 环形缓冲、mul=(a*b)>>32 乘积族)、36 点 MDCT + 混叠蝶形、量化内外迭代循环(steptabi/int2idx 查表 + 浮点回退、new_choose_table 码本成对比较)、34 张 Huffman 码表与 32 位缓存位写入器(缓存跨帧连续,帧尾不足一个字的位留到下一帧);表由 C dumper 零转录提取(scripts/gen_mp3_enc_tables.sh);唯一算法偏差是 calc_scfsi 用双端一致的确定性 ln 替代 libm log(wasm/native 位级可复现);44.1k stereo 128k、48k mono 192k、22.05k mono 64k(MPEG-2 LSF)三组向量与编译后的 shine 参考逐字节相同(参考与 shineenc MD5 一致),ffmpeg 9.0.2 解码零告警,本解码器往返 SNR 17.4–18.1 dB);Opus 编码器(opus_encode.mbt + opus_enc_rc/math/tables/celt/bands/alloc/psy/psy2.mbt:移植 FFmpeg 原生 opus/enc.c 的 CELT-only 路径——range coder(前向 range 字节 + 反向 raw-bit 区、末尾合并)、瞬态/非瞬态 MDCT 与逐带能量归一化、coarse 能量预测与精细位(fine bits/sign)、tf/alloc_trim/动态 boost 的熵编码、PVQ 频带量化(split/折叠/LCG 降级与 collapse mask 传播)、心理声学包决策(bessel 激励、强度/双声道/tf 搜索、21 阶帧预算分配);48 kHz 20 ms MONO/STEREO FULLBAND,确定性 libm 与直通 MDCT 双端一致;48k stereo 96k、48k mono 48k 两组 12 帧向量 26/26 包逐字节一致,Ogg Opus 封装经 ffmpeg 9.0.2 解码零告警,本仓库 Opus 解码器往返 SNR 15.7 / 13.0 dB,与参考解码器(16.6 / 13.5 dB)相差 <1 dB));FLAC 无损 PCM(8/16/20/24/32-bit;32-bit 定点/LPC 残差走 64 位路径,32-bit stereo 的 33-bps side channel 走 64 位缓冲);FLAC Vorbis comment 标签读写(flac_read_tags/flac_add_tags,替换/删除注释块且不动帧,ffmpeg 夹具读回与 ffprobe 验证);FLAC 编码器(固定预测 0-4 阶 + LPC 1-12 阶 Levinson-Durbin/15-bit 量化 + Rice/Rice2 分区阶 0-8 搜索与 Rice escape 分区(分区阶>0 时把密集残差存为定宽样本;固定/LPC 每个候选阶都用完整分区搜索的真实位数选优)、立体声 left/right/mid-side 去相关、wasted bits、UTF-8 帧号、STREAMINFO/MD5/CRC,8/12/16/20/24/32-bit 1-8 声道;32-bit 走 64 位预测/残差与 33-bit 侧声道宽写;16-bit stereo、24-bit mono、8-bit mono、相关立体声、AR(2) LPC、非平稳分区、32-bit 单/双声道及极值 33-bit 侧声道均与 ffmpeg 解码 PCM 逐字节一致,16-bit stereo 夹具 7361→4903 字节、相关立体声 1646→1266 字节);ALAC 解码(16/20/24/32-bit、1-8 声道,MP4 alac magic cookie、未压缩元素与 Rice+LPC 压缩元素,ffmpeg 编码的 16/24-bit 单/双声道与 5.1 文件解码 PCM 逐字节一致);ALAC 编码器(16/24-bit 单/双声道,SCE/CPE + 自适应 FIR LPC(Levinson/EST、9-bit 系数)+ Rice 熵编码,四种立体声去相关模式(left/right、left/side、right/side、mid/side),36 字节 cookie;16-bit 立体声/相关立体声与 24-bit 单/双声道经 ffmpeg 9.0.2 解码 PCM 逐字节一致);TTA 无损解码(8/16/24-bit,LE 位流、自适应 Rice 与混合滤波,ffmpeg 编码的 8 kHz 单/双声道夹具 PCM 逐字节一致);ADPCM 解码(IMA WAV 4-bit、Microsoft、Yamaha,以及 MOV ima4/IMA QuickTime;WAV 块对齐/QuickTime 34 字节块解复用后与 ffmpeg s16le 参考逐字节一致);WavPack 无损解码(16/24/32-bit 单/双声道,小端熵位流/自适应中值/反相关,ffmpeg 夹具 PCM 逐字节一致);G.711 A-law/µ-law、G.722、G.726 16/24/32/40 kbit/s 解码(WAV 块解复用后与 ffmpeg s16le 参考逐字节一致);aptX/aptX HD 解码(原始 4/6 字节块、两级 QMF 与自适应预测,ffmpeg 夹具 s32le 逐字节一致);AC-3 解码(bsid≤10,双单声道/单声道/立体声/3F/2F1R/3F1R/2F2R/3F2R+LFE,耦合与耦合坐标、立体声 rematrixing、delta bit allocation、零尾数抖动、dynrng 动态范围;256/128 点 IMDCT 直接实现 + KBD 窗;ffmpeg 9.0.2 夹具 s16 参考最大差 1 LSB,单声道逐字节一致);AMR-NB 解码(4.75–12.2 kbit/s 全部八种模式,RFC 4867 位重排、LSF/LSP/LPC 与 12.2k 分裂量化、基音滞后插值、代数码本、固定增益平滑与抗稀疏 IR 滤波、合成/后滤波/二阶高通;ffmpeg 9.0.2 libopencore 夹具 s16 参考最大差 1 LSB);E-AC-3 解码(bsid 11–16 独立帧,2/3/6 块;帧头语法标志、LUT/AC-3 式指数策略、E-AC-3 耦合与快速增益/转换器 SNR 偏移、默认比特分配参数;SPX/AHT/增强耦合/依赖帧/缩减采样率明确报错;ffmpeg 9.0.2 原生 eac3 夹具(单/立体声/5.1、32/44.1/48 kHz、2/3/6 块)s16 参考最大差 1 LSB);WMA v1/v2 解码(ASF 包级:exp-VLC/LSP 指数、run-level 系数、噪声编码、MS stereo、比特储备与可变块语法,自建正弦窗/全 IMDCT;ffmpeg 9.0.2 wmav1/wmav2 夹具 s16 参考最大差 1 LSB;ASF(.wma/.asf)解复用读取 Stream Properties WAVEFORMATEX 与 Data 包负载分片,端到端解码同参考一致);Vorbis I 解码(Ogg 三头解析、码本 Huffman/VQ、floor 0/1、residue 0/1/2、耦合与 submap/mux、全部模式、重叠相加;IMDCT 与 FFmpeg tx 半逆变换逐点对拍;libvorbis 真实 mono/stereo/5.1/噪声短块流 s16 参考最大差 1 LSB) | 多声道 HE-AAC 已覆盖 5.0/5.1/7.1(wide)/6.1(back)/5.1.2(back),libfdk_aac 不支持的 2.1 布局仍无真实夹具;6.1(back)/5.1.2(back) 只能以原始 AU + ASC 通道配置验证,因为 ADTS 的 3-bit channel_configuration 无法表达 ASC 值 11/14(adtsenc.c 会截断);E-AC-3 的 SPX/AHT/增强耦合、AMR-WB、USAC 等未覆盖 |
| 其他视频 / 音频 | VP9 profile 0/1/2/3:关键帧与帧间帧(P 帧四种 MV 模式、三路参考、可切换/固定插值滤波、并行提交与计数驱动概率自适应;复合预测(fix/var 双参考选择与 (a+b+1)>>1 复合平均:手工构造 3 帧 64x64 确定性流(switchable comp 模式、ZEROMV 双参考)逐帧 MD5 对齐 FFmpeg 9.0.2,另有 libvpx 真实 128x96/64x48/96x64(alt-ref 隐藏帧、非 frame-parallel 反向适配)会话共 34 帧逐帧对齐,向量在 libavcodec/vp9_realdata_vectors/,生成脚本 scripts/emit_vp9_realdata_vectors.py;comp_inter_blocks 诊断计数器;参考缩放——scaled MC 双向(libvpx 官方 vp90-2-05-resize 向量 10 帧 MD5 对齐 vpxdec 原生输出,缩放系数 14 位分数步进与 webm/issues/820 舍入复刻)、8/10/12-bit、4:2:0/4:2:2/4:4:0/4:4:4;AV1 8/10/12-bit 4:2:0/4:2:2/4:4:4/单色 多 tile 无损关键帧、有损关键帧(8/10/12-bit,DCT/ADST/IDTX 全变换、环路去块滤波、CDEF、环路恢复 Wiener/SGR 与 SWITCHABLE(4:2:0/4:2:2/4:4:4 全布局)、逐 SB delta-q/delta-lf、关键帧 segmentation 的 ALT_Q/ALT_LF/SKIP 与 seg_id 空间预测,多 tile 含 64/128 SB 与 tile 边界强度修正);AV1 inter 会话入口(含 2×2 tiles、GM warp、隐藏帧/show-existing,5 组真实流 35 帧 MD5 对齐);AV1 整帧 superres(coded 解码 + resize 上采样 + LR 上采样网格 + scaled 参考 MC,4 组 aomenc 流 34 帧 MD5 对齐);AV1 整帧 qmatrix(16 级别、Y/U/V 独立级别,13 组 57 帧 MD5 对齐,包含 12-bit 及 4:2:2/4:4:4/单色 inter);AV1 帧尺寸变化(aomenc resize-mode:KF↔inter 2×/2⁄3 缩放与逐帧随机尺寸的升降双向 scaled MC、非均匀 tile 间距、显式帧尺寸,7 组 168 帧 MD5 对齐 dav1d 原生输出;resize×superres 组合 24 帧对齐 libaom aomdec 原生输出,补齐 dav1d 1.5.1 崩溃的组合);AV1 film grain 合成(dav1d 1.5.1 算法:缩放点插值、AR 滤波 grain 模板、32×32 块 overlap、色度 luma 混合、8/10/12-bit,含 show-existing 输出与 update_grain=0 引用继承,真实 libaom film-grain-test 5 帧及手工构造的引用继承变体 MD5 均对齐 dav1d);AV1 intrabc(关键帧 intrabc CDF、refmvs DV 预测/裁剪、当前帧 bilinear 预测 + 残差,SVT-AV1 真实流 8 组 32 帧——含 8/10-bit、128×96、2×2 tiles——MD5 对齐 dav1d);AV1 inter 工具组合验证(interintra 含 wedge/smooth、masked compound、OBMC、local warp、dual filter、ref-frame-mvs 的隔离与全开组合共 5 组 70 帧 MD5 对齐 dav1d);MJPEG(8-bit 基线/渐进 + SOF3 无损平面预测,4:2:0/4:2:2/4:4:4;1x1 三分量 lossless RGB 8/9-bit 输出 bgr24,9-bit 走可逆颜色变换;单分量 lossless 10..16-bit 与单分量 9/10/12-bit 基线/渐进输出 gray16le;10/12-bit YCbCr(4:2:0/4:2:2/4:4:0/4:4:4)输出 yuv*16le(MSB 对齐;12-bit 无损、单分量基线与 4:2:0 基线夹具均与 ffmpeg 对应 pix_fmt 逐字节一致);4 分量 1x1 CMYK/YCCK(基线/渐进)按 Adobe APP14 transform 0/2 输出 gbrap/yuva444p;子采样 YCCK(2x2 Y + 全分辨率 K)按 FFmpeg 的 2× chroma 上采样后转 4:4:4;3 分量 1x1 APP14 transform 0/RGB 组件 ID 输出 gbrp,均与 ffmpeg 逐字节一致)、PNG/APNG;Opus SILK/混合/CELT 全模式与多流包级解码(OpusHead output_gain 标量增益:±5 dB 的 ffmpeg ff_exp10 float 常量下逐样本一致;SILK-only 端到端 PCM 与无汇编 FFmpeg 9.0.2 framemd5 逐帧一致,hybrid 最终 PCM 逐样本对拍最大误差 1.5e-8,受 CELT 合成 3e-6 容差约束) | MJPEG 12-bit/算术编码、其他 4 分量子采样布局与子采样 3 分量 Adobe 变换未支持;Opus 包丢失隐藏(PLC)与 FFmpeg 9.0.2 原生解码器一致地不生成补偿帧(PLC 只存在于 libopus 封装路径,不在本移植范围) |
| 容器与分片 | MP4/MOV(含 AAC/ALAC/H.264/HEVC/AV1/VP9/Opus/FLAC、AC-3/E-AC-3(ac-3+dac3、ec-3+dec3 条目,ffmpeg 解码与裸流逐字节一致)及 H.264+AAC 双轨(真实 5 帧 + 45 AAC 包:视频 framemd5 一致、音频与同 AU 的 ADTS 解码逐字节一致;AAC 编码器延迟可用 aac_priming 以 edts/elst 表达,ffmpeg 解码与源 MKV 裁剪后一致)、HEVC/AV1/VP9+AAC/Opus 双轨(video_codec="hevc"|"av1"|"vp9" 写 hvc1/av01/vp09 条目,B 帧沿用 ctts;audio_codec="opus" 写 Opus/dOps 并以 elst 表达 pre-skip;真实 x265 B 帧、AV1+AAC 与 AV1+Opus 重封装后 video framemd5、AAC/Opus PCM 均与源一致);双轨写入器按首帧 PTS 写视频 edts/elst 修剪 B 帧重排延迟,A/V 起点与源时间线一致,mdhd 语言可配(video_language/audio_language 按 ISO 639-2/T 打包,未知码回落 und;读取端解析 mdhd 语言)、H.264+AC-3/E-AC-3 双轨(真实 5 视频帧 + 4 音频帧:ffmpeg framemd5 与音频 PCM MD5 均与裸流参考一致;A/V 写入器可用 set_tags/set_chapters/write_subtitle 一次写入标签、章节与 mov_text 字幕轨)、单轨 MP3/FLAC/ALAC、AAC/AC-3/E-AC-3、Opus 与 mov_text 字幕写入器均可配 language(写入 mdhd;ffmpeg 9.0.2 解码 PCM 与参考逐字节一致)、单轨 H.264/HEVC/AV1/VP9 视频写入器(均可配 language 写 mdhd;真实 4:2:0/4:4:4 样本经 ffmpeg framemd5 与本地解码帧 MD5 一致;单轨 H.264/HEVC/AV1/VP9 与 H.264+AAC 双轨写入器均支持 ctts 呈现偏移(负偏移 version 1),并按首帧 PTS 写 edts/elst 修剪重排延迟;H.264 单/双轨与 HEVC 以真实 B 帧流验证,重封装后 video framemd5、packet DTS/PTS 与 AAC PCM 均与源一致);mp4_faststart 将 ftyp+mdat+moov 重排为 ftyp+moov+mdat 并修正 stco/co64(ffmpeg 解码 framemd5 一致)、udta/meta/ilst 元数据读写(title/artist/album/date/comment/genre/copyright 等 iTunes atom,ffmpeg 夹具读回、写入后 ffprobe/解码验证)、chpl 章节读写(1/10,000,000 s 起点 + 标题;ffmpeg 夹具读回、写入后 ffprobe 章节与 seek 验证)、mov_text(tx3g)字幕读取与写入(单轨写入器及 H.264+AAC/AC-3/E-AC-3 A/V 写入器的可选字幕轨,u16 长度 + UTF-8 样本、间隙/收尾空样本、mp4_tx3g_text;ffmpeg 提取 SRT 与源一致,A/V+字幕文件视频 framemd5 与音频 PCM 与无字幕版相同))、Matroska/WebM(含 H.264/HEVC/VP9/AV1/Opus、单轨 AAC/FLAC/ALAC、AC-3/E-AC-3/MP3(均可配 language,A_AC3/A_EAC3 单轨与 H.264 双轨,ffmpeg 解码音视频均与裸流参考一致;A/V 写入器可用 set_tags/set_chapters/write_subtitle 一次写入 Tags、Chapters 与 SRT 字幕轨)(ffmpeg 重封装解码与源一致;ALAC CodecPrivate 按 Matroska 规范仅存 24 字节配置、读取时补出 36 字节 atom)、VP9+Opus 与 H.264+AAC 多轨写入器;VP9/AV1/Opus 写入器可选 webm/matroska DocType,HEVC 写入器固定 matroska DocType;Tags SimpleTag 元数据读写(读取时过滤 track-targeted 标签并应用 LEAD_PERFORMER/PART_NUMBER 映射;写入在首个 Cluster 前插入并重写 SeekHead/Cues 位置,ffprobe 读到标签、seek 输出与源一致)、Chapters/ChapterAtom 章节读写(纳秒时间 + ChapterDisplay 标题;写入替换旧 Chapters 或插到簇前,ffprobe 章节与 seek 输出验证)、S_TEXT/UTF8 字幕读取与写入(单轨写入器按 BlockGroup + BlockDuration、16-bit 相对时间码超限自动分簇,TrackLanguage/TrackName/FlagDefault/FlagForced 可配置;H.264+AAC/AC-3/E-AC-3 双轨写入器可直接追加字幕轨,真实样本 framemd5/PCM 与无字幕版本一致);真实 VP9+Opus WebM 写入经 ffmpeg 解码与本地 VP9/Opus 解码双向验证;WebM 单轨/双轨写入器(VP9/AV1/Opus 可配 language)输出 SeekHead/Cues(关键帧 CueTime + CueClusterPosition),ffmpeg 全片解码与 -ss 定位均与源一致;VP9+Opus 双轨写 CodecDelay/SeekPreRoll 与末块 DiscardPadding(轨道语言可配 video_language/audio_language,默认 und),真实 WebM 重封装后视频帧与 Opus PCM 与源一致,真实 AV1 WebM 写入帧 MD5 与 ffmpeg framemd5 及本地 AV1 解码一致,真实 H.264 与 H.264+AAC Matroska 写入帧 MD5 与 ffmpeg framemd5 一致;单轨 H.264/HEVC 写入器支持可选 pts_ms 与 language(解码顺序与呈现顺序分离,B 帧)并输出 SeekHead/Cues,ffmpeg 全片解码与 -ss 定位与源一致;A/V 写入器按各轨累计 DTS 交错(块时间码保留 PTS)并输出 SeekHead/Cues,Tags/Chapters 插入后索引位置自动修正,AAC priming 用 CodecDelay + 尾块 DiscardPadding 表达;视频/音频/字幕 TrackLanguage 与字幕 FlagForced 可配(video_language/audio_language/subtitle_language/subtitle_forced);真实 B 帧+AAC 重封装视频帧与 AAC PCM 均与 ffmpeg 一致)、MPEG-TS(含 H.264+AAC、HEVC/MP3 与 H.264+AC-3/E-AC-3 双轨(stream type 0x81/0x87,PAT/PMT 按 mpegtsenc 写字节交换的 MPEG-2 CRC);AAC 自动 ADTS 封装、LOAS/LATM AAC 读取(latm_parse_stream:StreamMuxConfig 内嵌 ASC + PayloadMux 重打包为原始 AU;裸 LOAS 与 TS stream type 0x11 均经 ffmpeg 解码 PCM 差≤1 LSB),ffmpeg 9.0.2 可解码且 AC-3/E-AC-3 输出与裸流逐字节一致;PES 支持 PTS+DTS(B 帧,PCR 跟随 DTS;纯音频 TS 在音频 PID 写 PCR),真实 x264 B 帧 TS 重封装后 ffmpeg 的 DTS/PTS 与帧哈希均与源一致;H.264 B 帧 + AAC 双轨重封装后两路 PES 时间戳/payload 与视频解码帧一致;PAT/PMT 支持多节目,双节目 TS 的 programs/streams/PES 解复用与两路视频解码均与 ffmpeg 一致;写入 SDT 服务描述(service_name/service_provider/service_type/transport_stream_id/original_network_id,SDT 段与 ffmpeg mpegtsenc 逐字节一致,解复用回读服务名与提供商);nit 开关写 NIT(PID 0x10:network_name_descriptor + service_list_descriptor,段与 mpegtsenc 逐字节一致,解复用回读 network_name);PMT 可写音频 ISO 639 语言描述符(audio_language)与 HEVC registration 描述符(0x05 "HEVC"),PMT 段与 mpegtsenc 逐字节一致、解复用回读 language/registration)、WAV(含 PCM 8/16/24/32-bit、IEEE float32、A-law/µ-law(G.711)与 extensible 写入器及 LIST/INFO 标签读写(wav_read_tags/wav_add_tags,RIFF 与 RF64 的 ds64 尺寸同步,ffprobe/解码验证)与 Broadcast Wave bext 读写(WavBext/wav_read_bext;描述/来源/时间参考/UMID/coding history,段与 ffmpeg -write_bext 1 逐字节一致);非 PCM 写 fact 块、extensible float 用 0xFFFE + IEEE_FLOAT 子格式,8/16/24/32-bit、float32、A-law/µ-law(WAVEFORMATEX cbSize=0;6 声道 extensible 子格式 6/7,头部与 ffmpeg 逐字节一致)与 5.1 输出经 ffmpeg 9.0.2 解码样本逐字节一致;rf64 开关支持 RF64 大文件头,big_endian 开关写 RIFX 大端;RIFX 读端映射 pcm_*be(FFmpeg 9.0.2 对 RIFX 仍报 LE codec,属其自身限制,8-bit 外部验证通过)、Ogg(Opus/FLAC/Vorbis:Opus 与 FLAC 读写,真实 Opus 写入经 ffmpeg 解码验证,FLAC 回写解码 PCM 与源一致;Vorbis 读取三头与包序列,交给 Vorbis 解码器;三者 Vorbis comment 标签读取,Opus 写入器可带自定义 OpusTags 且 ffprobe 与解码验证)、AIFF/AIFC(PCM 8/16/24/32-bit 读写,80-bit 扩展采样率解析/生成;ffmpeg 解码与本地回读 PCM 一致)、Wave64(w64:GUID 分块 + 64 位块长读写,PCM 8/16/24/32-bit 与 IEEE float32,summarylist 标签读写(UTF-16LE,ffprobe 读回);ffmpeg 夹具与 WAV 载荷逐字节一致、写入经 ffmpeg 解码一致)、CAF(ALAC 变长包表与 LPCM 16/24-bit 读写,frma+alac cookie、pakt 包大小 varint 与帧数校验;ffmpeg 解码与本地回读一致)、AU(PCM 8/16/24/32-bit 大端与 µ-law/A-law 编解码读写、G.726LE 读取;编码字节与 ffmpeg 一致,解码与本地回读一致)、裸 AAC/MP3/AC-3/E-AC-3/AMR-NB/ASF(含 ADTS AAC 写入器、AC-3/E-AC-3 帧切分读取器、#!AMR/RFC 4867 TOC 帧切分读取器与 ASF/WMA 解复用、ID3v2 标签读写(id3v2_read_tags/id3v2_add_tags,v2.3/2.4 文本/TXXX/COMM、UTF-8 写入,ffprobe 与解码验证);真实 AAC 帧经 ffmpeg 解码验证,AC-3 切片按头部帧长含 44.1 kHz 变长帧,同一读取器按 bsid 识别 E-AC-3(2/3/6 块帧),AMR-NB 覆盖 13–32 字节 TOC 帧);MOV jpeg/png 与 Matroska V_MS/VFW/FOURCC(MPNG/MJPG)静像轨解码,Matroska V_MJPEG/VFW-MPNG 与 A_MPEG/L3 写入,MP4/MOV jpeg/png 静像写入,WAV 内 MP3/AAC 载荷读取(AAC 原始块按解码消费字节切帧);HLS/DASH 通过回调读取 TS/fMP4(HLS AES-128 真实加密流解密+解码验证;写入侧支持 AES-128-CBC+PKCS#7 加密与 EXT-X-KEY,ffmpeg 播放与明文流音频一致),含 H.264/HEVC/AV1/VP9/AAC/Opus 单轨 fMP4 初始化段/媒体段写入器(初始化段可选 language/video_language/audio_language,按 ISO 639 写入 mdhd;真实 HEVC/AV1/VP9 分片经 ffmpeg framemd5 与本地解码帧 MD5 一致;trun 支持 composition time offset(B 帧,负值 version 1),真实 x264 B 帧分片重封装后 ffmpeg 的 DTS/PTS 与帧哈希一致;HLS fMP4(EXT-X-MAP)与 DASH SegmentTemplate 的 B 帧分片经各自 reader 回读后 CTS/DTS 与解码帧一致),AC-3/E-AC-3 分片(ac-3+dac3、ec-3+dec3 初始化段,ffmpeg 解码与裸流逐字节一致),以及 H.264+AAC 双轨 fMP4(一个 moof 内两个 traf、mdat 先视频后音频;真实 5 视频帧 + 45 AAC 包分两段写入,ffmpeg 解码视频 framemd5 与本地帧 MD5 一致、音频 PCM 与同 AU 的 ADTS 解码逐字节一致)、HLS 主/媒体播放列表(含 EXT-X-MAP、EXT-X-BYTERANGE 单文件分片、EXT-X-DISCONTINUITY/EXT-X-GAP/EXT-X-PROGRAM-DATE-TIME 分段标签(hls_write_media_playlist_specs,标签顺序与 hlsplaylist.c 一致;每条分段可覆盖 EXT-X-MAP 与 EXT-X-KEY(密钥轮换/METHOD=NONE))与 EXT-X-DISCONTINUITY-SEQUENCE、EXT-X-PLAYLIST-TYPE/EXT-X-ALLOW-CACHE/EXT-X-I-FRAMES-ONLY/EXT-X-INDEPENDENT-SEGMENTS 头标签、EXT-X-MEDIA 音轨/字幕 rendition、SUBTITLES/CLOSED-CAPTIONS/VIDEO 属性、AVERAGE-BANDWIDTH、FRAME-RATE、EXT-X-START、EXT-X-I-FRAME-STREAM-INF(is_i_frame)、CLOSED-CAPTIONS rendition 的 INSTREAM-ID(无 URI)与字幕 FORCED=YES、WebVTT 分片写入器(绝对 cue 时间,ffmpeg 提取一致);TS 与 fMP4 两种分片均支持分离音轨,多 rendition 主播放列表经 ffmpeg 播放与本地 reader 解码验证)与 DASH SegmentTemplate(时长或 SegmentTimeline/ 寻址;dash_write_segment_template_mpd_periods 支持多 Period,显式 duration 参与分段展开)/SegmentList/SegmentBase MPD 写入器(音频 Representation 在提供 channels 时写 AudioChannelConfiguration,scheme 与 ffmpeg dashenc 一致;前两者均支持 text/vtt 字幕 AdaptationSet:省略 codecs/initialization/bandwidth,SegmentList 与 SegmentTimeline 字幕经 ffmpeg allowed_extensions 读取与源一致;SegmentBase 写入器生成全局 sidx 与 indexRange/Initialization range,sidx 与 ffmpeg movenc 字节一致)、SegmentBase 单文件 indexRange/sidx 读写(读取真实 fMP4 分片经 ffmpeg 播放验证,自写单文件+MPD 经 HTTP 由 ffmpeg 解码 framemd5 与源一致;支持视频+音频多 AdaptationSet,分离音轨 MPD 经 ffmpeg 播放、本地 reader 解码验证;SegmentList 支持分离文件与单文件 BaseURL+mediaRange,默认 startNumber=1 省略以兼容 ffmpeg dashdec);HLS EXT-X-MAP 与 DASH SegmentTemplate 均实测 HEVC/AV1/VP9 fMP4 分片(解复用后帧 MD5 与 fMP4 源一致) | 尚无统一播放 API、完整网络协议层或完整 muxer 集合 |
| 基础算法 | 位流、哈希/校验和、AES 等密码算法、数学/时间基及部分 @v128 内核 | libavutil 其余模块及 libswscale、libswresample 等尚未整体移植 |
moon check --target wasm --deny-warn --no-render
moon test --target wasm --no-render
moon info --target wasmInstall
Download zipPure MoonBit port of FFmpeg n9.0.2: codec bitstream line (H.264/H.265/VP9/AV1 video, AAC/MP3/Opus/FLAC decode; AAC/MP3/Opus encode), libavutil DSP, libavformat mux/demux (MP4/MKV/Ogg/WAV/FLAC/ADTS/MPEG-TS and more), plus a unified playback facade with ffprobe-style JSON CLI commands