更正MFCopyImage的参数?

时间:2012-12-11 02:43:33

标签: c++ winapi mfc ms-media-foundation

我正在尝试从CImage创建一个IMFSample,以便我可以使用SinkWriter从一系列图像中编码视频。 Microsoft在这里有一个如何使用DWORD数组(而不是CIMage)执行此操作的示例:http://msdn.microsoft.com/en-us/library/windows/desktop/ff819477(v=vs.85).aspx。这样做涉及使用MFCopyImage(),但在调用此函数时我得到一个访问违规,所以我可能传递了错误的参数。我是C ++的新手。

从他们的样本开始,这就是我所拥有的:

CImage *img = LoadImage();

IMFSample *pSample = NULL;
IMFMediaBuffer *pBuffer = NULL;

const LONG cbWidth = img->GetBPP() / 8 * img->GetWidth();
const DWORD cbBuffer = cbWidth * img->GetHeight();

BYTE *pData = NULL;
HRESULT hr = MFCreateMemoryBuffer(cbBuffer, &pBuffer);

if (SUCCEEDED(hr))
{
    hr = pBuffer->Lock(&pData, NULL, NULL);
}

if (SUCCEEDED(hr))
{
    hr = MFCopyImage(
        pData,                     
        cbWidth,                    
        (BYTE*)img->GetBits(),   
        cbWidth,                   
        cbWidth,                    
        img->GetHeight()
        ); // ACCESS VIOLATION HERE!
}
if (pBuffer)
{
    pBuffer->Unlock();
}

任何人都知道为什么这会让我获得一次访问权利?我是否传递了正确的价值观,特别是对于大踏步前进?基于此文档:http://msdn.microsoft.com/en-us/library/windows/desktop/bb970554(v=vs.85).aspx,我不清楚这个参数应该是什么。

12月11日更新:更改了代码示例,其中包含@cha和@ roman-r提供的更正。仍然得到同样的错误。

1 个答案:

答案 0 :(得分:0)

访问冲突是由错误的参数引起的。 API只会在源缓冲区或目标缓冲区之外的内存中命中。

您已经知道GetBPP问题,这个问题不小但很严重(您应该分别更新代码段)。

另一个问题是最后一个MFCopyImage参数。这是高度,而不是宽度。由于宽度通常较小,因此可能会出现缓冲区溢出。

另外,你假设步幅最小。实际上你可能有一个更大的。在这种情况下,您会看到对复制图像的偏斜效果,而不是访问冲突。