Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65624
  • 博文数量: 21
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-04 16:34
文章分类
文章存档

2011年(1)

2008年(20)

我的朋友
最近访客

分类: LINUX

2008-07-16 11:15:52

                    Mplayer S3C2440 Linux-2.6.18.2上移植记录

一、库文件移植准备

  为支持mp3的解码,在交叉编译mplayer时,加上 –enable-mad,如果在make的时候出现了:找不到 mad.h 的错误。下面方法就是针对这个问题的解决方案)
1.
交叉编译libmad
下载libmad包(libmad-0.15.1b.tar.gz);

打开一个终端,进入libmad的目录,输入配置命令:
./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging --prefix=/usr/local/arm/3.3.2/lib
CC=arm-linux-gcc
(要保证arm-linux-gcc的路径已经有 export过,否则给出完整路径。)
make
make install
这样就可以看到 /usr/local/arm/3.3.2/lib 目录下多了includelib目录,这些就是libmad相关的库。
2.
configure mplayer的时候,要加上以下几个选项:
--enable-mad
(为了在编译和链接的时候找的到头文件和库文件需要在CONFIGURE选项里加入以下两句,不然在编译的时候会找不到头文件,在链接的时候 –lmad 找不到mad的库文件)
--with-extraincdir=/usr/local/arm/3.3.2/lib/include
(这个指明 mad.h 这个文件所在的路径)
--with-extralibdir=/usr/local/arm/3.3.2/lib/lib
(这个指明libmad相关链接库所在的路径)

 

二、MPlayer 的移植

    在准备好LIBMAD库以后,就可以进行mplayer的移植了,先下载mplayer的源文件(MPlayer-1.0pre7.tar.bz2),再进行解压缩。

1、  mplayer-1.0pre7 目录下建立一个setup.sh的文件,把configure配置放里面。命令:touch setup.sh , chmod 777 setup.sh

2、  编辑setup.sh , setup.sh 里加入一行configure的命令,./configure --cc=arm-linux-gcc --target=arm-armv4-linux --enable-static --prefix=/tmp /mplayer --disable-win32  --disable-dvdread --enable-fbdev --disable-mencoder --disable-live --disable-mp3lib --enable-mad --enable-libavcodec  --with-extraincdir=/usr/local/arm/3.3.2/lib/include with-extralibdir=/usr/local/arm/3.3.2/lib/lib host-cc=gcc

其中—with…这个参数已经在上面说明了,--host-cc=gcc 必须要有,不然就编译不通过,因为有个文件需要GCC来生成,而不是arm-linux-gcc

3、  配置好以后就进行编译make,一切顺利。到此已经移植完成了。

 

三、开发板上调试

    下载以上编译的结果到板子上,mplayer大小有10M之多。运行./mplayer xxx.avi 失败,提示声卡的问题,mplayer有个参数是没声音输出,./mplayer nosound xxx.avi ,结果兴奋,视频出来了,很流畅,当然是用320x240压缩过的视频。但是为什么不能和声音一起播放呢?网上收集的资料显示

这个问题产生的根源最终追溯到音频的驱动部分。现在大部分的嵌入式板子都使用菲利普uda1341音频芯片,因而也都使用了相同一个音频驱动,即MIZI公司拥有版权的linux uda1341音频驱动,这个驱动基本上符合了oss的规范,但是当使用到多段DMA音频数据传输时,出现了一个问题,即DMA缓冲的建立发生在第一次调用write()函数将音频数据传送到设备描述符的时候,然而oss驱动的调用者通常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,然而因为缓冲尚未建立,因而返回缓冲大小为0这个结果。 解决的办法是在音频驱动源码的smdk2410_audio_open()函数体,加上如下一段代码,

              if ((file->f_mode & FMODE_WRITE)){

                            init_s3c2410_iis_bus_tx();

                            audio_clear_buf(&output_stream);

               // 加上以下这行代码

               if (!output_stream .buffers && audio_setup_buf(&output_stream))

                  return -ENOMEM;

按以上的方法做了,但是还是出现同样的提示,仔细的看了驱动,在驱动上加了大量的调试信息最后发现在smdk2410_audio_ioctl 中调用的一个函数老是返回错误,这个函数是access_ok(VERIFY_WRITE, inf, sizeof(*inf)),查了这个函数的代码发现返回1的时候是表示可以访问,而不是错误,所以导致下面代码老是出错,其实运行都是对的:

int err = access_ok(VERIFY_WRITE, inf, sizeof(*inf));

if (err)

return err;

于是改成int err = access_ok(VERIFY_WRITE, inf, sizeof(*inf));

重新编译内核,大功告成。

 

阅读(2370) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

wei555zeng2008-11-04 21:39:26

太感谢你了!多联系哈 大虾!

chinaunix网友2008-10-13 21:58:16

楼主你好。我在编译libmad是出错了。希望能得到你的帮助! 错误如下: make install-recursive make[1]: 正在进入目录 `/home/vishnut/桌面/libmad-0.15.1b' make[2]: 正在进入目录 `/home/vishnut/桌面/libmad-0.15.1b' make[3]: 正在进入目录 `/home/vishnut/桌面/libmad-0.15.1b' mkdir -p -- . /project/MPlayer/mad/lib /bin/bash ./libtool --mode=install /usr/bin/install -c libmad.la /project/MPlayer/mad/lib/libmad.la /usr/bin/install -c .libs/libmad.lai /project/MPlayer/mad/lib/libmad.la /usr/bin/install -c .libs/libmad.a /project/MPlayer/mad/lib/libmad.a