Starboard Module Reference: decode_target.h

A target for decoding image and video data into. This corresponds roughly to an EGLImage, but that extension may not be fully supported on all GL platforms. SbDecodeTarget supports multi-plane targets.

An SbDecodeTarget can be passed into any function which decodes video or image data. This allows the application to allocate fast graphics memory, and have decoding done directly into this memory, avoiding unnecessary memory copies, and also avoiding pushing data between CPU and GPU memory unnecessarily.


SbDecodeTargets support several different formats that can be used to decode into and render from. Some formats may be easier to decode into, and others may be easier to render. Some may take less memory. Each decoder needs to support the SbDecodeTargetFormat passed into it, or the decode will produce an error. Each decoder provides a way to check if a given SbDecodeTargetFormat is supported by that decoder.


Some components may need to acquire SbDecodeTargets compatible with a certain rendering context, which may need to be created on a particular thread. The SbDecodeTargetGraphicsContextProvider are passed in to the Starboard implementation from the application and provide information about the rendering context that will be used to render the SbDecodeTarget objects. For GLES renderers, it also provides functionality to enable the Starboard implementation to run arbitrary code on the application's renderer thread with the renderer's EGLContext held current. This may be useful if your SbDecodeTarget creation code needs to execute GLES commands like, for example, glGenTextures().

The primary usage is likely to be the SbPlayer implementation on some platforms.

SbDecodeTarget Example

Let's say that we are an application and we would like to use the interface defined in starboard/image.h to decode an imaginary "image/foo" image type.

First, the application should enumerate which SbDecodeTargetFormats are supported by that decoder.

