Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2be5b9f9 authored by Craig Donner's avatar Craig Donner
Browse files

Add support for BLOB format to HardwareBuffer.

Test: updated CTS test to check for error conditions if the blob dimensions are
bad.
Bug: 34050596

Change-Id: I3ec6e7a43dae8d0ac2b2d04bc4b38cd3c12f8390
parent 5559543e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -14138,9 +14138,10 @@ package android.hardware {
    method public int getWidth();
    method public boolean isDestroyed();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int BLOB = 33; // 0x21
    field public static final android.os.Parcelable.Creator<android.hardware.HardwareBuffer> CREATOR;
    field public static final int RGBA_8888 = 1; // 0x1
    field public static final int RGBA_FP16 = 5; // 0x5
    field public static final int RGBA_FP16 = 22; // 0x16
    field public static final int RGBX_8888 = 2; // 0x2
    field public static final int RGB_565 = 4; // 0x4
    field public static final int RGB_888 = 3; // 0x3
+2 −1
Original line number Diff line number Diff line
@@ -14683,9 +14683,10 @@ package android.hardware {
    method public int getWidth();
    method public boolean isDestroyed();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int BLOB = 33; // 0x21
    field public static final android.os.Parcelable.Creator<android.hardware.HardwareBuffer> CREATOR;
    field public static final int RGBA_8888 = 1; // 0x1
    field public static final int RGBA_FP16 = 5; // 0x5
    field public static final int RGBA_FP16 = 22; // 0x16
    field public static final int RGBX_8888 = 2; // 0x2
    field public static final int RGB_565 = 4; // 0x4
    field public static final int RGB_888 = 3; // 0x3
+2 −1
Original line number Diff line number Diff line
@@ -14170,9 +14170,10 @@ package android.hardware {
    method public int getWidth();
    method public boolean isDestroyed();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int BLOB = 33; // 0x21
    field public static final android.os.Parcelable.Creator<android.hardware.HardwareBuffer> CREATOR;
    field public static final int RGBA_8888 = 1; // 0x1
    field public static final int RGBA_FP16 = 5; // 0x5
    field public static final int RGBA_FP16 = 22; // 0x16
    field public static final int RGBX_8888 = 2; // 0x2
    field public static final int RGB_565 = 4; // 0x4
    field public static final int RGB_888 = 3; // 0x3
+8 −2
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ import libcore.util.NativeAllocationRegistry;
public final class HardwareBuffer implements Parcelable {
    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({RGBA_8888, RGBA_FP16, RGBX_8888, RGB_888, RGB_565})
    @IntDef({RGBA_8888, RGBA_FP16, RGBX_8888, RGB_888, RGB_565, BLOB})
    public @interface Format {};

    /** Format: 8 bits each red, green, blue, alpha */
@@ -52,7 +52,9 @@ public final class HardwareBuffer implements Parcelable {
    /** Format: 5 bits each red and blue, 6 bits green, no alpha */
    public static final int RGB_565     = 4;
    /** Format: 16 bits each red, green, blue, alpha */
    public static final int RGBA_FP16   = 5;
    public static final int RGBA_FP16   = 0x16;
    /** Format: opaque format used for raw data transfer; must have a height of 1 */
    public static final int BLOB        = 0x21;

    // Note: do not rename, this field is used by native code
    private long mNativeObject;
@@ -135,6 +137,9 @@ public final class HardwareBuffer implements Parcelable {
        if (layers <= 0) {
            throw new IllegalArgumentException("Invalid layer count " + layers);
        }
        if (format == BLOB && height != 1) {
            throw new IllegalArgumentException("Height must be 1 when using the BLOB format");
        }
        long nativeObject = nCreateHardwareBuffer(width, height, format, layers, usage);
        if (nativeObject == 0) {
            throw new IllegalArgumentException("Unable to create a HardwareBuffer, either the " +
@@ -295,6 +300,7 @@ public final class HardwareBuffer implements Parcelable {
            case RGBX_8888:
            case RGB_565:
            case RGB_888:
            case BLOB:
                return true;
        }
        return false;
+14 −10
Original line number Diff line number Diff line
@@ -223,16 +223,18 @@ jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer(

uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format) {
    switch (format) {
        case PIXEL_FORMAT_RGBA_8888:
        case HAL_PIXEL_FORMAT_RGBA_8888:
            return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
        case PIXEL_FORMAT_RGBX_8888:
        case HAL_PIXEL_FORMAT_RGBX_8888:
            return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
        case PIXEL_FORMAT_RGB_565:
        case HAL_PIXEL_FORMAT_RGB_565:
            return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
        case PIXEL_FORMAT_RGB_888:
        case HAL_PIXEL_FORMAT_RGB_888:
            return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
        case PIXEL_FORMAT_RGBA_FP16:
        case HAL_PIXEL_FORMAT_RGBA_FP16:
            return AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT;
        case HAL_PIXEL_FORMAT_BLOB:
            return AHARDWAREBUFFER_FORMAT_BLOB;
        default:
            ALOGE("Unknown pixel format %u", format);
            return 0;
@@ -242,15 +244,17 @@ uint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format)
uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) {
    switch (format) {
        case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
            return PIXEL_FORMAT_RGBA_8888;
            return HAL_PIXEL_FORMAT_RGBA_8888;
        case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
            return PIXEL_FORMAT_RGBX_8888;
            return HAL_PIXEL_FORMAT_RGBX_8888;
        case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
            return PIXEL_FORMAT_RGB_565;
            return HAL_PIXEL_FORMAT_RGB_565;
        case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
            return PIXEL_FORMAT_RGB_888;
            return HAL_PIXEL_FORMAT_RGB_888;
        case AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT:
            return PIXEL_FORMAT_RGBA_FP16;
            return HAL_PIXEL_FORMAT_RGBA_FP16;
        case AHARDWAREBUFFER_FORMAT_BLOB:
            return HAL_PIXEL_FORMAT_BLOB;
        default:
            ALOGE("Unknown AHardwareBuffer format %u", format);
            return 0;
Loading