1 Vs2005下编译XDiv库
1.从网上下载www.xvid.org上下载1.1.2,并解压 http://downloads.xvid.org/downloads/xvidcore-1.2.2.zip
2.编译过程中需要用到nasm这个编译汇编的工具http://sourceforge.net/projects/nasm/下 载一个win32版本
将你安装的nasm的工具的目录加入VS中如果你你解压的方式,也一样,工具->选项->项目和解决方案->VC++
目录 可执行文件下面就是要添加你的的nasm工具的目录.
3.找到xvidcore/build/win32目录双击xvidcore.dsw就可以打开目录了,这个解决方案里有很多项目,我的做法是一个一个来,所以除了libxvidcore这个项目,其它的全部卸载
4.开始编译
出现
nasm: error: no input file specified
type `nasm -h' for help 有这句话说明你的nasm在你的VS中已经使用了,但用法错误
Assembling xxx/src/image/x86_asm/colorspace_yuyv_mmx.asm
导致这个错误的原因不在于你,在 xvid的论坛上找到了错误原因,因为在VC6工程转换到.NET工程的时候,命令行里的宏给自动加上了双引号,(牛人告诉我的)
你需要找到libxvidcore->image->colorspace_yuyv_mmx.asm ,右击选择它的属性
配置属性->自定义属性->命令行
把有" 号去掉,千万不要多删,
nasm -o $(IntDir)/$(InputName).obj -f win32 -DWINDOWS -I../../src/ -I$(InputDir)/ $(InputPath)
像这样,尤其右边有个空格不能自作多情的删掉,
然后编译,很多警告,无视它。
就可以在win32的bin目录下找到xvidcore.dll和xvidcore.dll.a,其实到这里我在工程中要用到的
东西已经够了,但牛人们都给了完整的方案了,咱就勤快点,跟着做呗!
这写项目里还有其它几个项目,经试验xvid_bench和xvid_decraw_static 应为库的问题,链接出错
将刚编译bin/所有文件拷到win32目录下,在出错的项目属性中
项目属性->配置属性->连接器->输入->附加依赖库中添加libxvidcore.lib ,就不报错了。
.5、 编译VFW工程
没出现错误
6.编译dshow工程,因为它会用到directshow的sample里面的头文件
需要下载directshow SDK 没那份心思,不干了,留给需要的人去做吧。
参考贴
http://www.cnblogs.com/hyamw/archive/2007/01/25/630594.html
2 xvid静态库的封装类(编码和解码)
#define _XVID_ENCODE_H
#include <xvid.h>
public:
virtual void PostEncHandler(unsigned char * xvid, int key, int xvid_len) = 0 ;
};
protected:
// original encode routine in xvid lib
int enc_core(unsigned char *image, unsigned char *bitstream, int *key);
CXvidEnc() ;
~CXvidEnc() ;
bool Open();
bool Close();
static void XVID_GLOBAL_INIT();
void Encode(unsigned char * image);
void AttachCaller(int width, int height, CXvidEncHandler * enc_caller) ;
protected:
CXvidEncHandler* m_enc_caller ;
void * m_enc_handle;
unsigned char* m_bitstream;
bool m_closed;
int m_key ;
int m_width ;
int m_height ;
};
#endif
#include "./xvidenc.h"
#include "xvid.h"
/* quality 0 */
0,
/* quality 1 */
XVID_ME_ADVANCEDDIAMOND16,
/* quality 2 */
XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16,
/* quality 3 */
XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16 |
XVID_ME_ADVANCEDDIAMOND8 | XVID_ME_HALFPELREFINE8,
/* quality 4 */
XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16 |
XVID_ME_ADVANCEDDIAMOND8 | XVID_ME_HALFPELREFINE8 |
XVID_ME_CHROMA_PVOP | XVID_ME_CHROMA_BVOP,
/* quality 5 */
XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16 |
XVID_ME_ADVANCEDDIAMOND8 | XVID_ME_HALFPELREFINE8 |
XVID_ME_CHROMA_PVOP | XVID_ME_CHROMA_BVOP,
/* quality 6 */
XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16 | XVID_ME_EXTSEARCH16 |
XVID_ME_ADVANCEDDIAMOND8 | XVID_ME_HALFPELREFINE8 | XVID_ME_EXTSEARCH8 |
XVID_ME_CHROMA_PVOP | XVID_ME_CHROMA_BVOP,
};
/* quality 0 */
0,
/* quality 1 */
0,
/* quality 2 */
XVID_VOP_HALFPEL,
/* quality 3 */
XVID_VOP_HALFPEL | XVID_VOP_INTER4V,
/* quality 4 */
XVID_VOP_HALFPEL | XVID_VOP_INTER4V,
/* quality 5 */
XVID_VOP_HALFPEL | XVID_VOP_INTER4V |
XVID_VOP_TRELLISQUANT,
/* quality 6 */
XVID_VOP_HALFPEL | XVID_VOP_INTER4V |
XVID_VOP_TRELLISQUANT | XVID_VOP_HQACPRED,
};
//
#define MAX_ZONES 64
/* Maximum number of frames to encode */
#define ABS_MAXFRAMENR 9999
static int ARG_STATS = 0;
static int ARG_DUMP = 0;
static int ARG_LUMIMASKING = 0;
static int ARG_BITRATE = 0;
static int ARG_SINGLE = 0;
static char *ARG_PASS1 = 0;
static char *ARG_PASS2 = 0;
static int ARG_QUALITY = ME_ELEMENTS - 1;
static float ARG_FRAMERATE = 25.00f;
static int ARG_MAXFRAMENR = ABS_MAXFRAMENR;
static int ARG_MAXKEYINTERVAL = 0;
static char *ARG_INPUTFILE = NULL;
static int ARG_INPUTTYPE = 0;
static int ARG_SAVEMPEGSTREAM = 0;
static int ARG_SAVEINDIVIDUAL = 0;
static char *ARG_OUTPUTFILE = NULL;
static int ARG_BQRATIO = 150;
static int ARG_BQOFFSET = 100;
static int ARG_MAXBFRAMES = 0;
static int ARG_PACKED = 0;
static int ARG_VOPDEBUG = 0;
static int ARG_GMC = 0;
static int ARG_INTERLACING = 0;
static int ARG_QPEL = 0;
static int ARG_CLOSED_GOP = 0;
#define IMAGE_SIZE(x,y) ((x)*(y)*3/2)
#else
#define IMAGE_SIZE(x,y) ((x)*(y)*3)
#endif
#define SMALL_EPS (1e-10)
#define SWAP(a) ( (((a)&0x000000ff)<<24) | (((a)&0x0000ff00)<<8) | (((a)&0x00ff0000)>>8) | (((a)&0xff000000)>>24) )
CXvidEnc::CXvidEnc()
{
m_closed = true ;
m_enc_caller = NULL ;
m_enc_handle = NULL ;
m_key = 0 ;
m_width = 0 ;
m_height = 0 ;
m_bitstream = NULL ;
}
if(m_bitstream) free(m_bitstream) ;
m_bitstream = NULL ;
}
int xerr = 0 ;
m_closed = true;
/* Destroy the encoder instance */
xerr = xvid_encore(m_enc_handle, XVID_ENC_DESTROY, NULL, NULL);
return (xerr) ? false : true ;
}
{
m_width = width ;
m_height = height ;
m_enc_caller = enc_caller ;
if(m_width > 0 && m_height > 0) {
// max size
int max = (m_width > m_height) ? m_width : m_height ;
int xvid_len = (int)(max * max) ;
m_bitstream = (unsigned char *)malloc(xvid_len) ;
memset(m_bitstream, 0, xvid_len) ;
CXvidEnc::XVID_GLOBAL_INIT() ;
}
}
/*------------------------------------------------------------------------
* XviD core initialization
*----------------------------------------------------------------------*/
xvid_gbl_init_t xvid_gbl_init;
memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init));
xvid_gbl_init.version = XVID_VERSION;
xvid_gbl_init.cpu_flags = XVID_CPU_FORCE | XVID_CPU_ASM ; // here we use asm optimized code
/* Initialize XviD core -- Should be done once per __process__ */
xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL);
}
if(!m_enc_caller) return false ;
static xvid_enc_create_t xvid_enc_create;
int xerr = 0;
m_closed = false;
/*------------------------------------------------------------------------
* XviD encoder initialization
*----------------------------------------------------------------------*/
memset(&xvid_enc_create, 0, sizeof(xvid_enc_create));
xvid_enc_create.version = XVID_VERSION;
xvid_enc_create.width = m_width ;
xvid_enc_create.height = m_height ;
xvid_enc_create.profile = XVID_PROFILE_AS_L4;
/*
xvid_enc_create.zones = ZONES;
xvid_enc_create.num_zones = NUM_ZONES;
xvid_enc_create.plugins = plugins;
xvid_enc_create.num_plugins = 0;
*/
/* No fancy thread tests */
xvid_enc_create.num_threads = 0;
xvid_enc_create.fincr = 1;
xvid_enc_create.fbase = (int)10;
xvid_enc_create.max_key_interval = (int)-1; //--default 10s
/* Bframes settings */
xvid_enc_create.max_bframes = ARG_MAXBFRAMES;
xvid_enc_create.bquant_ratio = ARG_BQRATIO;
xvid_enc_create.bquant_offset = ARG_BQOFFSET;
/* Dropping ratio frame -- we don't need that */
xvid_enc_create.frame_drop_ratio = 0;
/* Global encoder options */
xvid_enc_create.global = 0;
if (ARG_PACKED)
xvid_enc_create.global |= XVID_GLOBAL_PACKED;
xvid_enc_create.global |= XVID_GLOBAL_CLOSED_GOP;
xvid_enc_create.global |= XVID_GLOBAL_EXTRASTATS_ENABLE;
xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL);
m_enc_handle = xvid_enc_create.handle;
return true;
}
int ret = 0 ;
if(m_closed) return;
if (ret > 0)
m_enc_caller->PostEncHandler(m_bitstream, m_key, ret) ;
}
raw CXvidEnc procedure
*/
int CXvidEnc::enc_core(unsigned char *image,unsigned char *bitstream, int * key)
{
int ret;
xvid_enc_frame_t xvid_enc_frame;
xvid_enc_stats_t xvid_enc_stats;
/* Version for the frame and the stats */
memset(&xvid_enc_frame, 0, sizeof(xvid_enc_frame));
xvid_enc_frame.version = XVID_VERSION;
xvid_enc_stats.version = XVID_VERSION;
xvid_enc_frame.bitstream = bitstream;
xvid_enc_frame.length = -1;
/* Initialize input image fields */
xvid_enc_frame.input.plane[0] = image;
xvid_enc_frame.input.csp = XVID_CSP_BGR; // suppose we get data from usb web cam
xvid_enc_frame.input.stride[0] = m_width*3;
/* Set up core's general features */
xvid_enc_frame.vol_flags = 0;
/* Set up core's general features */
xvid_enc_frame.vop_flags = vop_presets[ARG_QUALITY-2];
/* Frame type -- let core decide for us */
xvid_enc_frame.type = XVID_TYPE_AUTO;
/* Force the right quantizer -- It is internally managed by RC plugins */
xvid_enc_frame.quant = 0;
xvid_enc_frame.motion = motion_presets[ARG_QUALITY-2];
/* We don't use special matrices */
xvid_enc_frame.quant_intra_matrix = NULL;
xvid_enc_frame.quant_inter_matrix = NULL;
ret = xvid_encore(m_enc_handle, XVID_ENC_ENCODE, &xvid_enc_frame,NULL);
// &xvid_enc_stats);
//--判别是否是关键帧
*key = (xvid_enc_frame.out_flags & XVID_KEYFRAME);
//*stats_type = xvid_enc_stats.type;
//*stats_quant = xvid_enc_stats.quant;
//*stats_length = xvid_enc_stats.length;
//sse[0] = xvid_enc_stats.sse_y;
//sse[1] = xvid_enc_stats.sse_u;
//sse[2] = xvid_enc_stats.sse_v;
return (ret);
}
#define _XVID_DECODE_H
#include <xvid.h>
class CXvidDecHandler {
public:
virtual void PostDecHandler(unsigned char * image, int used_bytes) = 0 ;
};
CXvidDec() ;
~CXvidDec() ;
bool Open();
bool Close();
void Decode(unsigned char* xvid, int xvid_len);
static void XVID_GLOBAL_INIT();
void AttachCaller(int width, int height, CXvidDecHandler * dec_caller) ;
int dec_core(unsigned char *bitstream, unsigned char *image, int bs_size) ;
CXvidDecHandler* m_dec_caller ;
void* m_dec_handle ;
unsigned char * m_image ;
int m_width ;
int m_height ;
};
#endif
#include "./xviddec.h"
#include "xvid.h"
m_width = 0 ;
m_height = 0 ;
m_image = NULL ;
m_dec_handle = NULL ;
m_dec_caller = NULL ;
}
{
if(m_image) free(m_image) ;
m_image = NULL ;
}
{
m_width = width ;
m_height = height ;
m_dec_caller = dec_caller ;
if((m_width > 0) && (m_height > 0)) {
int image_len = m_width * m_height * 3 ;
m_image = (unsigned char *)malloc(image_len) ;
memset(m_image, 0, image_len) ;
CXvidDec::XVID_GLOBAL_INIT() ;
}
}
int xerr = 0 ;
xerr = xvid_decore(m_dec_handle, XVID_ENC_DESTROY, NULL, NULL);
}
/*------------------------------------------------------------------------
* XviD core initialization
*----------------------------------------------------------------------*/
xvid_gbl_init_t xvid_gbl_init;
memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init));
xvid_gbl_init.version = XVID_VERSION;
xvid_gbl_init.cpu_flags = XVID_CPU_FORCE | XVID_CPU_ASM ; // force to use asm optimized routine
/* Initialize XviD core -- Should be done once per __process__ */
xvid_global(NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL);
}
if(!m_dec_caller) return false ;
static xvid_dec_create_t xvid_dec_create ;
int ret = 0;
/*------------------------------------------------------------------------
* XviD encoder initialization
*----------------------------------------------------------------------*/
memset(&xvid_dec_create, 0, sizeof(xvid_dec_create_t));
xvid_dec_create.version = XVID_VERSION;
/* Width and Height of input frames */
xvid_dec_create.width = m_width ;
xvid_dec_create.height = m_height ;
ret = xvid_decore(NULL, XVID_DEC_CREATE, &xvid_dec_create, NULL) ;
m_dec_handle = xvid_dec_create.handle;
return true;
}
int ret = 0;
ret = dec_core(xvid, m_image, xvid_len);
if (ret > 0)
m_dec_caller->PostDecHandler(m_image, ret) ;
}
int CXvidDec::dec_core(unsigned char *bitstream,unsigned char *image, int bs_size)
{
int ret;
xvid_dec_frame_t xvid_dec_frame;
/* Reset all structures */
memset(&xvid_dec_frame, 0, sizeof(xvid_dec_frame_t));
/* Set version */
xvid_dec_frame.version = XVID_VERSION;
//xvid_dec_stats->version = XVID_VERSION;
/* No general flags to set */
xvid_dec_frame.general = 0;
/* Input stream */
xvid_dec_frame.bitstream = bitstream;
xvid_dec_frame.length = bs_size;
/* Output frame structure */
xvid_dec_frame.output.plane[0] = image;
xvid_dec_frame.output.stride[0] = m_width*3;
xvid_dec_frame.output.csp = XVID_CSP_BGR;
return(ret);
}
public CXvidEncHandler, // xvid encode handler
public CXvidDecHandler // xvid decode handler
{ ...
void PostEncHandler(unsigned char * xvid, int key, int xvid_len) ;
public:
void PostDecHandler(unsigned char * image, int used_bytes) ;
CXvidDec * m_vdo_dec ;
m_vdo_enc->AttachCaller(320, 240, this) ;
m_vdo_enc->Open() ;
m_vdo_dec->AttachCaller(320, 240, this) ;
m_vdo_dec->Open() ;
m_vdo_dec->Close() ;
delete m_vdo_dec ;
delete m_vdo_enc ;