NDK编译 x264 及调用出现的异常情况解决

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cndm123/article/details/81013797

这里简单介绍 x264 源码下载和编译的过程,具体也可以参考网上其他资料

x264源码下载链接  http://www.videolan.org/developers/x264.html  可以通过这个链下载

解压后进行,进入到 x264 文件路径下

编辑 NDK交叉编译 shell  脚本:

build_x264.sh  (名称可自定义)

#!/bin/sh

export NDK=/usr/local/android-ndk-r10e
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export PLATFORM=$NDK/platforms/android-14/arch-arm/
export PREFIX=$(pwd)/libs 

./configure --prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--disable-lavf \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM

make uninstall

make clean

make -j4

make install

在windows 桌面编辑的 sh 脚本还需要考虑编码问题。

vi  build_x264.sh  

在脚本底下  看到  dos 字样说明是在windows 编辑需要改成  unix  格式

  esc    :    set  ff   # 查看shell 脚本格式 

  esc  :  set ff  = unix  #修改sh格式为成 unix

# 如果shell 脚本权限是不可执行的 ,还需要修改权限

chmod  777  build_x264.sh

#执行 shell 脚本

./build_x264.sh

就完成编译和安装

在当前路径的  libs 文件下自动生成  /lib  和 /include  文件夹别分存放 libx264.a libx264.so 和 x264.h , x264_config.h 

如果想修改生成路径  可以修改sh 中的 export PREFIX=$(pwd)/libs

$(pwd) 定位当前路径

调用x264 时,根据需要添加静态库或动态库,选择libx264.a 或 libx264.so 文件

我使用 libx264.a  进行编程

我在调用的时候出现以下两个异常情况,具体是什么原因也说不说清楚,看到这篇博客后,也欢迎大家留言告诉我

问题一 :

libx264.a(encoder-8.o):encoder.c:function validate_parameters: error: undefined reference to 'log2f'

libx264.a(encoder-8.o):encoder.c:function x264_8_encoder_reconfig: error: undefined reference to 'log2f'

libx264.a(ratecontrol-10.o):ratecontrol.c:function x264_10_ratecontrol_new: error: undefined reference to 'log2'

这个异常,其实在编译程序时,有认真留意编译过程的在控制台的日志,也是会出现warnning 警告信息:

如下:

encoder/encoder.c: In function 'validate_parameters':
encoder/encoder.c:870:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
^
encoder/encoder.c:870:31: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );

analyse.c:188:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
logs[i] = log2f( i+1 ) * 2.0f + 1.718f;
^
encoder/analyse.c:188:19: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
logs[i] = log2f( i+1 ) * 2.0f + 1.718f;
^
encoder/ratecontrol.c: In function 'qscale2qp':
encoder/ratecontrol.c:208:5: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
return (12.0f + QP_BD_OFFSET) + 6.0f * log2f( qscale/0.85f );
^
encoder/ratecontrol.c:208:44: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
return (12.0f + QP_BD_OFFSET) + 6.0f * log2f( qscale/0.85f );

/ratecontrol.c:789:9: warning: implicit declaration of function 'log2' [-Wimplicit-function-declaration]
double bits_required = log2( num )
^
encoder/ratecontrol.c:789:32: warning: incompatible implicit declaration of built-in function 'log2' [enabled by default]
double bits_required = log2( num )
^
encoder/ratecontrol.c:819:27: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
rc->ip_offset = 6.0 * log2f( h->param.rc.f_ip_factor );
^
encoder/ratecontrol.c: In function 'x264_10_ratecontrol_start':
encoder/ratecontrol.c:1508:24: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
q -= 6*log2f( zone->f_bitrate_factor );
^
encoder/set.c: In function 'x264_10_sps_init':
encoder/set.c:248:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
sps->vui.i_log2_max_mv_length_vertical = (int)log2f( X264_MAX( 1, param->analyse.i_mv_range*4-1 ) ) + 1;
^
encoder/set.c:248:55: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
sps->vui.i_log2_max_mv_length_vertical = (int)log2f( X264_MAX( 1, param->analyse.i_mv_range*4-1 ) ) + 1;
^
encoder/encoder.c:870:9: warning: implicit declaration of function 'log2f' [-Wimplicit-function-declaration]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );
^
encoder/encoder.c:870:31: warning: incompatible implicit declaration of built-in function 'log2f' [enabled by default]
float qp_i = qp_p - 6*log2f( h->param.rc.f_ip_factor );

解决办法是将  源码中的 osdep.h 文件中的

#if !HAVE_LOG2F  直接替换成  #if 1

重新进行编译,问题就解决了,至于为什么也欢迎大家告诉我

第二个问题:

x264.h:811:5: error: 'int64_t' does not name a type

x264.h:814:5: error: 'int64_t' does not name a type

x264.h:951:50: error: 'int64_t' has not been declared

有了第一个问题解决经验,第二个问题也是直接修改 x264.h:

将  int64_t  改为  uint64_t

问题就解决了






展开阅读全文

调用Oracle存储过程时出现异常情况

08-10

写了一个存储过程,其返回一个记录集和一个Number类型的数值,在PL/SQL里调试都能正常返回值和记录集。在ASP.net中用如下方式调用:rnOracleParameter[] parms=new OracleParameter[]rnrn new OracleParameter("P_Type",OracleType.VarChar),rn new OracleParameter("P_QuerySql",OracleType.VarChar),rn new OracleParameter("Rating_Return",OracleType.Float),rn new OracleParameter("Cables_Return",OracleType.Cursor),rn;rnrn parms[0].Value = ProType;rn parms[1].Value = SqlStr;rn parms[2].Direction = ParameterDirection.Output; rn parms[3].Direction = ParameterDirection.Output; rnrnusing(OracleDataReader ODr = PLSQLHelper.ExecuteReader(connString,CommandType.StoredProcedure,"YH_SCJK.PG_TRSCABLE.GetCableLoadLine2",parms))rnrn if(ODr.Read())rn rn RatingVal = ODr.GetFloat(0); rn rnrn ODr.NextResult();rnrn while (ODr.Read())rn rn TrsCable NowCable = new TrsCable();rn NowCable.BJId = ODr.GetString(0);rn NowCable.Name = ODr.GetString(1);rn NowCable.SValue = ODr.GetDouble(2);rn NowCable.SDate = ODr.GetDateTime(3);rn Cables.Add(NowCable);rn rn rn rnrn 按理说Oracle存储过程返回值应该是按参数顺序返回,那么数值类型返回值Rating_Return应该在Cables_Return记录集之前,但是很奇怪,系统会报“RatingVal = ODr.GetFloat(0);”这句格式转换错误,我将获取记录集(即while (ODr.Read())后面的)的放在获取单值的前面,跟踪返回记录集正确,但ODr.NextResult();后,ODr.Read()返回false,无法得到单值……rn 不知哪里有问题,望各位大侠不吝赐教! 论坛

没有更多推荐了,返回首页