From 9da95fb8a3c57fd7b8963f561a05d836edc2b601 Mon Sep 17 00:00:00 2001 From: Stefan Sichler Date: Thu, 27 Jun 2019 09:07:12 +0200 Subject: [PATCH] LinuxRendererGLES: fixed memory leak, fixed segfault when NV12 textures are in use, when (stride != width*bps) and GL_UNPACK_ROW_LENGTH is not available --- .../VideoRenderers/LinuxRendererGLES.cpp | 17 +++++++++++------ .../VideoRenderers/LinuxRendererGLES.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp index 39e3866face4d..c524a2ff6970b 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp @@ -289,11 +289,18 @@ void CLinuxRendererGLES::LoadPlane(CYuvPlane& plane, int type, } else { + size_t planeSize = width * height * bps; + if (m_planeBufferSize < planeSize) + { + m_planeBuffer = static_cast(realloc(m_planeBuffer, planeSize)); + m_planeBufferSize = planeSize; + } + unsigned char *src(static_cast(data)), *dst(m_planeBuffer); - for (unsigned int y = 0; y < height; ++y, src += stride, dst += width * bpp) - memcpy(dst, src, width * bpp); + for (unsigned int y = 0; y < height; ++y, src += stride, dst += width * bps) + memcpy(dst, src, width * bps); pixelData = m_planeBuffer; } @@ -1292,11 +1299,9 @@ bool CLinuxRendererGLES::CreateYV12Texture(int index) im.planesize[1] = im.stride[1] * (im.height >> im.cshift_y); im.planesize[2] = im.stride[2] * (im.height >> im.cshift_y); - m_planeBuffer = static_cast(realloc(m_planeBuffer, m_sourceHeight * m_sourceWidth * im.bpp)); - for (int i = 0; i < 3; i++) { - im.plane[i] = new uint8_t[im.planesize[i]]; + im.plane[i] = nullptr; // will be set in UploadTexture() } for(int f = 0; f < MAX_FIELDS; f++) @@ -1459,7 +1464,7 @@ bool CLinuxRendererGLES::CreateNV12Texture(int index) for (int i = 0; i < 2; i++) { - im.plane[i] = new uint8_t[im.planesize[i]]; + im.plane[i] = nullptr; // will be set in UploadTexture() } for(int f = 0; f < MAX_FIELDS; f++) diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h index b0f53705d20ea..ecb4a9f8c72c8 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h @@ -203,6 +203,7 @@ class CLinuxRendererGLES : public CBaseRenderer AVColorPrimaries m_srcPrimaries; bool m_toneMap = false; unsigned char* m_planeBuffer = nullptr; + size_t m_planeBufferSize = 0; // clear colour for "black" bars float m_clearColour{0.0f};