LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 8145|回复: 46

realplay-10.0.8-r1可以在amd64机器上完成编译[种草得草兄提供了使用codecs方法,用am

[复制链接]
发表于 2006-12-1 02:25:01 | 显示全部楼层 |阅读模式
我是看了这个贴子http://www.linuxsir.cn/bbs/showt ... 有机会一试。

在64位环境下编译,已有的补丁不够,还要改动几个地方,我列一列步骤:
1)ebuild /usr/portage/local/layman/gentoo-china/media-video/realplayer/realplayer-10.0.8-r1.ebuild   unpack

2) 解压完后应该也打完了已有有补丁了,手工改几个地方:
A、realplay-10.0.8/datatype/image/jpg/import/jpeg-6b/jmorecfg.h, 第160行
#ifndef XMD_H                        /* X11/xmd.h correctly defines INT32 */
#if (defined _UNIX && (defined _ALPHA || defined _OSF1))
typedef int INT32;
#else
typedef long INT32;
#endif
#endif
改成:
#ifndef XMD_H                        /* X11/xmd.h correctly defines INT32 */
typedef int INT32;
#endif

B、然后有两个库需要编译成static library,要不然连接的时候会报错,提示用-fPIC选项重新编译。分别是:libogg和libtheora。
这两 个lib也可以用ebuild解压,然后到解压目录加上两个选项进行配置,如:
./configure --enable-static --disable-shared && make install, 完成安装。

C、接着,改掉连接了上面两个库的地方,将动态连接方式改成静态连接方式,一共有三个文件,分别是:
1)realplay-10.0.8/datatype/theora/renderer/linux2.pcf,去掉下面两行:
project.AddLibraries(os.path.join(oggLibPath, "libogg.a"),
                     os.path.join(oggLibPath, "libtheora.a"))
2)realplay-10.0.8/datatype/vorbis/renderer/unix.pcf,去掉下面一行:
project.AddLibraries(os.path.join(GetSDKPath("oggvorbissdk"), "lib", "libogg.a"))
3)realplay-10.0.8/datatype/ogg/fileformat/unix.pcf, 去掉下面一行:
project.AddLibraries(os.path.join(GetSDKPath("oggvorbissdk"), "lib", "libogg.a"))

D、再接着,不要强行编译那个aac codecs了,因为realplay_gtk_current-20060824-dist_linux-2.6-glibc23-amd64.zip中也没有64位相关的datatype_dist,一般只要把realplay-10.0.8/Makefile中有关aac的行注释掉就行了。

E、最后,还有一个地方动要打补丁的,编译的时候居然说__amd64__为"Unknown CPU architecture",请打开这个文件:realplay-10.0.8/common/import/gecko-sdk/nspr/include/prcpucfg.h,定位到这一行:#elif defined(__ia64__),改成#elif defined(__ia64__) || defined(__amd64__), 这样应该可以了,因为虽然ia64与amd64的指令可能不同,但字节排列方式应该还是一致的,所以我们可以安全地使用这段定义。

