使用SinkWriter(Media foundation)c ++时内存泄漏

时间:2014-04-07 14:39:15

标签: c++ memory ms-media-foundation

我一直在尝试编写一个小应用程序,为您创建视频,您可以发送自己的图像。为了对视频进行编码,我使用了媒体基础库。

一切正常。我能够创建一个非常短的视频,但是一旦我尝试创建一个大视频,我的应用程序就会开始占用大量内存并最终因为内存和崩溃而挨饿。内存范围为1.5 GB。

我做了一些调试,发现这个方法正在泄漏内存。在尝试了大量删除和空闲内存组合之后,我无法找出问题所在。你能帮帮我吗?这是添加框架的方法。

 HRESULT VideoCompressor::addFrame(BYTE* bitmapBytes)
{
    const long imageBufferWidth = VIDEO_WIDTH * 4;
    const DWORD bufferLength = imageBufferWidth * VIDEO_HEIGHT;
    IMFSample *sample = NULL;
    BYTE *dataBuffer = NULL;
    IMFMediaBuffer *sampleBuffer = NULL;
    DWORD maxLength;
    //std::shared_ptr<BYTE> *dataBuffer = NULL;

    if (!SUCCEEDED(MFCreateMemoryBuffer(bufferLength, &sampleBuffer)))
        return E_FAIL;

    sampleBuffer->GetMaxLength(&maxLength);
    if (!SUCCEEDED(sampleBuffer->Lock(&dataBuffer, NULL, NULL)))
        return E_FAIL;

    if (MFCopyImage(dataBuffer, imageBufferWidth,
        (BYTE *) bitmapBytes, imageBufferWidth, 
        imageBufferWidth, VIDEO_HEIGHT) 
        != S_OK)
        return E_FAIL;

    sampleBuffer->Unlock();
    sampleBuffer->SetCurrentLength(bufferLength);

    if (!SUCCEEDED(MFCreateSample(&sample)))
        return E_FAIL;

    if (!(SUCCEEDED(sample->AddBuffer(sampleBuffer))))
        return E_FAIL;


    if(!(SUCCEEDED(sample->SetSampleTime(startTime))))
        return E_FAIL;

    if(!(SUCCEEDED(sample->SetSampleDuration(durationTime))))
        return E_FAIL;

    if(!(SUCCEEDED(writer->WriteSample(/*streamIndex*/ 0, sample))))
        return E_FAIL;

    startTime = startTime  + durationTime;

    //sample->Release();
    //sampleBuffer->Release();

    SafeRelease(&sample);
    SafeRelease(&sampleBuffer);

    return S_OK;
}

SafeRelease的实施是

template <class T> void SafeRelease(T **_object)
{
    if (*_object)
    {
        (*_object)->Release();
        *_object = NULL;
    }
}

我怀疑它与BYTE * dataBuffer有关。我尝试使用delete []关键字将其删除,但它没有任何用处。

1 个答案:

答案 0 :(得分:3)

@jeff回答

如果你的代码是通过整个函数执行并返回S_OK,那么我看不到它,我不相信它在这个函数中。但是你应该修复一个事实,即你有多个退出点而不调用SafeRelease(..)。