#mp4 #sanitizer #media

mp4san-derive

为mp4san crate提供的宏

3个不稳定版本

0.5.1 2023年10月31日
0.5.0 2023年10月22日
0.4.0 2023年10月17日

#14#sanitizer

Download history 830/week @ 2024-03-13 1068/week @ 2024-03-20 718/week @ 2024-03-27 576/week @ 2024-04-03 910/week @ 2024-04-10 988/week @ 2024-04-17 794/week @ 2024-04-24 1045/week @ 2024-05-01 524/week @ 2024-05-08 1304/week @ 2024-05-15 1027/week @ 2024-05-22 856/week @ 2024-05-29 781/week @ 2024-06-05 722/week @ 2024-06-12 987/week @ 2024-06-19 814/week @ 2024-06-26

3,501 每月下载量
用于 mp4san

MIT 许可证

16KB
194

mp4san — 模糊测试状态

Rust MP4格式“消毒剂”。

当前消毒剂能够

  • 将输入中存在的所有展示元数据作为一个自包含的连续字节数组返回。
  • 找到并返回包含(连续)媒体数据的输入中span的指针。

"展示"元数据意味着任何MP4播放器播放文件所需的元数据。"自包含和连续"意味着返回的元数据可以与媒体数据连接在一起形成有效的MP4文件。

不支持MP4功能

消毒剂目前不支持

  • "分段"MP4文件,这通常用于自适应比特率流。
  • 不连续的媒体数据,即媒体数据(mdat)盒子与展示元数据(moov)交织。
  • 指向单独文件的媒体数据引用(dref)。
  • 任何类似的格式,例如Quicktime文件格式(mov)或旧的MP4版本1,其文件类型头(ftyp)中不包含isom兼容的品牌。

用法

消毒剂的主要入口点是sanitize/sanitize_async,它们接受一个Read + Skip输入。该Skip特质代表Seek特质的子集;一个可以向前跳过的输入流,但不一定可以定位到任意位置。

use mp4san_test::{example_ftyp, example_mdat, example_moov};

let example_input = [example_ftyp(), example_mdat(), example_moov()].concat();

let sanitized = mp4san::sanitize(std::io::Cursor::new(example_input)).unwrap();

assert_eq!(sanitized.metadata, Some([example_ftyp(), example_moov()].concat()));
assert_eq!(sanitized.data.offset, example_ftyp().len() as u64);
assert_eq!(sanitized.data.len, example_mdat().len() as u64);

parse模块还包含一个不太稳定且未记录的API,可以用于解析单个MP4盒子类型。

API文档
私有文档

提交错误报告

GitHub 是项目的缺陷跟踪器。请在 搜索 相似的现有问题后再 提交新的问题

测试

使用功能 mp4san-test/ffmpegmp4san-test/gpac 可以启用基于 FFMpeg 和 GPAC 的 mp4san 输出验证。

功能 mp4san-test/ffmpeg 需要安装以下 FFMpeg 库及其头文件

  • libavcodec
  • libavformat
  • libavutil
  • libswresample
  • libswscale

功能 mp4san-test/gpac 需要安装 libgpac >= 2.2 及其头文件。

集成测试 test_data 在私有的 test-data 子模块中的样本数据文件上运行。如果您有权访问此存储库,您可以手动检出子模块

$ git submodule update --init --checkout

在将样本数据文件添加到 mp4san-test-data 存储库之前,可以通过 mp4san-test-gen 处理样本数据文件上的集成测试。这将从样本文件中删除任何实际媒体数据,因为 mp4san 无论如何都不会读取它,只留下用于测试目的的元数据。这使得即使是非常大的媒体文件也可以被压缩成非常小的尺寸。

$ cargo run --bin mp4san-test-gen -- test-sample.mp4 test-data/test-sample.mp4.gz

模糊测试

支持通过 cargo aflcargo fuzz 进行模糊测试。有关更多详细信息,请参阅 Rust Fuzz 书籍。要运行基于 AFL 的模糊测试

$ cargo install cargo-afl
$ cd fuzz-afl
$ ./fuzz $num_cpus

要运行基于 libFuzzer 的模糊测试

$ cargo +nightly install cargo-fuzz
$ cargo +nightly fuzz run sanitize -- -dict=fuzz/mp4.dict -seed_inputs=fuzz/input/ffmpeg-black-1f.mp4,fuzz/input/ffmpeg-smptebars-30f.mp4

OSS-Fuzz

连续模糊测试也由 OSS-Fuzz 提供。

构建状态
代码覆盖率
发现的错误

许可

许可协议为 MIT

依赖项

~1.5MB
~39K SLoC