Compatible sensors#
IMX477 (Raspberry Pi HQ Camera)#
| Mode | Resolution | Aspect Ratio | Bit Depth | Max FPS | Sustainable FPS* | DNG Frame File Size (MB) |
|---|---|---|---|---|---|---|
| 0 | 2028 x 1080 | 1.87 | 12 | 50 | - | 4.3 |
| 1 | 2028 x 1520 | 1.33 | 12 | 40 | - | 5.3 |
| 2 | 1332 x 990 | 1.34 | 10 | 120 | - | 2.7 |
IMX296 (Raspberry Pi Global Shutter Camera)#
| Mode | Resolution | Aspect Ratio | Bit Depth | Max FPS | Sustainable FPS* | DNG Frame File Size (MB) |
|---|---|---|---|---|---|---|
| 0 | 1456 x 1088 | 1.33 | 10 | 60 | - | 3.1 |
IMX585 (Starlight Eye)#
| Mode | Resolution | Aspect Ratio | Bit Depth | Max FPS | Sustainable FPS* | DNG Frame File Size (MB) |
|---|---|---|---|---|---|---|
| 0 | 1928 x 1090 | 1.77 | 12 | 87 | 50 on CFE/NVMe ext4/exFAT and SSD ext4/exFAT | 4.0 |
| 1 | 3856 x 2180 | 1.77 | 12 | 40 | 40 on CFE/NVMe ext4; 38 on CFE/NVMe exFAT; 25 on SSD ext4/exFAT | 10.0 |
IMX283 (OneInchEye)#
| Mode | Resolution | Aspect Ratio | Bit Depth | Max FPS | Sustainable FPS* | DNG Frame File Size (MB) |
|---|---|---|---|---|---|---|
| 0 | 2736 x 1538 | 1.80 | 12 | 40 | - | 7.1 |
| 1 | 2736 x 1824 | 1.53 | 12 | 34 | - | 8.2 |
Sustainable FPS means the empirically observed frame rate that records without dropped frames on the listed storage and filesystem.
Note that maximum fps will vary according to disk write speed. For the specific fps values for your setup, make test recordings and monitor the output. Purple background in the monitor/web browser indicates drop frames.
You can limit which modes appear inside CineMate by editing the resolutions section in settings.json. k_steps are the approximate recording-size choices shown in the UI. The stock Cinemate 3.3.1 defaults show 1.5K, 2K, and 4K-class choices, so IMX585 4K stays visible by default. Remove 4 only if you intentionally want to hide 4K-class modes.
"resolutions": {
"k_steps": [1.5, 2, 4],
"bit_depths": [10, 12],
"custom_modes": {
"imx283": [
{"width": 3936, "height": 2176, "bit_depth": 12, "fps_max": 24}
]
}
}
The bit-depth column above describes the sensor mode reported by the camera stack. The IMX296 sensor mode is 10 bit. Cinemate's CinePi-RAW DNG writer may still save captures through its 12 bit DNG output path, so a correctly saved IMX296 DNG does not mean the sensor itself has a 12 bit mode.
Raspberry Pi 4 raw packing
Cinemate handles the CinePi-RAW packing choice automatically. On Raspberry Pi 4 / Pi 400 / CM4, IMX296 and IMX477 use packed raw mode (P). On Raspberry Pi 5 / CM5 they stay on unpacked mode (U). For IMX296 this means 1456:1088:10:P on Raspberry Pi 4-family boards and 1456:1088:10:U on Raspberry Pi 5 / CM5.
Sustainable frame rates#
These rows are measured sustainable limits: continuous recording without dropped frames. Performance depends on the sensor, storage device, and filesystem. Cinemate loads the stock dynamic-resolution rows from resources/dynamic_resolution_profiles.json, and the sensor compatibility metadata lives in resources/sensors.json.
| Sensor | Resolution | Bit Depth | Storage | Filesystem | Sustainable FPS |
|---|---|---|---|---|---|
| IMX477 | 2028 x 1080 | 12 bit | SSD (Samsung T7) | ext4 | 34 |
| IMX477 | 2028 x 1520 | 12 bit | SSD (Samsung T7) | ext4 | 24 |
| IMX477 | 1332 x 990 | 12 bit | SSD (Samsung T7) | ext4 | 71 |
| IMX477 | 2028 x 1080 | 12 bit | CFE Hat / NVMe | ext4 | 50 |
| IMX477 | 2028 x 1520 | 12 bit | CFE Hat / NVMe | ext4 | 40 |
| IMX477 | 1332 x 990 | 12 bit | CFE Hat / NVMe | ext4 | 119 |
| IMX585 | 1928 x 1090 | 12 bit | CFE Hat / NVMe | exFAT | 50 |
| IMX585 | 1928 x 1090 | 12 bit | CFE Hat / NVMe | ext4 | 50 |
| IMX585 | 3856 x 2180 | 12 bit | CFE Hat / NVMe | exFAT | 38 |
| IMX585 | 3856 x 2180 | 12 bit | CFE Hat / NVMe | ext4 | 40 |
| IMX585 | 1928 x 1090 | 12 bit | SSD | exFAT | 50 |
| IMX585 | 1928 x 1090 | 12 bit | SSD | ext4 | 50 |
| IMX585 | 3856 x 2180 | 12 bit | SSD | exFAT | 25 |
| IMX585 | 3856 x 2180 | 12 bit | SSD | ext4 | 25 |
Missing rows are intentionally inert in dynamic resolution mode: if the detected sensor, storage type, filesystem, desired resolution, or requested FPS is not represented by measured data, Cinemate leaves the current resolution unchanged.
Dynamic resolution#
When dynamic_resolution.enabled is true, Cinemate remembers the resolution the user selected as the desired mode. If the user raises FPS above that desired mode's measured sustainable limit, Cinemate switches to the highest measured mode that can sustain the requested FPS. If the user lowers FPS back to the desired mode's measured limit or below, Cinemate switches back.
Example: with IMX585, CFE Hat, ext4, and desired 3856 x 2180, the table limit is 40 fps. At 40 fps Cinemate keeps 3856 x 2180. Above 40 fps it switches to 1928 x 1090 because that row is measured up to 50 fps. With IMX585, SSD, and exFAT, the 4K limit is 25 fps, so Cinemate should expose 50 fps as the dynamic maximum and switch down above 25 fps.
While dynamic resolution is enabled, Cinemate also uses the measured profile to set the maximum FPS exposed to controls and free-mode stepping. If the desired mode has no matching measured row, Cinemate keeps the normal sensor-readout FPS maximum instead. When dynamic resolution is disabled, the maximum FPS always comes from the sensor readout reported by cinepi-raw.
Storage pre-roll is intentionally different: it uses the live sensor maximum for the currently selected mode and temporarily suspends dynamic resolution so the mounted media is stress-tested before Cinemate restores the user's FPS and applies the dynamic-resolution choice.
The active resolution numbers turn green in the simple GUI only while dynamic resolution is actively using a measured substitute mode for the current FPS instead of the user's desired mode. They stay white when the active mode is the user's desired resolution.
Measuring your own rows#
- Format the RAW media with the filesystem you want to test, for example
ext4orexfat, and mount it as the normal RAW drive. - Select one sensor mode and one FPS value.
- Record a long enough take to expose sustained write behavior, not just startup behavior.
- Watch the HDMI/browser GUI and logs. A purple
DROPalert means the FPS is above the sustainable limit for that setup. - Repeat until you find the highest FPS that records continuously with no dropped frames. If the buffer fills temporarily but catches up, note that in the row.
- Add or update one row in
resources/dynamic_resolution_profiles.jsonwith the sensor, storage type, filesystem, resolution, bit depth, and sustainable FPS.
Each row should include:
| Field | Meaning |
|---|---|
sensor |
Sensor id, for example imx585. |
sensor_aliases |
Optional compatible sensor names, for example ["imx585_mono"]. |
storage_type |
Storage class detected by Cinemate, for example ssd, cfe, or nvme. |
filesystem |
Filesystem of the mounted RAW media, for example ext4 or exfat. |
media_model |
Human-readable device name used for documentation. |
width, height, bit_depth |
Measured recording mode. Nearby driver modes are matched using match_tolerance_px. |
sustainable_fps |
Highest FPS that recorded without dropped frames. |
max_fps_no_buffer |
Optional stricter value for rows where you have also verified no buffer growth. |
test_duration_seconds |
Test duration, if recorded. |
buffer_peak_frames, drop_frames |
Evidence from the test run. |
confidence |
Suggested values are empirical or documented. |
notes |
Short context for future users. |
Dynamic resolution uses the stock JSON profile only. Cinemate does not update this table during recording, so empirical values should be added intentionally after you have tested the sensor and storage setup.
Occasional write-speed dips are most common on SSDs. Use conservative values in the lookup table; dynamic resolution is meant to prevent buffering, not to chase best-case burst performance.