Skip to content

CodebergReleaseArchive

jmalmsten edited this page Aug 28, 2026 · 2 revisions

About this page

As the move over from codeberg resulted in all the previous releases being left behind. I have gone through and listed the releasenotes from those here in this wiki page

They should all be available in the tag system, I think. In case anyone is interested in diving into the history.

Please also note that the versioning that I used on Codeberg was the regular semantic versioning. With Major.Minor.Patch. From the moment of the move, I am using Calendar Versioning with Year.Release.Patch. So that should explain any questions about what happened between v0.16.14 (last one on codeberg) and v26.1.0 (first one on GitHub).


v0.16.14 - Pre-release

Added:

#15 - ADM Mode

First iteration of the Animation Desk Mode that let's you use the VOP as a background for physical animations in front of the projection screen. Can be used for cel-animations, cutouts, puppets/claymation. A lot of things. And as with other things in the VOP. It's needlessly realistic. So there's no undos. Once a frame is committed to the Cam Mag. It's committed.

Skip keyframe pairs that are 0 exposure time.

This is simply to speed up working on composites that need multiple passes but not all passes need to run through the whole exposure sheet. The mechanism detects keyframe pairs that are set to 0 as exposure time. If a keyframe is 0 as exposure time but a keyframe on either side of it, before or after, is not 0, that's a fade and that shouldn't be skipped.

Pi's status LED turn off during exposure

To minimize the risk of stray light reflecting off the projection screen, the status LED on the Pi will now turn off during exposures.

#230 - Sweep Mode

This is a dropdown menu for each projection side image that makes it do brightness sweeps across the image. It defaults to ByPass to make sure it doesn't do anything weird unless you want it. Other modes are:

  • HighPass - This makes all the brightness values above the threshold white and all below dark
  • LowPass - This does the opposite
  • Bandpass - This makes values above and below the threshold black and only the threshold value white.

Along with these is the Width value. This widens the values at the threshold to show more or less pixels.

This mode runs a filter sweep during a smear exposure. You can use these with other projection layers to produce some wild pseudo-3D renderings. And even do almost depth compositing by rendering out from a 3D modeling program like Blender, 2 passes, Depth Map and a Beauty Pass. Depth to provide where the pixels are in 3D space and Beauty Pass to provide the colors of those pixels. And you'll use the depth map to tell which pixels should be in what depth using the Sweep mode. I imagine one can use this to make warp speed stretching like effects from the Star Trek TNG shows.

Other, more abstract use-cases are of course possible. But that's the most practical one I can think of right now.

Changed:

Fixed:

The ONLINE indicator didn't work

fixed.


V0.15.0 - Stable

Notes:

First stable one ready for release? This has been tested with the new public predeploy and the existing deploy scriptsBoy, it's been a while.

Added:

predeploy_vop.sh

Probably safe for public use version of the script I use for preparing a USB SSD for the VOP. When run, it will run through a checklist with the user to get their opinion of a few settings. Once all is run, you pull the USB SSD from the desktop or laptop and insert it to the Pi and boot it up. It should now be ready for installation of git and then cloning and deploying the VOP software.

Changed:

Changed the logo for the branding

Mostly for consistency. Now it should match the logo that's in the readme and the webGUI.

Fixed:


V0.14.0 - Prerelase

Added:

#199 - Target Aspect Ratio (Target AR) inputs for easier use of the PAR settings.

To simplify using non-square aspect ratios, I added a couple of inputs that let the user input the Aspect Ratio they want. Then hit the button CALC PAR and it does the math for Pixel Aspect Ratio for the user. This target aspect ratio is for now not saved in the current job. The PAR is already saved there.

It is also aware of the projection monitor's resolution so the calculations should be correct wether it's 16:9, 3:2, 4:3, 5:4 or whatever.

#206 - Navigate inputs with keyboard

To speed up navigation with the keyboard. I've added the ability to use up and down arrows to move between input fields up and down. For horizontal movement, we'll still have to use tab and shift-tab because I need to be able to step inside the long string inputs for POS and ROT easily.

#205 - Checkbox to show the latest exposed image in preview during execute job

Both as a way to see how things are progressing and to make it more interesting for marketing videos and livestreams. Simple use. When checked. It auto-loads the latest exposure to the preview window during a job execution. When unchecked. It doesn't and we need to use the CAM PROBE function to manually summon the image from the cam mag for preview.

#185 - Luma & RGB Waveform

To make it easier to judge exposures, I'm adding a waveform function to the right of the preview window.

#217 - Local Notifications