补丁完成,现在可以回到Terminal,用ebuild ... compile来编译了,编译完成后在Release目录下会有一个跟官方发行版一样的.run文件,命令行下执行./*.run就可以安装了。

至于不能运行的原因,暂时不详,我用strace看过,原以为是segfault,但发现居然报个general error就退出来了,看来得想办法编译一个调试版跟踪一下才知道原因。

到这里可能很多人都会想着那些64位codecs,呵呵,确实是可能编译的都编译出来了(除了先前说的那个aac),我试过给mplayer用,但不知道怎么搞的,居然不认,也有可能是配置的原因,也有可能是本来就不能用,反正也没太多的时间玩下去,将整个hacking过程奉上,盼望有时间又有精力的兄弟们接着努力
发表于 2006-12-1 07:55:01 | 显示全部楼层
不妨到 helix 下载最新的 snapshot 来编译,问题可能少点。
我也再试试。
回复 支持 反对

使用道具 举报

发表于 2006-12-1 17:25:00 | 显示全部楼层
我也编译出了codecs,改了mplayer的ebuild,指向我放codecs的文件夹,还强加了real USE,还是没用。

估计64 Realplayer 不能用的原因是codecs根本不支持64位,编译成功了也一样

如果是这样那就只能再等等了。。。
回复 支持 反对

使用道具 举报

发表于 2006-12-1 18:16:27 | 显示全部楼层
Post by 夕角
我也编译出了codecs,改了mplayer的ebuild,指向我放codecs的文件夹,还强加了real USE,还是没用。

估计64 Realplayer 不能用的原因是codecs根本不支持64位,编译成功了也一样

如果是这样那就只能再等等了。。。

这个应该是去hack mplayer的
源代码吧。real官方的codec应该没问题。可能是mplayer不能调用64位的real codec.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-1 22:42:03 | 显示全部楼层
Post by 种草得草
这个应该是去hack mplayer的
源代码吧。real官方的codec应该没问题。可能是mplayer不能调用64位的real codec.


嗯,这个很有可能是mplayer原因,除非官方提供的64位datatype_dist根本不能用,我仔细留意了编译codecs的过程,发现还比较顺利的,假如代码的兼容性真的太差,应该会有N多的警告,实际上没发现多少。

有一个地方比较重要,就是codecs的接口实现,我发现有几个地方用的指针强行转换,然而指针在64位平台是8字节的,我在猜测是不是这个原因倒致了codecs被加载的时候出错,没调试,还说不准...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-2 17:50:28 | 显示全部楼层
不能启动是因为下面几个有问题:
clntcore.so       // 核心
oggfformat.so  // ogg plugin
swfformat.so   //  flash format
vorbisrend.so  //  .....

问题解决:
1) 核心,可以把hxplay的merge过来,可以生成能启动的clntcore.so,或者直接把编译hxplay后的clntcore.so拷贝过来, 现在可以播放 mp3了

2) oggfformat.so && vorbisrend.so, 这两个plugin在被加载都时候都会报xxx_xxx_init符号未定义,看来还是重定位的问题, 还没解决....

3) swfformat.so,这个跟flash的支持有关,因为连接了datatype_dist,有可能问题就出在datatype_dist中,不能解决就不支持了.
回复 支持 反对

使用道具 举报

发表于 2006-12-2 18:45:21 | 显示全部楼层
sunmoon1997 已经成功用mplayer使用编译出来的解码。附件里面有他提供的补丁。
打了这个补丁。编译mplayer ./configure的时候 --with-reallibdir={codec所在目录}。



如果是gentoo,附件提供了 ebuild
1 把 codec 复制到 /opt/RealPlayer64/codecs/
  1. $ ls /opt/RealPlayer64/codecs/
  2. atrc.so  drv1.so  drvc.so  rv20.so  rv40.so
  3. cook.so  drv2.so  rv10.so  rv30.so  sipr.so
复制代码


2 USE="real64" emerge -av mplayer

注:附件中有两个 ebuild ,一个是 svn 的mplayer ,一个是 rc1的。解压后files里面有补丁。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-2 18:54:45 | 显示全部楼层
马上试试,呵呵, 非常感谢草兄
回复 支持 反对

使用道具 举报

发表于 2006-12-2 19:15:17 | 显示全部楼层
这里提供一个编译 real codec 的方法。
我用的是 2006.11.30 的current源代码。

1 设置环境变量
  1. $ export S=~/Desktop/realplay
  2. $ export BUILD_ROOT=$S/build
  3. $ export SYSTEM_ID=linux-2.6-glibc23-amd64
  4. $ export BUILDRC=$S/buildrc
复制代码

$ mkdir $S/release

2 编译
$S/build/bin/build.py
选择 [1] Set Target(s)->[0] List core targets...->[236] datatype_rm
再选择[3] run: build -trelease -t__helix_daily_push__

OK!这样就只编译了rm/rmvb的解码。编译出来的东西在release文件夹找。

注:这个版本编译到 common/container 会出错。打上这个补丁(也是sunmoon写的)
  1. --- common/container/hxstrfmt.cpp.orig  2005-12-07 02:36:39.000000000 +0800
  2. +++ common/container/hxstrfmt.cpp       2006-12-02 18:52:02.000000000 +0800
  3. @@ -519,10 +519,12 @@

  4. void CHXString::FormatV(const char* pFmt, va_list args)
  5. {
  6. -    va_list argList = args;
  7. +    va_list argList;
  8. +
  9. +    va_copy (argList, args);

  10.      //Guess the size
  11. -    int estimatedSize = GuessSize(pFmt, args);
  12. +    int estimatedSize = GuessSize(pFmt, argList);

  13.      if (m_pRep)
  14.         m_pRep->Resize(estimatedSize + FormatFudgeFactor);
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-2 19:18:10 | 显示全部楼层
楼主你继续啊,把realplayer搞定了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表