Xilinx video codec unit (VCU) provides multi-standard video encoding and decoding capabilities, including: High Efficiency Video Coding (HEVC), i.e., H.265; and Advanced Video Coding (AVC), i.e., H.264 standards. VCU software stack consists of custom kernel module and custom user space library known as Control Software (CtrlSW). The OpenMAX IL (OMX) layer is integrated on top of CtrlSW, and Gstreamer frame work is used to integrate OMX-IL component along with other multimedia elements.

OpenMAX™ is a cross-platform API that provides comprehensive streaming media codec and application portability by enabling accelerated multimedia components. Gstreamer is the cross-platform / open source multimedia framework, and provides the infrastructure to integrate multiple multimedia components and create pipelines.

Users can develop their application at all 3 levels, i.e. CtrlSW, OMX-IL, and Gstreamer.

VCU Software Stack

Supported Features

  • Multi-standard encoding/decoding support, including:
    • Advanced Video Coding (AVC) H.264
    • High Efficiency Video Coding (HEVC) H.265
    • HEVC Main profiles, level upto 5.1, High Tier, 4kp60 Encoding/Decoding
    • AVC BP/MP/HP, level upto 5.2, 4kp60 Encoding/Decoding
  • Supports multi-stream encoding/decoding up to 8(1080p30) streams
  • 420/422 chroma-format support
  • 8/10 bit encoding/decoding
  • Slice level Encoding/Decoding
  • Flexible Rate Control: CBR, VBR, Constant QP, Low-latency-RC(Optimized for streaming applications)
  • On-the-fly change of multiple encoding parameters
    • Target bitrate
    • Gop length
    • Number of B frames
    • Insertion of IDR picture
  • Region of Interest based Encoding (ROI)

API information and Example pipelines

Refer to VCU product guide documentation for more details on example pipelines, API information, Encoder/Decoder application flow chart, Encoder parameters...etc.

H.264/H.265 Video Codec Unit v1.1

Source code repos

VCU Control-Software
VCU Openmax-IL
VCU Linux-driver
VCU firmware


CMA Size setting instructions for Yocto and Petalinux users:

  • Using kernel menuconfig option

    1. Run kernel menuconfig using below cmds
      1. peta-linux : "petalinux-config -c kernel"
      2. yocto: " bitbake -f virtual/kernel -c menuconfig"
    2. Go to Device Drivers→Generic Driver options→ DMA Contiguous Memory Allocator
    3. Set default contiguous memory size as per your preferred value depending upon your usecase
    4. Save the configuration, exit the menuconfig and build images
  • Using bootargs at uboot prompt

    1. During boot-up stop at uboot prompt by continuously pressing any key during bootup and set custom CMA size using below cmd
      • "setenv bootargs $bootargs cma=1500m"
      • boot
  • Using custom uEnv.txt for Yocto

    1. There is a custom uEnv.txt file being generated by yocto build at work/build/tmp/deploy/images/zcu106-zynqmp which can be edited to set custom cma size.
    2. Modify uEnv.txt bootargs option to set requried cma size as below
      • "bootargs=earlycon clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait cma=1500m"
    3. Copy uEnv.txt having CMA boot args setting in boot partition (i.e the first partition) of sdcard and boot the board.

2018.2 release:

  • Fixed AVC Decoder hang issue for corrupted input file
  • Fixed data corruption issue observed with b-frame enable
  • Fixed zynqmp_vcu_encode application to support b-frames in AVC.
  • Fixed long run frame drop issue for AVC1080p60 decode→display with large input file
  • Fixed bad parameter error when setting baseline profile and level=5.1
  • Fixed MCU clock division calculation in VCU Init driver.
  • Improve CBR/VBR rate control for static video sequences