Setting things up so that a notification can be sent from the VOP to a phone on the local network listening to the ntfy app.

Changed:

#208 - Make Cam Res input into a dropdown menu

To simplify using different resolutions in the camera. I changed the Cam Res input field into a dropdown menu to quickly choose between valid options.

Added clock sync guard to the deploy_vop.sh

Fixed:

#200 - In MDS, the Keyframe PG does not apply

Fixed.

#201 - The Autogenerated workprint doesn't use PAR input when Preview Unsqueeze is ticked

Fixed.

#202 - Calibration page preview window is needlessly tiny

Fixed. Now matches the main page.


V0.13.1 - Pre-release

Added:

Restored the IP output for the idle screen

This one has been missed for a while. The idle screen used to show the IP and Port for the WebGUI. Now it's back.

Rearranged the placement of the mags in the GUI

To make the sidebar on the main page less greedy in vertical space. I moved the sections for the mags up abobe the preview. As a bonus, this also sets things up for the big wood grain makeover I have planned where I make the whole VOP look and feel more like an Optical Printer visually.

Frame counters for all the mags.

Added a neat little frame counter so that both when probing and when executing a job. I can see which frame is loaded at which gate. Mostly as a fun visual touch, but also as a way to decode if the step-printing is out of wack.

It's formatted like: ####/#### where ####/ is the current frame in the gate and /#### is the total number of frames in the gate.

The number is four digits. 0001-9999 because, right now, the step printer logic is limited to 9999 frames. in 24 fps playback speed, that's 6 minutes, 56 seconds and 15 frames. Should be enough for most shots. Please let me know if this is too limiting. But remember that upping thte limit to 5 digits means ten times the storage space requirements... per mag. and ten times the job length in time.

Stages for frame counters:

The step printers have three stages depending on what is loaded.

  • ----/---- - means the mag is empty and nothing is loaded
  • SINGLE_FR - means that a lone image is loaded and is treated as a still image. No step printing available.
  • 0001-9999/0001-9999 - this means a video has been ingested and transcoded to a tiff sequence that can be used with step printing.

Font choice

To make the counters stand out and look plain cool I decided to use a segmented display font found here: https://github.com/keshikan/DSEG

Read more about the font here: https://www.keshikan.net/fonts-e.html

I claim no ownership of the font. I just find it neat. :)

RENDER WORKPRINT button

Button to manually trigger creation of a new workprint even when a new full job isn't run.

Camera Feed for Focus and alignment

Issue #198 - Added a way to get a camera feed into the GUI in order to make it easier to both line up the camera, monitor and set focus.. Find it in the calibration page. And when using it. You should see a focus chart on the screen with some crosshairs in the corners and boxes in the corners of the camera feed. You should be able to use these to line up the camera to the monitor and set focus and zoom.

A focus peaking mode is coming once this is nailed down.

Wood grain makeover

Mostly a GUI niceity. I want to see the VOP using a wood style.

Changed:

Rearranged the sections of the GUI

In order to limit the vertical space used by the sidebar I moved the mags up as a horizontal line of sections. This is also in anticipation of the big wood-grain redesign that's coming later on.

Moved Noise Crusher and Hot Pixel Mapper to the Calibration Page

Simply because those are calibration steps.

Renamed mode names

Mostly to clean it up and make them less width hungry.

Display branding when job is nuked

When the NUKE JOB button is pressed and confirmed. The job is nuked and now a placeholder image is put into the preview. That placeholder is the branding image that's also used for the screensaver on the monitor.

Moved copyright text to bottom

Removed the Cheat Sheet from the bottom of the GUI

the cheatsheet.html remains for a while until I decide this change didn't become more troublesome than I wanted.

Fixed:

  • #187 - corrected exposure time for noise measure and hot pixel mapping.
  • #186 - unified naming so type is now task in the python code and json.
  • #142 - nothing left here to fix. so closed it.
  • Cleaned up a little inline css codes.
  • #140 - not actionable here either.
  • #141 - the whole standalone idle_screen.py is no more already. Nothing to do here.
  • When frame counter was added. It's using amber color. This is the same color that the NUKE JOB button used, so I restyled that button to match the other NUKE buttons. Just to keep the color coding consistent.

V0.12.2 - Pre-release

fixed:

Removed auto-updating of Proj Probe

Proj Probe kept getting in the way when I wanted to quickly check things. So I removed the auto-updating function for Proj Probe. Now, if you want to update the preview. You press the appropriate button to trigger that update.

Other stuff

