汇报两个 x265 内存泄漏的问题

我无法访问以下 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.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值