- Код: Выделить всё
PAVISTREAM m_paviStream; // AVI поток
PGETFRAME m_pgfFrame; // Указатель на текущий кадр в потоке
AVISTREAMINFO m_psiStreamInfo; // Информация о потоке
float Left=10; // Координаты полигона на экране.
float Top=10;
float Right=200;
float Bottom=200;
D3DTLVERTEX Rect[4];
1 этап. Загрузка.
Load()
{
// создаем пустую текстуру размером 128х128. Эта текстура и будет содержать в себе текущий кадр AVI файла D3DTextr_CreateEmptyTexture("videotexture", 128, 128, 0,D3DTEXTR_16BITSPERPIXEL );
// инициализируем библиотеку для работы с AVI
AVIFileInit();
// загружаем файл test.avi как поток.
AVIStreamOpenFromFile( &m_paviStream, "test.avi",streamtypeVIDEO, 0, OF_READ, NULL );
// Ссылку на текущий кадр приводим в начало потока
m_pgfFrame = AVIStreamGetFrameOpen( m_paviStream, NULL );
// получаем информацию об AVI файле.
AVIStreamInfo( m_paviStream, &m_psiStreamInfo,sizeof(AVISTREAMINFO));
}
2 этап. Рендеринг.
Render(IDirect3DDevice7* lpDevice)
{
// получаем поверхность (surface) текстуры
LPDIRECTDRAWSURFACE7 pddsTexture = D3DTextr_GetSurface("videotexture");
DDSURFACEDESC2 ddsd; // переменная, содержащая информацию о текстуре
ddsd.dwSize = sizeof(DDSURFACEDESC2);
// лоччим(lock) текстуру, т.е. открываем ее для попиксельного редактирования.
pddsTexture->Lock( NULL, &ddsd, DDLOCK_WAIT | DDLOCK_WRITEONLY, NULL );
// является ли текстура в формате 565 ? Дело в том что твой ускоритель может
// выбрать разные форматы для текстур. В то время как сам direct3D может избрать
// другой формат.
BOOL bTextureIs565 = (ddsd.ddpfPixelFormat.dwGBitMask==0x7E0)?TRUE:FALSE;
// Сохраняем время начала проигрывания файла
static FLOAT fAVIStartTime = ((FLOAT)clock())/CLOCKS_PER_SEC;
//Используем таймер для определения кадра, который нужно рендерить в данный момент.
FLOAT fCurrTime = ((FLOAT)clock())/CLOCKS_PER_SEC;
FLOAT fElapsedTime = fCurrTime-fAVIStartTime;
FLOAT fAVITimeScale = ((FLOAT)m_psiStreamInfo.dwRate) / m_psiStreamInfo.dwScale;
DWORD dwCurrFrame = (DWORD)( fElapsedTime * fAVITimeScale );
//Если мы достигли конца файла, то проигрываем его заново
if( dwCurrFrame >= m_psiStreamInfo.dwLength )
{
fAVIStartTime = ((FLOAT)clock())/CLOCKS_PER_SEC;
dwCurrFrame = m_psiStreamInfo.dwStart + 1;
}
//Получаем ссылку на текущий кадр в файле
BITMAPINFO* pbmi;
pbmi = (BITMAPINFO*)AVIStreamGetFrame( m_pgfFrame, dwCurrFrame );
//Ссылки на источник и приемник сюрфейса текстуры.
// В источнике пропускаем заголовок.
WORD* pSrc = (WORD*)( sizeof(BITMAPINFO) + (BYTE*)pbmi );
WORD* pDest = (WORD*)ddsd.lpSurface;
// Если формат тектсуры 565, то копируем текстуру попиксельно,
// в противном случаем копируем куском, без преобразований.
if( bTextureIs565 )
{
for( DWORD i=0; i < 128*128; i++ )
{
WORD color = *pSrc++;
*pDest++ = ((color & 0x1F)|((color & 0xFFE0)<<1));
}
}
else
memcpy( pDest, pSrc, sizeof(WORD)*128*128 );
// Разлочиваем (unlock) текстуру. Попиксельная обработка закончилась.
pddsTexture->Unlock(NULL);
// делаем текущей текстуру "videotexture"
lpDevice->SetTexture( 0, D3DTextr_GetSurface("videotexture" ));
// инициализируем полигон для наложения текстуры на него.
Rect[0] = D3DTLVERTEX(D3DVECTOR(Left,Bottom,0.11f),0.5f,0xffffffff,0,0,1);
Rect[1] = D3DTLVERTEX(D3DVECTOR(Left,Top,0.11f),0.5f,0xffffffff,0,0,0);
Rect[2] = D3DTLVERTEX(D3DVECTOR(Right,Bottom,0.11f),0.5f,0xffffffff,0,1,1);
Rect[3] = D3DTLVERTEX(D3DVECTOR(Right,Top,0.11f),0.5f,0xffffffff,0,1,0);
Rect[0].tu=0.0f;Rect[0].tv=0.0f;
Rect[1].tu=0.0f;Rect[1].tv=1.0f;
Rect[2].tu=0.99f;Rect[2].tv=0.0f;
Rect[3].tu=0.99f;Rect[3].tv=1.0f;
// отрисовываем полигон.
lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_TLVERTEX,Rect,4,0);
// убираем текущую текстуру
lpDevice->SetTexture( 0, NULL );
}
3 этап. Выгрузка
Restore()
{
AVIStreamRelease( m_paviStream ); // освобождаем AVI поток
AVIFileExit(); // закрываем библиотеку для работы с AVI
};
Заранее благодарен.....Если очень сложно, то хотяб рендеринг....