feat(FFmpeg): add V4L2 zero-copy support - #781
Conversation
ReenigneArcher
left a comment
There was a problem hiding this comment.
Can these patches be prepared for, and sent to upstream?
Generally, we like to do that to avoid maintaining patches forever.
That’s a good suggestion. I hadn’t considered upstreaming these changes initially, but after looking into FFmpeg’s current V4L2 M2M implementation, I don’t think these patches are a good fit for upstream in their current form. The patches mainly expose some V4L2 M2M internals and add a path for the case where an internal V4L2 buffer has already been modified externally. The issue is that, with the current V4L2 M2M design, FFmpeg cannot reasonably expose those internal input buffers to callers. If callers are not expected to access or modify those buffers, adding an upstream code path specifically to handle them being modified externally would also break that abstraction. DMABUF would provide a cleaner way to integrate V4L2 M2M with FFmpeg's existing hardware-frame model. There is already an upstream PR working in that direction: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23471 However, it looks like that PR has not been updated for about two months. Technical details on why the input buffers cannot currently be accessedNormally, as Sunshine does for other hardware backends, the flow is roughly:
The hardware frame context defines the input frame format and creates the hardware frame pool, so Sunshine can later obtain frames for encoding through The current V4L2 M2M implementation, however, uses MMAP-backed buffers rather than externally provided DMABUF-backed buffers. With MMAP, the buffers can only be allocated after the input/output formats have been configured and the V4L2 session has been fully initialized, which happens during After So if V4L2 support in Sunshine is not particularly urgent, I'm fine with either keeping this PR around for now or handling it differently if you prefer. |
9e3f44b to
2e57281
Compare
2e57281 to
f8fa3a4
Compare
|
|
Don't worry about the trailing space errors in the patches |



Description
This PR adds two FFmpeg patches required for Sunshine's upcoming V4L2 M2M hardware encoder support (H.264/HEVC/AV1) on Linux.
To achieve true zero-copy, Sunshine needs to import DMA-BUFs directly into FFmpeg's V4L2 output buffers. FFmpeg's current
v4l2_m2mimplementation uses a memcpy path, so two patches are needed to expose the required private headers/symbols to downstream consumers and adapt the buffer handling for Sunshine.Patch details
01-expose-function.patch: Exposes static/private functions so consumers can explicitly stop the encoder, reclaim output buffers, and set V4L2 extended controls.02-specify-buffer.patch: Adds additional fields and conditional logic to work with buffers that Sunshine has already written.Scope and behavior
Screenshot
Issues Fixed or Closed
Roadmap Issues
Type of Change
Checklist
AI Usage
See our AI usage policy.