最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

MPlayer-1.0rc1中,如果–disable-mpdvdkit 会导致数据类型off_t的定义发生问题

工作和技术 crifan 1629浏览 0评论

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的定义发生问题

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.154 seconds, using 22.14MB memory