blob: 6df175b6ba9aecb95114f3dafd082ce4f380a654 [file] [view]
Project: /youtube/cobalt/_project.yaml
Book: /youtube/cobalt/_book.yaml
# 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.
## 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 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[] = {
kSbDecodeTargetFormat3PlaneYUVI420,
kSbDecodeTargetFormat1PlaneRGBA,
kSbDecodeTargetFormat1PlaneBGRA,
};
SbDecodeTargetFormat format = kSbDecodeTargetFormatInvalid;
for (int i = 0; i < SB_ARRAY_SIZE_INT(kPreferredFormats); ++i) {
if (SbImageIsDecodeSupported("image/foo", kPreferredFormats[i])) {
format = kPreferredFormats[i];
break;
}
}
```
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 =
info.planes[kSbDecodeTargetPlaneRGBA].texture;
```
## 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, 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.
### 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 (e.g.
SbImageDecode()).
#### 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)
```