トップ 最新 追記

Masa's blog

検索キーワード:

2011年05月13日 MPlayer-1.0rc4 on ARMedSlack on zaurus(SL-C760) [長年日記]

_ MPlayer-1.0rc4 on ARMedSlack on zaurus(SL-C760)

普通にビルドすると

libmpeg2/motion_comp_arm_s.S: Assembler messages:
libmpeg2/motion_comp_arm_s.S:??: Error: selected processor does not support `pld [r1]'
libmpeg2/motion_comp_arm_s.S:??: Error: selected processor does not support `pld [r1]'

こんな感じのエラーが出る。

*** libmpeg2/motion_comp_arm_s.S.ORG    2011-05-12 15:04:22.000000000 +0900
--- libmpeg2/motion_comp_arm_s.S        2011-05-12 15:08:22.000000000 +0900
***************
*** 19,24 ****
--- 19,32 ----
  @ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


+ @ Disable pld for platforms which don't support it
+ #include "../config.h"
+ #if !HAVE_PLD
+ .macro pld reg
+ .endm
+ #endif
+
+
        .text

  @ ----------------------------------------------------------------

上記のパッチを当てたら、無事ビルド出来た。


2011年05月22日 console app with ARMedSlack 13.1 on zaurus(SL-C760) [長年日記]

_ FD-3.00j

コンソールベースのファイラー。ファイル名の拡張子にアプリケーションを関連付けて起動することができるので、mplayer等のフロントエンドとして利用したりする予定。

  • $ tar xvzf FD-3.00j.tar.gz
  • $ cd FD-3.00j
  • $ vi machine.h (必要に応じて修正。たぶん必要無し。)
  • $ vi fd.h (必要に応じて修正。たぶん必要無し。)
  • $ make
  • $ vi Makefile.in (必要に応じてTOPDIR等を修正。たぶん必要無し。)
  • $ cp _fdrc fdrc
  • # make install

上記の作業でインストールされる日本語マニュアルはARMedSlack 13.1のgnroffでは処理できないので、いったん削除して、フォーマット済のマニュアルを再度インストールする。

  • # make jcatman

拡張子に関連付けるアプリケーションをカスタマイズする。

  • vi ~/.fd2rc
launch "/.html" "w3m %C"
launch "/.htm"  "w3m %C"
launch "/.mp3"  "madplay %C"
launch "/.avi"  "mplayer -really-quiet -framedrop -dr -double -vo sdl -ao oss -vfm ffmpeg, -afm libmad, -autosync 30 -cache 2048 %C"

