Чтение онлайн

на главную - закладки

Жанры

Графика для Windows средствами DirectDraw

Трухильо Стэн

Шрифт:

 TRACE("AVIStreamOpenFromFile: %s\n", r==0 ? "OK" : "failed");

 r=AVIStreamFormatSize(avistream, 0, &fmtlen);

 TRACE("AVIStreamFormatSize: %s\n", r==0 ? "OK" : "failed");

 int formatsize=fmtlen+sizeof(RGBQUAD)*256;

 if (srcfmt) delete [] srcfmt;

 srcfmt = (LPBITMAPINFOHEADER)new BYTE[formatsize];

 ZeroMemory(srcfmt, formatsize);

 if (dstfmt) delete [] dstfmt;

 dstfmt = (LPBITMAPINFOHEADER)new BYTE[formatsize];

 ZeroMemory(dstfmt, formatsize);

 r=AVIStreamReadFormat(avistream, 0, srcfmt, &fmtlen);

 TRACE("AVIStreamReadFormat: %s\n", r==0 ? "OK" : "failed");

 TRACE(" --- %s ---\n", filename);

 TRACE(" biSize: %d\n", srcfmt->biSize);

 TRACE(" biWidth x biHeight: %dx%d\n", srcfmt->biWidth, srcfmt->biHeight);

 if (srcfmt->biPlanes != 1) TRACE(" - biPlanes: %d\n", srcfmt->biPlanes);

 TRACE(" biBitCount: %d\n", srcfmt->biBitCount);

 CString comp;

 switch (srcfmt->biCompression) {

 case BI_RGB:

comp="BI_RGB";

break;

 case BI_RLE8:

comp="BI_RLE8";

break;

 case BI_RLE4:

comp="BI_RLE4";

break;

 case BI_BITFIELDS:

comp="BI_BITFIELDS";

break;

 }

 TRACE(" biCompression: %s\n", comp);

 TRACE(" biSizeImage: %d\n", srcfmt->biSizeImage);

 TRACE(" ------------------\n");

 memcpy(dstfmt, srcfmt, fmtlen);

 dstfmt->biBitCount = 8;

 dtfmt->biCompression = BI_RGB;

 dstfmt->biSizeImage = dstfmt->biWidth * dstfmt->biHeight;

 startframe = AVIStreamStart(avistream);

 TRACE("stream start: %d\n", startframe);

 endframe = AVIStreamEnd(avistream);

 TRACE("stream end: %d\n", endframe);

 r=AVIStreamInfo(avistream, &streaminfo, sizeof(streaminfo));

 TRACE("AVIStreamInfo: %s\n", r==0 ? "OK" : "failed" );

 buflen = dstfmt->biSizeImage;

 int finalbuflen=((dstfmt->biWidth+3) & ~3) * dstfmt->biHeight;

 if (streaminfo.dwSuggestedBufferSize) if ((LONG)streaminfo.dwSuggestedBufferSize < buflen) {

TRACE("adjusting buflen to suggested size\n");

buflen = (LONG)streaminfo.dwSuggestedBufferSize;

 }

 if (decomp) ICClose(decomp);

 decomp = ICDecompressOpen(ICTYPE_VIDEO, streaminfo.fccHandler, srcfmt, dstfmt);

 TRACE("ICDecompressOpen: %s\n", decomp ? "OK" : "failed");

 if (rawdata) {

TRACE("delete [] rawdata...\n");

delete [] rawdata;

 }

 rawdata = new BYTE[buflen];

 if (finaldata) {

TRACE("delete [] finaldata...\n");

delete [] finaldata;

 }

 finaldata = new BYTE[finalbuflen];

 return TRUE;

}

В

функции LoadAvi используются функции VFW. Сначала LoadAvi закрывает открытый ранее AVI-поток функцией AVIStreamRelease, а затем открывает новый поток функцией AVIStreamOpenFromFile, которой в числе прочих аргументов передается имя открываемого AVI-файла.

Обратите внимание — третьим аргументом функции AVIStreamOpenFromFile является флаг, определяющий тип открываемого потока. В нашем случае использован флаг видеопотока streamtypeVIDEO, но с помощью трех оставшихся флагов (streamtypeAUDIO, streamtypeMIDI и streamtypeTEXT) можно открывать и потоки других типов.

Затем мы получаем данные о формате потока функцией AVIStreamReadFormat (пользуясь при этом функцией AVIStreamFormatSize). Я специально оставил в этом фрагменте отладочные макросы TRACE, чтобы продемонстрировать, какую информацию можно получить об AVI-файле.

На этой стадии инициализируются некоторые важные переменные класса. Например, мы присваиваем значения переменным startframe и endframe, чтобы во время извлечения кадров были известны допустимые значения их индексов.

Затем мы получаем доступ к декомпрессору. Функция ICDecompressorOpen по структуре, описывающей AVI-файл и желательный формат вывода, возвращает логический номер модуля декомпрессии. Позднее этот модуль используется для восстановления кадров. Наконец, мы выделяем память под два буфера: в одном хранятся необработанные (сжатые) данные, извлеченные из AVI-потока, а в другом — итоговый (восстановленный) кадр.

Функция CreateAviSurface 

Теперь у нашего приложения есть открытый AVI-поток и информация в объеме, достаточном для извлечения кадров. Но что же делать с кадром после того, как он будет прочитан и восстановлен? Нам понадобится поверхность для хранения полученных данных, и тогда воспроизведение видеоролика сведется к простому блиттингу содержимого этой поверхности во вторичный буфер приложения с последующим переключением страниц. Эта промежуточная поверхность создается функцией CreateAviSurface:

Поделиться:
Популярные книги

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Возвращение Безумного Бога

Тесленок Кирилл Геннадьевич
1. Возвращение Безумного Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвращение Безумного Бога

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Санек 4

Седой Василий
4. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 4

Подаренная чёрному дракону

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.07
рейтинг книги
Подаренная чёрному дракону

По дороге на Оюту

Лунёва Мария
Фантастика:
космическая фантастика
8.67
рейтинг книги
По дороге на Оюту

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Конструктор

Семин Никита
1. Переломный век
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Конструктор

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец