A video processing framework with simplicity in mind
This report summarizes scanner evidence for vapoursynth/vapoursynth, a C++ project with 2,125 GitHub stars. SynthScan examined 95,480 lines of code across 204 source files, recording 274 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 3.5 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 218 finding(s).
Are imports declared and package/API names verified? 12 finding(s).
Are wrappers, guards, and repeated structures necessary? 114 finding(s).
Which changes need focused human review? 274 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 274 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | include/VapourSynth4.h | 21 | #ifndef VAPOURSYNTH4_H | COMMENT |
| LOW | include/VapourSynth4.h | 41 | COMMENT | |
| LOW | include/VapourSynth4.h | 61 | /* And now for some symbol hide-and-seek... */ | COMMENT |
| LOW | include/VSHelper4.h | 21 | #endif | COMMENT |
| LOW | include/VSHelper4.h | 41 | COMMENT | |
| LOW | include/VSScript4.h | 21 | #ifndef VSSCRIPT4_H | COMMENT |
| LOW | include/cython/vapoursynth.h | 1 | /* Generated by Cython 3.0.10 */ | COMMENT |
| LOW | include/cython/vapoursynth_api.h | 1 | /* Generated by Cython 3.0.10 */ | COMMENT |
| LOW | sdk/gpu_invert_raw_example.c | 41 | #ifdef _WIN32 | COMMENT |
| LOW | sdk/invert_example.c | 1 | ////////////////////////////////////////// | COMMENT |
| LOW | sdk/invert_example.c | 121 | // Only 1 and 0 mean anything, so anything else is an error rather than a guess | COMMENT |
| LOW | sdk/invert_example.c | 141 | // fmUnordered is for filters whose state changes with every request, such as source | COMMENT |
| LOW | sdk/invert_example.c | 161 | // If you don't own a domain then make one up that's related | COMMENT |
| LOW | doc/conf.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | doc/conf.py | 21 | COMMENT | |
| LOW | doc/conf.py | 81 | # There are two options for replacing |today|: either, you set today to some | COMMENT |
| LOW | doc/conf.py | 101 | # If true, sectionauthor and moduleauthor directives will be shown in the | COMMENT |
| LOW | doc/conf.py | 121 | # html_theme_options = {} | COMMENT |
| LOW | doc/conf.py | 141 | COMMENT | |
| LOW | doc/conf.py | 161 | COMMENT | |
| LOW | doc/conf.py | 181 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. | COMMENT |
| LOW | doc/conf.py | 201 | # The font size ('10pt', '11pt' or '12pt'). | COMMENT |
| LOW | doc/conf.py | 221 | # If true, show page references after internal links. | COMMENT |
| LOW | linux_tests/lock_order_expected.txt | 1 | # The lock graph from section 2 of ../src/core/vsvulkanexec_protocol.md, as observed by the | COMMENT |
| LOW | linux_tests/probe_compat.h | 41 | #endif | COMMENT |
| LOW | linux_tests/check_lock_order.sh | 1 | #!/bin/sh | COMMENT |
| LOW | linux_tests/run_reset_tty.sh | 1 | #!/bin/sh | COMMENT |
| LOW | linux_tests/build_probes.sh | 1 | #!/bin/sh | COMMENT |
| LOW | fuzzers/py_fuzz.py | 481 | print(f" x{v} {k}") | COMMENT |
| LOW | src/core/vsapi.cpp | 21 | #include "vscore.h" | COMMENT |
| LOW | src/core/averageframesfilter.cpp | 21 | #include <algorithm> | COMMENT |
| LOW | src/core/averageframesfilter.cpp | 41 | namespace { | COMMENT |
| LOW | src/core/float16_helper.h | 21 | #ifndef FLOAT16_HELPER_H | COMMENT |
| LOW | src/core/version.h | 21 | #include "VapourSynth4.h" | COMMENT |
| LOW | src/core/ter-116n.h | 21 | const int character_height = 16; | COMMENT |
| LOW | src/core/ter-116n.h | 41 | #define ___X___X 0x11 | COMMENT |
| LOW | src/core/ter-116n.h | 61 | #define __X__X_X 0x25 | COMMENT |
| LOW | src/core/ter-116n.h | 81 | #define __XXX__X 0x39 | COMMENT |
| LOW | src/core/ter-116n.h | 101 | #define _X__XX_X 0x4D | COMMENT |
| LOW | src/core/ter-116n.h | 121 | #define _XX____X 0x61 | COMMENT |
| LOW | src/core/ter-116n.h | 141 | #define _XXX_X_X 0x75 | COMMENT |
| LOW | src/core/ter-116n.h | 161 | #define X___X__X 0x89 | COMMENT |
| LOW | src/core/ter-116n.h | 181 | #define X__XXX_X 0x9D | COMMENT |
| LOW | src/core/ter-116n.h | 201 | #define X_XX___X 0xB1 | COMMENT |
| LOW | src/core/ter-116n.h | 221 | #define XX___X_X 0xC5 | COMMENT |
| LOW | src/core/ter-116n.h | 241 | #define XX_XX__X 0xD9 | COMMENT |
| LOW | src/core/ter-116n.h | 261 | #define XXX_XX_X 0xED | COMMENT |
| LOW | src/core/simplefilters.cpp | 21 | #include <cfloat> | COMMENT |
| LOW | src/core/genericfilters.cpp | 21 | COMMENT | |
| LOW | src/core/audiofilters.cpp | 21 | #include <cstdlib> | COMMENT |
| LOW | src/core/memoryuse.cpp | 1 | #include <cassert> | COMMENT |
| LOW | src/core/audioresampling.cpp | 21 | #include <algorithm> | COMMENT |
| LOW | src/core/vscore.h | 21 | #ifndef VSCORE_H | COMMENT |
| LOW | src/core/vscore.h | 41 | #include <thread> | COMMENT |
| LOW | src/core/vscore.cpp | 21 | #include "vscore.h" | COMMENT |
| LOW | src/core/vsthreadpool.cpp | 21 | #include "vscore.h" | COMMENT |
| LOW | src/core/vsresize.cpp | 21 | #include <cmath> | COMMENT |
| LOW | src/core/vsresize.cpp | 1001 | vspapi->registerFunction("Bob", "clip:vnode:all;filter:data:opt;tff:int:opt;" COMMON_ARGS, RETURN_VALUE, bobCreate, | COMMENT |
| LOW | src/core/lutfilters.cpp | 21 | #include <cstdlib> | COMMENT |
| LOW | src/core/boxblurfilter.cpp | 21 | #include <memory> | COMMENT |
| 74 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/prop_dict_test.py | 112 | def test_no_nodes_or_functions(self): | CODE |
| LOW | test/prop_dict_test.py | 128 | def test_setting_a_property_survives_the_frame_closing_mid_iteration(self): | CODE |
| LOW | test/prop_dict_test.py | 142 | def test_setting_a_property_rejects_a_value_that_closes_the_frame(self): | CODE |
| LOW | test/filter_test.py | 162 | def test_convolution_saturates_before_converting(self): | STRING |
| LOW | test/filter_test.py | 178 | def test_lut_refuses_unprocessed_planes_when_the_storage_changes(self): | STRING |
| LOW⚡ | test/filter_test.py | 194 | def test_crop_rejects_coordinates_that_overflow_the_bounds_check(self): | STRING |
| LOW⚡ | test/filter_test.py | 202 | def test_blankaudio_keep_partial_last_frame(self): | STRING |
| LOW⚡ | test/filter_test.py | 209 | def test_gpu_resize_frame_matrix_outranks_matrix_in(self): | STRING |
| LOW | test/filter_test.py | 221 | def test_vulkan_property_does_not_deadlock_against_first_device_use(self): | STRING |
| LOW | test/filter_test.py | 235 | def test_transfer_staging_accounted_sized_to_demand_and_released_when_idle(self): | STRING |
| LOW | test/filter_test.py | 282 | def test_buffers_are_recycled_across_sizes_without_being_handed_out_twice(self): | STRING |
| LOW | test/filter_test.py | 298 | def test_lowering_the_limit_drains_the_pool_and_the_core_keeps_working(self): | STRING |
| LOW | test/chromaloc_mask_test.py | 65 | def maskedmerge_reveal_chroma_mask(self, mask, n=0, length=1, field_based=False, chromaloc=None, **kwargs): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 80 | def test_maskedmerge_matches_chromaloc_reference(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 89 | def test_maskedmerge_center_equals_unshifted_downsample(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 99 | def test_maskedmerge_per_frame_dispatch(self): | CODE |
| LOW | test/chromaloc_mask_test.py | 117 | def test_maskedmerge_non_subsampled_ignores_chromaloc(self): | CODE |
| LOW | test/chromaloc_mask_test.py | 141 | def test_maskedmerge_interlaced_matches_chromaloc_reference(self): | CODE |
| LOW | test/chromaloc_mask_test.py | 152 | def test_maskedmerge_interlaced_differs_from_progressive(self): | CODE |
| LOW | test/chromaloc_mask_test.py | 162 | def test_maskedmerge_chromaloc_compatibility(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 195 | def premultiply_reference_chroma(self, alpha, loc, field_based=False): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 203 | def test_premultiply_matches_reference(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 213 | def test_premultiply_per_frame_dispatch(self): | CODE |
| LOW | test/chromaloc_mask_test.py | 227 | def test_premultiply_interlaced_matches_reference(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 268 | def test_maskedmerge_interlaced_differs_from_progressive(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 272 | def test_maskedmerge_interlaced_matches_chromaloc_reference(self): | CODE |
| LOW⚡ | test/chromaloc_mask_test.py | 276 | def test_premultiply_interlaced_matches_reference(self): | CODE |
| LOW | test/test.py | 100 | def test_blank_clip_no_variable(self): | CODE |
| LOW | test/test.py | 111 | def test_blank_clip_variable_size(self): | CODE |
| LOW | test/test.py | 122 | def test_blank_clip_variable_format(self): | CODE |
| LOW⚡ | test/environment_test.py | 894 | def test_video_output_completes_short_writes(self): | CODE |
| LOW⚡ | test/environment_test.py | 900 | def test_audio_output_completes_short_writes(self): | CODE |
| LOW⚡ | test/environment_test.py | 909 | def test_destroy_from_own_frame_callback(self): | CODE |
| LOW | test/environment_test.py | 162 | def test_environment_can_retrieve_api(self): | CODE |
| LOW | test/environment_test.py | 168 | def test_environment_can_retrieve_core_ptr(self): | CODE |
| LOW | test/environment_test.py | 180 | def test_environment_use_unsets_environment_on_exit(self): | CODE |
| LOW | test/environment_test.py | 201 | def test_environment_use_restores_environment_on_exit(self): | CODE |
| LOW | test/environment_test.py | 218 | def test_policy_clearing_runs_callbacks(self): | CODE |
| LOW | test/environment_test.py | 255 | def test_environment_destruction_runs_callbacks(self): | CODE |
| LOW | test/environment_test.py | 295 | def test_environment_warns_against_resource_leaks(self): | CODE |
| LOW | test/environment_test.py | 304 | def test_locals_store_data_between_envs(self): | CODE |
| LOW | test/environment_test.py | 341 | def test_locals_differ_from_each_other(self): | CODE |
| LOW | test/environment_test.py | 357 | def test_locals_store_data_between_envs(self): | CODE |
| LOW | test/environment_test.py | 382 | def test_exception_tunneling_and_no_leak(self): | CODE |
| LOW | test/environment_test.py | 419 | def test_environment_invalidation_releases_nodes_and_core(self): | CODE |
| LOW | test/environment_test.py | 513 | def test_environment_waits_for_futures(self): | CODE |
| LOW | test/environment_test.py | 572 | def test_environment_refuses_requests_during_destruction(self): | CODE |
| LOW | test/environment_test.py | 610 | def test_policy_unregistering_itself_during_registration(self): | CODE |
| LOW | test/environment_test.py | 625 | def test_failed_registration_leaves_no_policy(self): | CODE |
| LOW | test/environment_test.py | 648 | def test_requests_without_current_environment_complete_and_track(self): | CODE |
| LOW | test/environment_test.py | 670 | def test_current_environment_waits_for_foreign_requests(self): | CODE |
| LOW | test/environment_test.py | 704 | def test_failed_registration_destroys_created_environments(self): | CODE |
| LOW | test/environment_test.py | 725 | def test_invoking_without_environment_does_not_leak(self): | CODE |
| LOW | test/environment_test.py | 746 | def test_output_rejects_mismatched_alpha(self): | CODE |
| LOW | test/environment_test.py | 767 | def test_frame_props_keep_embedded_nul(self): | CODE |
| LOW | test/environment_test.py | 777 | def test_create_video_frame_validates_dimensions(self): | CODE |
| LOW | test/environment_test.py | 791 | def test_frame_props_iteration_survives_close(self): | CODE |
| LOW | test/environment_test.py | 806 | def test_output_releases_frames_on_error(self): | CODE |
| LOW | test/environment_test.py | 831 | def test_functions_invoke_on_their_own_core(self): | CODE |
| LOW | test/environment_test.py | 852 | def test_get_outputs_keeps_dict_semantics(self): | CODE |
| 9 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | test/environment_test.py | 133 | except EOFError: | CODE |
| HIGH | fuzzers/py_fuzz.py | 339 | except vs.Error: | CODE |
| HIGH | src/py/_shell.py | 58 | except Exception: | CODE |
| HIGH | src/py/_shell.py | 65 | except Exception: | CODE |
| HIGH | src/py/_utils.py | 186 | except Exception: | CODE |
| HIGH | src/py/_utils.py | 211 | except Exception: | CODE |
| HIGH | src/py/_utils.py | 263 | except Exception: | CODE |
| HIGH | src/py/_utils.py | 140 | except Exception: | CODE |
| HIGH | src/py/_utils.py | 304 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/resize_reference.py | 21 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/resize_reference.py | 145 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/resize_reference.py | 196 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/resize_reference.py | 258 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/resize_reference.py | 300 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/resize_reference.py | 446 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gpuresize_test.py | 36 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gpuresize_test.py | 76 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gpuresize_test.py | 112 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gpuresize_test.py | 132 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gpuresize_test.py | 305 | # --------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/gpuresize_test.py | 751 | # --------------------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/gputestsupport.py | 42 | except Exception: | CODE |
| LOW | test/environment_test.py | 100 | except Exception: | CODE |
| LOW | linux_tests/log_reentry_all.py | 25 | except Exception as e: | CODE |
| LOW | linux_tests/log_reentry.py | 31 | except Exception as e: # an error is a fine answer; a hang is the finding | CODE |
| LOW | fuzzers/py_fuzz.py | 381 | except Exception as e: # noqa: BLE001 -- counted, and that is the point | CODE |
| LOW | fuzzers/py_fuzz.py | 387 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | fuzzers/py_fuzz.py | 426 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | fuzzers/py_fuzz.py | 440 | except Exception: # noqa: BLE001 | CODE |
| MEDIUM | fuzzers/py_fuzz.py | 436 | def rss_mb(): | CODE |
| LOW | src/py/_shell.py | 58 | except Exception: | CODE |
| LOW | src/py/_shell.py | 65 | except Exception: | CODE |
| LOW⚡ | src/py/_shell.py | 200 | except Exception: | CODE |
| LOW⚡ | src/py/_shell.py | 209 | except Exception: | CODE |
| LOW⚡ | src/py/_shell.py | 219 | except Exception: | CODE |
| LOW | src/py/_utils.py | 140 | except Exception: | CODE |
| LOW | src/py/_utils.py | 186 | except Exception: | CODE |
| LOW | src/py/_utils.py | 211 | except Exception: | CODE |
| LOW | src/py/_utils.py | 263 | except Exception: | CODE |
| LOW | src/py/_utils.py | 304 | except Exception: | CODE |
| LOW | src/py/_utils.py | 320 | except Exception: | CODE |
| LOW | src/py/_utils.py | 342 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | fuzzers/py_fuzz.py | 33 | CODE | |
| LOW | src/py/_shell.py | 1 | CODE | |
| LOW | src/py/__init__.py | 1 | CODE | |
| LOW | src/py/__init__.py | 2 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE | |
| LOW | src/py/__init__.py | 3 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/resize_reference.py | 156 | CODE | |
| LOW | test/chromaloc_mask_test.py | 162 | CODE | |
| LOW | test/environment_test.py | 777 | CODE | |
| LOW | test/zimgtest.py | 15 | CODE | |
| LOW | test/zimgtest.py | 34 | CODE | |
| LOW | test/zimgtest.py | 65 | CODE | |
| LOW | test/expr_compiler/compiler_test.py | 10 | CODE | |
| LOW | fuzzers/py_fuzz.py | 160 | CODE | |
| LOW | fuzzers/py_fuzz.py | 399 | CODE | |
| LOW | src/py/_shell.py | 19 | CODE | |
| LOW | src/py/_utils.py | 96 | CODE | |
| LOW | src/py/_utils.py | 289 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/gpuresize_test.py | 24 | # numpy nor a GPU. This file is an argv-driven harness rather than a unittest module, so a | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | doc/conf.py | 7 | # This file is execfile()d with the current directory set to its containing dir. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/py/_shell.py | 186 | def update_shell(path: str) -> None: | CODE |
| LOW | src/py/__init__.py | 14 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/resize_reference.py | 333 | CODE |