/* ************************************************************************* ** INTEL Corporation Proprietary Information ** ** This listing is supplied under the terms of a license ** agreement with INTEL Corporation and may not be copied ** nor disclosed except in accordance with the terms of ** that agreement. ** ** Copyright (c) 1995 Intel Corporation. ** All Rights Reserved. ** ** ************************************************************************* */ // $Author: KLILLEVO $ // $Date: 31 Oct 1996 10:12:46 $ // $Archive: S:\h26x\src\common\cdrvbase.cpv $ // $Header: S:\h26x\src\common\cdrvbase.cpv 1.25 31 Oct 1996 10:12:46 KLILLEVO $ // $Log: S:\h26x\src\common\cdrvbase.cpv $ // // Rev 1.25 31 Oct 1996 10:12:46 KLILLEVO // changed from DBOUT to DBgLog // // Rev 1.24 04 Oct 1996 16:11:54 JMCVEIGH // In DrvOpen(), DecompPtr is now allocated if dwFlags indicate // ICMODE_DECOMPRESS *and* ICMODE_COMPRESS. After installing the ClearVideo // encoder, Adobe's Premiere would crash when compressing with the off-line. // Crash was due to accessing an unallocated version of DecompPtr. // Raj believes ClearVideo installed DCI. Possible penalty of this fix // is that we might allocate a decoder instance that is never used. // // Rev 1.23 26 Sep 1996 14:46:48 MBODART // Simplified version number definitions. // Bumped H.261 major version number to 4, reset build number to 001. // // Rev 1.22 12 Sep 1996 13:54:06 KLILLEVO // changed to Win32 memory allocation // // Rev 1.21 03 Sep 1996 16:17:58 PLUSARDI // updated for version 2.50 of 263 net // // Rev 1.20 23 Aug 1996 13:44:56 SCDAY // added version numbers for Quartz using #ifdef QUARTZ // // Rev 1.19 22 Aug 1996 10:17:14 PLUSARDI // updated for quartz version 3.05 for h261 // // Rev 1.18 16 Aug 1996 11:31:28 CPERGIEX // updated not non-quartz build // // Rev 1.17 30 Jul 1996 12:57:22 PLUSARDI // updated for RTP version string // // Rev 1.16 11 Jul 1996 07:54:18 PLUSARDI // change the version number for h261 v3.05.003 // // Rev 1.15 12 Jun 1996 09:47:22 KLILLEVO // updated version number // // Rev 1.14 28 Apr 1996 20:25:36 BECHOLS // // Merged the RTP code into the Main Base. // // Rev 1.13 21 Feb 1996 11:40:58 SCDAY // cleaned up compiler build warnings by putting ifdefs around definition of b // // Rev 1.12 02 Feb 1996 18:52:22 TRGARDOS // Added code to enable ICM_COMPRESS_FRAMES_INFO message. // // Rev 1.11 27 Dec 1995 14:11:36 RMCKENZX // // Added copyright notice // // Rev 1.10 13 Dec 1995 13:21:52 DBRUCKS // changed the h261 version string defintions to use V3.00 // // Rev 1.9 01 Dec 1995 15:16:34 DBRUCKS // added VIDCF_QUALITY to support the quality slider. // // Rev 1.8 15 Nov 1995 15:58:56 AKASAI // Remove YVU9 from get info and return error "0" when unsupported. // (Integration point) // // Rev 1.7 09 Oct 1995 11:46:56 TRGARDOS // // Set VIDCF_CRUNCH flag to support bit rate control. // // Rev 1.6 20 Sep 1995 12:37:38 DBRUCKS // save the fcc in uppercase // // Rev 1.5 19 Sep 1995 15:41:00 TRGARDOS // Fixed four cc comparison code. // // Rev 1.4 19 Sep 1995 13:19:50 TRGARDOS // Changed drv_open to check ICOPEN flags. // // Rev 1.3 12 Sep 1995 15:45:38 DBRUCKS // add H261 ifdef to desc and name // // Rev 1.2 25 Aug 1995 11:53:00 TRGARDOS // Debugging key frame encoder. // // Rev 1.1 23 Aug 1995 12:27:16 DBRUCKS // // turn on color converter init // // Rev 1.0 31 Jul 1995 12:56:10 DBRUCKS // rename files // // Rev 1.1 21 Jul 1995 18:20:36 DBRUCKS // IsBadReadPtr fails with a NULL - protect against // // Rev 1.0 17 Jul 1995 14:43:58 CZHU // Initial revision. // // Rev 1.0 17 Jul 1995 14:14:28 CZHU // Initial revision. ;//////////////////////////////////////////////////////////////////////////// #include "precomp.h" #ifdef H261 #ifdef QUARTZ char szDescription[] = "Microsoft H.261 Video Codec"; char szDesc_i420[] = "Intel 4:2:0 Video V3.05"; char szName[] = "MS H.261"; #else char szDescription[] = "Microsoft H.261 Video Codec"; char szDesc_i420[] = "Intel 4:2:0 Video V3.00"; char szName[] = "MS H.261"; #endif #else // is H263 #ifdef QUARTZ char szDescription[] = "Microsoft H.263 Video Codec"; char szDesc_i420[] = "Intel 4:2:0 Video V2.55"; char szName[] = "MS H.263"; #else char szDescription[] = "Microsoft H.263 Video Codec"; char szDesc_i420[] = "Intel 4:2:0 Video V2.50"; char szName[] = "MS H.263"; #endif #endif static U32 MakeFccUpperCase(U32 fcc); void MakeCode32(U16 selCode16) { BYTE desc[8]; #define DSC_DEFAULT 0x40 #define dsc_access 6 GlobalReAlloc((HGLOBAL)selCode16, 0, GMEM_MODIFY|GMEM_MOVEABLE); _asm { mov bx, selCode16 ; bx = selector lea di, word ptr desc ; ES:DI --> desciptor mov ax,ss mov es,ax mov ax, 000Bh ; DPMI get descriptor int 31h ; set DEFAULT bit to make it a 32-bit code segment or desc.dsc_access,DSC_DEFAULT mov ax,000Ch ; DPMI set descriptor int 31h } } /****************************************************** * DrvLoad() ******************************************************/ BOOL PASCAL DrvLoad(void) { static int AlreadyInitialised = 0; if (!AlreadyInitialised) { AlreadyInitialised = 1; // H263InitDecoderGlobal(); H263InitColorConvertorGlobal (); H263InitEncoderGlobal(); } return TRUE; } ;//////////////////////////////////////////////////////////////////////////// ;// Function: void PASCAL DrvFree(void); ;// ;// Description: Added header. ;// ;// History: 02/23/94 -BEN- ;//////////////////////////////////////////////////////////////////////////// void PASCAL DrvFree(void) { return; } /********************************************************** * DrvOpen() * Arguments: * Pointer to ICOPEN data structure passed by * the system. * Returns: * If successful, returns a pointer to our INSTINFO data structure. That * will be passed back to us in the dwDriverID parameter on subsequent * system calls. * If unsuccessful, it returns NULL. **********************************************************/ LPINST PASCAL DrvOpen(ICOPEN FAR * icinfo) { INSTINFO *lpInst; #ifdef _DEBUG char buf80[80]; #endif // Allocate memory for our instance information structure, INSTINFO. if((lpInst = (INSTINFO *) HeapAlloc(GetProcessHeap(), 0, sizeof(INSTINFO))) == NULL){ DBOUT("DrvOpen: Unable to ALLOC INSTINFO") return NULL; } /* * Store the four cc so we know which codec is open. * TODO: handle both lower case and upper case fourcc's. */ lpInst->fccHandler = MakeFccUpperCase(icinfo->fccHandler); #ifdef _DEBUG wsprintf(buf80,"fccHandler=0x%lx",lpInst->fccHandler); DBOUT(buf80); #endif lpInst->CompPtr = NULL; lpInst->DecompPtr = NULL; // Check if being opened for decompression. if ( ((icinfo->dwFlags & ICMODE_DECOMPRESS) == ICMODE_DECOMPRESS) || ((icinfo->dwFlags & ICMODE_FASTDECOMPRESS) == ICMODE_FASTDECOMPRESS) ){ // Allocate memory for our decompressor specific instance data, DECINSTINFO. if((lpInst->DecompPtr = (DECINSTINFO *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DECINSTINFO))) == NULL){ DBOUT("DrvOpen: Unable to ALLOC DECINSTINFO") HeapFree(GetProcessHeap(),0,lpInst); return NULL; } // Set flag indicating decoder instance is unitialized. lpInst->DecompPtr->Initialized = FALSE; } // Check if being opened for compression as H.263. if( (((icinfo->dwFlags & ICMODE_COMPRESS) == ICMODE_COMPRESS) || ((icinfo->dwFlags & ICMODE_FASTCOMPRESS) == ICMODE_FASTCOMPRESS)) && (lpInst->fccHandler == FOURCC_H263) ) { // Allocate memory for our compressor specific instance data, COMPINSTINFO. if((lpInst->CompPtr = (COMPINSTINFO*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(COMPINSTINFO))) == NULL){ DBOUT("DrvOpen: Unable to ALLOC COMPINSTINFO") if (lpInst->DecompPtr != NULL) HeapFree(GetProcessHeap(),0,lpInst->DecompPtr); HeapFree(GetProcessHeap(),0,lpInst); return NULL; } // Set flag indicating encoder instance is uninitialized. lpInst->CompPtr->Initialized = FALSE; lpInst->CompPtr->FrameRate = (float) 0; lpInst->CompPtr->DataRate = 0; #if 0 // Allocate memory for our decompressor specific instance data, DECINSTINFO. // Previously we didn't force this - assumed application specified // decompressor needed to be allocated in dwFlags. // After installing ClearVideo encoder, Adobe Premiere crashed using off-line without this code. // Put same work around here (DECINSTINFO is fairly small) // Might be due to installation of DCI? JM if (lpInst->DecompPtr == NULL) { if((lpInst->DecompPtr = (DECINSTINFO *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DECINSTINFO))) == NULL){ DBOUT("DrvOpen: Unable to ALLOC DECINSTINFO") HeapFree(GetProcessHeap(),0,lpInst); return NULL; } // Set flag indicating decoder instance is unitialized. lpInst->DecompPtr->Initialized = FALSE; } #endif } // Assign instance info flag with ICOPEN flag. lpInst->dwFlags = icinfo->dwFlags; // Disable codec by default. The client will send us a private message // to enable it. lpInst->enabled = FALSE; return lpInst; } DWORD PASCAL DrvClose(LPINST lpInst) { if(IsBadReadPtr((LPVOID)lpInst, sizeof(INSTINFO))){ DBOUT("DrvClose: instance NULL") return 1; } if(lpInst->DecompPtr && // IsBadReadPtr errors on NT with NULL !IsBadReadPtr((LPVOID)lpInst->DecompPtr, sizeof(DECINSTINFO))){ if(lpInst->DecompPtr->Initialized){ H263TermDecoderInstance(lpInst->DecompPtr); } HeapFree(GetProcessHeap(),0,lpInst->DecompPtr); lpInst->DecompPtr = NULL; } if(lpInst->CompPtr && // IsBadReadPtr errors on NT with NULL !IsBadReadPtr((LPVOID)lpInst->CompPtr, sizeof(COMPINSTINFO))){ if(lpInst->CompPtr->Initialized){ H263TermEncoderInstance(lpInst->CompPtr); } HeapFree(GetProcessHeap(),0,lpInst->CompPtr); lpInst->CompPtr = NULL; } HeapFree(GetProcessHeap(),0,lpInst); return 1; } DWORD PASCAL DrvGetState(LPINST lpInst, LPVOID pv, DWORD dwSize) { // Return current state of compression options if (pv == NULL) return (sizeof(COMPINSTINFO)); // check that incoming buffer is big enough if (dwSize < sizeof(COMPINSTINFO)) return 0; // Check instance pointer if (lpInst && lpInst->CompPtr) { // fill the incoming buffer _fmemcpy(pv, lpInst->CompPtr, (int)sizeof(COMPINSTINFO)); return sizeof(COMPINSTINFO); } else return 0; } DWORD PASCAL DrvSetState(LPINST lpInst, LPVOID pv, DWORD dwSize) { // check that there is enough incoming data if (dwSize < sizeof(COMPINSTINFO)) return 0; // Check instance pointer if (lpInst && lpInst->CompPtr && pv) { // get data out of incoming buffer _fmemcpy(lpInst->CompPtr, pv, (int)sizeof(COMPINSTINFO)); return sizeof(COMPINSTINFO); } else return 0; } DWORD PASCAL DrvGetInfo(LPINST lpInst, ICINFO FAR *icinfo, DWORD dwSize) { if (icinfo == NULL) return sizeof(ICINFO); if (dwSize < sizeof(ICINFO)) return 0; if (!lpInst) return 0; icinfo->dwSize = sizeof(ICINFO); icinfo->fccType = ICTYPE_VIDEO; icinfo->fccHandler = lpInst->fccHandler; icinfo->dwVersion = 9002; MultiByteToWideChar(CP_ACP,0,szName,-1,icinfo->szName,16); if(lpInst->fccHandler == FOURCC_H263) { icinfo->dwFlags = VIDCF_TEMPORAL; // We support inter frame compression. icinfo->dwFlags |= VIDCF_FASTTEMPORALC; // We do not need ICM to provide previous frames on compress icinfo->dwFlags |= VIDCF_CRUNCH; // We support bit rate control icinfo->dwFlags |= VIDCF_QUALITY; // We support Quality MultiByteToWideChar(CP_ACP,0,szDescription,-1,icinfo->szDescription,128); } else if ((lpInst->fccHandler == FOURCC_YUV12) || (lpInst->fccHandler == FOURCC_IYUV)) { icinfo->dwFlags = 0; MultiByteToWideChar(CP_ACP,0,szDesc_i420,-1,icinfo->szDescription,128); } else { DBOUT("Error: unsupported four cc.") return(0); } return sizeof(ICINFO); } /************************************************************************** * * MakeFccUpperCase(). * * Convert the passed parameter to upper case. No change to chars not in * the set [a..z]. * * returns input parameter in all upper case */ static U32 MakeFccUpperCase( U32 fcc) { U32 ret; unsigned char c; c = (unsigned char)(fcc & 0xFF); fcc >>= 8; ret = toupper(c); c = (unsigned char)(fcc & 0xFF); fcc >>= 8; ret += toupper(c) << 8; c = (unsigned char)(fcc & 0xFF); fcc >>= 8; ret += ((U32)toupper(c)) << 16; c = (unsigned char)(fcc & 0xFF); ret += ((U32)toupper(c)) << 24; return ret; } /* end MakeFccUpperCase() */