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

Commit b69fedaa authored by Wonsik Kim's avatar Wonsik Kim Committed by Automerger Merge Worker
Browse files

Merge changes I47894ce3,Ibc2013cf,Ide4eb89b am: 532501a2 am: 1329fe68

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/1564488

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I27168c44f715982c4d561a1407fb9adc09b42be7
parents 94e68196 1329fe68
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -33,12 +33,14 @@
#include <OMX_IndexExt.h>

#include <android/fdsan.h>
#include <media/stagefright/foundation/ColorUtils.h>
#include <media/stagefright/omx/OMXUtils.h>
#include <media/stagefright/MediaErrors.h>
#include <ui/Fence.h>
#include <ui/GraphicBuffer.h>
#include <utils/Thread.h>

#include "utils/Codec2Mapper.h"
#include "C2OMXNode.h"

namespace android {
@@ -71,6 +73,25 @@ public:
        jobs->cond.broadcast();
    }

    void setDataspace(android_dataspace dataspace) {
        Mutexed<Jobs>::Locked jobs(mJobs);
        ColorUtils::convertDataSpaceToV0(dataspace);
        jobs->configUpdate.emplace_back(new C2StreamDataSpaceInfo::input(0u, dataspace));
        int32_t standard = (int32_t(dataspace) & HAL_DATASPACE_STANDARD_MASK)
            >> HAL_DATASPACE_STANDARD_SHIFT;
        int32_t transfer = (int32_t(dataspace) & HAL_DATASPACE_TRANSFER_MASK)
            >> HAL_DATASPACE_TRANSFER_SHIFT;
        int32_t range = (int32_t(dataspace) & HAL_DATASPACE_RANGE_MASK)
            >> HAL_DATASPACE_RANGE_SHIFT;
        std::unique_ptr<C2StreamColorAspectsInfo::input> colorAspects =
            std::make_unique<C2StreamColorAspectsInfo::input>(0u);
        if (C2Mapper::map(standard, &colorAspects->primaries, &colorAspects->matrix)
                && C2Mapper::map(transfer, &colorAspects->transfer)
                && C2Mapper::map(range, &colorAspects->range)) {
            jobs->configUpdate.push_back(std::move(colorAspects));
        }
    }

protected:
    bool threadLoop() override {
        constexpr nsecs_t kIntervalNs = nsecs_t(10) * 1000 * 1000;  // 10ms
@@ -102,6 +123,9 @@ protected:
                    uniqueFds.push_back(std::move(queue.workList.front().fd1));
                    queue.workList.pop_front();
                }
                for (const std::unique_ptr<C2Param> &param : jobs->configUpdate) {
                    items.front()->input.configUpdate.emplace_back(C2Param::Copy(*param));
                }

                jobs.unlock();
                for (int fenceFd : fenceFds) {
@@ -119,6 +143,7 @@ protected:
                queued = true;
            }
            if (queued) {
                jobs->configUpdate.clear();
                return true;
            }
            if (i == 0) {
@@ -161,6 +186,7 @@ private:
        std::map<std::weak_ptr<Codec2Client::Component>,
                 Queue,
                 std::owner_less<std::weak_ptr<Codec2Client::Component>>> queues;
        std::vector<std::unique_ptr<C2Param>> configUpdate;
        Condition cond;
    };
    Mutexed<Jobs> mJobs;
@@ -172,6 +198,9 @@ C2OMXNode::C2OMXNode(const std::shared_ptr<Codec2Client::Component> &comp)
      mQueueThread(new QueueThread) {
    android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ALWAYS);
    mQueueThread->run("C2OMXNode", PRIORITY_AUDIO);

    Mutexed<android_dataspace>::Locked ds(mDataspace);
    *ds = HAL_DATASPACE_UNKNOWN;
}

status_t C2OMXNode::freeNode() {
@@ -459,8 +488,11 @@ status_t C2OMXNode::dispatchMessage(const omx_message& msg) {
    android_dataspace dataSpace = (android_dataspace)msg.u.event_data.data1;
    uint32_t pixelFormat = msg.u.event_data.data3;

    // TODO: set dataspace on component to see if it impacts color aspects
    ALOGD("dataspace changed to %#x pixel format: %#x", dataSpace, pixelFormat);
    mQueueThread->setDataspace(dataSpace);

    Mutexed<android_dataspace>::Locked ds(mDataspace);
    *ds = dataSpace;
    return OK;
}

@@ -493,4 +525,8 @@ void C2OMXNode::onInputBufferDone(c2_cntr64_t index) {
    (void)mBufferSource->onInputBufferEmptied(bufferId, -1);
}

android_dataspace C2OMXNode::getDataspace() {
    return *mDataspace.lock();
}

}  // namespace android
+3 −0
Original line number Diff line number Diff line
@@ -93,6 +93,8 @@ struct C2OMXNode : public BnOMXNode {
     */
    void onInputBufferDone(c2_cntr64_t index);

    android_dataspace getDataspace();

private:
    std::weak_ptr<Codec2Client::Component> mComp;
    sp<IOMXBufferSource> mBufferSource;
@@ -101,6 +103,7 @@ private:
    uint32_t mWidth;
    uint32_t mHeight;
    uint64_t mUsage;
    Mutexed<android_dataspace> mDataspace;

    // WORKAROUND: timestamp adjustment

+69 −2
Original line number Diff line number Diff line
@@ -211,8 +211,6 @@ public:
                (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits,
                &usage, sizeof(usage));

        // NOTE: we do not use/pass through color aspects from GraphicBufferSource as we
        // communicate that directly to the component.
        mSource->configure(
                mOmxNode, static_cast<hardware::graphics::common::V1_0::Dataspace>(mDataSpace));
        return OK;
@@ -411,6 +409,10 @@ public:
        mNode->onInputBufferDone(index);
    }

    android_dataspace getDataspace() override {
        return mNode->getDataspace();
    }

