Cedrus

From linux-sunxi.org
Jump to: navigation, search

Contents

Overview

Cedrus is a project intended for fully opensource hardware video-decoding stack, replacing the proprietary, GPL violating CedarX shipped with sunxi devices. The name stems from the Cedrus tree, which commonly is known as Cedar.

Cedrus support is currently implemented as a vdpau driver for the vdpau framework.

Main project is located on Github: https://github.com/linux-sunxi/libvdpau-sunxi

Current status

Currently the driver is in alpha status or Proof of Concept (PoC) phase. The driver is quite usable, but by far not production quality and a security risk. Confirmed work with A10, A13 and A20.

SECURITY NOTE:: Currently opensource driver implemented as replacement of blob. Blob and current opensource replacement driver (vdpau-sunxi) use allwinner's kernel driver that remap registers for use in userspace, with allwinner disp driver used for hardware overlay. Together with access to physical memory, and dangerous VE DMA ability it makes serious security problem.

That should be replaced proper way in ongoing mainline process.

Supported codec matrix

Codec vdpau-sunxi Opensource PoC Blob decoder
Decoding support
MPEG1 Yes(only progressive) Yes Yes
MPEG2 Yes(only progressive) Yes Yes
MPEG4 Limited No Yes
MS-MPEG No No Yes
VP6 No No Yes
JPEG No[1] Yes No
MJPEG No[1] Yes Yes
XDIV No No Yes
DIVX No No Yes
Sorenson No[1] No Yes
WMV9 No No Yes
RMVB No[1] No Yes
H264 Yes No Yes
AVS No[1] No No
VP8 No[1] Yes Yes
Encoding support
JPEG No[2] Yes Yes
MJPEG No[2] No No
H264 No[2] (Only I-frames) Yes
  1. 1.0 1.1 1.2 1.3 1.4 1.5 VDPAU does not support this codec
  2. 2.0 2.1 2.2 VDPAU API doesn't have support for encoding.

Tasks

Cedrus/libvdpau_integration_matrix gives an overview about the functions provided via the VDPAU API and their integration in libvdpau-sunxi. It also lists the required functions for various programs.

Installation

Prerequisites

Various things are required to get cedrus to play back video. This list can act as a quick start.

  • Proper memory reservation
  • cedarX module either compiled in or the module loaded
  • write access permissions on /dev/disp and /dev/cedar_dev
  • sunxi-vdpau library installed
  • enviroment variable telling libvdpau which library to use

Reserve memory for the VPU

The VPU needs a block of memory to store (de)coded frames in. The kernel needs to be informed about this before booting. To do so, the kernel command line needs to be modified. This can be done at compiletime or by modifying the bootloaders Kernel_arguments. By default Allwinner reserves 80 Megabytes but depending on the player being used and video being decoded, less can suffice or more can be necessary. Feel free to experiment with the amount, but if available, 128 MiB is a nice number to test things with. This can be set by the following kernel argument.

sunxi_ve_mem_reserve=128

This kernel parameter is ignored in recent 3.4 kernels, if CMA is enabled in kernel configuration. If CONFIG_CMA=y, ve_size is hardcoded to 80MB in sunxi_cedar kernel module.

CedarX module

Depending on where the kernel came from, the cedarX kernel is either available as module or built in. To see whether it is available, check whether /dev/cedar_dev exists. If not, run modprobe sun4i_cedar_dev (in future versions this should be called sunxi_cedar_dev). There should now be a /dev/cedar_dev

Write access persmissions

To be able to pass data to the VPU, proper permission to /dev/cedar_dev is required.

For testing, manually setting permissions is fine.

chown <username>:<usergroup> /dev/cedar_dev
chmod 666 /dev/cedar_dev

The VPU only decodes the video codec. To have it appear on the display, write access permission to /dev/disp is required.

chown <username>:<usergroup> /dev/disp
chmod 666 /dev/disp

To do this properly with udev rules, create files for each under /etc/udev/rules.d/

50-disp.rules

KERNEL=="disp", MODE="0660", GROUP="video"

50-cedar.rules

KERNEL=="cedar_dev", MODE="0660", GROUP="video"

Installing sunxi-vdpau library

There are currently no pre-compiled binaries available and have to be compiled from source. This most likely has to be performed on the target device, while possible to be cross compiled.

Prerequisites

  • git (yum install git | apt-get install git | emerge git)
  • gcc (yum group-install "Development Tools" | apt-get install build-essential)
  • libvdpau-dev (yum install libvdpau-dev | apt-get install libvdpau-dev | emerge libvdpau)

Compiling source

The current libvdpau code is stored on github and gitorious.

git clone https://github.com/linux-sunxi/libvdpau-sunxi.git
cd libvdpau-sunxi
make
sudo make install

Pay close attention as to where these libraries get installed. Depending on the distro in use, it's most likely they will need to be put in /usr/lib/vdpau. If they are not put there, manually copy them there. With the driver now installed, it is important to tell vdpau to use this library. By default it will try to load and use the nVidia vdpau implementation.

export VDPAU_DRIVER=sunxi

The latest git version of Xorg#fbturbo_driver can report the DRI2 VDPAU name as 'sunxi', if 'sunxi_cedar_mod' kernel module loaded successfully. See commit

Playing video

With everything setup properly, it should now be possible to playback accelerated media!

The best test file would be one of the well known sample media's. The big buck bunny is an often used one. http://samplemedia.linaro.org/H264/big_buck_bunny_1080p_H264_AAC_25fps_7200K.MP4

Depending if you use mpv or mplayer2, the following options are required. For mplayer2:

 mplayer -vo vdpau -vc ffmpeg12vdpau,ffh264vdpau, [filename]

For mpv:

 mpv --vo=vdpau --hwdec=vdpau --hwdec-codecs=all [filename]

Note: There have been reports that some mplayer versions in certain repositories are not compiled with vdpau support.

Now you can also try to use other files, but note it has to be mpeg1, mpeg2 or h264 encoded!

OSD support

Now we have simple OSD implementation, using g2d hardware.

Access to g2d (as xorg turbo driver) is also required.

chmod 666 /dev/g2d

To do this properly with udev rules, create a file under /etc/udev/rules.d/

50-g2d.rules

KERNEL=="g2d", MODE="0660", GROUP="video"

and make sure that the user wanting to decode video is in the video group!

To turn on OSD support during runtime

export VDPAU_OSD=1


Note: mplayer's "-ass" osd not currently supported, due to lack of 'alpha only' surfaces support in current g2d driver

Personal tools
Namespaces

Variants
Actions
Navigation
Tools