# gst-plugin-gphoto2
Andreas Frisch
GStreamer Conference
October 10, 2026, Prague
---
# A revenant from the past
* A photobooth hobby project from 2016
* [presented](https://gstconf.ubicast.tv/videos/photobooth-an-exemplary-multi-disciplinary-project/) at GStreamer conf. 2017 in Prague
* was used a lot until COVID, then stowed away
----

---
# Original design
* monolithic C application with GTK UI
* video preview from USB-tethered DSLR
* everything done in GStreamer, EXCEPT:
* image acquisition in a thread with
libgphoto2 + fdsrc
---
# Rewrite it in Rust 🦀
* application rewritten in client-server style
* GUI runs in a browser window
* WebRTC for preview video, snapshots, control messages
---
# libgphoto2
* library with USB-PTP support for huge (3k+) number of DSLR/photo cameras
* [rust bindings](https://crates.io/crates/gphoto2) are available
---
# gphoto2src
* a live `Source/Video` element (`PushSrc`)
* always pad 'src' live view as MJPEG ("viewfinder")
* `gst-launch-1.0 gphoto2src ! jpegparse ! jpegdec ! autovideosink`
* internally a `PushSrc` inside a bin, modelled after `GstBaseCameraSrc`
---
# Taking still photos
* exposure of single shots or bursts
* asynchronously through element action signals
* `prepare-capture`
* `capture-image`
* `resume-preview`
* actual payload appears on `image` request pad (ANY caps, JPEG or RAW)
---
# Challenges
* no live video during exposure: variable framerate / GAP events
* flaky USB-PTP connections, multiple cameras / Device Provider
* TBD: Camera controls interface (focus, aperture, exposure time, ISO)
---
# Is this worth upstreaming?
<gstreamer@fraxinas.dev>
<style>
.reveal :not(pre) > code {
background: #3a3a3a;
color: #ffd866;
padding: 0 0.2em;
border-radius: 0.15em;
}
.reveal h1 { font-size: 2em; }
</style>