| Distinctive characteristic | Current implementation | Why it matters |
|---|---|---|
| MLLM-oriented, not playback-oriented | Fresh search over sampled RGB frames | Frame roles and motion units are chosen for tokenization rather than bitstream compliance |
| ViT-aligned coding unit | 14×14 macroblocks on a 27×27 grid at 378 px | Each visual patch receives one uniform motion vector |
| Low-fps displacement coverage | ±48 px window at 2 fps | Covers the observed p95 motion magnitude near 47 px |
| One search, two products | Selected MV/residual + summed pcost | The same work builds P inputs and triggers adaptive I-frame insertion |
| Deterministic encoding | Fixed scan order, strict tie-break, cache fingerprint | Stage-1 and Stage-2 can consume reproducible codec inputs |
| Compact offline cache | 729 block MVs/frame; rebuild residual at 2–4 ms/frame | Avoids live block matching inside distributed training |
pen = lam * block * block, with block=14.hierarchical = search > 8; current ±48 is approximate coarse-to-fine search, not exact full-window search.| Version | Sampling / range | Characteristic |
|---|---|---|
| V1 | native-rate consecutive frames, ±8 | Small motion but high-motion tail repeatedly hits the boundary |
| V2 | native-rate, ±16 hierarchical | Twice the reach at approximately full-±8 candidate cost |
| V3–V5 | 2 fps, ±48 hierarchical | Correct temporal spacing and broad reach; approximately 8× more candidates than V2 |
| Raw motion | Current encoded value, scale 16 | Proposed value, scale 48 |
|---|---|---|
| 8 px | 0.50 | 0.17 |
| 16 px | 1.00 | 0.33 |
| 32 px | 1.00 | 0.67 |
| 48 px | 1.00 | 1.00 |
clip(motion / 16, −1, 1) despite a ±48 search window.CodecFrame.u5() without passing cfg.mv_scale; changing the config field alone does not change this path.search_range; regenerate caches under a new fingerprint.since_i and then checks >= 16, so frame 16 becomes I; the maximum P-chain length is 15.| Finding | Evidence | Impact | Priority |
|---|---|---|---|
| Per-video γ | gamma=None invokes quantile calibration on each video | Every video is pushed toward a similar GOP distribution; content adaptivity is weakened | P1 |
| Global calibration at wrong fps | frame_costs() decodes without sample_fps=2 | The available global-γ helper calibrates native-rate motion but training/eval use 2-fps gaps | P0 |
| Kmax off by one | since_i += 1; if since_i >= max_gop | Declared Kmax=16 produces at most 15 P-frames | P1 |
gop_min_p unused | Config field never enters assign_roles() | Configuration and behavior can silently diverge | P2 |
codec_preprocess.py module docstring, which still says motion comes from the bitstream.| Gate | Change | Measurement | Pass condition |
|---|---|---|---|
| A | Match Eq. 1 exactly or document a normalized-SAD equivalent | Exact-search oracle on a sampled block set | Hierarchical selected cost within a predefined tolerance; no hidden 196× λ |
| B | Calibrate one γ on 2-fps training frames | GOP-length histogram by dataset and motion quartile | Median near 8; dynamic videos receive shorter GOPs than static videos |
| C | Fix Kmax and motion normalization | Chain lengths and encoded-MV histograms | t=16 occurs; saturation limited to true ±48 boundary |
| D | Range/λ ablation: ±32 vs ±48; λ sweep | residual MAE, pcost, runtime, boundary rate | Choose the Pareto point before rebuilding the full cache |
| E | End-to-end matched-token evaluation | MLVU/MVBench plus quality by GOP depth | Search fixes improve P quality without collapsing temporal coverage |