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

Commit 9bad0d7e authored by Courtney Goeltzenleuchter's avatar Courtney Goeltzenleuchter Committed by Chia-I Wu
Browse files

Add plumbing for HDR metadata

Allow a ANativeWindow client to send HDR metadata to SurfaceFlinger.
The metadata can be queried with
BufferLayerConsumer::getCurrentHdrMetadata.

Written by Courtney.  Updated by olv@.

Bug: 63710530
Test: builds
Change-Id: I23192d4750950664b57863a533bffd72397255b4
parent e85d368c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ cc_library_shared {
        "FrameTimestamps.cpp",
        "GLConsumer.cpp",
        "GuiConfig.cpp",
        "HdrMetadata.cpp",
        "IDisplayEventConnection.cpp",
        "IConsumerListener.cpp",
        "IGraphicBufferConsumer.cpp",
+9 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ size_t BufferItem::getFlattenedSize() const {
        size = FlattenableUtils::align<4>(size);
    }
    size += mSurfaceDamage.getFlattenedSize();
    size += mHdrMetadata.getFlattenedSize();
    size = FlattenableUtils::align<8>(size);
    return size + getPodSize();
}
@@ -151,6 +152,10 @@ status_t BufferItem::flatten(
    if (err) return err;
    FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());

    err = mHdrMetadata.flatten(buffer, size);
    if (err) return err;
    FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());

    // Check we still have enough space
    if (size < getPodSize()) {
        return NO_MEMORY;
@@ -212,6 +217,10 @@ status_t BufferItem::unflatten(
    if (err) return err;
    FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());

    err = mHdrMetadata.unflatten(buffer, size);
    if (err) return err;
    FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());

    // Check we still have enough space
    if (size < getPodSize()) {
        return NO_MEMORY;
+5 −3
Original line number Diff line number Diff line
@@ -765,6 +765,7 @@ status_t BufferQueueProducer::queueBuffer(int slot,
            &crop, &scalingMode, &transform, &acquireFence, &stickyTransform,
            &getFrameTimestamps);
    const Region& surfaceDamage = input.getSurfaceDamage();
    const HdrMetadata& hdrMetadata = input.getHdrMetadata();

    if (acquireFence == NULL) {
        BQ_LOGE("queueBuffer: fence is NULL");
@@ -825,9 +826,9 @@ status_t BufferQueueProducer::queueBuffer(int slot,
        }

        BQ_LOGV("queueBuffer: slot=%d/%" PRIu64 " time=%" PRIu64 " dataSpace=%d"
                " crop=[%d,%d,%d,%d] transform=%#x scale=%s",
                slot, mCore->mFrameCounter + 1, requestedPresentTimestamp,
                dataSpace, crop.left, crop.top, crop.right, crop.bottom,
                " validHdrMetadataTypes=0x%x crop=[%d,%d,%d,%d] transform=%#x scale=%s",
                slot, mCore->mFrameCounter + 1, requestedPresentTimestamp, dataSpace,
                hdrMetadata.validTypes, crop.left, crop.top, crop.right, crop.bottom,
                transform,
                BufferItem::scalingModeName(static_cast<uint32_t>(scalingMode)));

@@ -866,6 +867,7 @@ status_t BufferQueueProducer::queueBuffer(int slot,
        item.mTimestamp = requestedPresentTimestamp;
        item.mIsAutoTimestamp = isAutoTimestamp;
        item.mDataSpace = dataSpace;
        item.mHdrMetadata = hdrMetadata;
        item.mFrameNumber = currentFrameNumber;
        item.mSlot = slot;
        item.mFence = acquireFence;
+69 −0
Original line number Diff line number Diff line
/*
 * Copyright 2018 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.
 */

#include <gui/HdrMetadata.h>

namespace android {

size_t HdrMetadata::getFlattenedSize() const {
    size_t size = sizeof(validTypes);
    if (validTypes & SMPTE2086) {
        size += sizeof(smpte2086);
    }
    if (validTypes & CTA861_3) {
        size += sizeof(cta8613);
    }
    return size;
}

status_t HdrMetadata::flatten(void* buffer, size_t size) const {
    if (size < getFlattenedSize()) {
        return NO_MEMORY;
    }

    FlattenableUtils::write(buffer, size, validTypes);
    if (validTypes & SMPTE2086) {
        FlattenableUtils::write(buffer, size, smpte2086);
    }
    if (validTypes & CTA861_3) {
        FlattenableUtils::write(buffer, size, cta8613);
    }

    return NO_ERROR;
}

status_t HdrMetadata::unflatten(void const* buffer, size_t size) {
    if (size < sizeof(validTypes)) {
        return NO_MEMORY;
    }
    FlattenableUtils::read(buffer, size, validTypes);
    if (validTypes & SMPTE2086) {
        if (size < sizeof(smpte2086)) {
            return NO_MEMORY;
        }
        FlattenableUtils::read(buffer, size, smpte2086);
    }
    if (validTypes & CTA861_3) {
        if (size < sizeof(cta8613)) {
            return NO_MEMORY;
        }
        FlattenableUtils::read(buffer, size, cta8613);
    }

    return NO_ERROR;
}

} // namespace android
+14 −3
Original line number Diff line number Diff line
@@ -951,7 +951,8 @@ constexpr size_t IGraphicBufferProducer::QueueBufferInput::minFlattenedSize() {
size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
    return minFlattenedSize() +
            fence->getFlattenedSize() +
            surfaceDamage.getFlattenedSize();
            surfaceDamage.getFlattenedSize() +
            hdrMetadata.getFlattenedSize();
}

size_t IGraphicBufferProducer::QueueBufferInput::getFdCount() const {
@@ -978,7 +979,12 @@ status_t IGraphicBufferProducer::QueueBufferInput::flatten(
    if (result != NO_ERROR) {
        return result;
    }
    return surfaceDamage.flatten(buffer, size);
    result = surfaceDamage.flatten(buffer, size);
    if (result != NO_ERROR) {
        return result;
    }
    FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
    return hdrMetadata.flatten(buffer, size);
}

status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
@@ -1002,7 +1008,12 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
    if (result != NO_ERROR) {
        return result;
    }
    return surfaceDamage.unflatten(buffer, size);
    result = surfaceDamage.unflatten(buffer, size);
    if (result != NO_ERROR) {
        return result;
    }
    FlattenableUtils::advance(buffer, size, surfaceDamage.getFlattenedSize());
    return hdrMetadata.unflatten(buffer, size);
}

// ----------------------------------------------------------------------------
Loading