| --- |
| layout: doc |
| title: "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. The SbBlitter API is supported as |
| well, and this is able to more-or-less unify the two. |
| |
| 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; |
| SbMemorySet(&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. |
| * `kSbDecodeTargetFormat1PlaneUYVY` |
| |
| A decoder target format consisting of a single plane with pixels layed 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 implementaion 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 #### |
| |
| * `SbBlitterDevice device` |
| |
| The SbBlitterDevice object that will be used to render any produced |
| SbDecodeTargets. |
| |
| ### 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 #### |
| |
| * `int left` |
| * `int top` |
| * `int right` |
| * `int bottom` |
| |
| ### SbDecodeTargetInfoPlane ### |
| |
| Defines an image plane within a SbDecodeTargetInfo object. |
| |
| #### Members #### |
| |
| * `SbBlitterSurface surface` |
| |
| A handle to the Blitter surface that can be used for rendering. |
| * `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`. 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. In the case where SB_HAS(GLES2), 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) |
| ``` |
| |