- 解码分发 decoder.c:magic(fLaC→dr_flac / 其它→minimp3);flac ≤16bit→S16、 >16bit→S32 满幅送 audiod(AUDIO_FMT_S32),rate/ch/bits 按实际流,零 SRC 零裁剪 - song_url_auto 接受 flac(type 权威/url 扩展名兜底),降级语义不变;flac 下载限幅 1GB - 缓存键 song_<id>_<level>.<ext>:同歌同档命中不重下,换档新条目旧档留 LRU; ext 前导点正名(修双点名),lookup 回退历史双点名+旧无档键温和兼容 - audio_out S32 通路(AUDIOD/ALSA/WAV)+ 流死重开按 bits 还原格式 - 验证(0 真实请求):44.1k/16 与 96k/24 自制样本宿主+qemu 帧数/时长精确、 逐样本零误差;mp3 回归逐帧一致;player_flow_sim P1-P6(新 P6 档位键/flac ext)、 cache_evict/cover/pagination/window/audiod_chain sim 全 PASS;mipsel 0 warning - REPORT §19 / VENDOR_NOTES dr_flac 条目;未部署真机(留主会话)
82 lines
6.1 KiB
Markdown
82 lines
6.1 KiB
Markdown
# VENDOR_NOTES — os.meow.ncm 技术栈选型备查
|
||
|
||
> 预研:`patch_v2/ncm_app`(仅此目录)。库全部静态编入 mipsel(zig-mipsel-cc 交叉),
|
||
> 产物在 `out/`,各库构建脚本见 `build_*.sh`。体积口径:`size` Berkerley `text/data/bss`,
|
||
> mipsel 静态、`-Os`;flash≈text,RAM≈data+bss。基准:空 `printf` 静态 mipsel = text 5888。
|
||
> 实测于 2026-08-31。
|
||
|
||
## 选型结论(先看)
|
||
|
||
| 库 | 版本 | 许可 | mipsel text | 选/不选 |
|
||
|---|---|---|---|---|
|
||
| mbedtls(裁剪) | 3.6.2 | Apache-2.0 | 链接 Demo ≈ 388 KB(库文本合计 ~410 KB) | ✅ 选(TLS+AES/MD5/RSA/base64/X509 一体) |
|
||
| BearSSL | master@7bea48e | MIT | TLS client 参考子集 ≈ 96 KB | 备选(更省 flash,但集成面更杂) |
|
||
| jsmn | 1.1.0 | MIT | 2.2 KB | ✅ 选(解析器) |
|
||
| cJSON | 1.7.18 | MIT | 20.0 KB | 参考对比(未选,太大) |
|
||
| qrcodegen | nayuki@993ccbb | MIT | 10.8 KB | ✅ 选(二维码) |
|
||
| minimp3 | master@ea99364 | CC0 | 37.4 KB | ✅ 选(MP3 v1 解码) |
|
||
| dr_flac | 0.13.4 | public domain / MIT-0 | 见 REPORT §19(§19 补选,FLAC 解码,单头入库) | ✅ 选(无损/Hi-Res) |
|
||
| dr_mp3 | 0.7.4 | MIT/public-domain | 40.7 KB | 参考对比(未选,质量更好但更大更吃内存) |
|
||
|
||
## 各库明细
|
||
|
||
### mbedtls 3.6.2(Mbed TLS)— Apache-2.0
|
||
- 上游:https://github.com/Mbed-TLS/mbedtls (tag mbedtls-3.6.2,commit 107ea89)
|
||
- 裁剪配置:`config/mbedtls_config_ncm.h`(由 `build_mbedtls.sh` 从默认 141 个 define 减到 102 个)。
|
||
保留:TLS1.2 client、AES-CBC/ECB/GCM、MD5、RSA(1024)+BIGNUM、PK/ASN1、X509 证书解析、Base64、PEM_PARSE、ECP/ECDH(P-256 等)。
|
||
裁掉:TLS1.3、全部 DTLS、PSA_CRYPTO/IS/LMS、CTR_DRBG/ENTROPY(用自定义 rng)、
|
||
CAMELLIA/ARIA/DES/CHACHA/CHACHAPOLY/CCM、HKDF/NIST_KW/ECJPAKE、PKCS5/7/12、PEM_WRITE、MD4、X509_CRL/CSR、
|
||
SSL_SESSION_TICKETS/ALPN/RENEGOTIATION/MAX_FRAGMENT/CTX_SERIALIZATION/KEEP_PEER_CERT 等。
|
||
裁剪说明:原默认配置裁剪前 `text` 更大;按 `config.py get`/`unset` 逐项减;`build_mbedtls.sh` 里列出清单。
|
||
- 产物:`out/mbedtls/mipsel/`(libmbedcrypto.a / libmbedx509.a / libmbedtls.a),
|
||
text 合计 420236(≈410 KB);实际链接 Demo(含 libc)text=397102(≈388 KB)。
|
||
- 为什么它覆盖了我们全部需求:`mbedtls_aes_crypt_ecb`(AES-128-ECB)、`mbedtls_aes_crypt_cbc`(CBC+PKCS7 手写)、
|
||
`mbedtls_md`(MD5)、`mbedtls_base64_*`、`mbedtls_rsa_public`(无 padding 纯模幂 = weapi)、`mbedtls_ssl_*`(TLS1.2 client)。
|
||
|
||
### BearSSL(TLS 备选)— MIT
|
||
- 上游:https://www.bearssl.org/git/BearSSL (GitHub `bearssl/bearssl` 已 404,已迁移至官方站点;commit 7bea48e,无语义化版本号)
|
||
- 构建:`build_bearssl.sh`(`make lib`,CC/AR 用 zig 包装;产物 `out/bearssl/mipsel/bm/libbearssl.a`)。
|
||
- 全库 text=317177(≈310 KB);但只取 TLS client+handshake+rsa+x509 并 `--gc-sections` 后 text≈98620(≈96 KB)。
|
||
- 特点:体积小、常量时间;但**库里没有 base64**(需自带 ~0.5KB 例程),
|
||
AES-ECB 也无现成封装(需用 block primitive 逐块或 CBC 变通),RSA raw 用 `br_rsa_i31_public`(已确认存在)。
|
||
- 结论:省 flash 的备选;v1 若集成想省事、且要保 weapi 精确性,仍以 mbedtls 优先。
|
||
|
||
### jsmn 1.1.0 — MIT
|
||
- 上游:https://github.com/zserge/jsmn(tag v1.1.0)
|
||
- header-only 分词器,无 DOM/无 malloc;编译为最小 TU 后 text=2208(≈2.2 KB)。
|
||
- 用于解析响应 JSON(如 `{"code":200,"unikey":"..."}` 取 unikey)。demo 已实测解析正确。
|
||
|
||
### cJSON 1.7.18 — MIT(参考对比,未选)
|
||
- 上游:https://github.com/DaveGamble/cJSON(tag v1.7.18)。text=20503(≈20 KB)。
|
||
- 优点:现成 DOM、好取值;缺点:20 KB + 需要 malloc、对 14MB 内存也偏大。选 jsmn。
|
||
|
||
### qrcodegen(nayuki QR-Code-generator)— MIT
|
||
- 上游:https://github.com/nayuki/QR-Code-generator(c/qrcodegen.c,commit 993ccbb)
|
||
- 纯 C 单文件、无图形依赖。text=11082(≈10.8 KB)。
|
||
- 用途:把 `https://music.163.com/login?codekey=<unikey>` 渲染成位图给 MeowOS UI 显示。
|
||
|
||
### minimp3 — CC0
|
||
- 上游:https://github.com/lieff/minimp3(master@ea99364)。header-only(minimp3.h + minimp3_ex.h)。
|
||
- 采用 `minimp3_ex`(带 ID3/CRC 处理、可 seek 的流式解码)text=38292(≈37.4 KB)。
|
||
- 用途:v1 播放(standard/higher = mp3 128/192k)。内存占用小、MIPS 单核可实时(见 benchmark)。
|
||
|
||
### dr_mp3 0.7.4 — MIT/public-domain(参考对比,未选)
|
||
- 上游:https://github.com/mackron/dr_libs(dr_mp3.h 单文件)。
|
||
- text=41679(≈40.7 KB);兼容性/音质更好,但更大、解码中间态内存更高。minimp3 更契合 14MB 限制。
|
||
|
||
### dr_flac 0.13.4 — public domain / MIT-0(§19 选,FLAC 解码)
|
||
- 上游:https://github.com/mackron/dr_libs(`dr_flac.h` 单头文件,532768 B,
|
||
2026-09-01 取自 master;版本宏 DRFLAC_VERSION=0.13.4)。**本文件入库**
|
||
(`.gitignore` 对 `vendor/` 开了 `!vendor/dr_flac/` 例外;单头文件可入库,网络不可达时可复现)。
|
||
- 集成:`app/play/dr_flac_impl.c` 唯一实现 TU(`DR_FLAC_IMPLEMENTATION` + `DR_FLAC_NO_OGG`
|
||
裁 ogg 容器——网易云 song_url 的 flac 恒原生封装),vendor 豁免告警(同 minimp3 口径)。
|
||
- 位宽:`drflac_read_pcm_frames_s16`(≤16bit)/ `s32`(>16bit,左对齐满幅 → audiod
|
||
AUDIO_FMT_S32,AUDIOD_DESIGN.md §4 归一在 SDK/audiod 侧)。
|
||
- 实测(REPORT §19):44.1k/16 与 96k/24 样本逐样本零误差;qemu-mipsel 96k/24 解码 29× RT。
|
||
|
||
## 备注(工程)
|
||
- mbedtls 产物默认写在 `vendor/mbedtls/library/`(3.6 的 Makefile 不理会 BUILD 变量),脚本再拷贝到 `out/`。
|
||
- `MBEDTLS_SSL_IN_CONTENT_LEN/OUT_CONTENT_LEN` 默认 16KB;对 14MB 也不大,可再按需调小(见 REPORT 内存估)。
|
||
- CA 根:demo 从 `/etc/ssl/certs/ca-certificates.crt` 加载;设备侧需内置 CA bundle(eapi 用 iPhone UA,域名 interface.music.163.com)。
|
||
- 恢复 mbedtls 默认 config:`git -C vendor/mbedtls checkout -- include/mbedtls/mbedtls_config.h`。
|