我无法访问以下 BUG 汇报地址,不知道有没有大佬可以提交 ISSUE 给到官方?
https://bitbucket.org/multicoreware/x265/issues?status=new&status=open
在进行 Address Sanitizer 测试的时候,发现了两个 x265 的内存泄漏问题,泄漏的内存有限,不会引起特别大的问题,只是会影响其它问题的分析,汇报如下:
问题一:
这个问题在 x265 3.2 版本首次发现,由以下提交记录引入:
In http://hg.videolan.org/x265/file/tip/source/encoder/encoder.cpp:2460
if (!!m_param->selectiveSAO)
{
Slice* slice = frameEnc->m_encData->m_slice;
slice->m_bUseSao = curEncoder->m_frameFilter.m_useSao = 1;
switch (m_param->selectiveSAO)
{
case 3: if (!IS_REFERENCED(frameEnc))
slice->m_bUseSao = curEncoder->m_frameFilter.m_useSao = 0;
break;
case 2: if (!!m_param->bframes && slice->m_sliceType == B_SLICE)
slice->m_bUseSao = curEncoder->m_frameFilter.m_useSao = 0;
break;
case 1: if (slice->m_sliceType != I_SLICE)
slice->m_bUseSao = curEncoder->m_frameFilter.m_useSao = 0;
break;
}
}
else
{
Slice* slice = frameEnc->m_encData->m_slice;
slice->m_bUseSao = curEncoder->m_frameFilter.m_useSao = 0;
}
here will set curEncoder->m_frameFilter.m_useSao = 0 while https://hg.videolan.org/x265/file/tip/source/encoder/framefilter.cpp:159
void FrameFilter::destroy()
{
X265_FREE(m_ssimBuf);
if (m_parallelFilter)
{
if (m_useSao)
{
for(int row = 0; row < m_numRows; row++)
m_parallelFilter[row].m_sao.destroy((row == 0 ? 1 : 0));
}
delete[] m_parallelFilter;
m_parallelFilter = NULL;
}
}
if m_useSao set to 0,m_sao.destroy will not be executed. but in https://hg.videolan.org/x265/file/tip/source/encoder/framefilter.cpp:176
m_useSao = 1;
m_numRows = numRows;
m_numCols = numCols;
m_hChromaShift = CHROMA_H_SHIFT(m_param->internalCsp);
m_vChromaShift = CHROMA_V_SHIFT(m_param->internalCsp);
m_pad[0] = top->m_sps.conformanceWindow.rightOffset;
m_pad[1] = top->m_sps.conformanceWindow.bottomOffset;
m_saoRowDelay = m_param->bEnableLoopFilter ? 1 : 0;
m_lastHeight = (m_param->sourceHeight % m_param->maxCUSize) ? (m_param->sourceHeight % m_param->maxCUSize) : m_param->maxCUSize;
m_lastWidth = (m_param->sourceWidth % m_param->maxCUSize) ? (m_param->sourceWidth % m_param->maxCUSize) : m_param->maxCUSize;
integralCompleted.set(0);
if (m_param->bEnableSsim)
m_ssimBuf = X265_MALLOC(int, 8 * (m_param->sourceWidth / 4 + 3));
m_parallelFilter = new ParallelFilter[numRows];
if (m_parallelFilter)
{
if (m_useSao)
{
for(int row = 0; row < numRows; row++)
{
if (!m_parallelFilter[row].m_sao.create(m_param, (row == 0 ? 1 : 0)))
m_useSao = 0;
else
{
if (row != 0)
m_parallelFilter[row].m_sao.createFromRootNode(&m_parallelFilter[0].m_sao);
}
m_useSao always set to 1 then m_sao.create be executed and will malloc m_tmpL1,m_tmpL2,m_tmpU and so on. here m_tmpL1,m_tmpL2,m_tmpU...will not be freed.
问题二:
x265: e31211b2f00c source/encoder/api.cpp In x265_encoder_open zoneParam malloc and not free in "return encoder" branch.