FFMEPG解码器在嵌入式(PXA270)移植成功 (--enable-x264),分享

#!/bin/bash
./configure --cc=gcc /
     --cross-prefix=/opt/crosstool/arm-linux/bin/arm-linux- /
     --cpu=arm-v4l /
     --enable-gpl /
            --enable-x264 /
          --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib /
            --enable-static /
     --enable-decoder=x264

交叉编译器配置参数
Configured with: /home/pxa270/kernel_gcc_qt/pxa27x/gcc-3.4.3-glibc-2.3.2/build/arm-linux/gcc-3.4.3-glibc-2.3.2/gcc-3.4.3/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux --with-cpu=iwmmxt --enable-cxx-flags=-mcpu=iwmmxt --with-headers=/opt/crosstool/arm-linux/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long --without-fp
Thread model: posix
gcc version 3.4.3

libavutil version:49.0.0
libavcodec version:51.8.0
libavformat verion:50.4.0

编译过程中的问题及其解决
1、直接编译过程中,对于/libavcodec/x264.c的编译过程会找不到头文件x264.h,

解决方法:
将x264开源编码器中的/common/x264.h复制到ffmpeg/libavcodec/中,并修改x264.c
增加函数包括
static void x264_log_default( void *p_unused, int i_level, const char *psz_fmt, va_list arg )
void    x264_param_default( x264_param_t *param )
int x264_nal_encode( void *p_data, int *pi_data, int b_annexeb, x264_nal_t *nal )

下面三个函数中由于牵涉很多其他函数,而且仅和编码器有关,我主要针对解码器,所以就#if 0, 然后将原x264.c中调用这三个函数的语句注释掉
x264_t * x264_encoder_open   ( x264_param_t *param )
int     x264_encoder_encode
void    x264_encoder_close  ( x264_t *h )


2、编译问题SNOW.C
对于编译SNOW.C,我的arm-linux-gcc (version 3.4.2)编译不下去,死机了,为了寻求解决方法,这里将snow.c的编译禁了,即在根目录FFMPEG/libavcodec/Makefile中
ifneq ($(CONFIG_SNOW_DECODER)$(CONFIG_SNOW_ENCODER),)
    OBJS+= snow.o
endif
改为
ifneq ($(CONFIG_SNOW_DECODER)$(CONFIG_SNOW_ENCODER),)
    # OBJS+= snow.o
endif
其实也就是取消了编解码库中的SNOW_DECODER和SNOW_ENCODER.同时将config.h和config.mak文件中的相关CONFIG_SNOW_* 定义改为0和no


其他关于snow编解码器的错误
/opt/crosstool/arm-linux/bin/arm-linux-gcc -Wl,--warn-common -rdynamic -L/usr/local/lib -g -o ffmpeg_g ffmpeg.o cmdutils.o -L./libavformat -lavformat -L./libavcodec -lavcodec -L./libavutil -lavutil -lm -ldl
/opt/crosstool/arm-linux/lib/gcc/arm-linux/3.4.3/../../../../arm-linux/bin/ld: skipping incompatible /usr/local/lib/libavformat.a when searching for -lavformat
/opt/crosstool/arm-linux/lib/gcc/arm-linux/3.4.3/../../../../arm-linux/bin/ld: skipping incompatible /usr/local/lib/libavcodec.a when searching for -lavcodec
/opt/crosstool/arm-linux/lib/gcc/arm-linux/3.4.3/../../../../arm-linux/bin/ld: skipping incompatible /usr/local/lib/libavutil.a when searching for -lavutil
./libavcodec/libavcodec.a(allcodecs.o)(.text+0x790): In function `avcodec_register_all':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/allcodecs.c:654: undefined reference to `snow_encoder'
./libavcodec/libavcodec.a(allcodecs.o)(.text+0x864):/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/allcodecs.c:654: undefined reference to `snow_decoder'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x72c): In function `w53_8_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x884): In function `w97_8_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x9e8): In function `w53_16_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0xb40): In function `w97_16_c':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:344: undefined reference to `ff_spatial_dwt'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x38714): In function `dsputil_init':
/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:3839: undefined reference to `ff_snow_vertical_compose97i'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x38718):/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:3839: undefined reference to `ff_snow_horizontal_compose97i'
./libavcodec/libavcodec.a(dsputil.o)(.text+0x3871c):/mnt/hgfs/software/work/ffmpeg_src_working/ffmpeg/libavcodec/dsputil.c:3839: undefined reference to `ff_snow_inner_add_yblock'
collect2: ld returned 1 exit status
make: *** [ffmpeg_g] Error 1


解决方法:

在文件allcodecs.c中,将相关snow_encoder和snow_decoder的编解码注册器屏蔽
line 177// register_avcodec(&snow_encoder);
line 368// register_avcodec(&snow_decoder);(应该在Config.h和Config.mak修改时已经屏蔽了不会编译,我也不知道,改了才没有undefined reference to 'snow_encoder'和'snow_decoder'的错误)


ff_snow_vertical_compose97i等三个函数隶属于snow编码器的优化程序段,屏蔽这三个函数,此时这三个函数的实现将由c或其他指令行事的程序段完成功能
#if 0
 #ifdef CONFIG_SNOW_ENCODER
     c->vertical_compose97i = ff_snow_vertical_compose97i;
     c->horizontal_compose97i = ff_snow_horizontal_compose97i;
      c->inner_add_yblock = ff_snow_inner_add_yblock;
 #endif
#endif


3、在ld连接时,发生-lx264选项无法辨识
解决方法
修改配置的config.mak文件,将EXTRALIBS=-lm -lx264 -ldl修改为EXTRALIBS=-lm -ldl就OK了


其中遇到的问题:
 一、主机(虚拟机)和目标机的nfs mount:
目前的解决方法,
 1、开启nfs服务,关闭iptables,nfslock服务,用setup命令或者主菜单-〉系统设置-〉服务器设置
 2、在文件/etc/exports中加入共享文件目录,如/Video 192.168.0.*(rw,sync),将Linux下的Video目录共享于ip地址为192.168.0.1~192.168.0.254的所有主机,可读写。修改后保存,重启nfs服务,/etc/rc.d/init.d/nfs restart
 3、将虚拟机中的Linux的eth0设定为192.168.0.120和Windows下的IP地址设为一致,目标机地址必须与主机地址在同一个网段,如192.168.0.110就可以了。
 4、mount -a 192.168.0.120:/Video /mnt/nfs,挂载成功后,在目标机在访问时可能发生Permission Denial,权限不够的情况,只需将主机共享目录中的用户权限增加,如chmod 777 Video
 
 

TODO:
1、PXA270下加入视频显示部分,ffplay
2、Mplayer的相关移植工作
3、将X264的编码器加入
4、支持其他类型的编解码器 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值