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

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

Merge "RELAND CCodec: handle dataspace update from GraphicBufferSource" am:...

Merge "RELAND CCodec: handle dataspace update from GraphicBufferSource" am: f787fd49 am: 2fcd4bef am: 7838a48d

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

Change-Id: I4daa97cea3996742b6e26d55f8386e2c2d71645b
parents 41443f19 7838a48d
Loading
Loading
Loading
Loading
+35 −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,23 @@ 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 transfer;
        int32_t range;
        ColorUtils::getColorConfigFromDataSpace(dataspace, &range, &standard, &transfer);
        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 +121,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 +141,7 @@ protected:
                queued = true;
            }
            if (queued) {
                jobs->configUpdate.clear();
                return true;
            }
            if (i == 0) {
@@ -161,6 +184,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 +196,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() {
@@ -461,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;
}

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

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

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

    /**
     * Returns dataspace information from GraphicBufferSource.
     */
    android_dataspace getDataspace();

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

    // WORKAROUND: timestamp adjustment

+7 −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;
@@ -1612,6 +1614,7 @@ void CCodec::start() {
        outputFormat = config->mOutputFormat = config->mOutputFormat->dup();
        if (config->mInputSurface) {
            err2 = config->mInputSurface->start();
            config->mInputSurfaceDataspace = config->mInputSurface->getDataspace();
        }
        buffersBoundToCodec = config->mBuffersBoundToCodec;
    }
@@ -1699,6 +1702,7 @@ void CCodec::stop() {
        if (config->mInputSurface) {
            config->mInputSurface->disconnect();
            config->mInputSurface = nullptr;
            config->mInputSurfaceDataspace = HAL_DATASPACE_UNKNOWN;
        }
    }
    {
@@ -1748,6 +1752,7 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) {
        if (config->mInputSurface) {
            config->mInputSurface->disconnect();
            config->mInputSurface = nullptr;
            config->mInputSurfaceDataspace = HAL_DATASPACE_UNKNOWN;
        }
    }

+23 −1
Original line number Diff line number Diff line
@@ -1128,6 +1128,12 @@ bool CCodecConfig::updateConfiguration(
            insertion.first->second = std::move(p);
        }
    }
    if (mInputSurface
            && (domain & mOutputDomain)
            && mInputSurfaceDataspace != mInputSurface->getDataspace()) {
        changed = true;
        mInputSurfaceDataspace = mInputSurface->getDataspace();
    }

    ALOGV("updated configuration has %zu params (%s)", mCurrentConfig.size(),
            changed ? "CHANGED" : "no change");
@@ -1356,7 +1362,6 @@ sp<AMessage> CCodecConfig::getFormatForDomain(
            msg->removeEntryAt(msg->findEntryByName("color-matrix"));
        }


        // calculate dataspace for raw graphic buffers if not specified by component, or if
        // using surface with unspecified aspects (as those must be defaulted which may change
        // the dataspace)
@@ -1394,6 +1399,23 @@ sp<AMessage> CCodecConfig::getFormatForDomain(
            }
        }

        if (mInputSurface) {
            android_dataspace dataspace = mInputSurface->getDataspace();
            ColorUtils::convertDataSpaceToV0(dataspace);
            int32_t standard;
            ColorUtils::getColorConfigFromDataSpace(dataspace, &range, &standard, &transfer);
            if (range != 0) {
                msg->setInt32(KEY_COLOR_RANGE, range);
            }
            if (standard != 0) {
                msg->setInt32(KEY_COLOR_STANDARD, standard);
            }
            if (transfer != 0) {
                msg->setInt32(KEY_COLOR_TRANSFER, transfer);
            }
            msg->setInt32("android._dataspace", dataspace);
        }

        // HDR static info

        C2HdrStaticMetadataStruct hdr;
+1 −0
Original line number Diff line number Diff line
@@ -124,6 +124,7 @@ struct CCodecConfig {

    std::shared_ptr<InputSurfaceWrapper> mInputSurface;
    std::unique_ptr<InputSurfaceWrapper::Config> mISConfig;
    android_dataspace mInputSurfaceDataspace;

    /// the current configuration. Updated after configure() and based on configUpdate in
    /// onWorkDone
Loading