Я пишу простой загрузчик AVI, чтобы получить каждый кадр из файла AVI и сохранить его в текстуру OpenGL. Я использую VFW, и AVIStreamRead
ничего не возвращает. Это мой код, который захватывает каждый кадр:
void CVideoControl::SetFrame(long frame)
{
HRESULT result;
long bytes, samples;
//Update variables
m_currentFrame = frame;
m_lastFrameChangeMS = gGlobalData->GetLastFrame();
//Get the frame
result = AVIStreamRead(m_aviStream, m_currentFrame, 1, m_inputTexture, m_videoAdjustedWidth * m_videoAdjustedHeight * 3, &bytes, &samples);
if(FAILED(result))
return;
//Decompress the stream
if(ICDecompress(m_decompressor, 0, m_inFormat, m_inputTexture, m_outFormat, m_outputTexture) != ICERR_OK)
return;
//Draw it to the OpenGL texture
glBindTexture(GL_TEXTURE_2D, m_videoOutputTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_videoAdjustedWidth, m_videoAdjustedHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_outputTexture);
}
Переменная bytes
имеет значение 2740, а samples
равно 1. Однако m_inputTexture
пусто. Это не плохой указатель или что-то в этом роде, он просто... пустой. AVIStreamRead
не возвращает никаких ошибок. В документации , единственное упоминание о том, что данные не читаются:
Если lpBuffer имеет значение NULL, эта функция не читает никаких данных;
Но lpBuffer
не NULL. Я бы разместил больше кода, но он повсюду перемешан. Других явных ошибок больше нигде нет, и отладчик показывает всю правильную информацию.