 
   
 
- Код: Выделить всё
- 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
 };
Заранее благодарен.....Если очень сложно, то хотяб рендеринг....





 
 