The other stuff that has been added in the previous prereleases survived so check out those release notes. Wait. I never did releases for them. Well. here they are:

fixed ratio mismatch for Cam Mag ingest

In order to get the camera's ingestion to match the PAR of the projection monitor, A change was done so that the ingested video matches the aspect ratio of the monitor while still fitting inside the camera resolution with a letterbox. And when the upload is done, the gui suggests the PAR that's needed to bring the final image back. This can then be applied by the user by simply clicking the suggestion.

V0.12.0 Video ingestion for the Cam Mag

In order to fascilitate an initial pass with full color fidelity, a function has been added to be able to feed the cam mag with a video file directly. Upon uploading, the VOP will generate a tiff sequence that matches the camera resolution. And then it will be there for regular LIME compositions.

V0.11.0 - Auto Whitebalance Measure.

Now we finally have a tool in the VOP that does the white-balance more automatically (though the AWB-R and AWB-B will remain accessible in the GUI as a way to tweak outside of the "accountants truth"). How it works is simple. It first tries to find an exposure where middle grey is not in the noise floor and not having a channel clipped. Then it takes the middle section of the screen and does a measurement to see how far off from neutral middle grey it is. It applies what it thinks should be applied to the channel gains to get there. It fires off another exposure. Does a new measurement and loops through that until it reaches a satisfactorally amount of neutral grey. It then presents you with the results, the image of the latest VOP approved exposure and applies the values to the AWB-R and AWB-B in the main section.

V0.9.0 & V0.10.0 - HDR

This update introduces the third mode alongside the SSS and MDS. The new one is HDR. It is here to be used with images and video footage exposures that don't need smears but do need higher degree of tonal detail. The SSS and MDS are limited to 8bpc and this HDR mode tries to extend this to the cameras full 12bpc range by not moving the image, instead, it animates the brightness values of the pixels so that over time, darker pixels go black and lighter pixels stay on to burn in more tonal detail. Until the end of the exposure sweep where the whole image goes dark.

Calibration Page

Added a second page that can be used for the calibration tools. For now, we only have added some initial measurement tools for the bracket mode.

Changed:

Sheet survivability

During debugging while adding bracket mode, it became apparent that we don't have to throw out the exposure sheet when switching modes.

Made it clearer what's what in preview

Until now, the preview was a bit ambiguous about where the image starts and ends when doing probes. This is made more clear now.

Fixed:

Incorrect fit and fill scale functions when non square PAR is used.

At some point when we added the Anamorphic functionality, the fit and fill to FOV broke when the non square PAR is used (for anamorphic results). This should now be fixed.


V0.8.1 - Pre-release

Notes: The big third layer addition!

Added:

A third layer

This version brings with it a big bit of refactoring as I add a third layer to the pipeline. The third layer can be used in the same ways as the other two and are rendered on the projection side. Use it for a second bipack or hold-out matte or whatever you imagine it can be used for.

Changed:

BiPack becomes BiPack1

As we now have two bipacks I went ahead and renamed BiPack to BiPack1 so things make more sense going forward.

Fixed:

Keyframing got inherited values from wrong fields.

Fixed.

Code Cleanup

cleaned up a few stray things that's been bothering me.


V0.7.1 - Prerelease

Notes: A few detours I've had to get outvof my head. It's starting to shape up as something almost useful now.

Added:

Rotation Order setting (dropdown menu)

In order to control which axis rotates before which other axis, I added a dropdown menu that allows you to choose which of the 6 permutations that are possible. This is a per job constant for now.

Anamorphic / Non-square Pixel Aspect Ratio (PAR)

Added the ability to use non-square pixel aspect ratio. This is to maximize the resolution for aspect ratios that are not the same as the HDMI monitor.

How to use:

See wiki at https://codeberg.org/jmalmsten-com/VOP/wiki/PAR-Anamorphic

There's also a ramble about it on the blog: https://www.jmalmsten.com/post/vop-anamorphics

