โญ .4spl File Format โฎ
โญโโฏ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ The 4Splat Codec is a palette-based, lossless video compression format. โ
โ It generalizes indexed-color images to 3D and 4D spatial-temporal data: โ
โ (x, y, z, frame). Pixels across all frames are compressed into the โ
โ global color palette, and each pixel stores an index into this โ
โ palette. All values are little-endian and indices are row-major order: โ
โ t-major -> z-major -> y-major -> x-major. โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
โญ Binary Layout โฎ
โญโโฏโโโโโโโโโโโโโโโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโญ Header โฎ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโญโฏ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎโโ
โโโ name size encoding value hex โโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโ
โโโ magic 4 bytes ASCII "4SPL" 0x34 0x53 0x50 0x4C โโโ
โโโ version 4 bytes uint8[4] {1,0,0,0} 0x01 0x00 0x00 0x00 โโโ
โโโ width 4 bytes uint32 Width โโโ
โโโ height 4 bytes uint32 Height โโโ
โโโ depth 4 bytes uint32 Depth โโโ
โโโ frames 4 bytes uint32 Frames โโโ
โโโ paletteSize 4 bytes uint32 PSize โโโ
โโโ flags 4 bytes bitmask Flags โโโ
โโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโโ
โโโโโโโโโโโโโโโ 32 bytes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโญ Palette โฎโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโญโฏ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎโโ
โโโ โญ Splat4D PSize-1 โฎ โโโ
โโโ โญ โ ... โ โ โฎ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโ
โโโ โญ Splat4D 2 โฎ โฐ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โฎ โโโ
โโโ โญ Splat4D 1 โฎ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ โโโ
โโโ โญ Splat4D 0 โฎ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ โ โโโ
โโโ โญโฏ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ โ โโโ
โโโ โ name size encoding purpose โ โ โ โ โโโ
โโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ โ โโโ
โโโ โ mu_x 4 bytes float mean position in x โ โ โ โ โโโ
โโโ โ mu_y 4 bytes float mean position in y โ โ โ โโโ
โโโ โ mu_z 4 bytes float mean position in z โ โ โ โ โโโ
โโโ โ sigma_x 4 bytes float std dev in x โ โ โ โโโ
โโโ โ sigma_y 4 bytes float std dev in y โ โ โ โ โโโ
โโโ โ sigma_z 4 bytes float std dev in z โ โ โ โโโ
โโโ โ mu_t 4 bytes float mean position in t โ โ โ โ โโโ
โโโ โ sigma_t 4 bytes float std dev in t โ โ โ โโโ
โโโ โ r 4 bytes float red intensity โ โ โ โโโคโโ
โโโ โ g 4 bytes float green intensity โ โ โโ โฏ โโโ
โโโ โ b 4 bytes float blue intensity โ โโโโฏ โโโ
โโโ โ alpha 4 bytes float โฒ opacity โโโโฏ โโโ
โโโ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ โโโ
โโโ 48 bytes references โโโ
โโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโโ
โโโโโโโโโโโ 48*PSize bytes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโญ Index โฎโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโญโฏ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎโโ
โโโ โญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎโญโโโโฎ โญโโโโฎโญโโโโฎ โโโ
โโโ โ 0 โโ 1 โโ 2 โโ 3 โโ 4 โโ 5 โโ 6โโโ 7 โโ 8 โโ 9 โ ... โI-2โโI-1โ โโโ
โโโ โฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏโฐโโโโฏ โฐโโโโฏโฐโโโโฏ โโโ
โโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโโ
โโโโโโโโโโโโโโโโ 8*I bytes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโญ Footer โฎโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโญโฏ โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎโโ
โโโ name size encoding value hex โโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโ
โโโ idxoffset 8 bytes uint64 โโโ
โโโ checksum 4 bytes CRC32 โโโ
โโโ end 4 bytes ASCII "LPS4" 0x4C 0x50 0x53 0x34 โโโ
โโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโโ
โโโโโโโโโโโโโโ 16 bytes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
โญ flags โฎ
โญโฏโโโโโโโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโ 00 โโโโ 01 โโโโ 02 โโโโ 03 โโโโ 04 โโโโ 05 โโโโ 06 โโโโ 07 โโโโโโโ
โโโโโโญโโโโโโโโฌโโโโโโโโฌโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎโโโ
โ 00 โ ENDIANโ SORTEDโ PRECISION โ COMPRESSION SCHEME โโโโ
โโโโโโโโโโโโโโดโโโโโโโโผโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโโ
โ 01 โ INDEX WIDTH โ SPLAT SHAPE โ COLOR SPACE โโโโ
โโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโโ
โ 02 โ INTERPOLATION TYPE โ ENCRYPTION TYPE โโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโโ
โ 03 โ METADATA โโโโ
โโโโโโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโ Offset Size Flag Bin Description โโ
โโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โโ 0x00 1 ENDIAN 0 Little-Endan โโ
โโ 1 Big-Endian โโ
โโ 0x01 1 SORTED 0 No โโ
โโ 1 Yes โโ
โโ 0x02 2 PRECISION 00 Float16 โโ
โโ 01 Float32 โโ
โโ 10 Float64 โโ
โโ 11 Float128 โโ
โโ 0x04 4 COMPRESSION 0000 None โโ
โโ 0001 Run Length Encoding โโ
โโ 0010 DEFLATE (Katz, 1993) โโ
โโ 0011 RAR (Roshal, 1993) โโ
โโ 0100 LZO (Oberhumer, 1994) โโ
โโ 0101 Zlib Gaily & Adler, 1995) โโ
โโ 0110 bzip2 (Seward, 1996) โโ
โโ 0111 LZMA (Pavlov, 1998) โโ
โโ 1000 ZPAQ (Mahoney, 2008) โโ
โโ 1001 XZ (Pavlov, 2009) โโ
โโ 1010 LZ4 (Collet, 2011) โโ
โโ 1011 Snappy (Google, 2011) โโ
โโ 1100 LZHAM (Geldreich, 2013) โโ
โโ 1101 Brotli (Google, 2015) โโ
โโ 1110 LZFSE (Apple, 2015) โโ
โโ 1111 Zstd (Facebook, 2016) โโ
โโ 0x08 2 INDEX WIDTH 00 1-byte โโ
โโ 01 2-byte โโ
โโ 10 4-byte โโ
โโ 11 8-byte โโ
โโ 0x0A 2 SPLAT SHAPE 00 Isotropic (1 ฯ) โโ
โโ 01 Axis-Aligned (3 ฯ) โโ
โโ 10 Full Covariance (6 vals) โโ
โโ 11 RESERVED โโ
โโ 0x0C 4 COLOR SPACE 0000 sRGB (IEC 61966-2-1) โโ
โโ 0001 Linear sRGB (IEC 61966-2-1) โโ
โโ 0010 OKLab (Ottosson 2020) โโ
โโ 0011 Display P3 (DCI-P3 / P3-D65) โโ
โโ 0100 Rec.709 (ITU-R BT.709) โโ
โโ 0101 Rec.2020 (ITU-R BT.2020) โโ
โโ 0110 DCI-P3 (SMPTE RP 431-2) โโ
โโ 0111 ACES-AP0 (SMPTE ST 2065-1) โโ
โโ 1000 ProPhoto RGB (Kodak ROMM RGB) โโ
โโ 1001 Rec.2100 (ITU-R BT.2100) โโ
โโ 1010 CIE Lab (CIE 1976 L*a*b*) โโ
โโ 1011 CIE XYZ D65 (ISO 11664-1) โโ
โโ 1100 ACEScg-AP1 (SMPTE ST 2065-1) โโ
โโ 1101 Rec.601 (ITU-R BT.601-7) โโ
โโ 1110 XYZ D50 (ISO 11664-1) โโ
โโ 1111 XYZ D65 (ISO 11664-1) โโ
โโ 0x20 4 INTERPOLATION 0000 None โโ
โโ 0001 Nearest Neighbor โโ
โโ 0010 Axis-align (lin/bi/tri/quad) โโ
โโ 0011 Smooth (cubic/bi/tri/quad) โโ
โโ 0100 Lanczos โโ
โโ 0101 Gaussian โโ
โโ 0110 Catmull-Rom โโ
โโ 0111 NURBS โโ
โโ 1000 Radial Basis Functions โโ
โโ 1001 Optical Flow โโ
โโ 1010 Neural โโ
โโ 1011 Akima Splines โโ
โโ 1100 Inverse Distace โโ
โโ 1101 Fourier โโ
โโ 1110 Moving Least Squares โโ
โโ 1111 Cubic Hermite โโ
โโ 0x24 8 METADATA ???????? Anything โโ
โโโโโโโโโโ 4 bytes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
| Test | Description |
|---|---|
crc32_known_value |
Confirms the CRC32 implementation reproduces the standard checksum for the canonical "123456789" vector. |
checksum_matches_footer |
Ensures a freshly built video records the same checksum in its footer as produced by the compute helper. |
idxoffset_helpers_agree |
Checks that forward and reverse idxoffset helpers agree on the palette/index boundary. |
validate_succeeds_for_valid_video |
Verifies that a well-formed sample video passes validation. |
validate_fails_for_bad_checksum |
Expects validation to fail when the footer checksum is tampered with. |
validate_fails_for_null_video |
Asserts validation rejects a null video pointer. |
validate_fails_for_bad_magic |
Confirms validation catches an incorrect magic number. |
validate_fails_for_bad_version |
Confirms validation rejects files with an unsupported version field. |
validate_fails_for_zero_width |
Ensures validation fails if the header width is zero. |
validate_fails_for_zero_height |
Ensures validation fails when the header height is zero. |
validate_fails_for_zero_depth |
Ensures validation fails when the header depth is zero. |
validate_fails_for_zero_frames |
Ensures validation fails when the header frame count is zero. |
validate_fails_for_zero_palette_size |
Ensures validation fails when the palette size is zero. |
validate_fails_for_bad_footer_marker |
Confirms validation detects an incorrect footer terminator. |
validate_fails_for_big_endian_flag |
Verifies validation flags files marked as big-endian, which the codec does not support. |
validate_fails_for_unsupported_precision |
Ensures validation rejects headers requesting unsupported float precision. |
validate_detects_corrupted_index |
Confirms validation catches index data corruption without a matching checksum update. |
write_and_read_round_trip |
Exercises writing a video to disk and reading it back to guarantee structural fidelity. |
write_header_rejects_null_fp |
Checks that header writing fails when given a null file pointer. |
write_header_rejects_null_header |
Verifies header writing refuses to operate on a null header. |
read_header_rejects_null_fp |
Ensures header reading fails when the file pointer is null. |
read_header_rejects_null_header |
Ensures header reading fails when the output header pointer is null. |
write_palette_rejects_nulls |
Confirms palette writing validates its pointers and entry count. |
read_palette_rejects_invalid_inputs |
Ensures palette reading rejects null pointers or zero-length requests. |
read_palette_fails_on_short_file |
Verifies palette reading detects truncated palette data. |
write_index_rejects_nulls |
Confirms index writing validates its pointers and entry count. |
read_index_rejects_invalid_inputs |
Ensures index reading rejects null pointers or zero-length requests. |
read_index_fails_on_short_file |
Verifies index reading detects truncated index data. |
write_footer_rejects_nulls |
Confirms footer writing fails with null file or footer pointers. |
read_footer_rejects_nulls |
Ensures footer reading fails when provided null inputs. |
read_footer_fails_on_short_file |
Verifies footer reading detects truncated footer data. |
write_video_rejects_nulls |
Confirms video writing validates both the file pointer and video structure. |
read_video_rejects_nulls |
Ensures video reading refuses null file pointers or video outputs. |
read_video_fails_on_truncated_index |
Verifies video reading catches truncated index sections and cleans up allocations. |
read_video_fails_on_crc_mismatch |
Ensures video reading fails when the stored checksum does not match the payload. |
read_video_rejects_big_endian_flag |
Confirms video reading rejects files flagged as big-endian. |
read_video_fails_on_invalid_footer_marker |
Ensures video reading fails when the footer terminator is corrupted. |
idxoffset_sanity_mismatch |
Checks the idxoffset sanity helpers catch mismatched offsets between header and footer. |
header_defaults_to_float32_precision |
Verifies header construction defaults the precision flag to float32 when unspecified. |
An exploratory visualization tool lives in tools/visualize_4splat.py. It parses a
.4spl video, reconstructs frames using the stored palette, and renders an
interactive Matplotlib dashboard featuring:
- Reconstructed RGB frames for the active palette entries.
- Heat-map slices that show how palette indices are distributed across space.
- Scatter markers for each Gaussian "splat" centered at
(ฮผx, ฮผy)with marker sizes proportional to how close their temporal mean(ฮผt)is to the selected frame. - Checkboxes to toggle the most-used palette entries on and off for quick reconstruction experiments.
Launch it with:
python tools/visualize_4splat.py path/to/video.4splUse the sliders at the bottom to step through time and depth slices, and the checkboxes on the left to enable or disable palette slots.