⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfwpbdll_if.c

📁 魔兽2Linux版
💻 C
字号:
//==========================================================================////  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 (c) 1999 - 2001  On2 Technologies Inc. All Rights Reserved.////--------------------------------------------------------------------------/*****************************************************************************        *   Module Title :     vfwpbdll_if.c**   Description  :     Video codec demo playback dll interface*******************************************************************************//*****************************************************************************  Header Files******************************************************************************/#define STRICT			/* Strict type checking. */#include <stdio.h>#define __try#include "Huffman.h"#include "pbdll.h"#include "BlockMapping.h"#include <math.h>#include "vfw_PB_Interface.h"//#include "VP31DVERSION.h"#define VP31DVERSION "None at all"#define CommentString "\nON2.COM VERSION VP31D " VP31DVERSION "\n"#ifdef _MSC_VER#pragma comment(exestr,CommentString)#endif/*****************************************************************************  Implicit Imports******************************************************************************/extern unsigned int CPUFrequency;/*****************************************************************************  Module constants.******************************************************************************//*****************************************************************************  Exported data structures.******************************************************************************//*****************************************************************************  Module statics.******************************************************************************/static const char vp31dVersion[] = VP31DVERSION;/*****************************************************************************  Imports******************************************************************************/extern void CCONV ScaleOrCenter(PB_INSTANCE(*pbi),				YUV_BUFFER_CONFIG * YuvConfig);#if !defined(MACPPC)#if defined(POSTPROCESS)extern void PostProcess(PB_INSTANCE * pbi);const unsigned long PP_MACHINE_LOWLIMIT = 350;	//Lowest CPU (MHz) to enable PostProcessconst unsigned long PP_MACHINE_MIDLIMIT = 400;	//Lowest CPU (MHz) to enable PostProcessconst unsigned long PP_MACHINE_TOPLIMIT = 590;	//Lowest CPU (MHz) to enable PostProcess/*const unsigned long PP_MACHINE_LOWLIMIT = 340; //Lowest CPU (MHz) to enable PostProcessconst unsigned long PP_MACHINE_MIDLIMIT = 440; //Lowest CPU (MHz) to enable PostProcess*/#endif#endifextern void InitialiseConfiguration(PB_INSTANCE * pbi);//extern UINT32 FrameSize;  /* The number of bytes in the frame (read from the frame header). *//*****************************************************************************  Exported Global Variables******************************************************************************//*****************************************************************************  Foreward references******************************************************************************//**************************************************************************** *  *  ROUTINE       :     VP31D_GetVersionNumber * *  INPUTS        :     None * *  OUTPUTS       :     None. * *  RETURNS       :     None . * *  FUNCTION      :     Returns a pointer to the version string * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/const char *CCONV VP31D_GetVersionNumber(void){	return vp31dVersion;}/**************************************************************************** *  *  ROUTINE       :     StartDecoder * *  INPUTS        :     The handle of the display window. * *  OUTPUTS       :     None. * *  RETURNS       :     TRUE if succeeds else FALSE. * *  FUNCTION      :     Starts the compressor grabber * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/BOOL CCONV StartDecoder(PB_INSTANCE ** pbi, UINT32 ImageWidth,			UINT32 ImageHeight){	__try {		// set up our structure holding all formerly global information about a playback instance		*pbi = CreatePBInstance();		// Validate the combination of height and width.		(*pbi)->Configuration.VideoFrameWidth = ImageWidth;		(*pbi)->Configuration.VideoFrameHeight = ImageHeight;		(*pbi)->ProcessorFrequency = CPUFrequency;		// Fills in fragment counts as well		if (!PbBuildBitmapHeader		    ((*pbi)/*, (*pbi)->Configuration.VideoFrameWidth,		     (*pbi)->Configuration.VideoFrameHeight*/)) {			DeletePBInstance(pbi);			return FALSE;		}		/* Initialise the input buffer pointers. */		/* Set last_dct_thresh to an illegal value to make sure the		   *  Q tables are initialised for the new video sequence. 		 */		(*pbi)->LastFrameQualityValue = 0;		/* Clear various flags. */		(*pbi)->DecoderErrorCode = NO_DECODER_ERROR;		// Set up various configuration parameters.		InitialiseConfiguration(*pbi);		// Clear down the YUVtoRGB conversion skipped list.		memset((*pbi)->skipped_display_fragments, 0,		       (*pbi)->UnitFragments);		return TRUE;	}//    catch(BOOL X)//    {//        ErrorTrap( *pbi, GEN_EXCEPTIONS );//          return FALSE;//    }}/**************************************************************************** *  *  ROUTINE       :     GetPbParam * *  INPUTS        :     PB_COMMAND_TYPE Command *                      char *          Parameter * *  OUTPUTS       :     None. * *  RETURNS       :     None *	 *  FUNCTION      :     Generalised command interface to decoder. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/#if defined(POSTPROCESS)void CCONV GetPbParam(PB_INSTANCE * pbi, PB_COMMAND_TYPE Command,		      UINT32 * Parameter){	switch (Command) {	case PBC_SET_POSTPROC:		*Parameter = pbi->PostProcessingLevel;	default:		break;	}}#elsevoid CCONV GetPbParam(PB_INSTANCE * pbi __attribute__((unused)),	PB_COMMAND_TYPE Command __attribute__((unused)),	UINT32 * Parameter __attribute__((unused))){    // Nothing todo without postprocess support}#endif#if !defined(MACPPC)/**************************************************************************** *  *  ROUTINE       :     SetPbParam * *  INPUTS        :     PB_COMMAND_TYPE Command *                      char *          Parameter * *  OUTPUTS       :     None. * *  RETURNS       :     None *	 *  FUNCTION      :     Generalised command interface to decoder. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/#if defined(POSTPROCESS)void CCONV SetPbParam(PB_INSTANCE * pbi, PB_COMMAND_TYPE Command,		      UINT32 Parameter){	switch (Command) {	case PBC_SET_CPUFREE:		{			double Pixels =			    pbi->Configuration.VideoFrameWidth *			    pbi->Configuration.VideoFrameHeight;			double FreeMhz =			    pbi->ProcessorFrequency * Parameter / 100;			double PixelsPerMhz =			    100 * sqrt(1.0 * Pixels) / FreeMhz;			pbi->CPUFree = Parameter;			if (PixelsPerMhz > 100)				pbi->PostProcessingLevel = 0;			else if (PixelsPerMhz > 90)				pbi->PostProcessingLevel = 4;			else if (PixelsPerMhz > 80)				pbi->PostProcessingLevel = 5;			else				pbi->PostProcessingLevel = 6;			break;		}	case PBC_SET_POSTPROC:		if (Parameter == 9) {			SetPbParam(pbi, PBC_SET_CPUFREE, 70);		} else			pbi->PostProcessingLevel = Parameter;		break;	default:		break;	}}#elsevoid CCONV SetPbParam(PB_INSTANCE * pbi __attribute__((unused)),	PB_COMMAND_TYPE Command __attribute__((unused)),	UINT32 Parameter __attribute__((unused))){    // Nothing todo without postprocess support}#endif#endif/**************************************************************************** *  *  ROUTINE       :     GetYUVConfig * *  INPUTS        :     YUV_BUFFER_CONFIG  * YuvConfig * *  OUTPUTS       :     None. * *  RETURNS       :     None *	 *  FUNCTION      :     Gets details of the reconstruction buffer * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/void CCONV GetYUVConfig(PB_INSTANCE(*pbi), YUV_BUFFER_CONFIG * YuvConfig){	__try {		YuvConfig->YWidth = pbi->Configuration.VideoFrameWidth;		YuvConfig->YHeight = pbi->Configuration.VideoFrameHeight;		YuvConfig->YStride = pbi->Configuration.YStride;		YuvConfig->UVWidth =		    pbi->Configuration.VideoFrameWidth / 2;		YuvConfig->UVHeight =		    pbi->Configuration.VideoFrameHeight / 2;		YuvConfig->UVStride = pbi->Configuration.UVStride;#if defined(POSTPROCESS)		if (pbi->PostProcessingLevel) {			YuvConfig->YBuffer =			    &pbi->PostProcessBuffer[pbi->ReconYDataOffset];			YuvConfig->UBuffer =			    &pbi->PostProcessBuffer[pbi->ReconUDataOffset];			YuvConfig->VBuffer =			    &pbi->PostProcessBuffer[pbi->ReconVDataOffset];		} else#endif		{			YuvConfig->YBuffer =			    &pbi->LastFrameRecon[pbi->ReconYDataOffset];			YuvConfig->UBuffer =			    &pbi->LastFrameRecon[pbi->ReconUDataOffset];			YuvConfig->VBuffer =			    &pbi->LastFrameRecon[pbi->ReconVDataOffset];		}	}//    catch(BOOL X)//    {//        ErrorTrap( pbi, GEN_EXCEPTIONS );//    }    }/**************************************************************************** Debugging Aid Only*/void writeframe(PB_INSTANCE * pbi, char *address, int x){	// write the frame	FILE *yframe;	char filename[255];	sprintf(filename, "d:\\y%d.raw", x);	yframe = fopen(filename, "wb");	fwrite(address, pbi->ReconYPlaneSize, 1, yframe);	fclose(yframe);}/**************************************************************************** *  *  ROUTINE       :     DecodeFrameToYUV * *  INPUTS        :     UINT8 * VideoBufferPtr *                              Compressed input video data * *                      UINT32  ByteCount  *                              Number of bytes compressed data in buffer. *   * *                      UINT32  Height and width of image to be decoded * *  OUTPUTS       :     None *                      None * *  RETURNS       :     None * *  FUNCTION      :     Decodes a frame into the internal YUV reconstruction buffer. *                      Details of this buffer can be obtained by calling GetYUVConfig(). * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/int CCONV DecodeFrameToYUV(PB_INSTANCE(*pbi), char *VideoBufferPtr,			   unsigned int ByteCount __attribute__((unused)), UINT32 ImageWidth __attribute__((unused)),			   UINT32 ImageHeight __attribute__((unused))){	__try {		// Sanity check to make sure that the decoder has been initialised		// If it has not then we must initialise it before we proceed.		// Clear any outstanding error code .... start with a clean slate.		pbi->DecoderErrorCode = NO_DECODER_ERROR;		// Indicate that no YUV to RGB required.		pbi->OutputRGB = FALSE;		//      Copy the compressed video data into the internal. 		//memcpy( pbi->DataInputBuffer, VideoBufferPtr, ByteCount );		pbi->br.bitsinremainder = 0;		pbi->br.position = (cuchar *) VideoBufferPtr;		// Decode the frame. 		if (LoadAndDecode(pbi) == -1)			return -1;#if defined(POSTPROCESS)		if (pbi->PostProcessingLevel) {			PostProcess(pbi);		}#endif	}//    catch(BOOL X)//    {//        ErrorTrap( pbi, GEN_EXCEPTIONS );//    }	return 0;}/**************************************************************************** *  *  ROUTINE       :     StopDecoder * *  INPUTS        :     None * *  OUTPUTS       :     None. * *  RETURNS       :     None . * *  FUNCTION      :     Stops the encoder and grabber * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/BOOL CCONV StopDecoder(PB_INSTANCE ** pbi){	__try {		if (*pbi) {			DeleteFragmentInfo(*pbi);			DeleteFrameInfo(*pbi);			DeletePBInstance(pbi);			return TRUE;		}	}//    catch (BOOL X)//    {//        ErrorTrap( *pbi, GEN_EXCEPTIONS );//              return FALSE;//    }	return TRUE;}/**************************************************************************** *  *  ROUTINE       :     ErrorTrap * *  INPUTS        :     Nonex. * *  OUTPUTS       :     None. * *  RETURNS       :     None * *  FUNCTION      :     Called when a fatal error is detected. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/void ErrorTrap(PB_INSTANCE * pbi, int ErrorCode){	// Flag the error unless there is already one pending	if (pbi->DecoderErrorCode == NO_DECODER_ERROR) {		pbi->DecoderErrorCode = ErrorCode;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -