Почему AVIStreamRead ничего не читает?

Я пишу простой загрузчик 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. Я бы разместил больше кода, но он повсюду перемешан. Других явных ошибок больше нигде нет, и отладчик показывает всю правильную информацию.


person smoth190    schedule 15.05.2012    source источник


Ответы (1)


Различные файлы AVI кодируются с использованием разных кодеков. Возможно, файл, который вы пытаетесь декодировать, не имеет кодека, который может обрабатываться vfw.

Также я бы начал с некоторого рабочего примера кода и постепенно модифицировал его в соответствии со своими потребностями. Когда задействовано видео, слишком много деталей, что делает чистую документацию в основном бесполезной.

person Warpin    schedule 15.05.2012
comment
Я пробовал несколько видео. Когда я использую ICLocate для поиска декомпрессора, он успешно работает с правильными данными. Все работает нормально, пока здесь. Я поищу несколько образцов, но хороших не так много. - person smoth190; 16.05.2012