11 个版本 (4 个破坏性更新)

0.5.1 2023年10月31日
0.5.0 2023年10月22日
0.4.0 2023年10月17日
0.3.1 2023年5月16日
0.1.2 2023年3月21日

#30 in 视频

Download history 823/week @ 2024-03-13 1050/week @ 2024-03-20 691/week @ 2024-03-27 546/week @ 2024-04-03 916/week @ 2024-04-10 983/week @ 2024-04-17 788/week @ 2024-04-24 1040/week @ 2024-05-01 518/week @ 2024-05-08 1291/week @ 2024-05-15 1024/week @ 2024-05-22 853/week @ 2024-05-29 778/week @ 2024-06-05 721/week @ 2024-06-12 986/week @ 2024-06-19 810/week @ 2024-06-26

每月下载量 3,492

MIT 协议

135KB
3K SLoC

mp4san — 模糊测试状态

Rust MP4 格式 "净化器"。

目前净化器可以

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

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

不支持的MP4功能

净化器目前不支持

  • "分段"MP4文件,这类文件主要用于自适应比特率流。
  • 不连续的媒体数据,即穿插在呈现元数据(moov)中的媒体数据(mdat)盒子。
  • 指向单独文件的媒体数据引用(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

依赖关系

约2-3MB
约56K SLoC