首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MFCopyImage的参数正确吗?

MFCopyImage的参数正确吗?
EN

Stack Overflow用户
提问于 2012-12-11 10:43:33
回答 1查看 1.5K关注 0票数 0

我正在尝试从CImage创建一个IMFSample,这样我就可以使用SinkWriter从一系列图像中编码视频。微软在这里有一个如何使用DWORD数组(而不是CIMage)来实现这一点的示例:http://msdn.microsoft.com/en-us/library/windows/desktop/ff819477(v=vs.85).aspx。这样做涉及到使用MFCopyImage(),但我在调用此函数时遇到访问冲突,因此我可能传入了错误的参数。我是C++的新手。

根据他们的样本,这是我得到的:

代码语言:javascript
运行
复制
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提供的更正的代码示例。仍然得到相同的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-11 20:39:31

访问冲突是由错误参数引起的。API只会访问超出源或目标缓冲区的内存。

您已经意识到了GetBPP问题,这个问题不是很小,但很严重(您应该分别更新您的代码片段)。

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

此外,您假定步幅最小。实际上,你可能会有一个更大的。在这种情况下,您将在复制的映像上看到倾斜效果,而不会出现访问冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13812826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档