【苦逼bug系列】之重构播放器篇

本文详细记录了在重构ffmpeg播放器时遇到的问题,包括makefile错误、NDK编译问题以及使用getrusage获取进程资源信息时的错误。针对这些问题,作者提供了解决方案,如修改配置文件、处理NDK的限制以及理解头文件包含的重要性。同时,文章还探讨了getrusage函数的使用,并引用了相关资源进行深入解析。
摘要由CSDN通过智能技术生成

bug啊。。。要命啊。。。

两种ndk-build方式

a.libffmpeg什么都不修改,

b. 修改,按我的博文   或者我本次采用的 http://abitno.me.sixxs.org/compile-ffmpeg-android-ndk

(又或者参考baicheng推荐。。將 FFmpeg整合至Android平台)        进行尝试。


本次首先使用第一种方式:

问题1. make: *** empty variable name.  Stop (已解决)

原因:原来是ndk路径对空格‘ ‘ 和小数点’ .'均不支持。myelipse8.6 默认workspace 的位置有个/myeclipse 8.6/ 这个路径,要删除!!!

            之后即可。但是紧接着报出第二个错误(之前sz机器上并没有这个问题,产生的原因估计跟新机器指令集有关系)


问题2.  Compile thumb  : avcodec <= 4xm.c(未解决)
/home/grant/Workspaces/ffmpeg/jni/libffmpeg/libavcodec/4xm.c: In function 'decode_frame':
/home/grant/Workspaces/ffmpeg/jni/libffmpeg/libavcodec/x86/mathops.h:93: error: can't find a register in class 'CC_REG' while reloading 'asm'

为什么会出现这个呢?定位到具体位置内容为

#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
    __asm__ ("shrl %1, %0\n\t"
         : "+r" (a)
         : "ic" ((uint8_t)(-s))
    );
    return a;
}

难道是不支持 汇编语句 —asm—? 是gcc的问题还是ndk的问题?

原因:

参考文章:1. http://www.diybl.com/course/6_system/linux/Linuxjs/20090309/160214.html

之前因為想找出 ass 字幕爛掉的原因,得編譯一個 debug 版本的 mplayer。但只要一加入這個選項後編譯就會爛掉,會跑出如下的錯誤訊息: 

can’t find a register in class ‘GENERAL_REGS’ while reloading ‘asm’ 

當時也沒仔細去找解法,直接用插入 printf 的方法來觀察一些變數,問題也順利解決了。不過昨天把 svn head 抓下來編譯後也是一樣,看來應該是老問題了,查了一下 maillist 發現有人問過,可以參考這幾封信: 
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-November/047222.html 
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-November/047221.html 

解決方法是在 libavcodec/Makefile 的 CFLAGS 加入 -fomit-frame-pointer 參數就好。編譯完果然變得超級肥大…看起來是可以用 gdb 來跑了: 

88M mplayer
6.9M mplayer-strip 

這問題好像留了好幾年還找不到解決方法,不過在 FAQ 中是把問題推給 gcc,所以在 gcc 的 ml 上也發現有人問過類似的 問 題….

2. 但是上面的方法也有人不成功:

46 for (i = 0; i < 0x20 / 2; i += 4)
  47 {
  48 asm(
  49 "movaps %2, %%xmm3\n\t"
  50 "shufps $27, %%xmm3, %%xmm3\n\t"
  51 "movups %3, %%xmm1\n\t"

我查了网上有如下说的:
export CFLAGS=-fomit-frame-pointer
但依然没有解决,Google也不好搜,这个问题难道过于容易了?请大侠指点一下,搞了好久了,无从下手啊。
多谢。



+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

鉴于错误太多,不得不采用第二种方法。

Android的GCC是不支持restrict关键字的,所以把ffmpeg源码下configure生成的config.h文件中的这一行:
#define restrict restrict   改成 #define restrict    /*意思就是把后面的restrict去掉*/
如果重新Configure的话记得要把这个关键字去掉。

完全修改后,

需要

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值