From de0fb7242454e2d854997144d0b43edb30fd1441 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 4 Jan 2026 18:24:20 -0600 Subject: [PATCH] av_buffer_create() copies the pointer not the data --- app/streaming/video/ffmpeg-renderers/eglimagefactory.cpp | 4 ++-- app/streaming/video/ffmpeg-renderers/vaapi.cpp | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/streaming/video/ffmpeg-renderers/eglimagefactory.cpp b/app/streaming/video/ffmpeg-renderers/eglimagefactory.cpp index c9aee153..b0dd1413 100644 --- a/app/streaming/video/ffmpeg-renderers/eglimagefactory.cpp +++ b/app/streaming/video/ffmpeg-renderers/eglimagefactory.cpp @@ -251,7 +251,7 @@ ssize_t EglImageFactory::exportDRMImages(AVFrame* frame, EGLDisplay dpy, EGLImag // Add a buffer reference to the frame to automatically destroy the EGLImages // when the frame is no longer referenced. - frame->opaque_ref = av_buffer_create((uint8_t*)imgCtx, sizeof(imgCtx), + frame->opaque_ref = av_buffer_create((uint8_t*)imgCtx, sizeof(*imgCtx), freeEglImageContextBuffer, frame->opaque_ref, // Chain any existing buffer AV_BUFFER_FLAG_READONLY); @@ -477,7 +477,7 @@ ssize_t EglImageFactory::exportVAImages(AVFrame *frame, uint32_t exportFlags, EG // Add a buffer reference to the frame to automatically destroy the EGLImages // when the frame is no longer referenced. - frame->opaque_ref = av_buffer_create((uint8_t*)imgCtx, sizeof(imgCtx), + frame->opaque_ref = av_buffer_create((uint8_t*)imgCtx, sizeof(*imgCtx), freeEglImageContextBuffer, frame->opaque_ref, // Chain any existing buffer AV_BUFFER_FLAG_READONLY); diff --git a/app/streaming/video/ffmpeg-renderers/vaapi.cpp b/app/streaming/video/ffmpeg-renderers/vaapi.cpp index 1777e0c2..aa2aa5b5 100644 --- a/app/streaming/video/ffmpeg-renderers/vaapi.cpp +++ b/app/streaming/video/ffmpeg-renderers/vaapi.cpp @@ -1221,7 +1221,8 @@ bool VAAPIRenderer::mapDrmPrimeFrame(AVFrame* frame, AVDRMFrameDescriptor* drmDe // Add a buffer reference to the frame to automatically close the // mapped FDs when the frame is no longer referenced. - frame->opaque_ref = av_buffer_create((uint8_t*)drmDescriptor, sizeof(*drmDescriptor), + frame->opaque_ref = av_buffer_create((uint8_t*)(new AVDRMFrameDescriptor(*drmDescriptor)), + sizeof(*drmDescriptor), freeDrmDescriptorBuffer, frame->opaque_ref, // Chain any existing buffer AV_BUFFER_FLAG_READONLY); @@ -1236,6 +1237,7 @@ void VAAPIRenderer::freeDrmDescriptorBuffer(void* opaque, uint8_t* data) for (int i = 0; i < drmDescriptor->nb_objects; i++) { close(drmDescriptor->objects[i].fd); } + delete drmDescriptor; // Free any chained buffers av_buffer_unref((AVBufferRef**)&opaque);