使い方は、カーソルキーでファイルを選んで、エンターキーでアプリケーションの起動。本来のファイラーとしての機能は `?' を入力してヘルプで確認できる。

_ moc-2.4.4 (music on console)

コンソールベースのmp3プレイヤー。

起動は

$ mocp

サーバとしてのmocpと、クライアントとしてのmocpの2つのプロセスが起動する。

  • 移動 : 上下矢印キー
  • 再生 : エンターキー
  • 停止 : s
  • 一時停止 : p
  • ボリュームアップ(1%) : >
  • ボリュームダウン(1%) : <
  • ボリュームアップ(5%) : .
  • ボリュームダウン(5%) : ,
  • 進める(1秒) : 右矢印
  • 戻す(1秒) : 左矢印
  • 進める(5秒) : ]
  • 戻す(5秒) : [
  • プレイリスト領域(への|からの)移動 : タブキー
  • プレイリストヘの追加 : a
  • プレイリストからの削除 : d
  • 終了(サーバ、クライアントの両方) : Q
  • 終了(クライアントのみ、再生はバックグラウンドで継続) : q

2011年05月23日 snes9x with ARMedslack 13.1 on zaurus(SL-C760) [長年日記]

_ snes9x with ARMedslack 13.1 on zaurus(SL-C760)

snes9xARMedslack 13.1でビルドしてみた。

以前にIntelマシンでビルドした手順で行うと、別のエラーが出た。以下のパッチで対応。

*** snes9x/unix/unix.cpp.ORG    2011-03-07 19:09:37.000000000 +0900
--- snes9x/unix/unix.cpp        2011-03-07 19:13:14.000000000 +0900
***************
*** 1129,1139 ****
  {
      *drive = 0;

!     char *slash = strrchr (path, '/');
      if (!slash)
!       slash = strrchr (path, '\\');

!     char *dot = strrchr (path, '.');

      if (dot && slash && dot < slash)
        dot = NULL;
--- 1129,1139 ----
  {
      *drive = 0;

!     char *slash = (char *)strrchr (path, '/');
      if (!slash)
!       slash = (char *)strrchr (path, '\\');

!     char *dot = (char *)strrchr (path, '.');

      if (dot && slash && dot < slash)
        dot = NULL;

上記でコンパイルは通るが、以下のパッチも当てないと、armプラットフォームでは正常に動かない。

*** snes9x/port.h.ORG   2011-05-16 17:48:15.000000000 +0900
--- snes9x/port.h       2011-05-21 23:32:31.000000000 +0900
***************
*** 266,274 ****
  #endif

  #if defined(__i386__) || defined(__i486__) || defined(__i586__) || \
!     defined(__WIN32__) || defined(__alpha__)
  #define LSB_FIRST
  #define FAST_LSB_WORD_ACCESS
  #else
  #define MSB_FIRST
  #endif
--- 266,276 ----
  #endif

  #if defined(__i386__) || defined(__i486__) || defined(__i586__) || \
!     defined(__WIN32__) || defined(__alpha__) || defined(__arm__)
  #define LSB_FIRST
+ # if !defined(__arm__)
  #define FAST_LSB_WORD_ACCESS
+ # endif
  #else
  #define MSB_FIRST
  #endif

以上。

で、zaurus(SL-C760)で快適に遊べるかは...微妙。


2011年05月27日 xserver-kdrive-imageon on ARMedslack 13.1 with zaurus(SL-C760) [長年日記]

_ xserver-kdrive-imageon on ARMedslack 13.1 with zaurus(SL-C760)

Slackware 13.37ARMedslack 13.37がリリースされた今日この頃...

以前のブログ

今回はAngstromからXimageonのバイナリを拝借するのは避けたい

と宣言していたのだが、あっさりと撤回。

なぜなら動画もサクサク見たいし、snes9xもサクサク動かしたいから...

調達物資

http://www.angstrom-distribution.org/repo/より以下の物資を調達する。

  • libts-1.0-0_1.0-r28.6.9_armv5te.ipk
  • pointercal_0.0-r5_c7x0.ipk
  • tslib-calibrate_1.0-r28.6.9_armv5te.ipk
  • tslib-conf_1.0-r28.6.9_armv5te.ipk
  • xserver-kdrive-imageon_1.2.0-r8.6_armv5te.ipk
  • xserver-security-policy_1.4.2-r3.2_armv5te.ipk

展開

上記のipkファイルはarコマンドで展開できる。展開した中にdata.tar.gzというファイルが有るので、それを希望の場所で展開する。

今回は`/angstrom'というディレクトリを用意して、angstromから取り込んだ物は全てその中に放り込むことにする。

# mkdir /angstrom
# cd /tmp
# ar x ほげほげ.ipk
# cd /angstrom
# tar xvzf - /tmp/data.tar.gz

ld.so.confの設定

上記の方法で導入した Ximageon は /angstrom/usr/lib/libts-1.0.so.0 をリンクして動かす必要があるので、/etc/ld.so.confを設定する。

# cp /etc/ld.so.conf /etc/ld.so.conf.BAK # 念のためバックアップ
# echo /angstrom/usr/lib >>/etc/ld.so.conf
# ldconfig

キャリブレーションの実施

