Правильные параметры для MFCopyImage?

Я пытаюсь создать 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. Все еще получаю ту же ошибку.

0

Решение

Нарушение прав доступа вызвано неверными аргументами. API просто поражает память за пределами буферов источника или назначения.

Вы уже знаете о GetBPP проблема, которая не маленькая, но серьезная (ваш код должен быть обновлен соответственно).

Еще одна проблема — последняя MFCopyImage аргумент. Это высота, а не ширина. Поскольку ширина обычно меньше, вы, вероятно, переполните буфер.

Кроме того, вы предполагаете минимальный шаг. По сути, вы можете иметь больший. В этом случае вы увидите перекос на скопированном изображении, а не нарушение прав доступа.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]