Я пишу рендерер DX9 и в настоящее время работаю над возможностью воспроизведения файлов фильмов AVI.Я смог извлечь любой указанный кадр, используя AVIStreamGetFrame()
, который возвращает упакованный DIB, и оттуда я хочу иметь возможность скопировать эти растровые данные в уже существующий IDirect3DTexture9 *
.
Моя проблемаНедостаточное понимание формата файла растрового изображения и знание того, как преобразовать данные пикселей, передаваемые из BITMAPINFOHEADER
, в формат, который может интерпретировать IDirect3DTexture9
.
Сначала я создаю свою текстуру DX9 следующим образом:
LPBITMAPINFO bmpInfo = m_pVideoData->GetVideoFormat();
D3DXCreateTexture(LtGEngine::GetInstance()->GetDevice(),
bmpInfo->bmiHeader.biWidth,
bmpInfo->bmiHeader.biHeight,
D3DX_DEFAULT,
0,
D3DFMT_A8R8G8B8, // <- DETERMINE HOW?
D3DPOOL_MANAGED, // <- OR D3DPOOL_SYSTEMMEM?
&m_pD3DTexture);
Вопросы, которые у меня есть, перечислены в комментариях выше.Когда я получаю BITMAPINFO и, например, он читает bmpInfo.bmiHeader.biBitCount = 8 (или 16 и т. Д.), Означает ли это, что мне нужно соответственно изменить D3DFMT_ *?
Позже, когда я получу LPBITMAPINFOHEADER
для кадра, который я хочу визуализировать, я теряюсь в том, что делать с pBits
, возвращенным из функции IDirect3DTexture9::LockRect()
.Вот что у меня есть:
// Retrieve a frame from the video data as a BITMAPINFOHEADER
LPBITMAPINFOHEADER pBmpInfoHeader;
m_pVideoData->GetVideoFrame(0, 0, &pBmpInfoHeader);
D3DLOCKED_RECT rect;
if(FAILED(m_pD3DTexture->LockRect(0, &rect, NULL, 0)))
{
m_pD3DTexture->UnlockRect(0);
}
DWORD* pDest = (DWORD*)rect.pBits;
// Now what to copy from pBmpInfoHeader?
Есть ли какие-либо вызовы API, которые делают это для меня, чего я не видел?Или кто-нибудь знает более легкий путь, чем этот?Спасибо за чтение / помощь.