2015年3月23日 星期一

為 Bay Trail 低功耗小電腦安裝 Ubuntu 14.04.2 所做的一些最佳化

首先是實體記憶體只有 1~2 GB

所以安裝 zram-config 跟修改 /etc/default/grub 當中的 GRUB_CMDLINE_LINUX 加上 zswap.enabled=1

sudo apt-get install zram-config
sudo service zram-config start
sudo sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="zswap.enabled=1"/' /etc/default/grub
Zram 是壓縮實體記憶體當中的資料的技術,而 Zswap 則是壓縮 Swap 分割區當中的資料的技術,兩者都會稍微增加 CPU 使用量。

另外也可以使用更有效率的 lz4 壓縮格式,請參考 http://www.plurk.com/p/kumpgn/etc/init/zram-config.conf 的設定。

然後是透過 VAAPI 來使用硬體解碼器

首先可以安裝 VAAPI 相關的軟體套件。

sudo apt-get install i965-va-driver gstreamer1.0-vaapi vainfo

然後就可以透過 vainfo 指令看到有支援哪些硬體加速編碼跟解碼

$ vainfo
libva info: VA-API version 0.35.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_35
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.35 (libva 1.3.0)
vainfo: Driver version: Intel i965 driver - 1.3.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD

然後安裝 VLC 媒體播放器後,再從偏好設定中開啟功能。

sudo apt-get install --yes vlc

讓 Chromium 支援 VAAPI

然後因為到目前為止 (2015/03/23) Google Chrome/Chromium 並沒有支援一般 Linux 系統上的 VAAPI,所以如果想要使用必須安裝 ppa:saiarcot895/chromium-beta 所提供的 Chromium 才會有。

另外可能還需要更改 Chromium 的啟動參數,為了減少 Chromium 的記憶體使用量,我還參考了 Process Models - The Chromium Projects 上面的模式,使用了 --process-per-site。

sudo add-apt-repository --yes ppa:saiarcot895/chromium-beta
sudo apt-get update
sudo apt-get install --yes chromium-browser
sudo sed -i 's/CHROMIUM_FLAGS=""/CHROMIUM_FLAGS="--ignore-gpu-blacklist --process-per-site"/' /etc/chromium-browser/default

另外還要在 Chromium 上安裝 Adblock for Youtube™h264ify,安裝 Adblock for Youtube™ 是因為 Youtube™ 影片內嵌的廣告會影響到播放品質,在這個低功耗的電腦上面特別明顯,而安裝 h264ify 則是因為 Youtube™ 預設的串流編碼是 VP9,而我用的這個電腦上面並沒有支援 VP9 的硬體加速解碼,所以安裝 h264ify 強制讓 Youtube™ 串流編碼變成 H264。

另外就是 Ubuntu Unity 桌面預設的 Totem 媒體播放器目前還沒有支援 VAAPI,不然安裝 gstreamer1.0-vaapi 可以派上用場了,不過也許可以參考 http://gitorious.org/vaapi/gstreamer-vaapi 當中的 README 使用 gst-launch-1.0 來感受一下。

Usage
-----

  VA elements are automatically plugged into GStreamer pipelines. So,
  using playbin (or playbin2 with GStreamer 0.10) should work as is.
  However, here are a few alternate pipelines that could be manually
  constructed.

  * Play an H.264 video with an MP4 container in fullscreen mode
  $ gst-launch-1.0 -v filesrc location=/path/to/video.mp4 ! \
      qtdemux ! vaapidecode ! vaapisink fullscreen=true

  * Play a raw MPEG-2 interlaced stream
  $ gst-launch-1.0 -v filesrc location=/path/to/mpeg2.bits ! \
      mpegvideoparse ! vaapidecode ! vaapipostproc ! vaapisink

  * Convert from one pixel format to another, while also downscaling
  $ gst-launch-1.0 -v filesrc location=/path/to/raw_video.yuv ! \
      videoparse format=yuy2 width=1280 height=720 ! \
      vaapipostproc format=nv12 height=480 ! vaapisink

  * Encode a 1080p stream in raw I420 format into H.264
  $ gst-launch-1.0 -v filesrc location=/path/to/raw_video.yuv ! \
      videoparse format=i420 width=1920 height=1080 framerate=30/1 ! \
      vaapiencode_h264 rate-control=cbr tune=high-compression ! \
      qtmux ! filesink location=/path/to/encoded_video.mp4

Mozilla Firefox 目前好像也沒有支援 VAAPI,也許有人可以幫忙補充一下進度。

未來的 PowerVR 對於 VP8 的硬體加速解碼支援

目前只看到了兩則報導,分別是去年十月的 Intel Publishes DRM Driver For PowerVR Video Decoder! VP8 Decoding! 跟今年一月的 Intel Is Still Working On The VED DRM Driver For PowerVR,但是還沒有看到那些 commits 進到 mainline kernel 裡面,另外 Youtube™ 上面的預設串流編碼是 VP9,不曉得 VP8 的硬解支援能不能夠幫助到 VP9,目前看起來未來會多一兩個檔案名稱內有 ipvr 的 kernel module 。

最後另外順便收集了一下 Dell New XPS 13 在 vivid 上面的 vainfo 感覺還不錯。

libva info: VA-API version 0.37.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_37
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.37 (libva 1.5.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Broadwell - 1.5.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice