MPlayer-1.0rc1中,如果–disable-mpdvdkit 会导致数据类型off_t的定义发生问题
最近遇到一个很是让人无语的事情。
很久以前,在buildroot中,其自动打了对应patch,然后用正常的mplayer的配置参数,去配置MPlayer-1.0rc1:
./configure –prefix=/usr –confdir=/etc –target=arm-linux –host-cc=/usr/bin/gcc –cc=/root/buildroot/buildroot/build_arm/staging_dir/usr/bin/arm-linux-uclibc-gcc –as=/root/buildroot/buildroot/build_arm/staging_dir/usr/bin/arm-linux-uclibc-as –with-extraincdir=/root/buildroot/buildroot/build_arm/staging_dir/usr/include –with-extralibdir=/root/buildroot/buildroot/build_arm/staging_dir/lib –enable-mad –enable-fbdev –disable-big-endian –disable-mpdvdkit –disable-tv –enable-dynamic-plugins –disable-armv5te
然后再make,是可以正常编译的。而且一直也没出过啥问题。
最近遇到mplayer播放vbr播放时间显示问题,在网上找了个vbr的patch给MPlayer-1.0rc2打上之后,
rc2版本的是可以正常的只不过播放时候调用mad库
mplayer -ac mad test.mp3
结果播放时间对了,但是总时间显示还是不对,后来debug找到原因是libmpcodecsad_libmad.c中,把mplayer中已经计算精确的sh->i_bps给重写了:
sh->i_bps=this->frame.header.bitrate/8;
改成:
if(sh->i_bps < 0)
{
sh->i_bps=this->frame.header.bitrate/8;
}
就可以正常显示播放时间和总时间了。
但是同样的patch,打到rc1中,以为直接就OK了,不需要其他改动了。但运行结果却是完全乱了,debug调试发现,在libmpdemuxdemux_audio.c中,
demux_audio_open()中,通过
mp3_found = add_mp3_hdr(&mp3_hdrs, st_pos, mp3_chans, mp3_freq,
mpa_spf, mpa_layer, mpa_br, mp3_flen, mpa_ssize);
返回的结果,完全是无效的值,所以深入debug,最后追到底,发现是
mp3_flen初始化就是一个不正常的值:
Playing 2m44s676ms_188Kbps_VBR.mp3.
-6-6-6-6-: mpeghdr_pos=0
-7-7-7-0-: n=0, mp3_flen=-1097754712, stream_tell(s)=4
-7-7-7-0-: n=1, mp3_flen=-1097754712, stream_tell(s)=2062
parseHeader:framesize=417
-7-7-7-7-: st_pos=1791001364490, mp3_flen=-1097754572
其后,st_pos也是赋值不正常,而正常的结果应该是:
Playing 2m44s676ms_188Kbps_VBR.mp3.
-6-6-6-6-: mpeghdr_pos=0
-7-7-7-0-: n=0, mp3_flen=0, stream_tell(s)=4
-7-7-7-0-: n=1, mp3_flen=0, stream_tell(s)=2062
parseHeader:framesize=417
-7-7-7-7-: st_pos=2058, mp3_flen=417
所以,但是,代码都是一样的,始终找不到,到底是哪部分的问题,后来发现,st_pos的变量类型是off_t:
off_t st_pos = 0, next_frame_pos = 0;
而通过Source Insight看到off_t的定义,不是普通的大家共用的某个头文件,而是在
libmpdvdkit2common.h中,而这个libmpdvdkit2,对于rc1版本的mplayer,在configure时候,是有个对应的参数配置的: –disable-mpdvdkit Disable mpdvdkit2 support [autodetect]
而这个参数,到了rc2中,去掉了。其具体作用,网上google到的:
mplayer-docs-1.0-0.24.20060223.2.fc4.i386 RPM
– Switch from external libdvdread to mpdvdkit, since the streaming part fails
to build otherwise.
好像是个DVD相关的库。rc2去掉了这个配置,估计是用了其他的库代替了这个了。
这个是rc2配置编译或生产的congfig.h中相关的配置的值:
/* Indicates that Ogle’s libdvdread is available for DVD playback */
#define USE_DVDREAD 1
/* Indicates that dvdread is internal */
#define USE_DVDREAD_INTERNAL 1
/* Additional options for libdvdread/libdvdcss */
#undef DVD_STRUCT_IN_DVD_H
#define DVD_STRUCT_IN_LINUX_CDROM_H 1
#undef DVD_STRUCT_IN_SYS_CDIO_H
#undef DVD_STRUCT_IN_SYS_DVDIO_H
#define HAVE_LINUX_DVD_STRUCT 1
这个是rc1的:
/* Indicates that Ogle’s libdvdread is available for DVD playback */
#undef USE_DVDREAD
/* Indicates that dvdread is from libmpdvdkit */
#undef USE_MPDVDKIT
/* Additional options for libmpdvdkit*/
#undef DVD_STRUCT_IN_DVD_H
#define DVD_STRUCT_IN_LINUX_CDROM_H 1
#undef DVD_STRUCT_IN_SYS_CDIO_H
#undef DVD_STRUCT_IN_SYS_DVDIO_H
其中就有mpdvdkit。而去取消参数配置–disable-mpdvdkit ,再生成的config.h就会包含这个mpdvdkit了,
/* Indicates that Ogle’s libdvdread is available for DVD playback */
#define USE_DVDREAD 1
/* Indicates that dvdread is from libmpdvdkit */
#define USE_MPDVDKIT 2
/* Additional options for libmpdvdkit*/
#undef DVD_STRUCT_IN_DVD_H
#define DVD_STRUCT_IN_LINUX_CDROM_H 1
#undef DVD_STRUCT_IN_SYS_CDIO_H
#undef DVD_STRUCT_IN_SYS_DVDIO_H
#undef HAVE_BSD_DVD_STRUCT
#define HAVE_LINUX_DVD_STRUCT 1
#undef HAVE_OPENBSD_DVD_STRUCT
#undef DARWIN_DVD_IOCTL
#define HAVE_STDDEF_H 1
#define HAVE_DVD 1
然后,再去运行上面的加了MP3的VBR的patch的rc1的Mplayer,播放VBR的mp3,结果mp3的播放时间和总时间都显示正确了。
所以,现在知道原因了,就是由于rc1版本的Mplayer,是否配置–disable-mpdvdkit ,会决定off_t的类型,所以,在需要unsigned long long ,即uint64_t的时候,就会出问题了。。。
【总结】
.这种,参数配置导致头文件中的off_t数据类型定义发生变化,而因此会导致其他问题,的情况,真是让人崩溃,也很纳闷,为何Mplayer的开发者,对于常见的off_t的类型的定义,为何非要和DVD的一个库相关,而不是放到独立的,和模块无关的,通用的某个头文件里面。。。
如果不是其他特殊原因,这样的设计,只能用一个字评价:“搓!!!”
【后记】
后来的debug,又清楚了一些,是由于如果不加–disable-mpdvdkit ,就会启用 –enable-largefiles,所以,使得off_t是long long,sizeof(off_t)是8。而启用了–enable-largefiles后,编译出来的mplayer就比原先大多了,有7M左右,而原先不加–enable-largefiles编译出来的mplayer,才4M左右。
所以,也就是,off_t的数据类型,其实和–disable-mpdvdkit 没有直接关系,但有间接关系,不加–disable-mpdvdkit 会导致启用–enable-largefiles,因此使得off_t变成long long,否则本身是int(此处和long一样,sizeof(long)=4),使得此处,sizeof(int)=4。
转载请注明:在路上 » MPlayer-1.0rc1中,如果–disable-mpdvdkit 会导致数据类型off_t的定义发生问题