キャリブレーションを行って`/angstrom/etc/pointercal'を生成する。

# TSLIB_PLUGINDIR=/angstrom/usr/lib/ts; export TSLIB_PLUGINDIR
# TSLIB_CONFFILE=/angstrom/etc/ts.conf; export TSLIB_CONFFILE
# TSLIB_CALIBFILE=/angstrom/etc/pointercal; export TSLIB_CALIBFILE
# TSLIB_TSDEVICE=/dev/input/event1; export TSLIB_TSDEVICE
# /angstrom/usr/bin/ts_calibrate

~/.xserverrc 作成

自分のホームディレクトリに`.xserverrc'を作ることで、`startx'コマンド実行時に起動するX serverを自由に選ぶ事ができる。

#! /bin/sh
TSLIB_PLUGINDIR=/angstrom/usr/lib/ts; export TSLIB_PLUGINDIR
TSLIB_CONFFILE=/angstrom/etc/ts.conf; export TSLIB_CONFFILE
TSLIB_CALIBFILE=/angstrom/etc/pointercal; export TSLIB_CALIBFILE
TSLIB_TSDEVICE=/dev/input/event1; export TSLIB_TSDEVICE

exec /angstrom/usr/bin/Ximageon \
        -softCursor \
        -use-evdev \
        -mouse /dev/input/event1 \
        -sp /angstrom/usr/lib/xserver/ScurityPolicy

設定は起動時のオプションで指定する。Ximageon自体は/etc/X11/xorg.conf無しで起動するので、xorg.confを参照しないのかもしれない(?)。

指定できるオプションは`Ximageon -help'で表示される。

`-softCursor'を指定しないとマウスカーソルの描画が崩れる場合がある。

`-use-evdev'はなんとなく指定...。

`-mouse'を指定すると何故だかマウスカーソルの「ブルブル」が軽減できる(ような気がする)。

そして実行属性を与える。

$ chmod +x ~/.xserverrc

フォントパスの設定

フォントパスを ~/.xinitrc の中で設定する。

if [ -e /usr/share/fonts/misc ]
then
	xset fp+ /usr/share/fonts/misc
fi
if [ -e /usr/share/fonts/75dpi ]
then
	xset fp+ /usr/share/fonts/75dpi
fi
if [ -e /usr/share/fonts/100dpi ]
then
	xset fp+ /usr/share/fonts/100dpi
fi
if [ -e /usr/share/fonts/Type1 ]
then
	xset fp+ /usr/share/fonts/Type1
fi

追記 : `Ximageon'の`-fp'オプションでも指定できるよう。

起動

$ startx

で、肝心の性能の方は、ARMedslack 13.1標準の /usr/bin/Xorg(fb版?)ではxengineで780rmp程度だったのが Ximageon では1200rpmぐらいまで向上 d(^^)。


2011年05月29日 ATI imageon patch for MPlayer-1.0rc4 from MPlayer-1.0pre8's patch [長年日記]

_ ATI imageon patch for MPlayer-1.0rc4 from MPlayer-1.0pre8's patch

I have ported ATI imageon patch for MPlayer-1.0rc4 from MPlayer-1.0pre8's patch.

I have succeeded to run mplayer with imageon on ARMedslack 13.1 with zaurus(SL-C760).

New patch is here :)

#
# MPlayer-1.0rc4-imageon.diff
#
*** ./Makefile.ORG	2011-05-28 17:05:02.695597593 +0900
--- ./Makefile	2011-05-28 17:06:42.277689754 +0900
***************
*** 541,546 ****
--- 541,547 ----
  SRCS_MPLAYER-$(DXR3)         += libvo/vo_dxr3.c
  SRCS_MPLAYER-$(ESD)          += libao2/ao_esd.c
  SRCS_MPLAYER-$(FBDEV)        += libvo/vo_fbdev.c libvo/vo_fbdev2.c
+ SRCS_MPLAYER-$(IMAGEON)      += libvo/vo_imageon.c
  SRCS_MPLAYER-$(GGI)          += libvo/vo_ggi.c
  SRCS_MPLAYER-$(GIF)          += libvo/vo_gif89a.c
  SRCS_MPLAYER-$(GL)           += libvo/gl_common.c libvo/vo_gl.c \
