Я пытаюсь создать IMFSample из CImage, чтобы я мог кодировать видео из серии изображений с помощью 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 , мне было не ясно, каким именно должен быть этот параметр.
Обновление 11 декабря: изменен пример кода с исправлениями, предоставленными @cha и @ roman-r. Все еще получаю ту же ошибку.
Нарушение прав доступа вызвано неверными аргументами. API просто поражает память за пределами буферов источника или назначения.
Вы уже знаете о GetBPP
проблема, которая не маленькая, но серьезная (ваш код должен быть обновлен соответственно).
Еще одна проблема — последняя MFCopyImage
аргумент. Это высота, а не ширина. Поскольку ширина обычно меньше, вы, вероятно, переполните буфер.
Кроме того, вы предполагаете минимальный шаг. По сути, вы можете иметь больший. В этом случае вы увидите перекос на скопированном изображении, а не нарушение прав доступа.
Других решений пока нет …