支持VC++平台的x264的最新版本是x264-20091006,接下来就以该版本为例分析编译运行x264过程中遇到的问题以及解决办法。
错误提示:
错误原因:MS的VS编译器对C99标准支持不好,不支持函数当中混合定义、声明变量。
解决办法:在函数开头统一定义变量。
示例源码:
static ALWAYS_INLINE int x264_exp2fix8( float x ) { if( x >= 512.f/6.f ) return 0; if( x <= -512.f/6.f ) return 0xffff; int i = x*(-64.f/6.f) + 512; return (x264_exp2_lut[i&63]+256) << (i>>6) >> 8; }
修改后代码:
static ALWAYS_INLINE int x264_exp2fix8( float x ) { int i; if( x >= 512.f/6.f ) return 0; if( x <= -512.f/6.f ) return 0xffff; i = x*(-64.f/6.f) + 512; return (x264_exp2_lut[i&63]+256) << (i>>6) >> 8; }
注:x264代码中有十几处类似的错误,只需一一改正过来就可以了。
错误代码:
static const uint8_t check_mv_lists[X264_MBTYPE_MAX] = {[P_L0]=1, [B_L0_L0]=1, [B_L1_L1]=2};
修改为:
static const uint8_t check_mv_lists[X264_MBTYPE_MAX] ={0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,0,0,0};
错误代码:
fprintf( stderr, "Bad header magic (%"PRIx32" <=> %s)\n",*((uint32_t*)header), header );
修改为:
fprintf( stderr, "Bad header magic (%ld %s)\n", *((uint32_t*)header), header );
这是由于libx264工程没有添加lookahead.c文件,从而缺少几个函数的定义造成的,错误提示如下图:
解决方法:添加lookahead.c进工程,如下图所示:
解决办法:重新定义一下log2f(x)即可,在osdep.h中添加log2f(x)定义,加入的代码如下:
#ifdef _MSC_VER #define inline __inline #define strcasecmp stricmp #define strncasecmp strnicmp #define snprintf _snprintf #define fseek _fseeki64 #define ftell _ftelli64 #define isfinite _finite #define strtok_r strtok_s #define _CRT_SECURE_NO_DEPRECATE #define X264_VERSION "" // no configure script for msvc #define log2f(x) (logf(x)*1.4426950408889634f) #endif
截止目前,应该可以把所有的问题都解决了,出现了大家最喜欢的Build succeeded。