функции LoadAvi используются функции VFW. Сначала LoadAvi закрывает открытый ранее AVI-поток функцией AVIStreamRelease, а затем открывает новый поток функцией AVIStreamOpenFromFile, которой в числе прочих аргументов передается имя открываемого AVI-файла.
Обратите внимание — третьим аргументом функции AVIStreamOpenFromFile является флаг, определяющий тип открываемого потока. В нашем случае использован флаг видеопотока streamtypeVIDEO, но с помощью трех оставшихся флагов (streamtypeAUDIO, streamtypeMIDI и streamtypeTEXT) можно открывать и потоки других типов.
Затем мы получаем данные о формате потока функцией AVIStreamReadFormat (пользуясь при этом функцией AVIStreamFormatSize). Я специально оставил в этом фрагменте отладочные макросы TRACE, чтобы продемонстрировать, какую информацию можно получить об AVI-файле.
На этой стадии инициализируются некоторые важные переменные класса. Например, мы присваиваем значения переменным startframe и endframe, чтобы во время извлечения кадров были известны допустимые значения их индексов.
Затем мы получаем доступ к декомпрессору. Функция ICDecompressorOpen по структуре, описывающей AVI-файл и желательный формат вывода, возвращает логический номер модуля декомпрессии. Позднее этот модуль используется для восстановления кадров. Наконец, мы выделяем память под два буфера: в одном хранятся необработанные (сжатые) данные, извлеченные из AVI-потока, а в другом — итоговый (восстановленный) кадр.
Функция CreateAviSurface
Теперь у нашего приложения есть открытый AVI-поток и информация в объеме, достаточном для извлечения кадров. Но что же делать с кадром после того, как он будет прочитан и восстановлен? Нам понадобится поверхность для хранения полученных данных, и тогда воспроизведение видеоролика сведется к простому блиттингу содержимого этой поверхности во вторичный буфер приложения с последующим переключением страниц. Эта промежуточная поверхность создается функцией CreateAviSurface: