From 80ddd5ba135afa1e3359b764809c14528fc8074a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 6 Jan 2026 00:35:33 -0600 Subject: [PATCH] Fix software upload for DRM renderer with non-720p resolutions The buffer allocated for the 720p test frame was left around and we would attempt to reuse it even if the stream had frames of a different size. --- app/streaming/video/ffmpeg-renderers/drm.cpp | 28 +++++++++++++++++++- app/streaming/video/ffmpeg-renderers/drm.h | 4 +++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/streaming/video/ffmpeg-renderers/drm.cpp b/app/streaming/video/ffmpeg-renderers/drm.cpp index 979f88cd..d22e6024 100644 --- a/app/streaming/video/ffmpeg-renderers/drm.cpp +++ b/app/streaming/video/ffmpeg-renderers/drm.cpp @@ -1056,6 +1056,29 @@ bool DrmRenderer::mapSoftwareFrame(AVFrame *frame, AVDRMFrameDescriptor *mappedF goto Exit; } + // If the frame size or format changed, we need to recreate the buffer + if (frame->width != drmFrame->width || + frame->height != drmFrame->height || + drmFormatTuple->second != drmFrame->format) { + + if (drmFrame->primeFd) { + close(drmFrame->primeFd); + drmFrame->primeFd = 0; + } + + if (drmFrame->mapping) { + munmap(drmFrame->mapping, drmFrame->size); + drmFrame->mapping = nullptr; + } + + if (drmFrame->handle) { + struct drm_mode_destroy_dumb destroyBuf = {}; + destroyBuf.handle = drmFrame->handle; + drmIoctl(m_DrmFd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroyBuf); + drmFrame->handle = 0; + } + } + // Create a new dumb buffer if needed if (!drmFrame->handle) { struct drm_mode_create_dumb createBuf = {}; @@ -1081,6 +1104,9 @@ bool DrmRenderer::mapSoftwareFrame(AVFrame *frame, AVDRMFrameDescriptor *mappedF goto Exit; } + drmFrame->width = frame->width; + drmFrame->height = frame->height; + drmFrame->format = drmFormatTuple->second; drmFrame->handle = createBuf.handle; drmFrame->pitch = createBuf.pitch; drmFrame->size = createBuf.size; @@ -1145,7 +1171,7 @@ bool DrmRenderer::mapSoftwareFrame(AVFrame *frame, AVDRMFrameDescriptor *mappedF mappedFrame->nb_layers = 1; auto &layer = mappedFrame->layers[0]; - layer.format = drmFormatTuple->second; + layer.format = drmFrame->format; int lastPlaneSize = 0; for (int i = 0; i < 4; i++) { diff --git a/app/streaming/video/ffmpeg-renderers/drm.h b/app/streaming/video/ffmpeg-renderers/drm.h index 3ae601bb..d33f0969 100644 --- a/app/streaming/video/ffmpeg-renderers/drm.h +++ b/app/streaming/video/ffmpeg-renderers/drm.h @@ -682,6 +682,10 @@ private: SwFrameMapper m_SwFrameMapper; int m_CurrentSwFrameIdx; struct { + int width; + int height; + uint32_t format; + uint32_t handle; uint32_t pitch; uint64_t size;