{
  "_comment": [
    "Single source of truth for the Windows LGPL FFmpeg build.",
    "build_ffmpeg_lgpl.sh reads encoders/muxers/protocols/indevs from here to write the configure line;",
    "check_ffmpeg_build.py compares a built bin/ directory against the same file.",
    "encoders, muxers, protocols and indevs are EXACT sets (nothing more, nothing less).",
    "required_* are subsets that must be present (decoders/demuxers/filters/hwaccels are built in full).",
    "Every encoder/muxer carries the code site that needs it (master 74761abf, 2026-10-01).",
    "Adding one: add it here with its evidence, rebuild, re-run check_ffmpeg_build.py."
  ],
  "ffmpeg_version": "8.1.1",
  "lib_majors": {
    "avcodec": 62, "avformat": 62, "avutil": 60, "avdevice": 62,
    "avfilter": 11, "swscale": 9, "swresample": 6
  },
  "license": "LGPL version 2.1 or later",
  "forbidden_configure_flags": ["--enable-gpl", "--enable-version3", "--enable-nonfree"],
  "allowed_external_libs": ["libdav1d"],
  "encoders": {
    "h264_nvenc": "proxy_transcode.cpp:1038 (+ probe :627/:737); recording_engine.cpp:563; mlt_timeline_handler.cpp:1342/1353 export ladder",
    "hevc_nvenc": "nvenc_capability.cpp:268 find_encoder_by_name -> pre_editing_handler.cpp:278 hevcSupported",
    "av1_nvenc": "nvenc_capability.cpp:270 find_encoder_by_name -> pre_editing_handler.cpp:280 av1Supported",
    "h264_amf": "proxy_transcode.cpp:601 kH264Fallbacks (AMD GPUs)",
    "h264_mf": "proxy_transcode.cpp:606 kH264Fallbacks (every Windows 8+); mlt_timeline_handler.cpp:1342/1353 export ladder",
    "mpeg4": "mlt_timeline_handler.cpp:1342/1353 export ladder (last resort)",
    "dnxhd": "proxy_transcode.cpp:1050 DNxHR LB proxy (-profile:v dnxhr_lb)",
    "mjpeg": "thumbnail_handler.cpp:40; thumbnail_generator.cpp:276; recording_engine.cpp:1062 (in-process AV_CODEC_ID_MJPEG)",
    "aac": "recording_engine.cpp:632 (AV_CODEC_ID_AAC); mlt_timeline_handler.cpp:486 + emc_export.cpp:284 acodec=aac",
    "pcm_s16le": "proxy_transcode.cpp:1061; stt_runner.cpp:299; transcript_handler.cpp:86; script_match_handler.cpp:2356; waveform_handler.cpp:97 (-f s16le); null muxer default audio codec",
    "wrapped_avframe": "silence_detector.cpp:63 '-i <clip> -af silencedetect -f null -' maps the video stream too; the null muxer's default video encoder is wrapped_avframe (libavformat/nullenc.c)",
    "h263": "not used by our code: configure force-enables it for mpeg4 (mpeg4_encoder_select=\"h263_encoder ...\")"
  },
  "muxers": {
    "mov": "proxy_transcode.cpp:874 <stem>.mov proxies (+ -timecode, -movflags +write_colr); clip_trim remux .mov",
    "mp4": "mlt_timeline_handler.cpp:454 default export .mp4 via MLT avformat consumer (emc_export.cpp:272); clip_trim remux .mp4",
    "matroska": "recording_engine.cpp:663 alloc_output_context2(\"matroska\"); timeline_export.cpp:508 .mkv; clip_trim.cpp:61/65 default .mkv",
    "wav": "stt_runner.cpp:976 <take>.wav; transcript_handler.cpp:539 vf_<id>.wav; script_match_handler.cpp:2356 pcm_s16le 48k extract",
    "s16le": "waveform_handler.cpp:97 '-f s16le -' to pipe",
    "null": "proxy_transcode.cpp:627 encoder probe '-f null -'; silence_detector.cpp:63",
    "avi": "clip_trim.cpp:54-66 remux keeps the source extension; camera_manager.cpp:1133 accepts .avi",
    "asf": "clip_trim remux; camera_manager.cpp:1133 .wmv (av_guess_format -> asf)",
    "flv": "clip_trim remux; camera_manager.cpp:1133 .flv",
    "webm": "clip_trim remux; camera_manager.cpp:1133 .webm",
    "ipod": "clip_trim remux; camera_manager.cpp:1134 .m4v (av_guess_format -> ipod)",
    "mpeg": "clip_trim remux; camera_manager.cpp:1134 .mpg/.mpeg (av_guess_format -> mpeg)",
    "3gp": "clip_trim remux; camera_manager.cpp:1134 .3gp",
    "mxf": "clip_trim remux; camera_manager.cpp:1134 .mxf",
    "mpegts": "clip_trim remux; camera_manager.cpp:1134 .mts/.m2ts (av_guess_format -> mpegts)",
    "adts": "not used by our code: configure force-enables it for mpegts (mpegts_muxer_select=\"... adts_muxer latm_muxer ...\")",
    "latm": "not used by our code: configure force-enables it for mpegts (mpegts_muxer_select)"
  },
  "muxer_configure_names": {
    "_comment": "muxer runtime name (ffmpeg -muxers, av_guess_format) -> configure component name, where they differ. configure silently drops unknown names inside a comma list, so the build maps them and then checks config_components.h.",
    "3gp": "tgp",
    "mpeg": "mpeg1system",
    "s16le": "pcm_s16le"
  },
  "guess_format": {
    "_comment": "clip_trim.cpp:142 avformat_alloc_output_context2(nullptr, nullptr, path): the muxer is chosen from the extension. Measured with the full BtbN muxer set; the reduced build must pick the same muxer.",
    "mp4": "mp4", "avi": "avi", "mov": "mov", "mkv": "matroska", "wmv": "asf", "flv": "flv",
    "webm": "webm", "m4v": "ipod", "mpg": "mpeg", "mpeg": "mpeg", "3gp": "3gp", "mxf": "mxf",
    "mts": "mpegts", "m2ts": "mpegts", "wav": "wav"
  },
  "protocols": {
    "file": "every local path (all ffmpeg.exe/ffprobe.exe runs, avformat_open_input, concat demuxer entries)",
    "pipe": "waveform_handler.cpp:97 '-f s16le -' writes to stdout"
  },
  "indevs": {
    "dshow": "recording_engine.cpp:453/1228, capture_source_enumerator.cpp:172/228 av_find_input_format(\"dshow\")",
    "lavfi": "proxy_transcode.cpp:626 encoder probe '-f lavfi -i color=...'"
  },
  "outdevs": {},
  "shipped_dlls": {
    "_comment": "Where installer.iss puts each FFmpeg DLL and the import that needs it there (dumpbin /imports, 2026-10-01; scripts/ffmpeg/dll_swap_test.py imports). A DLL nothing imports is not shipped to that directory.",
    "{app}": {
      "avcodec-62.dll": "EnchantDashboard.exe (23 symbols), mltavformat.dll (34), ffmpeg.exe, ffprobe.exe, avformat/avdevice-62.dll",
      "avformat-62.dll": "EnchantDashboard.exe (19), mltavformat.dll (22), ffmpeg.exe, ffprobe.exe, avdevice-62.dll",
      "avutil-60.dll": "EnchantDashboard.exe (40), mltavformat.dll (58), every other FFmpeg DLL",
      "swscale-9.dll": "EnchantDashboard.exe (6), mltavformat.dll (10), ffmpeg.exe, ffprobe.exe",
      "swresample-6.dll": "EnchantDashboard.exe (8), mltavformat.dll (5), avcodec-62.dll",
      "avdevice-62.dll": "EnchantDashboard.exe (3: avdevice_register_all, avdevice_list_input_sources, avdevice_free_list_devices -- dshow capture: recording_engine.cpp:43, capture_source_enumerator.cpp:52/235), ffmpeg.exe (10), ffprobe.exe (10)",
      "avfilter-11.dll": "mltavformat.dll (25: MLT avfilter services), avdevice-62.dll (22: lavfi input device), ffmpeg.exe (46: -vf/-af/-filter_complex), ffprobe.exe (7)"
    },
    "{app}\\engine": {
      "avcodec-62.dll": "EnchantEngine.exe (12)",
      "avformat-62.dll": "EnchantEngine.exe (6)",
      "avutil-60.dll": "EnchantEngine.exe (11)",
      "swscale-9.dll": "EnchantEngine.exe (3)",
      "swresample-6.dll": "avcodec-62.dll imports it"
    },
    "_not_in_engine": "avdevice-62.dll, avfilter-11.dll: nothing in {app}\\engine imports them; the engine ran with only the five above (3 clips, results identical to the 7-DLL runs)."
  },
  "required_hwaccels": ["cuda", "d3d11va", "dxva2"],
  "required_decoders": [
    "h264", "hevc", "prores", "dnxhd", "mjpeg", "mpeg2video", "mpeg4", "vp9", "av1", "libdav1d",
    "h264_cuvid", "hevc_cuvid", "av1_cuvid", "jpeg2000", "png", "tiff",
    "aac", "mp3float", "flac", "alac", "ac3", "eac3", "opus", "vorbis",
    "pcm_s16le", "pcm_s24le", "pcm_s32le", "pcm_f32le", "pcm_s16be", "pcm_s24be"
  ],
  "required_demuxers": ["mov", "mxf", "matroska", "mpegts", "avi", "asf", "wav", "aiff", "w64", "mp3", "flac", "concat", "image2", "rawvideo", "lavfi", "dshow"],
  "required_filters": [
    "scale", "scale_cuda", "hwdownload", "hwupload", "hwupload_cuda", "format", "fps", "pad", "setpts", "asetpts",
    "aresample", "pan", "concat", "silencedetect", "setparams", "color", "transpose", "hflip", "vflip", "anull", "null"
  ]
}
