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.

- SbDecodeTargetFormat

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.

- SbDecodeTargetGraphicsContextProvider

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.

## Macros

### kSbDecodeTargetInvalid

Well-defined value for an invalid decode target handle.

## Enums

### SbDecodeTargetFormat

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.

#### Values

- `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, the Y, U, and V planes 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.

### SbDecodeTargetPlane

All the planes supported by SbDecodeTarget.

#### Values

- `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.

## Typedefs

### SbDecodeTarget

A handle to a target for image data decoding.

#### Definition

    typedef SbDecodeTargetPrivate* SbDecodeTarget

### SbDecodeTargetGlesContextRunner

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.

#### Definition

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

### SbDecodeTargetGlesContextRunnerTarget

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

#### Definition

    typedef void(* SbDecodeTargetGlesContextRunnerTarget) (void *gles_context_runner_target_context)

## Structs

### SbDecodeTargetGraphicsContextProvider

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.

#### Members

- `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.

### SbDecodeTargetInfo

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

#### Members

- `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.

### SbDecodeTargetInfoContentRegion

Defines a rectangular content region within a SbDecodeTargetInfoPlane structure.

#### Members

- `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`

### SbDecodeTargetInfoPlane

Defines an image plane within a SbDecodeTargetInfo object.

#### Members

- `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\].

## Functions

### PrivateDecodeTargetReleaser

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

#### Declaration

    static void PrivateDecodeTargetReleaser(void *context)

### SbDecodeTargetGetInfo

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.

#### Declaration

    bool SbDecodeTargetGetInfo(SbDecodeTarget decode_target, SbDecodeTargetInfo *out_info)

### SbDecodeTargetIsFormatValid

Returns whether a given format is valid.

#### Declaration

    static bool SbDecodeTargetIsFormatValid(SbDecodeTargetFormat format)

### SbDecodeTargetIsValid

Returns whether the given file handle is valid.

#### Declaration

    static bool SbDecodeTargetIsValid(SbDecodeTarget handle)

### SbDecodeTargetRelease

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. This function must be called on a thread with the context.

#### Declaration

    void SbDecodeTargetRelease(SbDecodeTarget decode_target)

### SbDecodeTargetReleaseInGlesContext

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

#### Declaration

    static void SbDecodeTargetReleaseInGlesContext(SbDecodeTargetGraphicsContextProvider *provider, SbDecodeTarget decode_target)

### SbDecodeTargetRunInGlesContext

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.

#### Declaration

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