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

Commit 2efcefd3 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Adding HDR10+ metadata support for media API"

parents cec2af51 a82679d8
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */

#include <gui/HdrMetadata.h>
#include <limits>

namespace android {

@@ -26,6 +27,10 @@ size_t HdrMetadata::getFlattenedSize() const {
    if (validTypes & CTA861_3) {
        size += sizeof(cta8613);
    }
    if (validTypes & HDR10PLUS) {
        size += sizeof(size_t);
        size += hdr10plus.size();
    }
    return size;
}

@@ -41,6 +46,12 @@ status_t HdrMetadata::flatten(void* buffer, size_t size) const {
    if (validTypes & CTA861_3) {
        FlattenableUtils::write(buffer, size, cta8613);
    }
    if (validTypes & HDR10PLUS) {
        size_t metadataSize = hdr10plus.size();
        FlattenableUtils::write(buffer, size, metadataSize);
        memcpy(buffer, hdr10plus.data(), metadataSize);
        FlattenableUtils::advance(buffer, size, metadataSize);
    }

    return NO_ERROR;
}
@@ -62,6 +73,22 @@ status_t HdrMetadata::unflatten(void const* buffer, size_t size) {
        }
        FlattenableUtils::read(buffer, size, cta8613);
    }
    if (validTypes & HDR10PLUS) {
        if (size < sizeof(size_t)) {
            return NO_MEMORY;
        }

        size_t metadataSize;
        FlattenableUtils::read(buffer, size, metadataSize);

        if (size < metadataSize) {
            return NO_MEMORY;
        }

        hdr10plus.resize(metadataSize);
        memcpy(hdr10plus.data(), buffer, metadataSize);
        FlattenableUtils::advance(buffer, size, metadataSize);
    }

    return NO_ERROR;
}
@@ -91,6 +118,10 @@ bool HdrMetadata::operator==(const HdrMetadata& rhs) const {
        }
    }

    if ((validTypes & HDR10PLUS) == HDR10PLUS) {
        if (hdr10plus != rhs.hdr10plus) return false;
    }

    return true;
}

+22 −0
Original line number Diff line number Diff line
@@ -965,6 +965,9 @@ int Surface::perform(int operation, va_list args)
    case NATIVE_WINDOW_SET_BUFFERS_CTA861_3_METADATA:
        res = dispatchSetBuffersCta8613Metadata(args);
        break;
    case NATIVE_WINDOW_SET_BUFFERS_HDR10_PLUS_METADATA:
        res = dispatchSetBuffersHdr10PlusMetadata(args);
        break;
    case NATIVE_WINDOW_SET_SURFACE_DAMAGE:
        res = dispatchSetSurfaceDamage(args);
        break;
@@ -1120,6 +1123,12 @@ int Surface::dispatchSetBuffersCta8613Metadata(va_list args) {
    return setBuffersCta8613Metadata(metadata);
}

int Surface::dispatchSetBuffersHdr10PlusMetadata(va_list args) {
    const size_t size = va_arg(args, size_t);
    const uint8_t* metadata = va_arg(args, const uint8_t*);
    return setBuffersHdr10PlusMetadata(size, metadata);
}

int Surface::dispatchSetSurfaceDamage(va_list args) {
    android_native_rect_t* rects = va_arg(args, android_native_rect_t*);
    size_t numRects = va_arg(args, size_t);
@@ -1568,6 +1577,19 @@ int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata
    return NO_ERROR;
}

int Surface::setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata) {
    ALOGV("Surface::setBuffersBlobMetadata");
    Mutex::Autolock lock(mMutex);
    if (size > 0) {
        mHdrMetadata.hdr10plus.assign(metadata, metadata + size);
        mHdrMetadata.validTypes |= HdrMetadata::HDR10PLUS;
    } else {
        mHdrMetadata.validTypes &= ~HdrMetadata::HDR10PLUS;
        mHdrMetadata.hdr10plus.clear();
    }
    return NO_ERROR;
}

Dataspace Surface::getBuffersDataSpace() {
    ALOGV("Surface::getBuffersDataSpace");
    Mutex::Autolock lock(mMutex);
+5 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#pragma once

#include <stdint.h>
#include <vector>

#include <system/graphics.h>
#include <utils/Flattenable.h>
@@ -27,11 +28,14 @@ struct HdrMetadata : public LightFlattenable<HdrMetadata> {
    enum Type : uint32_t {
        SMPTE2086 = 1 << 0,
        CTA861_3 = 1 << 1,
        HDR10PLUS = 1 << 2,
    };

    uint32_t validTypes{0};

    android_smpte2086_metadata smpte2086{};
    android_cta861_3_metadata cta8613{};
    std::vector<uint8_t> hdr10plus{};

    // LightFlattenable
    bool isFixedSize() const { return false; }
+2 −0
Original line number Diff line number Diff line
@@ -218,6 +218,7 @@ private:
    int dispatchSetBuffersDataSpace(va_list args);
    int dispatchSetBuffersSmpte2086Metadata(va_list args);
    int dispatchSetBuffersCta8613Metadata(va_list args);
    int dispatchSetBuffersHdr10PlusMetadata(va_list args);
    int dispatchSetSurfaceDamage(va_list args);
    int dispatchSetSharedBufferMode(va_list args);
    int dispatchSetAutoRefresh(va_list args);
@@ -249,6 +250,7 @@ protected:
    virtual int setBuffersDataSpace(ui::Dataspace dataSpace);
    virtual int setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metadata);
    virtual int setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata);
    virtual int setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata);
    virtual int setCrop(Rect const* rect);
    virtual int setUsage(uint64_t reqUsage);
    virtual void setSurfaceDamage(android_native_rect_t* rects, size_t numRects);
+7 −0
Original line number Diff line number Diff line
@@ -366,10 +366,17 @@ TEST_F(SurfaceTest, SetHdrMetadata) {
        78.0,
        62.0,
    };

    std::vector<uint8_t> hdr10plus;
    hdr10plus.push_back(0xff);

    int error = native_window_set_buffers_smpte2086_metadata(window.get(), &smpte2086);
    ASSERT_EQ(error, NO_ERROR);
    error = native_window_set_buffers_cta861_3_metadata(window.get(), &cta861_3);
    ASSERT_EQ(error, NO_ERROR);
    error = native_window_set_buffers_hdr10_plus_metadata(window.get(), hdr10plus.size(),
                                                          hdr10plus.data());
    ASSERT_EQ(error, NO_ERROR);
}

TEST_F(SurfaceTest, DynamicSetBufferCount) {
Loading