Функция DrawScene()



Наконец, все готово к отображению кадров видеоролика. Для этого мы подготавливаем и выводим очередной кадр при каждом вызове функции DrawScene() классом DirectDrawWin. Функция DrawScene() выглядит так:

void AviPlayWin::DrawScene() { long r; r=AVIStreamRead( avistream, curframe, 1, rawdata, buflen, 0, 0 ); if (r) { TRACE("AVIStreamRead failed: "); switch (r) { case AVIERR_BUFFERTOOSMALL: TRACE("BUFFERTOOSMALL\n"); break; case AVIERR_MEMORY: TRACE("MEMORY\n"); break; case AVIERR_FILEREAD: TRACE("FILEREAD\n"); break; } } r=ICDecompress( decomp, 0, srcfmt, rawdata, dstfmt, finaldata); UpdateAviSurface(); backsurf->BltFast( x, y, avisurf, 0, DDBLTFAST_WAIT ); curframe=(curframe<endframe) ? curframe+1 : startframe; primsurf->Flip( 0, DDFLIP_WAIT ); }

Функция DrawScene() с помощью функции AVIStreamRead() извлекает очередной кадр из AVI-потока, после чего сохраняет полученные данные в буфере rawdata. Я оставил в ней несколько макросов TRACE(), которые пригодились мне при отладке, но надеюсь, что вам они не понадобятся.
Затем мы вызываем функцию ICDecompress() и передаем ей логический номер декомпрессора, ранее полученный от функции LoadAvi(). Аргументами функции ICDecompress() являются два буфера — первый содержит необработанные (сжатые) данные, а второй — восстановленное изображение.
Функция UpdateAviSurface() копирует восстановленный кадр на поверхность AVI. Эта функция рассматривается ниже.
Подготовленная поверхность AVI копируется во вторичный буфер функцией BltFast() интерфейса DirectDrawSurface. После этого переменная curframe увеличивается или сбрасывается в зависимости от ее значения и количества кадров в ролике. Наконец, функция Flip() интерфейса DirectDrawSurface выводит кадр на экран.


- Начало - - Назад - - Вперед -



Книжный магазин