blob: 3369fad50f240b4e2bd45a6bca09d2c4193a5267 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.graphics.common@1.0;
/**
* Common enumeration and structure definitions for all graphics HALs.
*/
/**
* Pixel formats for graphics buffers.
*/
@export(name="android_pixel_format_t", value_prefix="HAL_PIXEL_FORMAT_")
enum PixelFormat : int32_t {
/**
* 32-bit format that has 8-bit R, G, B, and A components, in that order,
* from the lowest memory address to the highest memory address.
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
RGBA_8888 = 0x1,
/**
* 32-bit format that has 8-bit R, G, B, and unused components, in that
* order, from the lowest memory address to the highest memory address.
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
RGBX_8888 = 0x2,
/**
* 24-bit format that has 8-bit R, G, and B components, in that order,
* from the lowest memory address to the highest memory address.
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
RGB_888 = 0x3,
/**
* 16-bit packed format that has 5-bit R, 6-bit G, and 5-bit B components,
* in that order, from the most-sigfinicant bits to the least-significant
* bits.
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
RGB_565 = 0x4,
/**
* 32-bit format that has 8-bit B, G, R, and A components, in that order,
* from the lowest memory address to the highest memory address.
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
BGRA_8888 = 0x5,
/**
* Legacy formats deprecated in favor of YCBCR_420_888.
*/
YCBCR_422_SP = 0x10, // NV16
YCRCB_420_SP = 0x11, // NV21
YCBCR_422_I = 0x14, // YUY2
/**
* 64-bit format that has 16-bit R, G, B, and A components, in that order,
* from the lowest memory address to the highest memory address.
*
* The component values are signed floats, whose interpretation is defined
* by the dataspace.
*/
RGBA_FP16 = 0x16,
/**
* RAW16 is a single-channel, 16-bit, little endian format, typically
* representing raw Bayer-pattern images from an image sensor, with minimal
* processing.
*
* The exact pixel layout of the data in the buffer is sensor-dependent, and
* needs to be queried from the camera device.
*
* Generally, not all 16 bits are used; more common values are 10 or 12
* bits. If not all bits are used, the lower-order bits are filled first.
* All parameters to interpret the raw data (black and white points,
* color space, etc) must be queried from the camera device.
*
* This format assumes
* - an even width
* - an even height
* - a horizontal stride multiple of 16 pixels
* - a vertical stride equal to the height
* - strides are specified in pixels, not in bytes
*
* size = stride * height * 2
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
* - BufferUsage::RENDERSCRIPT
*
* The mapping of the dataspace to buffer contents for RAW16 is as
* follows:
*
* Dataspace value | Buffer contents
* -------------------------------+-----------------------------------------
* Dataspace::ARBITRARY | Raw image sensor data, layout is as
* | defined above.
* Dataspace::DEPTH | Unprocessed implementation-dependent raw
* | depth measurements, opaque with 16 bit
* | samples.
* Other | Unsupported
*/
RAW16 = 0x20,
/**
* BLOB is used to carry task-specific data which does not have a standard
* image structure. The details of the format are left to the two
* endpoints.
*
* A typical use case is for transporting JPEG-compressed images from the
* Camera HAL to the framework or to applications.
*
* Buffers of this format must have a height of 1, and width equal to their
* size in bytes.
*
* The mapping of the dataspace to buffer contents for BLOB is as
* follows:
*
* Dataspace value | Buffer contents
* -------------------------------+-----------------------------------------
* Dataspace::JFIF | An encoded JPEG image
* Dataspace::DEPTH | An android_depth_points buffer
* Dataspace::SENSOR | Sensor event data.
* Other | Unsupported
*/
BLOB = 0x21,
/**
* A format indicating that the choice of format is entirely up to the
* allocator.
*
* The allocator should examine the usage bits passed in when allocating a
* buffer with this format, and it should derive the pixel format from
* those usage flags. This format must never be used with any of the
* BufferUsage::CPU_* usage flags.
*
* Even when the internally chosen format has an alpha component, the
* clients must assume the alpha vlaue to be 1.0.
*
* The interpretation of the component values is defined by the dataspace.
*/
IMPLEMENTATION_DEFINED = 0x22,
/**
* This format allows platforms to use an efficient YCbCr/YCrCb 4:2:0
* buffer layout, while still describing the general format in a
* layout-independent manner. While called YCbCr, it can be used to
* describe formats with either chromatic ordering, as well as
* whole planar or semiplanar layouts.
*
* This format must be accepted by the allocator when BufferUsage::CPU_*
* are set.
*
* Buffers with this format must be locked with IMapper::lockYCbCr.
* Locking with IMapper::lock must return an error.
*
* The interpretation of the component values is defined by the dataspace.
*/
YCBCR_420_888 = 0x23,
/**
* RAW_OPAQUE is a format for unprocessed raw image buffers coming from an
* image sensor. The actual structure of buffers of this format is
* implementation-dependent.
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
* - BufferUsage::RENDERSCRIPT
*
* The mapping of the dataspace to buffer contents for RAW_OPAQUE is as
* follows:
*
* Dataspace value | Buffer contents
* -------------------------------+-----------------------------------------
* Dataspace::ARBITRARY | Raw image sensor data.
* Other | Unsupported
*/
RAW_OPAQUE = 0x24,
/**
* RAW10 is a single-channel, 10-bit per pixel, densely packed in each row,
* unprocessed format, usually representing raw Bayer-pattern images coming from
* an image sensor.
*
* In an image buffer with this format, starting from the first pixel of each
* row, each 4 consecutive pixels are packed into 5 bytes (40 bits). Each one
* of the first 4 bytes contains the top 8 bits of each pixel, The fifth byte
* contains the 2 least significant bits of the 4 pixels, the exact layout data
* for each 4 consecutive pixels is illustrated below (Pi[j] stands for the jth
* bit of the ith pixel):
*
* bit 7 bit 0
* =====|=====|=====|=====|=====|=====|=====|=====|
* Byte 0: |P0[9]|P0[8]|P0[7]|P0[6]|P0[5]|P0[4]|P0[3]|P0[2]|
* |-----|-----|-----|-----|-----|-----|-----|-----|
* Byte 1: |P1[9]|P1[8]|P1[7]|P1[6]|P1[5]|P1[4]|P1[3]|P1[2]|
* |-----|-----|-----|-----|-----|-----|-----|-----|
* Byte 2: |P2[9]|P2[8]|P2[7]|P2[6]|P2[5]|P2[4]|P2[3]|P2[2]|
* |-----|-----|-----|-----|-----|-----|-----|-----|
* Byte 3: |P3[9]|P3[8]|P3[7]|P3[6]|P3[5]|P3[4]|P3[3]|P3[2]|
* |-----|-----|-----|-----|-----|-----|-----|-----|
* Byte 4: |P3[1]|P3[0]|P2[1]|P2[0]|P1[1]|P1[0]|P0[1]|P0[0]|
* ===============================================
*
* This format assumes
* - a width multiple of 4 pixels
* - an even height
* - a vertical stride equal to the height
* - strides are specified in bytes, not in pixels
*
* size = stride * height
*
* When stride is equal to width * (10 / 8), there will be no padding bytes at
* the end of each row, the entire image data is densely packed. When stride is
* larger than width * (10 / 8), padding bytes will be present at the end of each
* row (including the last row).
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
* - BufferUsage::RENDERSCRIPT
*
* The mapping of the dataspace to buffer contents for RAW10 is as
* follows:
*
* Dataspace value | Buffer contents
* -------------------------------+-----------------------------------------
* Dataspace::ARBITRARY | Raw image sensor data.
* Other | Unsupported
*/
RAW10 = 0x25,
/**
* RAW12 is a single-channel, 12-bit per pixel, densely packed in each row,
* unprocessed format, usually representing raw Bayer-pattern images coming from
* an image sensor.
*
* In an image buffer with this format, starting from the first pixel of each
* row, each two consecutive pixels are packed into 3 bytes (24 bits). The first
* and second byte contains the top 8 bits of first and second pixel. The third
* byte contains the 4 least significant bits of the two pixels, the exact layout
* data for each two consecutive pixels is illustrated below (Pi[j] stands for
* the jth bit of the ith pixel):
*
* bit 7 bit 0
* ======|======|======|======|======|======|======|======|
* Byte 0: |P0[11]|P0[10]|P0[ 9]|P0[ 8]|P0[ 7]|P0[ 6]|P0[ 5]|P0[ 4]|
* |------|------|------|------|------|------|------|------|
* Byte 1: |P1[11]|P1[10]|P1[ 9]|P1[ 8]|P1[ 7]|P1[ 6]|P1[ 5]|P1[ 4]|
* |------|------|------|------|------|------|------|------|
* Byte 2: |P1[ 3]|P1[ 2]|P1[ 1]|P1[ 0]|P0[ 3]|P0[ 2]|P0[ 1]|P0[ 0]|
* =======================================================
*
* This format assumes:
* - a width multiple of 4 pixels
* - an even height
* - a vertical stride equal to the height
* - strides are specified in bytes, not in pixels
*
* size = stride * height
*
* When stride is equal to width * (12 / 8), there will be no padding bytes at
* the end of each row, the entire image data is densely packed. When stride is
* larger than width * (12 / 8), padding bytes will be present at the end of
* each row (including the last row).
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
* - BufferUsage::RENDERSCRIPT
*
* The mapping of the dataspace to buffer contents for RAW12 is as
* follows:
*
* Dataspace value | Buffer contents
* -------------------------------+-----------------------------------------
* Dataspace::ARBITRARY | Raw image sensor data.
* Other | Unsupported
*/
RAW12 = 0x26,
/** 0x27 to 0x2A are reserved for flexible formats */
/**
* 32-bit packed format that has 2-bit A, 10-bit B, G, and R components,
* in that order, from the most-sigfinicant bits to the least-significant
* bits.
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
RGBA_1010102 = 0x2B,
/**
* 0x100 - 0x1FF
*
* This range is reserved for vendor extensions. Formats in this range
* must support BufferUsage::GPU_TEXTURE. Clients must assume they do not
* have an alpha component.
*/
/**
* Y8 is a YUV planar format comprised of a WxH Y plane, with each pixel
* being represented by 8 bits. It is equivalent to just the Y plane from
* YV12.
*
* This format assumes
* - an even width
* - an even height
* - a horizontal stride multiple of 16 pixels
* - a vertical stride equal to the height
*
* size = stride * height
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
Y8 = 0x20203859,
/**
* Y16 is a YUV planar format comprised of a WxH Y plane, with each pixel
* being represented by 16 bits. It is just like Y8, but has double the
* bits per pixel (little endian).
*
* This format assumes
* - an even width
* - an even height
* - a horizontal stride multiple of 16 pixels
* - a vertical stride equal to the height
* - strides are specified in pixels, not in bytes
*
* size = stride * height * 2
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace. When the dataspace is
* Dataspace::DEPTH, each pixel is a distance value measured by a depth
* camera, plus an associated confidence value.
*/
Y16 = 0x20363159,
/**
* YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed
* by (W/2) x (H/2) Cr and Cb planes.
*
* This format assumes
* - an even width
* - an even height
* - a horizontal stride multiple of 16 pixels
* - a vertical stride equal to the height
*
* y_size = stride * height
* c_stride = ALIGN(stride/2, 16)
* c_size = c_stride * height/2
* size = y_size + c_size * 2
* cr_offset = y_size
* cb_offset = y_size + c_size
*
* This range is reserved for vendor extensions. Formats in this range
* must support BufferUsage::GPU_TEXTURE. Clients must assume they do not
* have an alpha component.
*
* This format must be accepted by the allocator when used with the
* following usage flags:
*
* - BufferUsage::CAMERA_*
* - BufferUsage::CPU_*
* - BufferUsage::GPU_TEXTURE
*
* The component values are unsigned normalized to the range [0, 1], whose
* interpretation is defined by the dataspace.
*/
YV12 = 0x32315659, // YCrCb 4:2:0 Planar
};
/**
* Buffer usage definitions.
*/
enum BufferUsage : uint64_t {
/** bit 0-3 is an enum */
CPU_READ_MASK = 0xfULL,
/** buffer is never read by CPU */
CPU_READ_NEVER = 0,
/** buffer is rarely read by CPU */
CPU_READ_RARELY = 2,
/** buffer is often read by CPU */
CPU_READ_OFTEN = 3,
/** bit 4-7 is an enum */
CPU_WRITE_MASK = 0xfULL << 4,
/** buffer is never written by CPU */
CPU_WRITE_NEVER = 0 << 4,
/** buffer is rarely written by CPU */
CPU_WRITE_RARELY = 2 << 4,
/** buffer is often written by CPU */
CPU_WRITE_OFTEN = 3 << 4,
/** buffer is used as a GPU texture */
GPU_TEXTURE = 1ULL << 8,
/** buffer is used as a GPU render target */
GPU_RENDER_TARGET = 1ULL << 9,
/** bit 10 must be zero */
/** buffer is used as a composer HAL overlay layer */
COMPOSER_OVERLAY = 1ULL << 11,
/** buffer is used as a composer HAL client target */
COMPOSER_CLIENT_TARGET = 1ULL << 12,
/** bit 13 must be zero */
/**
* Buffer is allocated with hardware-level protection against copying the
* contents (or information derived from the contents) into unprotected
* memory.
*/
PROTECTED = 1ULL << 14,
/** buffer is used as a hwcomposer HAL cursor layer */
COMPOSER_CURSOR = 1ULL << 15,
/** buffer is used as a video encoder input */
VIDEO_ENCODER = 1ULL << 16,
/** buffer is used as a camera HAL output */
CAMERA_OUTPUT = 1ULL << 17,
/** buffer is used as a camera HAL input */
CAMERA_INPUT = 1ULL << 18,
/** bit 19 must be zero */
/** buffer is used as a renderscript allocation */
RENDERSCRIPT = 1ULL << 20,
/** bit 21 must be zero */
/** buffer is used as a video decoder output */
VIDEO_DECODER = 1ULL << 22,
/** buffer is used as a sensor direct report output */
SENSOR_DIRECT_DATA = 1ULL << 23,
/**
* buffer is used as as an OpenGL shader storage or uniform
* buffer object
*/
GPU_DATA_BUFFER = 1ULL << 24,
/** bits 25-27 must be zero and are reserved for future versions */
/** bits 28-31 are reserved for vendor extensions */
VENDOR_MASK = 0xfULL << 28,
/** bits 32-47 must be zero and are reserved for future versions */
/** bits 48-63 are reserved for vendor extensions */
VENDOR_MASK_HI = 0xffffULL << 48,
};
/**
* Transformation definitions
*/
@export(name="android_transform_t", value_prefix="HAL_TRANSFORM_")
enum Transform : int32_t {
/**
* Horizontal flip. FLIP_H/FLIP_V is applied before ROT_90.
*/
FLIP_H = 1 << 0,
/**
* Vertical flip. FLIP_H/FLIP_V is applied before ROT_90.
*/
FLIP_V = 1 << 1,
/**
* 90 degree clockwise rotation. FLIP_H/FLIP_V is applied before ROT_90.
*/
ROT_90 = 1 << 2,
/**
* Commonly used combinations.
*/
ROT_180 = FLIP_H | FLIP_V,
ROT_270 = FLIP_H | FLIP_V | ROT_90,
};
/**
* Dataspace Definitions
* ======================
*
* Dataspace is the definition of how pixel values should be interpreted.
*
* For many formats, this is the colorspace of the image data, which includes
* primaries (including white point) and the transfer characteristic function,
* which describes both gamma curve and numeric range (within the bit depth).
*
* Other dataspaces include depth measurement data from a depth camera.
*
* A dataspace is comprised of a number of fields.
*
* Version
* --------
* The top 2 bits represent the revision of the field specification. This is
* currently always 0.
*
*
* bits 31-30 29 - 0
* +-----+----------------------------------------------------+
* fields | Rev | Revision specific fields |
* +-----+----------------------------------------------------+
*
* Field layout for version = 0:
* ----------------------------
*
* A dataspace is comprised of the following fields:
* Standard
* Transfer function
* Range
*
* bits 31-30 29-27 26 - 22 21 - 16 15 - 0
* +-----+-----+--------+--------+----------------------------+
* fields | 0 |Range|Transfer|Standard| Legacy and custom |
* +-----+-----+--------+--------+----------------------------+
* VV RRR TTTTT SSSSSS LLLLLLLL LLLLLLLL
*
* If range, transfer and standard fields are all 0 (e.g. top 16 bits are
* all zeroes), the bottom 16 bits contain either a legacy dataspace value,
* or a custom value.
*/
@export(name="android_dataspace_t", value_prefix="HAL_DATASPACE_")
enum Dataspace : int32_t {
/**
* Default-assumption data space, when not explicitly specified.
*
* It is safest to assume the buffer is an image with sRGB primaries and
* encoding ranges, but the consumer and/or the producer of the data may
* simply be using defaults. No automatic gamma transform should be
* expected, except for a possible display gamma transform when drawn to a
* screen.
*/
UNKNOWN = 0x0,
/**
* Arbitrary dataspace with manually defined characteristics. Definition
* for colorspaces or other meaning must be communicated separately.
*
* This is used when specifying primaries, transfer characteristics,
* etc. separately.
*
* A typical use case is in video encoding parameters (e.g. for H.264),
* where a colorspace can have separately defined primaries, transfer
* characteristics, etc.
*/
ARBITRARY = 0x1,
/**
* Color-description aspects
*
* The following aspects define various characteristics of the color
* specification. These represent bitfields, so that a data space value
* can specify each of them independently.
*/
STANDARD_SHIFT = 16,
/**
* Standard aspect
*
* Defines the chromaticity coordinates of the source primaries in terms of
* the CIE 1931 definition of x and y specified in ISO 11664-1.
*/
STANDARD_MASK = 63 << STANDARD_SHIFT, // 0x3F
/**
* Chromacity coordinates are unknown or are determined by the application.
* Implementations shall use the following suggested standards:
*
* All YCbCr formats: BT709 if size is 720p or larger (since most video
* content is letterboxed this corresponds to width is
* 1280 or greater, or height is 720 or greater).
* BT601_625 if size is smaller than 720p or is JPEG.
* All RGB formats: BT709.
*
* For all other formats standard is undefined, and implementations should use
* an appropriate standard for the data represented.
*/
STANDARD_UNSPECIFIED = 0 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.300 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.2126, KB = 0.0722 luminance interpretation
* for RGB conversion.
*/
STANDARD_BT709 = 1 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.290 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* KR = 0.299, KB = 0.114. This adjusts the luminance interpretation
* for RGB conversion from the one purely determined by the primaries
* to minimize the color shift into RGB space that uses BT.709
* primaries.
*/
STANDARD_BT601_625 = 2 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.290 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.222, KB = 0.071 luminance interpretation
* for RGB conversion.
*/
STANDARD_BT601_625_UNADJUSTED = 3 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.310 0.595
* blue 0.155 0.070
* red 0.630 0.340
* white (D65) 0.3127 0.3290
*
* KR = 0.299, KB = 0.114. This adjusts the luminance interpretation
* for RGB conversion from the one purely determined by the primaries
* to minimize the color shift into RGB space that uses BT.709
* primaries.
*/
STANDARD_BT601_525 = 4 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.310 0.595
* blue 0.155 0.070
* red 0.630 0.340
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.212, KB = 0.087 luminance interpretation
* for RGB conversion (as in SMPTE 240M).
*/
STANDARD_BT601_525_UNADJUSTED = 5 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.170 0.797
* blue 0.131 0.046
* red 0.708 0.292
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.2627, KB = 0.0593 luminance interpretation
* for RGB conversion.
*/
STANDARD_BT2020 = 6 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.170 0.797
* blue 0.131 0.046
* red 0.708 0.292
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.2627, KB = 0.0593 luminance interpretation
* for RGB conversion using the linear domain.
*/
STANDARD_BT2020_CONSTANT_LUMINANCE = 7 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.21 0.71
* blue 0.14 0.08
* red 0.67 0.33
* white (C) 0.310 0.316
*
* Use the unadjusted KR = 0.30, KB = 0.11 luminance interpretation
* for RGB conversion.
*/
STANDARD_BT470M = 8 << STANDARD_SHIFT,
/**
* Primaries: x y
* green 0.243 0.692
* blue 0.145 0.049
* red 0.681 0.319
* white (C) 0.310 0.316
*
* Use the unadjusted KR = 0.254, KB = 0.068 luminance interpretation
* for RGB conversion.
*/
STANDARD_FILM = 9 << STANDARD_SHIFT,
/**
* SMPTE EG 432-1 and SMPTE RP 431-2. (DCI-P3)
* Primaries: x y
* green 0.265 0.690
* blue 0.150 0.060
* red 0.680 0.320
* white (D65) 0.3127 0.3290
*/
STANDARD_DCI_P3 = 10 << STANDARD_SHIFT,
/**
* Adobe RGB
* Primaries: x y
* green 0.210 0.710
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*/
STANDARD_ADOBE_RGB = 11 << STANDARD_SHIFT,
TRANSFER_SHIFT = 22,
/**
* Transfer aspect
*
* Transfer characteristics are the opto-electronic transfer characteristic
* at the source as a function of linear optical intensity (luminance).
*
* For digital signals, E corresponds to the recorded value. Normally, the
* transfer function is applied in RGB space to each of the R, G and B
* components independently. This may result in color shift that can be
* minized by applying the transfer function in Lab space only for the L
* component. Implementation may apply the transfer function in RGB space
* for all pixel formats if desired.
*/
TRANSFER_MASK = 31 << TRANSFER_SHIFT, // 0x1F
/**
* Transfer characteristics are unknown or are determined by the
* application.
*
* Implementations should use the following transfer functions:
*
* For YCbCr formats: use TRANSFER_SMPTE_170M
* For RGB formats: use TRANSFER_SRGB
*
* For all other formats transfer function is undefined, and implementations
* should use an appropriate standard for the data represented.
*/
TRANSFER_UNSPECIFIED = 0 << TRANSFER_SHIFT,
/**
* Transfer characteristic curve:
* E = L
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal
*/
TRANSFER_LINEAR = 1 << TRANSFER_SHIFT,
/**
* Transfer characteristic curve:
*
* E = 1.055 * L^(1/2.4) - 0.055 for 0.0031308 <= L <= 1
* = 12.92 * L for 0 <= L < 0.0031308
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal
*/
TRANSFER_SRGB = 2 << TRANSFER_SHIFT,
/**
* BT.601 525, BT.601 625, BT.709, BT.2020
*
* Transfer characteristic curve:
* E = 1.099 * L ^ 0.45 - 0.099 for 0.018 <= L <= 1
* = 4.500 * L for 0 <= L < 0.018
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal
*/
TRANSFER_SMPTE_170M = 3 << TRANSFER_SHIFT,
/**
* Assumed display gamma 2.2.
*
* Transfer characteristic curve:
* E = L ^ (1/2.2)
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal
*/
TRANSFER_GAMMA2_2 = 4 << TRANSFER_SHIFT,
/**
* display gamma 2.6.
*
* Transfer characteristic curve:
* E = L ^ (1/2.6)
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal
*/
TRANSFER_GAMMA2_6 = 5 << TRANSFER_SHIFT,
/**
* display gamma 2.8.
*
* Transfer characteristic curve:
* E = L ^ (1/2.8)
* L - luminance of image 0 <= L <= 1 for conventional colorimetry
* E - corresponding electrical signal
*/
TRANSFER_GAMMA2_8 = 6 << TRANSFER_SHIFT,
/**
* SMPTE ST 2084 (Dolby Perceptual Quantizer)
*
* Transfer characteristic curve:
* E = ((c1 + c2 * L^n) / (1 + c3 * L^n)) ^ m
* c1 = c3 - c2 + 1 = 3424 / 4096 = 0.8359375
* c2 = 32 * 2413 / 4096 = 18.8515625
* c3 = 32 * 2392 / 4096 = 18.6875
* m = 128 * 2523 / 4096 = 78.84375
* n = 0.25 * 2610 / 4096 = 0.1593017578125
* L - luminance of image 0 <= L <= 1 for HDR colorimetry.
* L = 1 corresponds to 10000 cd/m2
* E - corresponding electrical signal
*/
TRANSFER_ST2084 = 7 << TRANSFER_SHIFT,
/**
* ARIB STD-B67 Hybrid Log Gamma
*
* Transfer characteristic curve:
* E = r * L^0.5 for 0 <= L <= 1
* = a * ln(L - b) + c for 1 < L
* a = 0.17883277
* b = 0.28466892
* c = 0.55991073
* r = 0.5
* L - luminance of image 0 <= L for HDR colorimetry. L = 1 corresponds
* to reference white level of 100 cd/m2
* E - corresponding electrical signal
*/
TRANSFER_HLG = 8 << TRANSFER_SHIFT,
RANGE_SHIFT = 27,
/**
* Range aspect
*
* Defines the range of values corresponding to the unit range of 0-1.
* This is defined for YCbCr only, but can be expanded to RGB space.
*/
RANGE_MASK = 7 << RANGE_SHIFT, // 0x7
/**
* Range is unknown or are determined by the application. Implementations
* shall use the following suggested ranges:
*
* All YCbCr formats: limited range.
* All RGB or RGBA formats (including RAW and Bayer): full range.
* All Y formats: full range
*
* For all other formats range is undefined, and implementations should use
* an appropriate range for the data represented.
*/
RANGE_UNSPECIFIED = 0 << RANGE_SHIFT,
/**
* Full range uses all values for Y, Cb and Cr from
* 0 to 2^b-1, where b is the bit depth of the color format.
*/
RANGE_FULL = 1 << RANGE_SHIFT,
/**
* Limited range uses values 16/256*2^b to 235/256*2^b for Y, and
* 1/16*2^b to 15/16*2^b for Cb, Cr, R, G and B, where b is the bit depth of
* the color format.
*
* E.g. For 8-bit-depth formats:
* Luma (Y) samples should range from 16 to 235, inclusive
* Chroma (Cb, Cr) samples should range from 16 to 240, inclusive
*
* For 10-bit-depth formats:
* Luma (Y) samples should range from 64 to 940, inclusive
* Chroma (Cb, Cr) samples should range from 64 to 960, inclusive
*/
RANGE_LIMITED = 2 << RANGE_SHIFT,
/**
* Extended range is used for scRGB. Intended for use with
* floating point pixel formats. [0.0 - 1.0] is the standard
* sRGB space. Values outside the range 0.0 - 1.0 can encode
* color outside the sRGB gamut.
* Used to blend / merge multiple dataspaces on a single display.
*/
RANGE_EXTENDED = 3 << RANGE_SHIFT,
/**
* Legacy dataspaces
*/
/**
* sRGB linear encoding:
*
* The red, green, and blue components are stored in sRGB space, but
* are linear, not gamma-encoded.
* The RGB primaries and the white point are the same as BT.709.
*
* The values are encoded using the full range ([0,255] for 8-bit) for all
* components.
*/
SRGB_LINEAR = 0x200, // deprecated, use V0_SRGB_LINEAR
V0_SRGB_LINEAR = STANDARD_BT709 | TRANSFER_LINEAR | RANGE_FULL,
/**
* scRGB linear encoding:
*
* The red, green, and blue components are stored in extended sRGB space,
* but are linear, not gamma-encoded.
* The RGB primaries and the white point are the same as BT.709.
*
* The values are floating point.
* A pixel value of 1.0, 1.0, 1.0 corresponds to sRGB white (D65) at 80 nits.
* Values beyond the range [0.0 - 1.0] would correspond to other colors
* spaces and/or HDR content.
*/
V0_SCRGB_LINEAR = STANDARD_BT709 | TRANSFER_LINEAR | RANGE_EXTENDED,
/**
* sRGB gamma encoding:
*
* The red, green and blue components are stored in sRGB space, and
* converted to linear space when read, using the SRGB transfer function
* for each of the R, G and B components. When written, the inverse
* transformation is performed.
*
* The alpha component, if present, is always stored in linear space and
* is left unmodified when read or written.
*
* Use full range and BT.709 standard.
*/
SRGB = 0x201, // deprecated, use V0_SRGB
V0_SRGB = STANDARD_BT709 | TRANSFER_SRGB | RANGE_FULL,
/**
* scRGB:
*
* The red, green, and blue components are stored in extended sRGB space,
* but are linear, not gamma-encoded.
* The RGB primaries and the white point are the same as BT.709.
*
* The values are floating point.
* A pixel value of 1.0, 1.0, 1.0 corresponds to sRGB white (D65) at 80 nits.
* Values beyond the range [0.0 - 1.0] would correspond to other colors
* spaces and/or HDR content.
*/
V0_SCRGB = STANDARD_BT709 | TRANSFER_SRGB | RANGE_EXTENDED,
/**
* YCbCr Colorspaces
* -----------------
*
* Primaries are given using (x,y) coordinates in the CIE 1931 definition
* of x and y specified by ISO 11664-1.
*
* Transfer characteristics are the opto-electronic transfer characteristic
* at the source as a function of linear optical intensity (luminance).
*/
/**
* JPEG File Interchange Format (JFIF)
*
* Same model as BT.601-625, but all values (Y, Cb, Cr) range from 0 to 255
*
* Use full range, BT.601 transfer and BT.601_625 standard.
*/
JFIF = 0x101, // deprecated, use V0_JFIF
V0_JFIF = STANDARD_BT601_625 | TRANSFER_SMPTE_170M | RANGE_FULL,
/**
* ITU-R Recommendation 601 (BT.601) - 625-line
*
* Standard-definition television, 625 Lines (PAL)
*
* Use limited range, BT.601 transfer and BT.601_625 standard.
*/
BT601_625 = 0x102, // deprecated, use V0_BT601_625
V0_BT601_625 = STANDARD_BT601_625 | TRANSFER_SMPTE_170M | RANGE_LIMITED,
/**
* ITU-R Recommendation 601 (BT.601) - 525-line
*
* Standard-definition television, 525 Lines (NTSC)
*
* Use limited range, BT.601 transfer and BT.601_525 standard.
*/
BT601_525 = 0x103, // deprecated, use V0_BT601_525
V0_BT601_525 = STANDARD_BT601_525 | TRANSFER_SMPTE_170M | RANGE_LIMITED,
/**
* ITU-R Recommendation 709 (BT.709)
*
* High-definition television
*
* Use limited range, BT.709 transfer and BT.709 standard.
*/
BT709 = 0x104, // deprecated, use V0_BT709
V0_BT709 = STANDARD_BT709 | TRANSFER_SMPTE_170M | RANGE_LIMITED,
/**
* SMPTE EG 432-1 and SMPTE RP 431-2.
*
* Digital Cinema DCI-P3
*
* Use full range, linear transfer and D65 DCI-P3 standard
*/
DCI_P3_LINEAR = STANDARD_DCI_P3 | TRANSFER_LINEAR | RANGE_FULL,
/**
* SMPTE EG 432-1 and SMPTE RP 431-2.
*
* Digital Cinema DCI-P3
*
* Use full range, gamma 2.6 transfer and D65 DCI-P3 standard
* Note: Application is responsible for gamma encoding the data as
* a 2.6 gamma encoding is not supported in HW.
*/
DCI_P3 = STANDARD_DCI_P3 | TRANSFER_GAMMA2_6 | RANGE_FULL,
/**
* Display P3
*
* Display P3 uses same primaries and white-point as DCI-P3
* linear transfer function makes this the same as DCI_P3_LINEAR.
*/
DISPLAY_P3_LINEAR = STANDARD_DCI_P3 | TRANSFER_LINEAR | RANGE_FULL,
/**
* Display P3
*
* Use same primaries and white-point as DCI-P3
* but sRGB transfer function.
*/
DISPLAY_P3 = STANDARD_DCI_P3 | TRANSFER_SRGB | RANGE_FULL,
/**
* Adobe RGB
*
* Use full range, gamma 2.2 transfer and Adobe RGB primaries
* Note: Application is responsible for gamma encoding the data as
* a 2.2 gamma encoding is not supported in HW.
*/
ADOBE_RGB = STANDARD_ADOBE_RGB | TRANSFER_GAMMA2_2 | RANGE_FULL,
/**
* ITU-R Recommendation 2020 (BT.2020)
*
* Ultra High-definition television
*
* Use full range, linear transfer and BT2020 standard
*/
BT2020_LINEAR = STANDARD_BT2020 | TRANSFER_LINEAR | RANGE_FULL,
/**
* ITU-R Recommendation 2020 (BT.2020)
*
* Ultra High-definition television
*
* Use full range, BT.709 transfer and BT2020 standard
*/
BT2020 = STANDARD_BT2020 | TRANSFER_SMPTE_170M | RANGE_FULL,
/**
* ITU-R Recommendation 2020 (BT.2020)
*
* Ultra High-definition television
*
* Use full range, SMPTE 2084 (PQ) transfer and BT2020 standard
*/
BT2020_PQ = STANDARD_BT2020 | TRANSFER_ST2084 | RANGE_FULL,
/**
* Data spaces for non-color formats
*/
/**
* The buffer contains depth ranging measurements from a depth camera.
* This value is valid with formats:
* HAL_PIXEL_FORMAT_Y16: 16-bit samples, consisting of a depth measurement
* and an associated confidence value. The 3 MSBs of the sample make
* up the confidence value, and the low 13 LSBs of the sample make up
* the depth measurement.
* For the confidence section, 0 means 100% confidence, 1 means 0%
* confidence. The mapping to a linear float confidence value between
* 0.f and 1.f can be obtained with
* float confidence = (((depthSample >> 13) - 1) & 0x7) / 7.0f;
* The depth measurement can be extracted simply with
* uint16_t range = (depthSample & 0x1FFF);
* HAL_PIXEL_FORMAT_BLOB: A depth point cloud, as
* a variable-length float (x,y,z, confidence) coordinate point list.
* The point cloud will be represented with the android_depth_points
* structure.
*/
DEPTH = 0x1000,
/**
* The buffer contains sensor events from sensor direct report.
* This value is valid with formats:
* HAL_PIXEL_FORMAT_BLOB: an array of sensor event structure that forms
* a lock free queue. Format of sensor event structure is specified
* in Sensors HAL.
*/
SENSOR = 0x1001
};
/**
* Color modes that may be supported by a display.
*
* Definitions:
* Rendering intent generally defines the goal in mapping a source (input)
* color to a destination device color for a given color mode.
*
* It is important to keep in mind three cases where mapping may be applied:
* 1. The source gamut is much smaller than the destination (display) gamut
* 2. The source gamut is much larger than the destination gamut (this will
* ordinarily be handled using colorimetric rendering, below)
* 3. The source and destination gamuts are roughly equal, although not
* completely overlapping
* Also, a common requirement for mappings is that skin tones should be
* preserved, or at least remain natural in appearance.
*
* Colorimetric Rendering Intent (All cases):
* Colorimetric indicates that colors should be preserved. In the case
* that the source gamut lies wholly within the destination gamut or is
* about the same (#1, #3), this will simply mean that no manipulations
* (no saturation boost, for example) are applied. In the case where some
* source colors lie outside the destination gamut (#2, #3), those will
* need to be mapped to colors that are within the destination gamut,
* while the already in-gamut colors remain unchanged.
*
* Non-colorimetric transforms can take many forms. There are no hard
* rules and it's left to the implementation to define.
* Two common intents are described below.
*
* Stretched-Gamut Enhancement Intent (Source < Destination):
* When the destination gamut is much larger than the source gamut (#1), the
* source primaries may be redefined to reflect the full extent of the
* destination space, or to reflect an intermediate gamut.
* Skin-tone preservation would likely be applied. An example might be sRGB
* input displayed on a DCI-P3 capable device, with skin-tone preservation.
*
* Within-Gamut Enhancement Intent (Source >= Destination):
* When the device (destination) gamut is not larger than the source gamut
* (#2 or #3), but the appearance of a larger gamut is desired, techniques
* such as saturation boost may be applied to the source colors. Skin-tone
* preservation may be applied. There is no unique method for within-gamut
* enhancement; it would be defined within a flexible color mode.
*
*/
@export(name="android_color_mode_t", value_prefix="HAL_COLOR_MODE_")
enum ColorMode : int32_t {
/**
* DEFAULT is the "native" gamut of the display.
* White Point: Vendor/OEM defined
* Panel Gamma: Vendor/OEM defined (typically 2.2)
* Rendering Intent: Vendor/OEM defined (typically 'enhanced')
*/
NATIVE = 0,
/**
* STANDARD_BT601_625 corresponds with display
* settings that implement the ITU-R Recommendation BT.601
* or Rec 601. Using 625 line version
* Rendering Intent: Colorimetric
* Primaries:
* x y
* green 0.290 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* KR = 0.299, KB = 0.114. This adjusts the luminance interpretation
* for RGB conversion from the one purely determined by the primaries
* to minimize the color shift into RGB space that uses BT.709
* primaries.
*
* Gamma Correction (GC):
*
* if Vlinear < 0.018
* Vnonlinear = 4.500 * Vlinear
* else
* Vnonlinear = 1.099 * (Vlinear)^(0.45) – 0.099
*/
STANDARD_BT601_625 = 1,
/**
* Primaries:
* x y
* green 0.290 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.222, KB = 0.071 luminance interpretation
* for RGB conversion.
*
* Gamma Correction (GC):
*
* if Vlinear < 0.018
* Vnonlinear = 4.500 * Vlinear
* else
* Vnonlinear = 1.099 * (Vlinear)^(0.45) – 0.099
*/
STANDARD_BT601_625_UNADJUSTED = 2,
/**
* Primaries:
* x y
* green 0.310 0.595
* blue 0.155 0.070
* red 0.630 0.340
* white (D65) 0.3127 0.3290
*
* KR = 0.299, KB = 0.114. This adjusts the luminance interpretation
* for RGB conversion from the one purely determined by the primaries
* to minimize the color shift into RGB space that uses BT.709
* primaries.
*
* Gamma Correction (GC):
*
* if Vlinear < 0.018
* Vnonlinear = 4.500 * Vlinear
* else
* Vnonlinear = 1.099 * (Vlinear)^(0.45) – 0.099
*/
STANDARD_BT601_525 = 3,
/**
* Primaries:
* x y
* green 0.310 0.595
* blue 0.155 0.070
* red 0.630 0.340
* white (D65) 0.3127 0.3290
*
* Use the unadjusted KR = 0.212, KB = 0.087 luminance interpretation
* for RGB conversion (as in SMPTE 240M).
*
* Gamma Correction (GC):
*
* if Vlinear < 0.018
* Vnonlinear = 4.500 * Vlinear
* else
* Vnonlinear = 1.099 * (Vlinear)^(0.45) – 0.099
*/
STANDARD_BT601_525_UNADJUSTED = 4,
/**
* REC709 corresponds with display settings that implement
* the ITU-R Recommendation BT.709 / Rec. 709 for high-definition television.
* Rendering Intent: Colorimetric
* Primaries:
* x y
* green 0.300 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* HDTV REC709 Inverse Gamma Correction (IGC): V represents normalized
* (with [0 to 1] range) value of R, G, or B.
*
* if Vnonlinear < 0.081
* Vlinear = Vnonlinear / 4.5
* else
* Vlinear = ((Vnonlinear + 0.099) / 1.099) ^ (1/0.45)
*
* HDTV REC709 Gamma Correction (GC):
*
* if Vlinear < 0.018
* Vnonlinear = 4.5 * Vlinear
* else
* Vnonlinear = 1.099 * (Vlinear) ^ 0.45 – 0.099
*/
STANDARD_BT709 = 5,
/**
* DCI_P3 corresponds with display settings that implement
* SMPTE EG 432-1 and SMPTE RP 431-2
* Rendering Intent: Colorimetric
* Primaries:
* x y
* green 0.265 0.690
* blue 0.150 0.060
* red 0.680 0.320
* white (D65) 0.3127 0.3290
*
* Gamma: 2.6
*/
DCI_P3 = 6,
/**
* SRGB corresponds with display settings that implement
* the sRGB color space. Uses the same primaries as ITU-R Recommendation
* BT.709
* Rendering Intent: Colorimetric
* Primaries:
* x y
* green 0.300 0.600
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* PC/Internet (sRGB) Inverse Gamma Correction (IGC):
*
* if Vnonlinear ≤ 0.03928
* Vlinear = Vnonlinear / 12.92
* else
* Vlinear = ((Vnonlinear + 0.055)/1.055) ^ 2.4
*
* PC/Internet (sRGB) Gamma Correction (GC):
*
* if Vlinear ≤ 0.0031308
* Vnonlinear = 12.92 * Vlinear
* else
* Vnonlinear = 1.055 * (Vlinear)^(1/2.4) – 0.055
*/
SRGB = 7,
/**
* ADOBE_RGB corresponds with the RGB color space developed
* by Adobe Systems, Inc. in 1998.
* Rendering Intent: Colorimetric
* Primaries:
* x y
* green 0.210 0.710
* blue 0.150 0.060
* red 0.640 0.330
* white (D65) 0.3127 0.3290
*
* Gamma: 2.2
*/
ADOBE_RGB = 8,
/**
* DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
* the D65 white point and the SRGB transfer functions.
* Rendering Intent: Colorimetric
* Primaries:
* x y
* green 0.265 0.690
* blue 0.150 0.060
* red 0.680 0.320
* white (D65) 0.3127 0.3290
*
* PC/Internet (sRGB) Gamma Correction (GC):
*
* if Vlinear ≤ 0.0030186
* Vnonlinear = 12.92 * Vlinear
* else
* Vnonlinear = 1.055 * (Vlinear)^(1/2.4) – 0.055
*
* Note: In most cases sRGB transfer function will be fine.
*/
DISPLAY_P3 = 9
};
/**
* Color transforms that may be applied by hardware composer to the whole
* display.
*/
@export(name="android_color_transform_t", value_prefix="HAL_COLOR_TRANSFORM_")
enum ColorTransform : int32_t {
/** Applies no transform to the output color */
IDENTITY = 0,
/** Applies an arbitrary transform defined by a 4x4 affine matrix */
ARBITRARY_MATRIX = 1,
/**
* Applies a transform that inverts the value or luminance of the color, but
* does not modify hue or saturation */
VALUE_INVERSE = 2,
/** Applies a transform that maps all colors to shades of gray */
GRAYSCALE = 3,
/** Applies a transform which corrects for protanopic color blindness */
CORRECT_PROTANOPIA = 4,
/** Applies a transform which corrects for deuteranopic color blindness */
CORRECT_DEUTERANOPIA = 5,
/** Applies a transform which corrects for tritanopic color blindness */
CORRECT_TRITANOPIA = 6
};
/**
* Supported HDR formats. Must be kept in sync with equivalents in Display.java.
*/
@export(name="android_hdr_t", value_prefix="HAL_HDR_")
enum Hdr : int32_t {
/** Device supports Dolby Vision HDR */
DOLBY_VISION = 1,
/** Device supports HDR10 */
HDR10 = 2,
/** Device supports hybrid log-gamma HDR */
HLG = 3
};