*** ./configure.ORG	2011-05-28 16:44:50.099669463 +0900
--- ./configure	2011-05-28 17:12:06.180388128 +0900
***************
*** 423,428 ****
--- 423,429 ----
    --enable-xshape          enable XShape support [autodetect]
    --disable-xss            disable screensaver support via xss [autodetect]
    --enable-fbdev           enable FBDev video output [autodetect]
+   --enable-imageon         enable imageon video output [no]
    --enable-mlib            enable mediaLib video output (Solaris) [disable]
    --enable-3dfx            enable obsolete /dev/3dfx video output [disable]
    --enable-tdfxfb          enable tdfxfb video output [disable]
***************
*** 630,635 ****
--- 631,637 ----
  _svga=auto
  _vesa=auto
  _fbdev=auto
+ _imageon=no
  _dvb=auto
  _dxr2=auto
  _dxr3=auto
***************
*** 996,1001 ****
--- 998,1005 ----
    --disable-vesa)       _vesa=no        ;;
    --enable-fbdev)       _fbdev=yes      ;;
    --disable-fbdev)      _fbdev=no       ;;
+   --enable-imageon)     _imageon=yes    ;;
+   --disable-imageon)    _imageon=no     ;;
    --enable-dvb)         _dvb=yes        ;;
    --disable-dvb)        _dvb=no         ;;
    --enable-dxr2)        _dxr2=yes       ;;
***************
*** 4876,4881 ****
--- 4880,4896 ----
  echores "$_fbdev"


+ echocheck "ATI Imageon 100 (imageon)"
+ if test "$_imageon" = yes ; then
+   def_imageon='#define CONFIG_IMAGEON 1'
+   libs_mplayer="$libs_mplayer -lw100"
+   vomodules="imageon $vomodules"
+ else
+   def_imageon='#undef CONFIG_IMAGEON'
+   novomodules="imageon $novomodules"
+ fi
+ echores "$_imageon"
+

  echocheck "DVB"
  if test "$_dvb" = auto ; then
***************
*** 8584,8589 ****
--- 8599,8605 ----
  FAAD_INTERNAL = $_faad_internal
  FASTMEMCPY = $_fastmemcpy
  FBDEV = $_fbdev
+ IMAGEON = $_imageon
  FREETYPE = $_freetype
  FTP = $_ftp
  GIF = $_gif
***************
*** 9121,9126 ****
--- 9137,9143 ----
  $def_dxr2
  $def_dxr3
  $def_fbdev
+ $def_imageon
  $def_ggi
  $def_ggiwmh
  $def_gif
*** ./libvo/video_out.c.ORG	2011-05-28 18:22:05.775727864 +0900
--- ./libvo/video_out.c	2011-05-28 18:27:29.443599038 +0900
***************
*** 113,118 ****
--- 113,119 ----
  extern const vo_functions_t video_out_bl;
  extern vo_functions_t video_out_fbdev;
  extern const vo_functions_t video_out_fbdev2;
+ extern vo_functions_t video_out_imageon;
  extern vo_functions_t video_out_svga;
  extern const vo_functions_t video_out_png;
  extern const vo_functions_t video_out_ggi;
***************
*** 214,219 ****
--- 215,223 ----
          &video_out_fbdev,
          &video_out_fbdev2,
  #endif
+ #ifdef CONFIG_IMAGEON
+         &video_out_imageon,
+ #endif
  #ifdef CONFIG_SVGALIB
          &video_out_svga,
  #endif
