(转)Mplayer分析

注:本文只关注FBDEV相关的内容,其他的或不提,或略过。[由于时间比较紧,许多地方肯定还有不足的地方,欢迎指教]


首先从Mplayer.c中的main函数开始,
注意到
//================== Init VIDEO (codec & libvo) ==========================
current_module=”preinit_libvo”;
if(!(video_out=init_best_video_out(video_driver_list)))

这将跳进Video_out.c
for(i=0;video_out_drivers[i];i++){
if(!video_driver->preinit(vo_subdevice))
如果你的FBDEV打开的话,即若有
#ifdef HAVE_FBDEV
&video_out_fbdev,
&video_out_fbdev2,
那么,video_driver->preinit(vo_subdevice)这句话将跳进Vo_fbdev.c中执行preinit操作。
Preinit中进行了
fb_dev_fd = open(fb_dev_name, O_RDWR)
和一些ioctl对framebuffer设备的信息进行读取:
ioctl(fb_dev_fd, FBIOGET_VSCREENINFO, &fb_vinfo)
至此,FBDEV相关的pre初始化操作基本结束。

。。。省略其他无关的信息
进入
uint32_t (*draw_slice)(uint8_t *src[], int stride[], int w,int h, int x,int y);
也就是此时将调用Vo_fbdev.c中的
static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y)
{
uint8_t *d;
uint8_t *s;

d = center + (fb_line_len * y + x) * fb_pixel_size;

s = src[0];
while (h) {
memcpy(d, s, w * fb_pixel_size);
d += fb_line_len;
s += stride[0];
h–;
}

return 0;
}
从而完成从mpi到framebuffer的内存拷贝!

---------------------------------------------------

Mplayer 中的版本管理

原文地址: http://kware.blogbus.com/logs/17613567.html

1. Mplayer 中的版本管理
   1) 文件 Makefile 中处理
      depend: help_mp.h
        ./version.sh `$(CC) -dumpversion`
      # 这里将编译器的版本号也追加在整体版本号

   2) 文件中 version.sh 中的处理
      #!/bin/sh
      echo "#define VERSION "1.0pre7try2-$1-josa1.0"" > version.h
      #自动生成 version.h 文件。这里增加了 josa 版本号
      #文件 version.h 里只有一行:#define VERSION "1.0pre7try2-3.2.3-josa1.0"

   3) 版本号使用
      // 初始化,消息系统 …… mplayer.c 中
      mp_msg(MSGT_CPLAYER, MSGL_INFO, "MPlayer " VERSION " (C) 2000-2005 Yifang NTT Team\n");

   4) 编解码器的版本号问题 libancodec/utils.c
      unsigned avcodec_version( void ) { return LIBAVCODEC_VERSION_INT; }
      unsigned avcodec_build( void ) { return LIBAVCODEC_BUILD; }

2. Mplayer 安全禁用函数的使用
   错误:“utils.c: undefined reference to `time_is_forbidden_due_to_security_issues'”
   解决方案:

   #undef fprintf
   #undef time
     josaf = fopen(fn, "wt");
     time(&rawtime);                       // 获取当地时间
     fprintf(josaf, "Josa Begin! " VERSION ", Yuchun Ji, %s\n", ctime(&rawtime));
     av_log_callback = josa;
   #define fprintf please_use_av_log
   #define time time_is_forbidden_due_to_security_issues

3. 原始技术资料文本
   F:\MPlayer-1.0pre7try2\DOCS\tech\libmpcodecs.txt
   The libMPcodecs API details, hints - by A'rpi
   ==================================
   See also: colorspaces.txt, codec-devel.txt, dr-methods.txt, codecs.conf.txt

       [MPlayer core]
             | (1)
        _____V______   (2)  /~~~~~~~~~~\    (3,4) |~~~~~~|
        |          | -----> | vd_XXX.c | -------> | vd.c |
        | decvideo |        \__________/ <-(3a)-- |______|
        |          | -----, ,.............(3a,4a).....:
        ~~~~~~~~~~~~ (6) V V
          /~~~~~~~~\     /~~~~~~~~\ (8)
          | vf_X.c | --> | vf_Y.c | ----> vf_vo.c / ve_XXX.c
          \________/     \________/
              |              ^
          (7) |   |~~~~~~|   : (7a)
              `-> | vf.c |...:
                  |______|

4. 音视频解码器选择
   1) 在 libmpcodec/dec_audio.c 文件 init_best_audio_codec() 函数中
      // 输出的三项信息分别为“编解码器名称、驱动程序、描述信息”
      tprintf("\nACD:%s AFM:%s(%s)",
        sh_audio->codec->name, sh_audio->codec->drv, sh_audio->codec->info);

   2) 在 libmpcodec/dec_video.c 文件 init_best_video_codec() 函数中
      // 输出的三项信息分别为“编解码器名称、驱动程序、描述信息”
      tprintf("\nVCD:%s VFM:%s(%s)\n",
        sh_video->codec->name, sh_video->codec->drv, sh_video->codec->info);

5. 文件 codecs.conf.h 的自动生成机制
   1) 元工具 codec_cfg.exe 的生成,在 Makefile 文件里
      PRG_CFG = codec-cfg

      $(PRG_CFG): version.h codec-cfg.c codec-cfg.h
        $(HOST_CC) $(HOST_CFLAGS) -I. -g codec-cfg.c mp_msg.c -o $(PRG_CFG) -DCODECS2HTML \
          $(EXTRA_LIB) $(EXTRA_INC) $(I18NLIBS)

   2) 使用生成的 codec_cfg.exe 工具生成 codecs.conf.h 头文件,在 Makefile 文件里
      codecs.conf.h: $(PRG_CFG) etc/codecs.conf
        ./$(PRG_CFG) ./etc/codecs.conf > $@

   3) 元工具 codec-cfg.c 分析
      目的是将编解码器配置文件 etc/codecs.conf 转化为 codecs.conf.h 文件。源配置格式见下节,目标格
      式如下:

     

      codecs_t builtin_video_codecs[] = {
      {{0x10000001, 0x10000002, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
       {0x10000001, 0x10000002, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0},                                
       {0x4D504553, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
       {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},                          
       {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},          
       {0,0,0,0,0,0,0,0,0, 0, 0, 0, 0, 0, 0, 0 },                  
       "mpegpes",                                                  
       "MPEG-PES output (.mpg or DXR3/DVB card)",                  
       "for hardware decoding",                        

转载于:https://www.cnblogs.com/juncent/archive/2011/06/16/2082825.html

你可能感兴趣的:((转)Mplayer分析)