{
  "measuredAt": "2026-09-10T05:01:28.449Z",
  "runtime": "native FFmpeg (not browser ffmpeg.wasm)",
  "ffmpegVersion": "ffmpeg version 8.1-full_build-www.gyan.dev Copyright (c) 2000-2026 the FFmpeg developers",
  "fixture": "Synthetic 3-second 320x180 test pattern with two tone tracks, subtitle, chapter and synthetic metadata.",
  "audio": [
    {
      "track": 0,
      "range": "inside",
      "peak": 0
    },
    {
      "track": 0,
      "range": "outside",
      "peak": 0.1299726366996765
    },
    {
      "track": 1,
      "range": "inside",
      "peak": 0
    },
    {
      "track": 1,
      "range": "outside",
      "peak": 0.20981720089912415
    }
  ],
  "pixels": [
    {
      "case": "black",
      "mean": 0.0339781746031746,
      "max": 5,
      "pixels": 4032
    },
    {
      "case": "timed-inside",
      "mean": 0.03695436507936508,
      "max": 2,
      "pixels": 4032
    },
    {
      "case": "timed-outside",
      "mean": 123.27207341269842,
      "max": 228,
      "pixels": 4032
    }
  ],
  "streams": [
    {
      "case": "mute-full",
      "audioTracks": 0,
      "chapters": 0,
      "knownFixtureTagsRemaining": false,
      "bytes": 116421,
      "sha256": "dc8e70f9c76749836f81d8301d384f90630d5bdb4aaf80feee7a480e925959f5",
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-an",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/mute-full.mp4"
      ]
    },
    {
      "case": "mute-range",
      "audioTracks": 2,
      "chapters": 0,
      "knownFixtureTagsRemaining": false,
      "bytes": 174968,
      "sha256": "45a80927a608f3980a53fbe28c81b90bf02520e9fd159d082b7c9b4a9aa927b1",
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-map",
        "0:a",
        "-af",
        "aeval=exprs='if(between(t,1,2),0,val(ch))':c=same",
        "-c:a",
        "aac",
        "-b:a",
        "128k",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/mute-range.mp4"
      ]
    },
    {
      "case": "mask-black",
      "audioTracks": 2,
      "chapters": 0,
      "knownFixtureTagsRemaining": false,
      "bytes": 132341,
      "sha256": "344b3c73c6c53ccba06098492cc39272bc240ca5090dd867a2314f16e76e33b1",
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-filter_complex",
        "[0:V:0]scale=320:180:flags=bilinear,setsar=1,pad=ceil(iw/2)*2:ceil(ih/2)*2,format=yuv420p,drawbox=x=36:y=18:w=84:h=48:color=black:t=fill[v]",
        "-map",
        "[v]",
        "-map",
        "0:a?",
        "-c:a",
        "aac",
        "-b:a",
        "128k",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-c:v",
        "libx264",
        "-preset",
        "fast",
        "-crf",
        "23",
        "-pix_fmt",
        "yuv420p",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/mask-black.mp4"
      ]
    },
    {
      "case": "mask-time-muted",
      "audioTracks": 0,
      "chapters": 0,
      "knownFixtureTagsRemaining": false,
      "bytes": 53844,
      "sha256": "237de774514de2f71f8f2564bc372dc21e7e807abf8e24e0e94f16bf75072712",
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-filter_complex",
        "[0:V:0]scale=320:180:flags=bilinear,setsar=1,pad=ceil(iw/2)*2:ceil(ih/2)*2,format=yuv420p,drawbox=x=36:y=18:w=84:h=48:color=black:t=fill:enable='between(t,1,2)'[v]",
        "-map",
        "[v]",
        "-an",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-c:v",
        "libx264",
        "-preset",
        "fast",
        "-crf",
        "23",
        "-pix_fmt",
        "yuv420p",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/mask-time-muted.mp4"
      ]
    },
    {
      "case": "mask-pixel",
      "audioTracks": 2,
      "chapters": 0,
      "knownFixtureTagsRemaining": false,
      "bytes": 132891,
      "sha256": "76a2eb4283388321e64aa335470aa85889717d84ca747c398df4e6c739cddea2",
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-filter_complex",
        "[0:V:0]scale=320:180:flags=bilinear,setsar=1,pad=ceil(iw/2)*2:ceil(ih/2)*2,format=yuv420p,split[base][area];[area]crop=84:48:36:18,scale=2:1:flags=neighbor,scale=84:48:flags=neighbor[fx];[base][fx]overlay=x=36:y=18[v]",
        "-map",
        "[v]",
        "-map",
        "0:a?",
        "-c:a",
        "aac",
        "-b:a",
        "128k",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-c:v",
        "libx264",
        "-preset",
        "fast",
        "-crf",
        "23",
        "-pix_fmt",
        "yuv420p",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/mask-pixel.mp4"
      ]
    },
    {
      "case": "mask-small-blur",
      "audioTracks": 2,
      "chapters": 0,
      "knownFixtureTagsRemaining": false,
      "bytes": 135436,
      "sha256": "e7a083b7ee43573ab834d8c6a74762e4213096ced9ee2ff08e8885f23e4f3889",
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-filter_complex",
        "[0:V:0]scale=320:180:flags=bilinear,setsar=1,pad=ceil(iw/2)*2:ceil(ih/2)*2,format=yuv420p,split[base][area];[area]crop=4:4:10:10,boxblur=luma_radius=1:luma_power=1:chroma_radius=0:chroma_power=1[fx];[base][fx]overlay=x=10:y=10[v]",
        "-map",
        "[v]",
        "-map",
        "0:a?",
        "-c:a",
        "aac",
        "-b:a",
        "128k",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-c:v",
        "libx264",
        "-preset",
        "fast",
        "-crf",
        "23",
        "-pix_fmt",
        "yuv420p",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/mask-small-blur.mp4"
      ]
    }
  ],
  "formats": [
    {
      "case": "format-mov-full",
      "format": "mov",
      "audioTracks": 0,
      "audioCodecs": [],
      "decoded": true,
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-an",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/format-mov-full.mov"
      ]
    },
    {
      "case": "format-mov-range",
      "format": "mov",
      "audioTracks": 2,
      "audioCodecs": [
        "aac",
        "aac"
      ],
      "decoded": true,
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-map",
        "0:a",
        "-af",
        "aeval=exprs='if(between(t,1,2),0,val(ch))':c=same",
        "-c:a",
        "aac",
        "-b:a",
        "128k",
        "-movflags",
        "+faststart",
        "tmp/redaction-test/format-mov-range.mov"
      ]
    },
    {
      "case": "format-mkv-full",
      "format": "mkv",
      "audioTracks": 0,
      "audioCodecs": [],
      "decoded": true,
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-an",
        "tmp/redaction-test/format-mkv-full.mkv"
      ]
    },
    {
      "case": "format-mkv-range",
      "format": "mkv",
      "audioTracks": 2,
      "audioCodecs": [
        "aac",
        "aac"
      ],
      "decoded": true,
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.mkv",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-map",
        "0:a",
        "-af",
        "aeval=exprs='if(between(t,1,2),0,val(ch))':c=same",
        "-c:a",
        "aac",
        "-b:a",
        "128k",
        "tmp/redaction-test/format-mkv-range.mkv"
      ]
    },
    {
      "case": "format-webm-full",
      "format": "webm",
      "audioTracks": 0,
      "audioCodecs": [],
      "decoded": true,
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.webm",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-an",
        "tmp/redaction-test/format-webm-full.webm"
      ]
    },
    {
      "case": "format-webm-range",
      "format": "webm",
      "audioTracks": 2,
      "audioCodecs": [
        "opus",
        "opus"
      ],
      "decoded": true,
      "args": [
        "-y",
        "-i",
        "tmp/redaction-test/input.webm",
        "-map",
        "0:V:0",
        "-c:v",
        "copy",
        "-map_metadata",
        "-1",
        "-map_metadata:s",
        "-1",
        "-map_chapters",
        "-1",
        "-map",
        "0:a",
        "-af",
        "aeval=exprs='if(between(t,1,2),0,val(ch))':c=same",
        "-c:a",
        "libopus",
        "-b:a",
        "128k",
        "tmp/redaction-test/format-webm-range.webm"
      ]
    }
  ],
  "limitations": "No real speech, faces, identifying documents, phone recordings or browser rendering were certified. Audio measurements use the interior 1.2-1.8s of a 1-2s mute interval, not its codec transition boundaries. Pixel checks cover the synthetic black-mask rectangle, not arbitrary redaction effectiveness."
}
