Difference between revisions of "Raspberry Pi VideoCore APIs"

From eLinux.org
Jump to: navigation, search
(Function Documentation: Add more detail on graphics_get_display_size, implementation is public)
m (Add proper Qt5 link)
Line 95: Line 95:
* '''[http://wiki.xbmc.org/index.php?title=Raspberry_Pi XBMC]''' - ''a media center, omxplayer's "big brother" ''
* '''[http://wiki.xbmc.org/index.php?title=Raspberry_Pi XBMC]''' - ''a media center, omxplayer's "big brother" ''
* '''[http://nccastaff.bournemouth.ac.uk/jmacey/GraphicsLib/piNGL/index.html piNGL]''' - ''port of the NGL graphics library to Raspberry Pi''
* '''[http://nccastaff.bournemouth.ac.uk/jmacey/GraphicsLib/piNGL/index.html piNGL]''' - ''port of the NGL graphics library to Raspberry Pi''
* qt5 samples - ''TODO: Find link''
* '''[http://qt-project.org/wiki/Qt-RaspberryPi Qt on Pi]''' - ''Raspberry Pi port of the Qt toolkit''

Revision as of 15:13, 20 June 2012

Back to the Hub.

Software & Distributions:

Software - an overview.

Distributions - operating systems and development environments for the Raspberry Pi.

Kernel Compilation - advice on compiling a kernel.

Performance - measures of the Raspberry Pi's performance.

Programming - programming languages that might be used on the Raspberry Pi.

The Raspberry Pi contains a Broadcom VideoCore IV GPU providing OpenGL ES 1.1, OpenGL ES 2.0, hardware-accelerated OpenVG 1.1, Open EGL, OpenMAX and 1080p30 H.264 high-profile decode. There are 24 GFLOPS of general purpose compute and a bunch of texture filtering and DMA infrastructure. Eben worked on the architecture team for this and the Raspberry Pi team are looking at how they can make some of the proprietary features available to application programmers.

Currently C header files and libraries for many of the Broadcom APIs are located in /opt/vc/include and /opt/vc/lib respectively, or available from GitHub within the same directory structure. Some documentation is contained within comments in the header files, as well as documentation for the OpenMAX IL components in the documentation directory on Github, however it is severely lacking and difficult to understand in a general sense for people wanting to experiment with the device due to it being proprietary. As such, we encourage you to edit this page to help us build a much better open documentation.


  • The Raspberry Pi requires that the bcm_host_init() function is called first before any GPU calls can be made.
  • graphics_get_display_size() is a broadcom-specific function

Sample Programs

The Raspberry Pi comes with 7 sample programs and two helper libraries in the /opt/vc/src/hello_pi directory showing some of the system's capabilities and sample code.


This sample decodes h264 video using the OpenMAX APIs and the ilclient library, and is distributed with a short scene of Big Buck Bunny

ilclient helper library

This library is described as: This API defines helper functions for writing IL clients.

* This file defines an IL client side library.  This is useful when
* writing IL clients, since there tends to be much repeated and
* common code across both single and multiple clients.  This library
* seeks to remove that common code and abstract some of the
* interactions with components.  There is a wrapper around a
* component and tunnel, and some operations can be done on lists of
* these.  The callbacks from components are handled, and specific
* events can be checked or waited for.





These APIs allow controlling the HDMI and SDTV video outputs of the Raspberry Pi.

TODO: Describe better






EGL (Native Platform Graphics Interface) is an interface between Khronos rendering APIs such as OpenGL ES or OpenVG and the underlying native platform. The Raspberry Pi supports EGL Version 1.4 and the following EGL extensions (links are to EGL registry documentation):[1]


See Getting Started with EGL post by Jon Macey. Extended documentation available in the EGL Version 1.4 Specification and Simple Reference available in the EGL 1.4 API Quick Reference Card.

Function Documentation

int32_t graphics_get_display_size( const uint16_t display_number, uint32_t *width, uint32_t *height);

This function allows you to get the size of the display, and is often used in creating an EGL Surface. width and height are pointers that you pass in to where you want the response values to be written to, display number 0 is usually used for the Raspberry Pi. return value of >= 0 indicates success, <0 indicates failure.

This function is implemented in libbcm_host, and the implementation has been made public showing that it internally calls the vc_dispmanx_display_get_info function to get the width and height of the current mode.

Bugs present in early versions of the firmware caused this function to always return 1920x1080, however this can easily be fixed by updating the firmware with Hexxeh's rpi-update.[2][3]


The Raspberry Pi supports OpenGL ES 2.0 with the following extensions: [1]

  • GL_OES_compressed_ETC1_RGB8_texture
  • GL_OES_compressed_paletted_texture
  • GL_OES_texture_npot GL_OES_depth24
  • GL_OES_vertex_half_float
  • GL_OES_EGL_image
  • GL_OES_EGL_image_external
  • GL_EXT_discard_framebuffer
  • GL_OES_rgb8_rgba8
  • GL_OES_depth32
  • GL_OES_mapbuffer
  • GL_EXT_texture_format_BGRA8888
  • GL_APPLE_rgb_422
  • GL_EXT_debug_marker

TODO: Sample of how to use/initalise OpenGL ES


See /documentation/ilcomponents on GitHub firmware repository for official documentation.

TODO: Sample of how to use OpenMAX to decode audio/video/images, etc.

Other Programming Languages

TODO: Find and list any libraries written for other languages (e.g. Python) that interface with the Pi's GPU

Programs designed to work with the Raspberry Pi's VideoCore APIs

  • omxplayer - a command line a/v player for the Raspberry Pi utilising the OpenMAX APIs and ffmpeg
  • XBMC - a media center, omxplayer's "big brother"
  • piNGL - port of the NGL graphics library to Raspberry Pi
  • Qt on Pi - Raspberry Pi port of the Qt toolkit


  1. 1.0 1.1 eglinfo, http://www.raspberrypi.org/phpBB3/viewtopic.php?p=35942#p35942 , http://www.raspberrypi.org/phpBB3/viewtopic.php?p=36318#p36318
  2. http://www.raspberrypi.org/phpBB3/viewtopic.php?f=68&t=8252
  3. https://github.com/raspberrypi/firmware/issues/14