// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR // FITNESS FOR A PARTICULAR PURPOSE. // // Copyright © 1996 Microsoft Corporation. All Rights Reserved. // // Modified by Guillaume de Bailliencourt Morgan Multimedia 1998 #include #define NAME "DDExample with AVI's" #define TITLE "Direct Draw Example for WIDTHxHEIGHT and smaller AVI's" // Link with WINMM.LIB and VFW32.LIB #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include #include "resource.h" #ifndef YVU9 #define YVU9 mmioFOURCC('Y','V','U','9') #endif #ifndef Y411 #define Y411 mmioFOURCC('Y','4','1','1') #endif #ifndef YUY2 #define YUY2 mmioFOURCC('Y','U','Y','2') #endif #ifndef YVYU #define YVYU mmioFOURCC('Y','V','Y','U') #endif #ifndef UYVY #define UYVY mmioFOURCC('U','Y','V','Y') #endif #ifndef Y211 #define Y211 mmioFOURCC('Y','2','1','1') #endif #ifndef IF09 #define IF09 mmioFOURCC('I','F','0','9') #endif #ifndef YV12 #define YV12 mmioFOURCC('Y','V','1','2') #endif #define Y41P mmioFOURCC('Y','4','1','P') CHAR szName[MAX_PATH]; CHAR szCodecName[MAX_PATH]; CHAR szCodecDesc[MAX_PATH]; CHAR szCodecMode[MAX_PATH]; DWORD biCompression; #define WM_STARTAVI WM_USER+1 #define WM_STARTAVI1 WM_USER+2 #define WM_STARTAVI2 WM_USER+3 #define WM_STARTAVI3 WM_USER+4 int WIDTH = 0; int HEIGHT = 0; size_t memSize16 = 0; LPDIRECTDRAW lpDD; // DirectDraw object LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw primary surface LPDIRECTDRAWSURFACE lpDDSBack; // DirectDraw back surface LPDIRECTDRAWSURFACE lpDDSSource = NULL; // DirectDraw source AVI surface LPDIRECTDRAWPALETTE lpDDPal; // DirectDraw palette PALETTEENTRY ape[256]; DWORD dwWidth, dwHeight; HWND hwnd; MSG msg; // -- Multimedia/AVI globals PAVISTREAM pas; LONG lFmtLength; LPBITMAPINFOHEADER lpSrcFmt; LPBITMAPINFOHEADER lpCmpFmt; LPBITMAPINFOHEADER lpDecFmt; LONG lLength; AVISTREAMINFO si; AVISTREAMINFO si2; LPBYTE lpSrc, lpDec, lpCmp; LONG lIndex; LONG lFrames; HIC hicd; HIC hicc; OPENFILENAME ofn; HINSTANCE ghInst; RECT rc; RECT rcSrc; #define ERR_IMAGE_SIZE_TOO_LARGE -13 #define ERR_NO_DECOMPRESS_TO_8BIT -14 #define MALLOC(size) (void *)(((unsigned long)malloc(((size / 8) * 8) + 8) + 7) & 0xFFFFFFF8) void Sample(LPSTR szFileName); int SampleInit (const LPBITMAPINFO); void SampleDraw (const LPBYTE); int SampleRun (); int SampleRun2 (); void SampleStream (); void SampleStream1 (); void SampleStream2 (); void SampleStream3 (); BOOL GetOpenAVIFile(); /* * finiObjects * * finished with all objects we use; release them */ static void finiObjects( void ) { if( lpDD != NULL ) { if( lpDDSSource != NULL ) { lpDDSSource->Release(); lpDDSSource = NULL; } if( lpDDSPrimary != NULL ) { lpDDSPrimary->Release(); lpDDSPrimary = NULL; } if( lpDDPal != NULL ) { lpDDPal->Release(); lpDDPal = NULL; } lpDD->Release(); lpDD = NULL; } } /* finiObjects */ /* * restoreAll * * restore all lost objects */ HRESULT restoreAll( void ) { HRESULT ddrval; ddrval = lpDDSPrimary->Restore(); return ddrval; } /* restoreAll */ long FAR PASCAL WindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_SETCURSOR: SetCursor(NULL); return TRUE; case WM_STARTAVI: SampleStream(); break; case WM_STARTAVI1: SampleStream1(); break; case WM_STARTAVI2: SampleStream2(); break; case WM_STARTAVI3: SampleStream3(); break; case WM_KEYDOWN: switch( wParam ) { case VK_ESCAPE: case VK_F12: PostMessage(hWnd, WM_CLOSE, 0, 0); break; } break; case WM_DESTROY: finiObjects(); PostQuitMessage( 0 ); break; } return DefWindowProc(hWnd, message, wParam, lParam); } /* WindowProc */ /* * This function is called if the initialization function fails */ BOOL initFail( HWND hwnd, LPSTR lpszMsg) { finiObjects(); MessageBox( hwnd, lpszMsg, "DirectDraw Init FAILED", MB_OK ); if (hwnd) DestroyWindow( hwnd ); return FALSE; } /* initFail */ /* * doInit - do work required for every instance of the application: * create the window, initialize data */ static BOOL doInit( HINSTANCE hInstance, int nCmdShow ) { WNDCLASS wc; DDSURFACEDESC ddsd; //DDSCAPS ddscaps; HRESULT ddrval; char szMsg[256]; /* * set up and register window class */ wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NAME; wc.lpszClassName = NAME; RegisterClass( &wc ); /* * create a window */ hwnd = CreateWindowEx( 0, NAME, TITLE, WS_POPUP, 0, 0, WIDTH, HEIGHT, NULL, NULL, ghInst = hInstance, NULL ); if( !hwnd ) { return FALSE; } ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); if (!GetOpenAVIFile()) return FALSE; // Cancel pressed DWORD dwResult; dwResult = SampleRun(); if (dwResult) switch(dwResult) { // Problem with file encountered -- shut down gracefully case ERR_IMAGE_SIZE_TOO_LARGE: LoadString(ghInst, IDS_IMAGE2BIG, szName, MAX_PATH); MessageBox(GetDesktopWindow(), szName, NAME, MB_ICONHAND); return FALSE; break; case ERR_NO_DECOMPRESS_TO_8BIT: LoadString(ghInst, IDS_NODECOMPRESS, szName, MAX_PATH); MessageBox(GetDesktopWindow(), szName, NAME, MB_ICONHAND); return FALSE; break; } // Problem with file encountered -- shut down gracefully /* * create the main DirectDraw object */ ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); if( ddrval != DD_OK ) { return initFail(hwnd, "DirectDrawCreate"); } // Get exclusive mode ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_NORMAL); if( ddrval != DD_OK ) { return initFail(hwnd, "SetCooperativeLevel"); } // Create the primary surface ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); if( ddrval != DD_OK ) { wsprintf(szMsg, "CreateSurface 0x%X", ddrval); return initFail(hwnd, szMsg); } PostMessage(hwnd, WM_STARTAVI, 0, 0); return TRUE; } /* doInit */ /* * WinMain - initialization, message loop */ int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { OSVERSIONINFO osv; osv.dwOSVersionInfoSize = sizeof OSVERSIONINFO; GetVersionEx(&osv); if (osv.dwMajorVersion != 4 && osv.dwMinorVersion != 0) { MessageBox(GetDesktopWindow(), "Samples is designed for Windows 95!", NAME, MB_ICONHAND); return 0; } lpCmdLine = lpCmdLine; hPrevInstance = hPrevInstance; if( !doInit( hInstance, nCmdShow ) ) { // Funnel all exits through the same code path PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); } while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /* WinMain */ void GetPaletteFromDIB( LPBITMAPINFO lpbmi) { int i; // loop index, number of colors in color table // get pointer to BITMAPINFO if (lpbmi) { // store RGB triples // into palette for (i = 0; i < 256; i++) { ape[i].peRed = lpbmi->bmiColors[i].rgbRed; ape[i].peGreen = lpbmi->bmiColors[i].rgbGreen; ape[i].peBlue = lpbmi->bmiColors[i].rgbBlue; ape[i].peFlags = 0; } } } int SampleInit (const LPBITMAPINFO bmpFmt) { // SampleInit // if (lpDDSSource) return 1; //Let's set the palette. //GetPaletteFromDIB(bmpFmt); dwWidth = bmpFmt->bmiHeader.biWidth; dwHeight = bmpFmt->bmiHeader.biHeight; if (bmpFmt->bmiHeader.biHeight < 0) dwHeight = -bmpFmt->bmiHeader.biHeight; //lpDDPal->SetEntries(0, 0, 256, ape); DDSURFACEDESC ddsd; HRESULT ddrval; SetRect(&rc,0,0,WIDTH,HEIGHT); SetRect(&rcSrc,0,0,dwWidth,dwHeight); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwHeight = dwHeight; ddsd.dwWidth = dwWidth; ddsd.dwFlags |= DDSD_PIXELFORMAT; ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd.ddpfPixelFormat.dwFourCC = ((LPBITMAPINFOHEADER)bmpFmt)->biCompression; if (!lpDD) return 0; ddrval = lpDD->CreateSurface( &ddsd, &lpDDSSource, NULL ); if( ddrval != DD_OK ) { ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddrval = lpDD->CreateSurface( &ddsd, &lpDDSSource, NULL ); if( ddrval != DD_OK ) { initFail(NULL, "DirectDraw : CreateSurface"); lpDDSSource = NULL; return 0; } } memSize16 = dwWidth * 2 * dwHeight; return 1; } // SampleInit // void SampleDraw_orig (const LPBYTE pbBits) { // SampleDraw // HRESULT ddrval; DDSURFACEDESC ddsd; register BYTE *src, *dst; register int y, row; if (pbBits) { ddsd.dwSize = sizeof(ddsd); ddrval = lpDDSSource->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); if( ddrval == DD_OK ) { row = dwWidth << 1; src = (BYTE *)pbBits + row * dwHeight; dst = (BYTE *)ddsd.lpSurface; y = (int)dwHeight; while(y--) { memcpy(dst, src, row); dst += ddsd.lPitch; src -= row; } lpDDSSource->Unlock(NULL); } } lpDDSPrimary->Blt(&rc, lpDDSSource, &rcSrc, DDBLT_WAIT, NULL); // Flip the surfaces while( 1 ) { ddrval = lpDDSPrimary->Flip( NULL, 0 ); if( ddrval == DD_OK ) { break; } if( ddrval == DDERR_SURFACELOST ) { ddrval = restoreAll(); if( ddrval != DD_OK ) { break; } } if( ddrval != DDERR_WASSTILLDRAWING ) { break; } } } // SampleDraw // void SampleDraw (const LPBYTE pbBits) { // SampleDraw // DDSURFACEDESC ddsd; if (pbBits) { ddsd.dwSize = sizeof(ddsd); if (lpDDSSource->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) == DD_OK) { ICDecompress(hicd, 0, lpSrcFmt, pbBits, lpDecFmt, ddsd.lpSurface); lpDDSSource->Unlock(NULL); } } lpDDSPrimary->Blt(&rc, lpDDSSource, &rcSrc, DDBLT_WAIT, NULL); } // SampleDraw2 // // // Display the open dialog box to retrieve the user-selected AVI // BOOL GetOpenAVIFile() { // GetOpenAVIFile // ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = GetDesktopWindow(); ofn.lpstrFilter = NULL; ofn.lpstrFilter = "Video (*.avi)\0*.AVI\0All Files (*.*)\0*.*\0"; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 1; ofn.lpstrFile = (LPSTR)szName; ofn.nMaxFile = 128; ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = NULL; ofn.lpstrFileTitle = NULL; ofn.lpstrDefExt = NULL; ofn.Flags = OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST; return GetOpenFileName((LPOPENFILENAME)&ofn); } // GetOpenAVIFile // int SampleRun () { // SampleRun // AVIFileInit(); AVIStreamOpenFromFile(&pas, ofn.lpstrFile, streamtypeVIDEO, 0, OF_READ | OF_SHARE_EXCLUSIVE, NULL); AVIStreamFormatSize(pas, 0, &lFmtLength); lpSrcFmt = (LPBITMAPINFOHEADER)MALLOC(lFmtLength); lpDecFmt = (LPBITMAPINFOHEADER)MALLOC(lFmtLength); AVIStreamReadFormat(pas, 0, lpSrcFmt, &lFmtLength); lFrames = AVIStreamLength(pas); #define QUALITY 7500 memcpy(lpDecFmt, lpSrcFmt, lFmtLength); lpDecFmt->biSize = sizeof(BITMAPINFOHEADER); //lpDecFmt->biBitCount = 9; lpDecFmt->biBitCount = 16; //lpDecFmt->biBitCount = 12; //lpDecFmt->biBitCount = 24; //lpDecFmt->biBitCount = 32; //lpDecFmt->biCompression = UYVY; lpDecFmt->biCompression = YUY2; //lpDecFmt->biCompression = IF09; //lpDecFmt->biCompression = YV12; //lpDecFmt->biCompression = Y41P; //lpDecFmt->biCompression = BI_RGB; //lpDecFmt->biCompression = BI_BITFIELDS; // CIF to QCIF ... /*lpSrcFmt->biWidth /= 2; if (lpSrcFmt->biWidth == 360) lpSrcFmt->biWidth == 352; lpSrcFmt->biHeight /= 2; lpDecFmt->biWidth = lpSrcFmt->biWidth; lpDecFmt->biHeight = lpSrcFmt->biHeight;*/ WIDTH = lpDecFmt->biWidth; HEIGHT = lpDecFmt->biHeight; SetWindowPos(hwnd, 0, 0, 0, WIDTH, HEIGHT, SWP_NOMOVE | SWP_NOZORDER); lpDecFmt->biSizeImage = lpDecFmt->biHeight * lpDecFmt->biWidth * (lpDecFmt->biBitCount / 8); biCompression = lpDecFmt->biCompression; if (biCompression == BI_RGB) biCompression = mmioFOURCC('R','G','B',' '); if (biCompression == BI_BITFIELDS) biCompression = mmioFOURCC('R','G','B','2'); AVIStreamInfo(pas, &si, AVIStreamInfo(pas, NULL, 0)); lLength = (ULONG)lpSrcFmt->biSizeImage; if (si.dwSuggestedBufferSize) if ((LONG)si.dwSuggestedBufferSize < lLength) lLength = (LONG)si.dwSuggestedBufferSize; if (!lLength) lLength = (ULONG)(lpSrcFmt->biHeight * lpSrcFmt->biWidth * ((lpSrcFmt->biBitCount / 8) + (lpSrcFmt->biBitCount % 8))); lpSrc = (LPBYTE)MALLOC(lLength); lpDec = (LPBYTE)MALLOC(lpDecFmt->biSizeImage); //if (lpDecFmt->biHeight > 0) // lpDecFmt->biHeight = -lpDecFmt->biHeight; //hicd = ICDecompressOpen(ICTYPE_VIDEO, si.fccHandler, lpSrcFmt, lpDecFmt); hicd = ICOpen(ICTYPE_VIDEO, si.fccHandler, ICMODE_DECOMPRESS); hicc = ICOpen(ICTYPE_VIDEO, si.fccHandler, ICMODE_COMPRESS); long lSize = ICCompressGetFormat(hicc, lpDecFmt, NULL); if (lSize <= 0) { lpCmpFmt = (LPBITMAPINFOHEADER)MALLOC(lFmtLength); memcpy(lpCmpFmt, lpSrcFmt, lFmtLength); } else { lpCmpFmt = (LPBITMAPINFOHEADER)MALLOC(lFmtLength); ICCompressGetFormat(hicc, lpDecFmt, lpCmpFmt); } lpCmp = (LPBYTE)MALLOC(lpCmpFmt->biSizeImage); lpCmpFmt->biHeight = abs(lpCmpFmt->biHeight); char szMsg[256]; ICINFO icinfo; ICGetInfo(hicd, &icinfo, sizeof(icinfo)); wsprintf(szCodecName, "%S", icinfo.szName); wsprintf(szCodecDesc, "%S", icinfo.szDescription); WritePrivateProfileString((LPSTR)szCodecName, "description", (LPSTR)szCodecDesc, "codec.ini"); wsprintf(szMsg, "%S %S", icinfo.szName, icinfo.szDescription); MessageBox(hwnd, szMsg, "icinfo", 0); // lpSrcFmt = (LPBITMAPINFOHEADER)realloc(lpSrcFmt, lFmtLength); // ICDecompressGetPalette(hicd, lpSrcFmt, lpDecFmt); return 0; } // SampleRun // void SampleStream () { // SampleStream // int start, time, fps; char szMsg[256]; register int count; lIndex = 0; count = lFrames; start = clock(); while (count--) { // Extract individual frame! AVIStreamRead(pas, lIndex++, 1, lpSrc, lLength, NULL, NULL); } // Extract individual frame! time = clock() - start; if (time == 0) time++; fps = MulDiv(lFrames, 10000, time); wsprintf(szCodecMode, "%ldx%ldx%hu %4.4s NoDecomp/NoDraw", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression); wsprintf(szMsg, "%ld.%ld fps", fps / 10, fps % 10); WritePrivateProfileString((LPSTR)szCodecName, (LPSTR)szCodecMode, (LPSTR)szMsg, "codec.ini"); wsprintf(szMsg, "No Decomp/No Draw\n%ldx%ldx%hu %4.4s\n\n%ld.%ld fps", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression, fps / 10, fps % 10); MessageBox(hwnd, szMsg, "Result", 0); PostMessage(hwnd, WM_STARTAVI1, 0, 0); //PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); } // SampleStream // void SampleStream1 () { // SampleStream // int start, time, fps; char szMsg[256]; register int count; DWORD dwFlags; DWORD dwCkID; DDSURFACEDESC ddsd; lIndex = 0; count = lFrames; ICDecompressBegin(hicd,lpSrcFmt, lpDecFmt); start = clock(); while (count--) { // Extract individual frame! AVIStreamRead(pas, lIndex++, 1, lpSrc, lLength, NULL, NULL); ICDecompress(hicd, 0, lpSrcFmt, lpSrc, lpDecFmt, lpDec); } // Extract individual frame! time = clock() - start; ICDecompressEnd(hicd); if (time == 0) time++; fps = MulDiv(lFrames, 10000, time); wsprintf(szCodecMode, "%ldx%ldx%hu %4.4s NoDraw", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression); wsprintf(szMsg, "%ld.%ld fps", fps / 10, fps % 10); WritePrivateProfileString((LPSTR)szCodecName, (LPSTR)szCodecMode, (LPSTR)szMsg, "codec.ini"); wsprintf(szMsg, "No Draw\n%ldx%ldx%hu %4.4s\n\n%ld.%ld fps", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression, fps / 10, fps % 10); MessageBox(hwnd, szMsg, "Result", 0); // #### // PostMessage(hwnd, WM_STARTAVI2, 0, 0); // return; lIndex = 0; count = lFrames; ICCompressBegin(hicc, lpDecFmt, lpCmpFmt); start = clock(); while (count--) { // Extract individual frame! ICCompress(hicc, ICCOMPRESS_KEYFRAME, lpCmpFmt, lpCmp, lpDecFmt, lpDec, &dwCkID, &dwFlags, lIndex++, 0, QUALITY, NULL, NULL); } // Extract individual frame! time = clock() - start; ICCompressEnd(hicc); if (time == 0) time++; fps = MulDiv(lFrames, 10000, time); wsprintf(szCodecMode, "%ldx%ldx%hu %4.4s NoDraw", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression); wsprintf(szMsg, "%ld.%ld fps", fps / 10, fps % 10); WritePrivateProfileString((LPSTR)szCodecName, (LPSTR)szCodecMode, (LPSTR)szMsg, "codec.ini"); wsprintf(szMsg, "Compress No Draw\n%ldx%ldx%hu %4.4s\n\n%ld.%ld fps", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression, fps / 10, fps % 10); MessageBox(hwnd, szMsg, "Result", 0); if (SampleInit((LPBITMAPINFO)lpDecFmt)) { ddsd.dwSize = sizeof(ddsd); lIndex = 0; count = lFrames; ICDecompressBegin(hicd,lpSrcFmt, lpDecFmt); ICCompressBegin(hicc, lpDecFmt, lpCmpFmt); start = clock(); while (count--) { // Extract individual frame! AVIStreamRead(pas, lIndex++, 1, lpSrc, lLength, NULL, NULL); ICDecompress(hicd, 0, lpSrcFmt, lpSrc, lpDecFmt, lpDec); ICCompress(hicc, ICCOMPRESS_KEYFRAME, lpCmpFmt, lpCmp, lpDecFmt, lpDec, &dwCkID, &dwFlags, lIndex, 0, QUALITY, NULL, NULL); if (lpDDSSource->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) == DD_OK) { ICDecompress(hicd, 0, lpCmpFmt, lpCmp, lpDecFmt, ddsd.lpSurface); lpDDSSource->Unlock(NULL); lpDDSPrimary->Blt(&rc, lpDDSSource, &rcSrc, DDBLT_WAIT, NULL); } } // Extract individual frame! time = clock() - start; ICCompressEnd(hicc); ICDecompressEnd(hicd); if (time == 0) time++; fps = MulDiv(lFrames, 10000, time); wsprintf(szCodecMode, "%ldx%ldx%hu %4.4s NoDraw", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression); wsprintf(szMsg, "%ld.%ld fps", fps / 10, fps % 10); WritePrivateProfileString((LPSTR)szCodecName, (LPSTR)szCodecMode, (LPSTR)szMsg, "codec.ini"); wsprintf(szMsg, "Decompress/Compress/Decompress DirectDraw\n%ldx%ldx%hu %4.4s\n\n%ld.%ld fps", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression, fps / 10, fps % 10); MessageBox(hwnd, szMsg, "Result", 0); } PostMessage(hwnd, WM_STARTAVI2, 0, 0); // PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); } // SampleStream // void SampleStream2 () { // SampleStream // if (SampleInit((LPBITMAPINFO)lpDecFmt)) { DDSURFACEDESC ddsd; int start, time, fps; char szMsg[256]; register int count; lIndex = 0; count = lFrames; ddsd.dwSize = sizeof(ddsd); ICDecompressBegin(hicd,lpSrcFmt, lpDecFmt); start = clock(); while (count--) { // Extract individual frame! AVIStreamRead(pas, lIndex++, 1, lpSrc, lLength, NULL, NULL); //SampleDraw2(lpSrc); if (lpDDSSource->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) == DD_OK) { ICDecompress(hicd, 0, lpSrcFmt, lpSrc, lpDecFmt, ddsd.lpSurface); lpDDSSource->Unlock(NULL); lpDDSPrimary->Blt(&rc, lpDDSSource, &rcSrc, DDBLT_WAIT, NULL); } } // Extract individual frame! time = clock() - start; ICDecompressEnd(hicd); if (time == 0) time++; fps = MulDiv(lFrames, 10000, time); ICClose(hicd); ICClose(hicc); //AVIStreamRelease(pas); //AVIFileExit(); wsprintf(szCodecMode, "%ldx%ldx%hu %4.4s DirectDraw", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression); wsprintf(szMsg, "%ld.%ld fps", fps / 10, fps % 10); WritePrivateProfileString((LPSTR)szCodecName, (LPSTR)szCodecMode, (LPSTR)szMsg, "codec.ini"); wsprintf(szMsg, "DirectDraw\n%ldx%ldx%hu %4.4s\n\n%ld.%ld fps", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression, fps / 10, fps % 10); MessageBox(hwnd, szMsg, "Result", 0); } PostMessage(hwnd, WM_STARTAVI3, 0, 0); // PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); } // SampleStream // void SampleStream3 () { // SampleStream // HANDLE ghdd; HDC hdc; int start, time, fps; char szMsg[256]; register int count; lIndex = 0; count = lFrames; hdc = GetDC(hwnd); ghdd = DrawDibOpen(); DrawDibBegin(ghdd, hdc, -1, -1, lpSrcFmt, -1, -1, 0); start = clock(); while (count--) { // Extract individual frame! AVIStreamRead(pas, lIndex++, 1, lpSrc, lLength, NULL, NULL); DrawDibDraw(ghdd, hdc, 0, 0, -1, -1, lpSrcFmt, lpSrc, 0, 0, -1, -1, DDF_SAME_HDC | DDF_SAME_DRAW); } // Extract individual frame! time = clock() - start; if (time == 0) time++; fps = MulDiv(lFrames, 10000, time); DrawDibClose(ghdd); ReleaseDC(hwnd, hdc); AVIStreamRelease(pas); AVIFileExit(); wsprintf(szCodecMode, "%ldx%ldx%hu %4.4s DrawDib", lpDecFmt->biWidth, lpDecFmt->biHeight, lpDecFmt->biBitCount, &biCompression); wsprintf(szMsg, "%ld.%ld fps", fps / 10, fps % 10); WritePrivateProfileString((LPSTR)szCodecName, (LPSTR)szCodecMode, (LPSTR)szMsg, "codec.ini"); wsprintf(szMsg, "DrawDib\n%ldx%ldx%hu %4.4s\n\n%ld.%ld fps", lpSrcFmt->biWidth, lpSrcFmt->biHeight, lpSrcFmt->biBitCount, &lpSrcFmt->biCompression, fps / 10, fps % 10); MessageBox(hwnd, szMsg, "Result", 0); PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); } // SampleStream //