*** ./libvo/vo_imageon.c.ORG	2011-05-28 17:05:13.345722251 +0900
--- ./libvo/vo_imageon.c	2011-05-28 18:09:05.737762608 +0900
***************
*** 0 ****
--- 1,307 ----
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <inttypes.h>
+ #include <string.h>
+
+ #include "config.h"
+ #include "video_out.h"
+ #include "video_out_internal.h"
+ #include "mp_msg.h"
+
+ static vo_info_t info =
+ {
+         "ATI IMAGEON 100 driver",
+         "imageon",
+         "Manuel Teira",
+         "C760-Openzaurus Testing version"
+ };
+
+ LIBVO_EXTERN(imageon)
+
+ #include <acapi.h>
+
+ static struct w100privdata_t {
+         uint8_t config;
+         ac_device_t *dev;
+         uint16_t xres;
+         uint16_t yres;
+         uint16_t ovwidth;
+         uint16_t ovheight;
+         ac_surface_t insurface;
+         ac_surface_t ovsurface;
+         uint16_t srcwidth;
+         uint16_t srcheight;
+         uint8_t rotate;
+         uint8_t scale;
+         ac_point_t ovdst;
+         ac_point_t dstpos;
+         ac_overlayprops_t ovprops;
+         uint32_t format;
+ } w100_privdata;
+
+ static int preinit(const char *arg)
+ {
+         //Perhaps libw100 should include some code to query the framebuffer
+         struct w100privdata_t *pdata = &w100_privdata;
+
+         pdata->config = 0;
+         pdata->xres = 640;
+         pdata->yres = 480;
+         pdata->dev = ac_init(pdata->xres, pdata->yres, AC_ROT90);
+         if (pdata->dev) {
+                 return 0;
+         } else {
+                 //Put a log message here
+                 return 1;
+         }
+ }
+
+
+ static void draw_osd(void)
+ {
+ }
+
+ void check_events(void)
+ {
+         mp_msg(MSGT_VO, MSGL_V, "check_events got called\n");
+ }
+
+ static int config(uint32_t srcwidth, uint32_t srcheight,
+                   uint32_t dstwidth, uint32_t dstheight,
+                   uint32_t flags, char *title, uint32_t format)
+ {
+         struct w100privdata_t *pdata = &w100_privdata;
+         uint8_t xscale, yscale;
+         uint16_t scaledwidth, scaledheight;
+
+         mp_msg(MSGT_VO, MSGL_V,
+                "vo_imageon: srcwidth:%d, srcheight:%d, "
+                "dstwidth:%d, dstheight:%d\n",
+                srcwidth, srcheight, dstwidth, dstheight);
+
+         if (pdata->config) {
+                 ac_overlay_disable(pdata->dev);
+                 ac_free_surface(pdata->dev, &pdata->insurface);
+                 ac_free_surface(pdata->dev, &pdata->ovsurface);
+         }
+
+         pdata->srcwidth = srcwidth;
+         pdata->srcheight = srcheight;
+
+         //By the moment, only YUV420 supported
+         pdata->ovprops.format = OVLFORMAT_YUV420;
+         pdata->ovprops.portrait_mode = 0;
+         pdata->ovprops.inv_hor = 0;
+         pdata->ovprops.inv_ver = 0;
+         pdata->ovprops.yuv2rgb = 0;
+
+         pdata->rotate = AC_ROT90;
+
+         if (flags & VOFLAG_FULLSCREEN) {
+                 pdata->ovwidth = 240;
+                 pdata->ovheight = 320;
+                 xscale = ac_get_scaler(pdata->ovheight, srcwidth);
+                 yscale = ac_get_scaler(pdata->ovwidth, srcheight);
+                 pdata->scale = (xscale > yscale) ? xscale : yscale;
+                 pdata->ovdst.x = 0;
+                 pdata->ovdst.y = 0;
+                 pdata->ovprops.video_hor_exp = 1;
+                 pdata->ovprops.video_ver_exp = 1;
+         } else {
+                 pdata->ovwidth = (dstheight + 0xf) & ~0xf;
+                 pdata->ovheight = (dstwidth + 0xf) & ~0xf;
+                 xscale = ac_get_scaler(dstwidth, srcwidth);
+                 yscale = ac_get_scaler(dstheight, srcheight);
+                 pdata->ovdst.x = (pdata->xres - pdata->ovheight) / 2;
+                 pdata->ovdst.y = (pdata->yres - pdata->ovwidth) / 2;
+                 pdata->ovprops.video_hor_exp = 0;
+                 pdata->ovprops.video_ver_exp = 0;
+         }
+
+         pdata->scale = (xscale > yscale) ? xscale : yscale;
+         scaledwidth = ac_apply_scaler(srcwidth, pdata->scale);
+         scaledheight = ac_apply_scaler(srcheight, pdata->scale);
+         pdata->dstpos.x = (pdata->ovwidth - scaledheight) / 2;
+         pdata->dstpos.y = (pdata->ovheight - scaledwidth) / 2;
+
+         if (ac_alloc_surface(pdata->dev, &pdata->ovsurface,
+                              FMT_YUV420,
+                              pdata->ovwidth,
+                              pdata->ovheight,
+                              AC_MEM_INTERNAL) == NULL) {
+                 mp_msg(MSGT_VO, MSGL_FATAL, "Unable to allocate ov surface\n");
+                 return -1;
+         }
+
+         if (ac_alloc_surface(pdata->dev, &pdata->insurface,
+                              FMT_YUV420, srcwidth, srcheight,
+                              AC_MEM_INTERNAL) == NULL) {
+                 mp_msg(MSGT_VO, MSGL_WARN,
+                        "No room in internal memory for insurface\n");
+                 if (ac_alloc_surface(pdata->dev, &pdata->insurface,
+                                      FMT_YUV420, srcwidth, srcheight,
+                                      AC_MEM_EXTERNAL) == NULL) {
+                         mp_msg(MSGT_VO, MSGL_FATAL,
+                                "Unable to allocate surface\n");
+                         ac_free_surface(pdata->dev, &pdata->ovsurface);
+                         return -1;
+                 }
+         }
+
+         ac_clear_surface(pdata->dev, &pdata->ovsurface);
+         ac_clear_surface(pdata->dev, &pdata->insurface);
+
+
+         mp_msg(MSGT_VO, MSGL_V,
+                "vo_imageon: rotate:%d scale:%d ovwidth:%d, ovheight:%d, "
+                "ovdst(x:%d, y:%d) dstpos(x:%d,y:%d)\n",
+                pdata->rotate,
+                pdata->scale,
+                pdata->ovwidth,
+                pdata->ovheight,
+                pdata->ovdst.x,
+                pdata->ovdst.y,
+                pdata->dstpos.x,
+                pdata->dstpos.y);
+
+         ac_overlay_setup(pdata->dev, &pdata->ovsurface, &pdata->ovsurface.rect,
+                          &pdata->ovprops, 0);
+         ac_overlay_setpos(pdata->dev, &pdata->ovdst);
+         ac_overlay_enable(pdata->dev);
+
+         pdata->config = 1;
+         return 0;
+ }
+
+ static int draw_slice(uint8_t *image[], int stride[],
+                       int w, int h, int x, int y)
+ {
+         struct w100privdata_t *pdata = &w100_privdata;
+         ac_rect_t dstrect;
+         ac_surface_t *dstsurface = &pdata->insurface;
+         int plane;
+         mp_msg(MSGT_VO, MSGL_V,
+                "vo_imageon: draw_slice(w:%d,h:%d,x:%d,y:%d)\n",
+                w, h, x, y);
+
+         ac_reset_ctx(pdata->dev);
+         for (plane = 0; plane <= V_PLANE; plane++) {
+                 mp_msg(MSGT_VO, MSGL_V, "Plane: %d, Stride: %d\n",
+                        plane, stride[plane]);
+                 dstrect.x = x;
+                 dstrect.y = y;
+                 dstrect.w = w;
+                 dstrect.h = h;
+                 ac_host2planerect(pdata->dev,
+                                   image[plane],
+                                   &dstrect,
+                                   &pdata->insurface,
+                                   plane);
+         }
+         return 0;
+ }
+
+ static int draw_frame(uint8_t *frame[])
+ {
+         struct w100privdata_t *pdata = &w100_privdata;
+         mp_msg(MSGT_VO, MSGL_V, "vo_imageon: draw_frame() not implemented!\n");
+
+ }
+
+ static void flip_page(void)
+ {
+         struct w100privdata_t *pdata = &w100_privdata;
+         int plane;
+         ac_rect_t srcrect;
+         ac_point_t dstpoint;
+         ac_surface_t *insurface = &pdata->insurface;
+         ac_surface_t *ovsurface = &pdata->ovsurface;
+         ac_surfspec_t *surfspec = &ac_surfspecs[ovsurface->format];
+
+         mp_msg(MSGT_VO, MSGL_V, "vo_imageon: flip_page\n");
+
+         srcrect.x = 0;
+         srcrect.y = 0;
+
+         ac_reset_ctx(pdata->dev);
+         if (pdata->rotate != AC_ROT0) {
+                 ac_set_xform(pdata->dev, pdata->rotate, AC_NOMIRROR);
+         }
+         ac_disable_dbuf_update(pdata->dev);
+         ac_waitidle(pdata->dev);
+         for (plane = Y_PLANE; plane < surfspec->nplanes; plane++) {
+                 ac_setsrcplane(pdata->dev, insurface, plane);
+                 ac_setdstplane(pdata->dev, ovsurface, plane);
+                 ac_prepare_scaleblt(pdata->dev, DP_DST_8BPP);
+                 srcrect.w = pdata->srcwidth / surfspec->planes[plane].xsubsampling;
+                 srcrect.h = pdata->srcheight / surfspec->planes[plane].ysubsampling;
+                 dstpoint.x = pdata->dstpos.x / surfspec->planes[plane].xsubsampling;
+                 dstpoint.y = pdata->dstpos.y / surfspec->planes[plane].ysubsampling;
+                 mp_msg(MSGT_VO, MSGL_V,
+                        "vo_imageon: scaleblt src(x:%d,y:%d,w:%d,h:%d)"
+                        "dst(%d,%d)"
+                        "scale(%d)\n",
+                        srcrect.x, srcrect.y,
+                        srcrect.w, srcrect.h,
+                        dstpoint.x, dstpoint.y,
+                        pdata->scale);
+                 ac_scaleblt(pdata->dev, &srcrect, &dstpoint,
+                             pdata->scale, pdata->scale);
+         }
+         ac_enable_dbuf_update(pdata->dev);
+ }
+
+ static void uninit(void)
+ {
+         struct w100privdata_t *pdata = &w100_privdata;
+         ac_overlay_disable(pdata->dev);
+         ac_finish(pdata->dev);
+ }
+
+ static int control(uint32_t request, void *data, ...)
+ {
+         struct w100privdata_t *pdata = &w100_privdata;
+         switch (request) {
+         case VOCTRL_QUERY_FORMAT:
+                 return query_format(*((uint32_t *)data));
+         case VOCTRL_FULLSCREEN:
+                 mp_msg(MSGT_VO, MSGL_V, "vo_imageon: Asked for fullscreen\n");
+         }
+         return VO_NOTIMPL;
+ }
+
+ static int query_format(uint32_t format)
+ {
+         mp_msg(MSGT_VO, MSGL_V,
+                "vo_imageon: query_format was called: %x (%s)\n",
+                format, vo_format_name(format));
+
+         if (IMGFMT_IS_RGB(format)) {
+                 return 0;
+
+                 switch (IMGFMT_RGB_DEPTH(format)) {
+                 case 16:
+                         return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW |
+                                 VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN |
+                                 VFCAP_OSD | VFCAP_ACCEPT_STRIDE;
+                         break;
+                 }
+         } else {
+                 /* Planar YUV Formats */
+                 switch (format) {
+                 case IMGFMT_YV12:
+                 case IMGFMT_IYUV:
+                 case IMGFMT_I420:
+                 case IMGFMT_YVU9:
+                 case IMGFMT_IF09:
+                 case IMGFMT_Y8:
+                 case IMGFMT_Y800:
+                         return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW |
+                                 VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN |
+                                 VFCAP_OSD | VFCAP_ACCEPT_STRIDE;
+                         break;
+                 }
+         }
+
+         return 0;
+ }

You need permission to access /dev/mem to play mplayer with imageon, so you should execute like

$ sudo mplayer -vo imageon ...

or execute as root.

Have fun !

Some issue :(

  • With imageon, mplayer play sound with a little bit noisy.