private:
    sp<HGraphicBufferSource> mSource;
    sp<C2OMXNode> mNode;
@@ -1028,6 +1030,29 @@ void CCodec::configure(const sp<AMessage> &msg) {
            }
        }

        // get color aspects
        getColorAspectsFromFormat(msg, config->mClientColorAspects);

        /*
         * Handle dataspace
         */
        int32_t usingRecorder;
        if (msg->findInt32("android._using-recorder", &usingRecorder) && usingRecorder) {
            android_dataspace dataSpace = HAL_DATASPACE_BT709;
            int32_t width, height;
            if (msg->findInt32("width", &width)
                    && msg->findInt32("height", &height)) {
                setDefaultCodecColorAspectsIfNeeded(config->mClientColorAspects, width, height);
                // TODO: read dataspace / color aspect from the component
                setColorAspectsIntoFormat(
                        config->mClientColorAspects, const_cast<sp<AMessage> &>(msg));
                dataSpace = getDataSpaceForColorAspects(
                        config->mClientColorAspects, true /* mayexpand */);
            }
            msg->setInt32("android._dataspace", (int32_t)dataSpace);
            ALOGD("setting dataspace to %x", dataSpace);
        }

        int32_t subscribeToAllVendorParams;
        if (msg->findInt32("x-*", &subscribeToAllVendorParams) && subscribeToAllVendorParams) {
            if (config->subscribeToAllVendorParams(comp, C2_MAY_BLOCK) != OK) {
@@ -1960,6 +1985,44 @@ void CCodec::onInputBufferDone(uint64_t frameIndex, size_t arrayIndex) {
    }
}

static void HandleDataspace(
        android_dataspace dataspace, ColorAspects *colorAspects, sp<AMessage> *format) {
    ColorUtils::convertDataSpaceToV0(dataspace);
    int32_t range, standard, transfer;
    range = (dataspace & HAL_DATASPACE_RANGE_MASK) >> HAL_DATASPACE_RANGE_SHIFT;
    if (range == 0) {
        range = ColorUtils::wrapColorAspectsIntoColorRange(
                colorAspects->mRange);
    }
    standard = (dataspace & HAL_DATASPACE_STANDARD_MASK) >> HAL_DATASPACE_STANDARD_SHIFT;
    if (standard == 0) {
        standard = ColorUtils::wrapColorAspectsIntoColorStandard(
                colorAspects->mPrimaries,
                colorAspects->mMatrixCoeffs);
    }
    transfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK) >> HAL_DATASPACE_TRANSFER_SHIFT;
    if (transfer == 0) {
        transfer = ColorUtils::wrapColorAspectsIntoColorTransfer(
                colorAspects->mTransfer);
    }
    ColorAspects newColorAspects;
    ColorUtils::convertPlatformColorAspectsToCodecAspects(
            range, standard, transfer, newColorAspects);
    if (ColorUtils::checkIfAspectsChangedAndUnspecifyThem(
            newColorAspects, *colorAspects)) {
        *format = (*format)->dup();
        (*format)->setInt32(KEY_COLOR_RANGE, range);
        (*format)->setInt32(KEY_COLOR_STANDARD, standard);
        (*format)->setInt32(KEY_COLOR_TRANSFER, transfer);
        // Record current color aspects into |colorAspects|.
        // NOTE: newColorAspects could have been modified by
        //       checkIfAspectsChangedAndUnspecifyThem() above,
        //       so *colorAspects = newColorAspects does not work as intended.
        ColorUtils::convertPlatformColorAspectsToCodecAspects(
                range, standard, transfer, *colorAspects);
    }
}

void CCodec::onMessageReceived(const sp<AMessage> &msg) {
    TimePoint now = std::chrono::steady_clock::now();
    CCodecWatchdog::getInstance()->watch(this);
@@ -2074,6 +2137,10 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {

                sp<AMessage> outputFormat = config->mOutputFormat;
                config->updateConfiguration(updates, config->mOutputDomain);
                if (config->mInputSurface) {
                    android_dataspace ds = config->mInputSurface->getDataspace();
                    HandleDataspace(ds, &config->mClientColorAspects, &config->mOutputFormat);
                }
                RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat);

                // copy standard infos to graphic buffers if not already present (otherwise, we
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <C2Debug.h>

#include <codec2/hidl/client.h>
#include <media/stagefright/foundation/ColorUtils.h>
#include <utils/RefBase.h>

#include "InputSurfaceWrapper.h"
@@ -124,6 +125,7 @@ struct CCodecConfig {

    std::shared_ptr<InputSurfaceWrapper> mInputSurface;
    std::unique_ptr<InputSurfaceWrapper::Config> mISConfig;
    ColorAspects mClientColorAspects;

    /// the current configuration. Updated after configure() and based on configUpdate in
    /// onWorkDone
+2 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ public:
     */
    virtual void onInputBufferDone(c2_cntr64_t /* index */) {}

    virtual android_dataspace getDataspace() { return mDataSpace; }

protected:
    android_dataspace mDataSpace;
};
Loading