SbDecodeTargetFormat kPreferredFormats[] = {

SbDecodeTargetFormat format = kSbDecodeTargetFormatInvalid;
for (int i = 0; i < SB_ARRAY_SIZE_INT(kPreferredFormats); ++i) {
  if (SbImageIsDecodeSupported("image/foo", kPreferredFormats[i])) {
    format = kPreferredFormats[i];

Now that the application has a format, it can create a decode target that it will use to decode the .foo file into. Let's assume format is kSbDecodeTargetFormat1PlaneRGBA, that we are on an EGL/GLES2 platform. Also, we won't do any error checking, to keep things even simpler.

SbDecodeTarget target = SbImageDecode(
    context_provider, encoded_foo_data, encoded_foo_data_size,
    "image/foo", format);

// If the decode works, you can get the texture out and render it.
SbDecodeTargetInfo info;
memset(&info, 0, sizeof(info));
SbDecodeTargetGetInfo(target, &info);
GLuint texture =



Well-defined value for an invalid decode target handle.



The list of all possible decoder target formats. An SbDecodeTarget consists of one or more planes of data, each plane corresponding with a surface. For some formats, different planes will be different sizes for the same dimensions.

NOTE: For enumeration entries with an alpha component, the alpha will always be premultiplied unless otherwise explicitly specified.


  • kSbDecodeTargetFormat1PlaneRGBA

    A decoder target format consisting of a single RGBA plane, in that channel order.

  • kSbDecodeTargetFormat1PlaneBGRA

    A decoder target format consisting of a single BGRA plane, in that channel order.

  • kSbDecodeTargetFormat2PlaneYUVNV12

    A decoder target format consisting of Y and interleaved UV planes, in that plane and channel order.

  • kSbDecodeTargetFormat3PlaneYUVI420

    A decoder target format consisting of Y, U, and V planes, in that order.

  • kSbDecodeTargetFormat3Plane10BitYUVI420

    A decoder target format consisting of 10bit Y, U, and V planes, in that order. Each pixel is stored in 16 bits.

  • kSbDecodeTargetFormat3Plane10BitYUVI420Compact

    A decoder target format consisting of 10bit Y, U, and V planes, in that order. The plane data is stored in a compact format. Every three 10-bit pixels are packed into 32 bits.

  • kSbDecodeTargetFormat1PlaneUYVY

    A decoder target format consisting of a single plane with pixels laid out in the format UYVY. Since there are two Y values per sample, but only one U value and only one V value, horizontally the Y resolution is twice the size of both the U and V resolutions. Vertically, they Y, U and V all have the same resolution. This is a YUV 422 format. When using this format with GL platforms, it is expected that the underlying texture will be set to the GL_RGBA format, and the width of the texture will be equal to the number of UYVY tuples per row (e.g. the u/v width resolution). Content region left/right should be specified in u/v width resolution.

  • kSbDecodeTargetFormatInvalid

    An invalid decode target format.


All the planes supported by SbDecodeTarget.


  • kSbDecodeTargetPlaneRGBA

    The RGBA plane for the RGBA format.

  • kSbDecodeTargetPlaneBGRA

    The BGRA plane for the BGRA format.

  • kSbDecodeTargetPlaneY

    The Y plane for multi-plane YUV formats.

  • kSbDecodeTargetPlaneUV

    The UV plane for 2-plane YUV formats.

  • kSbDecodeTargetPlaneU

    The U plane for 3-plane YUV formats.

  • kSbDecodeTargetPlaneV

    The V plane for 3-plane YUV formats.



A handle to a target for image data decoding.


typedef SbDecodeTargetPrivate* SbDecodeTarget


Signature for a function provided by the application to the Starboard implementation that will let the Starboard implementation run arbitrary code on the application's renderer thread with the application's EGLContext held current.


typedef void(* SbDecodeTargetGlesContextRunner) (struct SbDecodeTargetGraphicsContextProvider *graphics_context_provider, SbDecodeTargetGlesContextRunnerTarget target_function, void *target_function_context)


Signature for a Starboard implementation function that is to be run by a SbDecodeTargetGlesContextRunner callback.


typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)



In general, the SbDecodeTargetGraphicsContextProvider structure provides information about the graphics context that will be used to render SbDecodeTargets. Some Starboard implementations may need to have references to some graphics objects when creating/destroying resources used by SbDecodeTarget. References to SbDecodeTargetGraphicsContextProvider objects should be provided to all Starboard functions that might create SbDecodeTargets (e.g. SbImageDecode()).


  • void * egl_display

    A reference to the EGLDisplay object that hosts the EGLContext that will be used to render any produced SbDecodeTargets. Note that it has the type void* in order to avoid #including the EGL header files here.

  • void * egl_context

    The EGLContext object that will be used to render any produced SbDecodeTargets. Note that it has the type void* in order to avoid

    including the EGL header files here.

  • SbDecodeTargetGlesContextRunner gles_context_runner

    The gles_context_runner function pointer is passed in from the application into the Starboard implementation, and can be invoked by the Starboard implementation to allow running arbitrary code on the renderer's thread with the EGLContext above held current.

  • void * gles_context_runner_context

    Context data that is to be passed in to gles_context_runner when it is invoked.


Contains all information about a decode target, including all of its planes. This can be queried via calls to SbDecodeTargetGetInfo().


  • SbDecodeTargetFormat format

    The decode target format, which would dictate how many planes can be expected in planes.

  • bool is_opaque

    Specifies whether the decode target is opaque. The underlying source of this value is expected to be properly maintained by the Starboard implementation. So, for example, if an opaque only image type were decoded into an SbDecodeTarget, then the implementation would configure things in such a way that this value is set to true. By opaque, it is meant that all alpha values are guaranteed to be 255, if the decode target is of a format that has alpha values. If the decode target is of a format that does not have alpha values, then this value should be set to true. Applications may rely on this value in order to implement certain optimizations such as occlusion culling.

  • int width

    The width of the image represented by this decode target.

  • int height

    The height of the image represented by this decode target.

  • SbDecodeTargetInfoPlane planes

    The image planes (e.g. kSbDecodeTargetPlaneRGBA, or {kSbDecodeTargetPlaneY, kSbDecodeTargetPlaneU, kSbDecodeTargetPlaneV} associated with this decode target.


Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.


  • float left

    If the texture (width, height) is set to (1, 1), then these values will be interpreted as normalized coordinates, and depending on the platform (for example GLES 2.0 provides no method of obtaining the texture width/height) this may be more natural than specifying absolute pixel offsets.

  • float top

  • float right

  • float bottom


Defines an image plane within a SbDecodeTargetInfo object.


  • uint32_t texture

    A handle to the GL texture that can be used for rendering.

  • uint32_t gl_texture_target

    The GL texture target that should be used in calls to glBindTexture. Typically this would be GL_TEXTURE_2D, but some platforms may require that it be set to something else like GL_TEXTURE_EXTERNAL_OES.

  • uint32_t gl_texture_format

    For kSbDecodeTargetFormat2PlaneYUVNV12 planes: the format of the texture. Usually, for the luma plane, this is either GL_ALPHA or GL_RED_EXT. For the chroma plane, this is usually GL_LUMINANCE_ALPHA or GL_RG_EXT. Ignored for other plane types.

  • int width

    The width of the texture/surface for this particular plane.

  • int height

    The height of the texture/surface for this particular plane.

  • SbDecodeTargetInfoContentRegion content_region

    The following properties specify a rectangle indicating a region within the texture/surface that contains valid image data. The top-left corner is (0, 0) and increases to the right and to the bottom. The units specified by these parameters are number of pixels. The range for left/right is [0, width], and for top/bottom it is [0, height].



This function is just an implementation detail of SbDecodeTargetReleaseInGlesContext() and should not be called directly.


static void PrivateDecodeTargetReleaser(void *context)


Writes all information about decode_target into out_info. The decode_target must not be kSbDecodeTargetInvalid. The out_info pointer must not be NULL. Returns false if the provided out_info structure is not zero initialized.


bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)


Returns whether a given format is valid.


static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)


Returns whether the given file handle is valid.


static bool SbDecodeTargetIsValid(SbDecodeTarget handle)


Returns ownership of decode_target to the Starboard implementation. This function will likely result in the destruction of the SbDecodeTarget and all its associated surfaces, though in some cases, platforms may simply adjust a reference count. In the case where SB_HAS(GLES2), this function must be called on a thread with the context


void SbDecodeTargetRelease(SbDecodeTarget decode_target)


Helper function that is possibly useful to Starboard implementations that will release a decode target on the thread with the GLES context current.


static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)


Inline convenience function to run an arbitrary SbDecodeTargetGlesContextRunnerTarget function through a SbDecodeTargetGraphicsContextProvider . This is intended to be called by Starboard implementations, if it is necessary.


static void SbDecodeTargetRunInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTargetGlesContextRunnerTarget target, void *target_context)