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

📄 codec.c

📁 这是一个压缩解压包,用C语言进行编程的,里面有详细的源代码.
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************** * *	XVID VFW FRONTEND *	codec * *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License as published by *	the Free Software Foundation; either version 2 of the License, or *	(at your option) any later version. * *	This program is distributed in the hope that it will be useful, *	but WITHOUT ANY WARRANTY; without even the implied warranty of *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *	GNU General Public License for more details. * *	You should have received a copy of the GNU General Public License *	along with this program; if not, write to the Free Software *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *************************************************************************//************************************************************************** * *	History: * *	12.07.2002	num_threads *	23.06.2002	XVID_CPU_CHKONLY; loading speed up *	25.04.2002	ICDECOMPRESS_PREROLL *	17.04.2002	re-enabled lumi masking for 1st pass *	15.04.2002	updated cbr support *	04.04.2002	separated 2-pass code to 2pass.c *				interlacing support *				hinted ME support *	23.03.2002	daniel smith <danielsmith@astroboymail.com> *				changed inter4v to only be in modes 5 or 6 *				fixed null mode crash ? *				merged foxer's alternative 2-pass code *				added DEBUGERR output on errors instead of returning *	16.03.2002	daniel smith <danielsmith@astroboymail.com> *				changed BITMAPV4HEADER to BITMAPINFOHEADER *					- prevents memcpy crash in compress_get_format() *				credits are processed in external 2pass mode *				motion search precision = 0 now effective in 2-pass *				modulated quantization *				added DX50 fourcc *	01.12.2001	inital version; (c)2001 peter ross <pross@xvid.org> * *************************************************************************/#include <windows.h>#include <vfw.h>#include <stdio.h>#include "vfwext.h"#include <xvid.h>#include "debug.h"#include "codec.h"#include "status.h"static const int pmvfast_presets[7] = {	0, 0, 0, 0,	0 | XVID_ME_HALFPELREFINE16 | 0,	0 | XVID_ME_HALFPELREFINE16 | 0 |	XVID_ME_ADVANCEDDIAMOND16, XVID_ME_HALFPELREFINE16 | XVID_ME_EXTSEARCH16 |	XVID_ME_HALFPELREFINE8 | 0 | XVID_ME_USESQUARES16};/*	return xvid compatbile colorspace,	or XVID_CSP_NULL if failure*/static int get_colorspace(BITMAPINFOHEADER * hdr){	/* rgb only: negative height specifies top down image */	int rgb_flip = (hdr->biHeight < 0 ? 0 : XVID_CSP_VFLIP);	switch(hdr->biCompression)	{	case BI_RGB :		if (hdr->biBitCount == 16)		{			DPRINTF("RGB16 (RGB555)");			return rgb_flip | XVID_CSP_RGB555;		}		if (hdr->biBitCount == 24) 		{			DPRINTF("RGB24");			return rgb_flip | XVID_CSP_BGR;		}		if (hdr->biBitCount == 32) 		{			DPRINTF("RGB32");			return rgb_flip | XVID_CSP_BGRA;		}		DPRINTF("unsupported BI_RGB biBitCount=%i", hdr->biBitCount);		return XVID_CSP_NULL;	case BI_BITFIELDS :		if (hdr->biSize >= sizeof(BITMAPV4HEADER))		{			BITMAPV4HEADER * hdr4 = (BITMAPV4HEADER *)hdr;			if (hdr4->bV4BitCount == 16 &&				hdr4->bV4RedMask == 0x7c00 &&				hdr4->bV4GreenMask == 0x3e0 &&				hdr4->bV4BlueMask == 0x1f)			{				DPRINTF("RGB555");				return rgb_flip | XVID_CSP_RGB555;			}			if(hdr4->bV4BitCount == 16 &&				hdr4->bV4RedMask == 0xf800 &&				hdr4->bV4GreenMask == 0x7e0 &&				hdr4->bV4BlueMask == 0x1f)			{				DPRINTF("RGB565");				return rgb_flip | XVID_CSP_RGB565;			}			DPRINTF("unsupported BI_BITFIELDS mode");			return XVID_CSP_NULL;		}				DPRINTF("unsupported BI_BITFIELDS/BITMAPHEADER combination");		return XVID_CSP_NULL;	case FOURCC_I420 :	case FOURCC_IYUV :		DPRINTF("IYUY");		return XVID_CSP_I420;	case FOURCC_YV12 :		DPRINTF("YV12");		return XVID_CSP_YV12;				case FOURCC_YUYV :	case FOURCC_YUY2 :		DPRINTF("YUY2");		return XVID_CSP_YUY2;	case FOURCC_YVYU :		DPRINTF("YVYU");		return XVID_CSP_YVYU;	case FOURCC_UYVY :		DPRINTF("UYVY");		return XVID_CSP_UYVY;	default :		DPRINTF("unsupported colorspace %c%c%c%c", 			hdr->biCompression&0xff,			(hdr->biCompression>>8)&0xff,			(hdr->biCompression>>16)&0xff,			(hdr->biCompression>>24)&0xff);		return XVID_CSP_NULL;	}}/* compressor *//* test the output format */LRESULT compress_query(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput){	BITMAPINFOHEADER * inhdr = &lpbiInput->bmiHeader;	BITMAPINFOHEADER * outhdr = &lpbiOutput->bmiHeader;	/* VFWEXT detection */	if (inhdr->biCompression == VFWEXT_FOURCC) {		return (ICM_USER+0x0fff);	}	if (get_colorspace(inhdr) == XVID_CSP_NULL) 	{		return ICERR_BADFORMAT;	}	if (lpbiOutput == NULL) 	{		return ICERR_OK;	}	if (inhdr->biWidth != outhdr->biWidth || inhdr->biHeight != outhdr->biHeight ||		(outhdr->biCompression != FOURCC_XVID && outhdr->biCompression != FOURCC_DIVX && outhdr->biCompression != FOURCC_DX50))	{		return ICERR_BADFORMAT;	}	return ICERR_OK;}LRESULT compress_get_format(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput){	BITMAPINFOHEADER * inhdr = &lpbiInput->bmiHeader;	BITMAPINFOHEADER * outhdr = &lpbiOutput->bmiHeader;	if (get_colorspace(inhdr) == XVID_CSP_NULL)	{		return ICERR_BADFORMAT;	}	if (lpbiOutput == NULL) 	{		return sizeof(BITMAPINFOHEADER);	}	memcpy(outhdr, inhdr, sizeof(BITMAPINFOHEADER));	outhdr->biSize = sizeof(BITMAPINFOHEADER);	outhdr->biSizeImage = compress_get_size(codec, lpbiInput, lpbiOutput);	outhdr->biXPelsPerMeter = 0;	outhdr->biYPelsPerMeter = 0;	outhdr->biClrUsed = 0;	outhdr->biClrImportant = 0;	if (codec->config.fourcc_used == 0)	{		outhdr->biCompression = FOURCC_XVID;	}	else if (codec->config.fourcc_used == 1)	{		outhdr->biCompression = FOURCC_DIVX;	}	else	{		outhdr->biCompression = FOURCC_DX50;	}	return ICERR_OK;}LRESULT compress_get_size(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiOutput){	return 2 * lpbiOutput->bmiHeader.biWidth * lpbiOutput->bmiHeader.biHeight * 3;}LRESULT compress_frames_info(CODEC * codec, ICCOMPRESSFRAMES * icf){#if 0	DPRINTF("%i %i", icf->lStartFrame, icf->lFrameCount);#endif	codec->fincr = icf->dwScale;	codec->fbase = icf->dwRate;	return ICERR_OK;}static char type2char(int type){	if (type==XVID_TYPE_IVOP)		return 'I';	if (type==XVID_TYPE_PVOP)		return 'P';	if (type==XVID_TYPE_BVOP)		return 'B';	return 'S';}static int vfw_debug(void *handle,			 int opt,			 void *param1,			 void *param2){	switch (opt) {	case XVID_PLG_CREATE:		*((void**)param2) = NULL;	case XVID_PLG_INFO:	case XVID_PLG_DESTROY:	case XVID_PLG_BEFORE:		return 0;	case XVID_PLG_AFTER:		{			xvid_plg_data_t *data = (xvid_plg_data_t *) param1;			/* We don't use DPRINTF here because it's active only for _DEBUG			 * builds and that activates lot of other debug printfs. We only			 * want these all the time */			char buf[1024];			sprintf(buf, "[%6i]   type=%c   Q:%2i   length:%6i",					data->frame_num, 					type2char(data->type),					data->quant, 					data->length);			OutputDebugString(buf);			return 0;		}	}	return XVID_ERR_FAIL;}#define XVID_DLL_NAME "xvidcore.dll"static int init_dll(CODEC* codec){	if (codec->m_hdll != NULL)		return 0;	DPRINTF("init_dll");	codec->m_hdll = LoadLibrary(XVID_DLL_NAME);	if (codec->m_hdll == NULL) {		DPRINTF("dll load failed");		MessageBox(0, XVID_DLL_NAME " not found!","Error!", MB_ICONEXCLAMATION|MB_OK);		return XVID_ERR_FAIL;	}	codec->xvid_global_func = (int (__cdecl *)(void *, int, void *, void *))GetProcAddress(codec->m_hdll, "xvid_global");	if (codec->xvid_global_func == NULL) {		MessageBox(0, "xvid_global() not found", "Error", 0);		return XVID_ERR_FAIL;	}	codec->xvid_encore_func = (int (__cdecl *)(void *, int, void *, void *))GetProcAddress(codec->m_hdll, "xvid_encore");	if (codec->xvid_encore_func == NULL) {		MessageBox(0, "xvid_encore() not found", "Error", 0);		return XVID_ERR_FAIL;	}	codec->xvid_decore_func = (int (__cdecl *)(void *, int, void *, void *))GetProcAddress(codec->m_hdll, "xvid_decore");	if (codec->xvid_decore_func == NULL) {		MessageBox(0, "xvid_decore() not found", "Error", 0);		return XVID_ERR_FAIL;	}	codec->xvid_plugin_single_func = 		(int (__cdecl *)(void *, int, void *, void *))(GetProcAddress(codec->m_hdll, "xvid_plugin_single"));	codec->xvid_plugin_2pass1_func = 		(int (__cdecl *)(void *, int, void *, void *))(GetProcAddress(codec->m_hdll, "xvid_plugin_2pass1"));	codec->xvid_plugin_2pass2_func = 		(int (__cdecl *)(void *, int, void *, void *))(GetProcAddress(codec->m_hdll, "xvid_plugin_2pass2"));	codec->xvid_plugin_lumimasking_func = 		(int (__cdecl *)(void *, int, void *, void *))(GetProcAddress(codec->m_hdll, "xvid_plugin_lumimasking"));	codec->xvid_plugin_psnr_func = 		(int (__cdecl *)(void *, int, void *, void *))(GetProcAddress(codec->m_hdll, "xvid_plugin_psnr"));	return 0;}/* constant-quant zones for fixed quant encoding */static voidprepare_cquant_zones(CONFIG * config) {		int i = 0;	if (config->num_zones == 0 || config->zones[0].frame != 0) {		/* first zone does not start at frame 0 or doesn't exist */		if (config->num_zones >= MAX_ZONES) config->num_zones--; /* we scrifice last zone */		config->zones[config->num_zones].frame = 0;		config->zones[config->num_zones].mode = RC_ZONE_QUANT;		config->zones[config->num_zones].weight = 100;		config->zones[config->num_zones].quant = config->desired_quant;		config->zones[config->num_zones].type = XVID_TYPE_AUTO;		config->zones[config->num_zones].greyscale = 0;		config->zones[config->num_zones].chroma_opt = 0;		config->zones[config->num_zones].bvop_threshold = 0;		config->num_zones++;		sort_zones(config->zones, config->num_zones, &i);	}	/* step 2: let's change all weight zones into quant zones */		for(i = 0; i < config->num_zones; i++)		if (config->zones[i].mode == RC_ZONE_WEIGHT) {			config->zones[i].mode = RC_ZONE_QUANT;			config->zones[i].quant = (100*config->desired_quant) / config->zones[i].weight;		}}/* full first pass zones */

⌨️ 快捷键说明

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