Comp View button (issue #175)

Sits next to Cam View. Behaves like Cam View — same smear-render-plus-camera-capture path — but the resulting preview JPG is the new exposure additively composited on top of whatever latent TIFF already exists in the CamMag for that frame. The latent on disk is NOT modified; this is preview-only. Use it as a viewfinder for lining up multi-pass exposures so you can verify ProjMag / BiPack / CamMag positions all land where you intended before committing with Execute Sequence.

Cam Probe button + 2x2 probe button layout (issue #175 follow-up)

Cam Probe is a fourth probe/preview button that simply pulls the existing latent TIFF for the current probe frame out of CamMag, converts it to JPG, and shows it in the preview window. No camera capture, no smear render, no engine round-trip - it's a pure read-and-convert via the Flask request thread, which means it also works while the engine is busy with another task (e.g. mid-Execute sanity checking).

The four probe/preview buttons are now arranged as a 2x2 grid:

  • Proj Probe | Cam Probe
  • Cam View | Comp View

Cam Probe is colored to match Proj Probe (both use the global accent color), pairing them visually as the two non-capturing probes.

Changed:

Preview area

Tweaked a bit of how the preview area is presented.

Corrected:

PH input in SSS mode

Found that the helper hover text for some reason said "Playhead" for the PH input. Should be Shutter Phase. Corrected that.


V0.7.0 - Prerelease

Notes:

Quite a big one here. Most notably, the VOP, the Video Optical Printer now actually accepts video. So it can do... optical printing. Like ye olde J.K. Optical Printers.

Please do remember. Prereleases like these seem to work on my end. But I have yet to do a full deployment run.

Added:

GATE, CAM and STP to the exposure sheets.

These fields only become visible when the input of either ProjectionMag (PM) or Bipack (BP) is a video. When feeding any of them a still image, these fields are not needed and are therefore hidden to avoid cluttering things.

Clarification of use:

  • GATE - Gate specifies which frame of the video should be seen at the keyframe. This is an anchor that the interpolated frames use to calculate their own visible frames. If left empty. The interpolator simply carries on as if no new anchor has been set. If a frame number is present there, the interpolator will jump to that new anchor. No smoothed out interpolation between the anchors will be done. The progression between keyframes are entirely dictated by the CAM:STP formula.

  • CAM & STP - These show the interpolator how to find out which frame to show where. It's interpreted as CAM:STP. 1:1 means that for each 1 frame in the CamMag. The gate of the video should be advanced 1 frame. CAM is an integer that has to be 1 or more. 0 and negative numbers cannot be used here. STP can be positive and negative numbers. Positive means advancing. Negative means reversing.

    Examples:

      - 2:-3 means that for every second camera frame, the video frame should reverse 3 frames. The resulting sequence would then be (from anchor frame of 9): 9,9,6,6,3,3,0,0. 
      - 1:0 means that for every camera frame. The video should advance 0 frames. This in effect renders a paused video. 
      - 4:1 means that for every fourth camera frame. the video should advance 0 frames. Making slowed down motion. The resulting sequence would be (from anchor frame 9): 9,9,9,9,10,10,10,10,11,11,11,11
    

    So far. No auto-looping commands. But they are coming later.

Added ability to click the measured black level to auto-copy the numbers to the Noise-crusher text input

This is mostly to avoid situations where I miss part of the float in my manual copy-pasting.

Added sanity checker to the exposure routines.

This forces valued in the Noise Crusher to be 0.0 - 1.0 and if they are outside. It clamps it into range and warns the user.

Added a pull_and_run_vop_nightly.sh

Mostly to speed simplify development and testing. Regular users are probably better off using the normal run_vop.sh

Added a marker in index.html both in title and header to show that this one is in the nightly and unstable branch

Added layer visibility toggle

This is so that we can quickly disable visibility of ProjMag or BiPack or both. When off, they go white. Which makes them effectively invisible when merging together with multiply. If both are off, we get a pure white image. This can be tinted with PG to do image-wide color addition.

Changed:

Added PM to the headers of the exposure sheet to clarify which columns are responsible for the Projection Mag.

rearranged things to fit better in the exposure sheet

Fixes:

Removed:


V0.6.4 - Pre-release

Notes:

While not much is added in features. A massive rebuild has taken place to make the VOP run well on a Pi4B with 4GB RAM

Also. While this runs just fine on my Pi4B with 4GB RAM. I have yet to do a full redeployment test. So I don't know if it survives that. That's why this one is marked as a prerelease.

Added:

  • ProRes Render button! - So it's simpler to go from a bunch of tiffs to something we can use in an NLE or Compositor. It renders a ProRes 4444 file with no alpha channel and linear gamma.

Changed:

  • Moved the prototype to Pi4B with 4GB for making sure it runs on lower hardware than the biggest 16 GB Pi5
  • Moved the idle screen to use OpenGL to simplify rendering systems and avoid the single CPU spiking that was discovered with moving to Pi4 platform.
  • Moved things around so the list of files only is sorted once at the start of the job instead of for each frame.

Core Engine & Hardware Synchronization

  • Resolved Hardware Shutter Desync: Replaced the --immediate flag in rpicam-still with a calculated --timeout (-t) delay matching PRIME_WAIT_MS (1500ms). This synchronizes the IMX477 physical shutter opening with the Python OpenGL render loop.

  • Normalized Shutter Calculations: Standardized the total_ms variable as a 1:1 map for the physical shutter duration (shutter_us). Removed legacy 1000ms subtractions and additions from the camera_hardware.py and engine.py modules.

  • Fixed Animation Temporal Jumps: Implemented VRAM Pre-Caching within execute_exposure. By loading textures into GPU memory before triggering the camera, we eliminated the 2–4 second thread-stall caused by synchronous SD card I/O on the first frame.

Rendering & Optical Shutter Integrity

  • Enforced Optical Shutter Blackouts: Addressed a KMSDRM/GLES driver optimization quirk where ctx.clear() was ignored if no geometry was present. The system now renders a Physical Black Quad (geometry-based clear) to ensure the monitor physically drops to 0,0,0 RGB during pre-roll and post-roll periods.

  • Verified Light-Shutter Architecture: Confirmed that the 500ms pre/post-roll sequence correctly encapsulates the smear animation, protecting the sensor from rolling shutter artifacts and ensuring a clean start/stop in total darkness.

Fixes:

  • Various fixes and improvements.

V0.6.3 - Stable (includes notes for not released releases v0.6.2, v0.6.1 and v0.6.0)

v0.6.3 - (20260421)

  • Added Noise floor measurement
  • Added Noise Crush input
  • Modified version numbering in the GUI title so it only tracks v#.# instead of v#.#.# . I'll still update the third digit in the header of the GUI though.
  • Added update to the preview to show what pixels are measured with the noise measurement function.
  • Added Hot Pixel Fixer that measures hot pixels and replaces those pixels in post.
  • Added Export and Import buttons to enable saving and loading jobs. And during import, it will check to see if the version number matches the currently installed version.
  • Added LAB/INVERT button that inverts the frames that are in CamMag. This enables easier holdout matte workflows within the VOP.
  • Added a first draft of the deployment script
  • Modified the deployment so the VOP now runs with systemd on the Pi. It therefore runs when the Pi boots and terminal output can be monitored with journal. And this also unshackles it from the current SSH connection. So you can start a long running job of hours in length. Turn off the client computer. Go to another client computer, connect and things will be continuing like normal.
  • Removed the standalone changelog.md since the release notes are documented here in the readme and on my website.
  • Successfully tested with deployment to a USB stick instead of SD card
  • Rebuilt the RGB fixer to be deployed with its own deployment script. Still found among the CaliTools
  • Fixed license compliance and removed mention of PISS in the copyright text and license.

v0.6.2 - (20260406)

Added

  • Added run_vop.sh to simplify starting the vop
  • Added the DVD-screensaver for when the VOP is idle
  • Added drop-zones to file uploads to circumvent any browser-related hangs when a folder disappears."

V0.6.1 - (20260404) - "Changes to for the installation tutorial

Added

  • Created 'Documentation' directory for project tracking.
  • Added tutorials to the wiki both for first installation of VOP and fullRGB fix.

Changed

  • Moved the force_full_rgb.sh script to CaliTools/FullRGBFix/ to clean up the root
  • Added ffmpeg_metadata.txt to .gitignore to clean out unnecessary file.

V0.6.1 - (20260404) - "Changes to for the installation tutorial

Added

  • Created 'Documentation' directory for project tracking.
  • Added tutorials to the wiki both for first installation of VOP and fullRGB fix.

Changed

  • Moved the force_full_rgb.sh script to CaliTools/FullRGBFix/ to clean up the root
  • Added ffmpeg_metadata.txt to .gitignore to clean out unnecessary file.

Archived Release Notes:

If you are interested in older ones. Starting from v0.6.0, you can visit jmalmsten.com/category/vop/

v0.6.0 - "The Great unification project"

This finally brings together the separate SSS and MDS versions that grew into their own branches because of issues with AI coding drift. The only real casualty being the rudimentary JK Step Printing stuff I had put in the SSS fork because I need to actually get progress done with the unification and the JK stuff was always more of a bonus thing. It will come for realsies... but later.

This also brings me to the numbering scheme of the versions. I am taking that control back from the LLM. And therefore I need to say that whatever it may say in the files somewhere. From this day. This version. Is v0.6.0. And history for realsies... starts here.

I will also start putting the release notes on my website so if you want the older ones starting from today. You can visit jmalmsten.com/category/vop/

Clone this wiki locally