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

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

Merge "Upstream changes from hardware/google/av"

parents 173d8836 1f213365
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -216,7 +216,7 @@ public:
        };

        uint64_t mbs = uint64_t((size.v.width + 15) / 16) * ((size.v.height + 15) / 16);
        float mbsPerSec = float(mbs) / frameRate.v.value;
        float mbsPerSec = float(mbs) * frameRate.v.value;

        // Check if the supplied level meets the MB / bitrate requirements. If
        // not, update the level with the lowest level meeting the requirements.
+32 −2
Original line number Diff line number Diff line
@@ -1024,7 +1024,7 @@ status_t CCodec::setupInputSurface(const std::shared_ptr<InputSurfaceWrapper> &s
        ALOGD("ISConfig: no configuration");
    }

    return surface->start();
    return OK;
}

void CCodec::initiateSetInputSurface(const sp<PersistentSurface> &surface) {
@@ -1111,12 +1111,20 @@ void CCodec::start() {
    }
    sp<AMessage> inputFormat;
    sp<AMessage> outputFormat;
    status_t err2 = OK;
    {
        Mutexed<Config>::Locked config(mConfig);
        inputFormat = config->mInputFormat;
        outputFormat = config->mOutputFormat;
        if (config->mInputSurface) {
            err2 = config->mInputSurface->start();
        }
    }
    if (err2 != OK) {
        mCallback->onError(err2, ACTION_CODE_FATAL);
        return;
    }
    status_t err2 = mChannel->start(inputFormat, outputFormat);
    err2 = mChannel->start(inputFormat, outputFormat);
    if (err2 != OK) {
        mCallback->onError(err2, ACTION_CODE_FATAL);
        return;
@@ -1190,6 +1198,13 @@ void CCodec::stop() {
        mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
    }

    {
        Mutexed<Config>::Locked config(mConfig);
        if (config->mInputSurface) {
            config->mInputSurface->disconnect();
            config->mInputSurface = nullptr;
        }
    }
    {
        Mutexed<State>::Locked state(mState);
        if (state->get() == STOPPING) {
@@ -1200,6 +1215,7 @@ void CCodec::stop() {
}

void CCodec::initiateRelease(bool sendCallback /* = true */) {
    bool clearInputSurfaceIfNeeded = false;
    {
        Mutexed<State>::Locked state(mState);
        if (state->get() == RELEASED || state->get() == RELEASING) {
@@ -1221,9 +1237,23 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) {
            }
            return;
        }
        if (state->get() == STARTING
                || state->get() == RUNNING
                || state->get() == STOPPING) {
            // Input surface may have been started, so clean up is needed.
            clearInputSurfaceIfNeeded = true;
        }
        state->set(RELEASING);
    }

    if (clearInputSurfaceIfNeeded) {
        Mutexed<Config>::Locked config(mConfig);
        if (config->mInputSurface) {
            config->mInputSurface->disconnect();
            config->mInputSurface = nullptr;
        }
    }

    mChannel->stop();
    // thiz holds strong ref to this while the thread is running.
    sp<CCodec> thiz(this);
+65 −32
Original line number Diff line number Diff line
@@ -128,7 +128,9 @@ public:
     * and released successfully.
     */
    virtual bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) = 0;
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) = 0;

    /**
     * Release the buffer that is no longer used by the codec process. Return
@@ -455,13 +457,18 @@ public:
     * \return  true  if the buffer is successfully released from a slot
     *          false otherwise
     */
    bool releaseSlot(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) {
    bool releaseSlot(
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) {
        sp<Codec2Buffer> clientBuffer;
        size_t index = mBuffers.size();
        for (size_t i = 0; i < mBuffers.size(); ++i) {
            if (mBuffers[i].clientBuffer == buffer) {
                clientBuffer = mBuffers[i].clientBuffer;
                if (release) {
                    mBuffers[i].clientBuffer.clear();
                }
                index = i;
                break;
            }
@@ -470,8 +477,11 @@ public:
            ALOGV("[%s] %s: No matching buffer found", mName, __func__);
            return false;
        }
        std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer();
        std::shared_ptr<C2Buffer> result = mBuffers[index].compBuffer.lock();
        if (!result) {
            result = clientBuffer->asC2Buffer();
            mBuffers[index].compBuffer = result;
        }
        if (c2buffer) {
            *c2buffer = result;
        }
@@ -485,8 +495,8 @@ public:
            if (!compBuffer || compBuffer != c2buffer) {
                continue;
            }
            mBuffers[i].clientBuffer = nullptr;
            mBuffers[i].compBuffer.reset();
            ALOGV("[%s] codec released buffer #%zu", mName, i);
            return true;
        }
        ALOGV("[%s] codec released an unknown buffer", mName);
@@ -597,7 +607,10 @@ public:
     * \return  true  if the buffer is successfully returned
     *          false otherwise
     */
    bool returnBuffer(const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) {
    bool returnBuffer(
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) {
        sp<Codec2Buffer> clientBuffer;
        size_t index = mBuffers.size();
        for (size_t i = 0; i < mBuffers.size(); ++i) {
@@ -606,7 +619,9 @@ public:
                    ALOGD("[%s] Client returned a buffer it does not own according to our record: %zu", mName, i);
                }
                clientBuffer = mBuffers[i].clientBuffer;
                if (release) {
                    mBuffers[i].ownedByClient = false;
                }
                index = i;
                break;
            }
@@ -616,8 +631,11 @@ public:
            return false;
        }
        ALOGV("[%s] %s: matching buffer found (index=%zu)", mName, __func__, index);
        std::shared_ptr<C2Buffer> result = clientBuffer->asC2Buffer();
        std::shared_ptr<C2Buffer> result = mBuffers[index].compBuffer.lock();
        if (!result) {
            result = clientBuffer->asC2Buffer();
            mBuffers[index].compBuffer = result;
        }
        if (c2buffer) {
            *c2buffer = result;
        }
@@ -636,9 +654,9 @@ public:
                    // This should not happen.
                    ALOGD("[%s] codec released a buffer owned by client "
                          "(index %zu)", mName, i);
                    mBuffers[i].ownedByClient = false;
                }
                mBuffers[i].compBuffer.reset();
                ALOGV("[%s] codec released buffer #%zu(array mode)", mName, i);
                return true;
            }
        }
@@ -723,8 +741,10 @@ public:
    }

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.returnBuffer(buffer, c2buffer);
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) override {
        return mImpl.returnBuffer(buffer, c2buffer, release);
    }

    bool expireComponentBuffer(
@@ -765,8 +785,10 @@ public:
    }

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.releaseSlot(buffer, c2buffer);
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) override {
        return mImpl.releaseSlot(buffer, c2buffer, release);
    }

    bool expireComponentBuffer(
@@ -801,7 +823,7 @@ public:
        return std::move(array);
    }

    virtual sp<Codec2Buffer> alloc(size_t size) const {
    virtual sp<Codec2Buffer> alloc(size_t size) {
        C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
        std::shared_ptr<C2LinearBlock> block;

@@ -850,11 +872,12 @@ public:
    ~EncryptedLinearInputBuffers() override {
    }

    sp<Codec2Buffer> alloc(size_t size) const override {
    sp<Codec2Buffer> alloc(size_t size) override {
        sp<IMemory> memory;
        for (const Entry &entry : mMemoryVector) {
            if (entry.block.expired()) {
                memory = entry.memory;
        size_t slot = 0;
        for (; slot < mMemoryVector.size(); ++slot) {
            if (mMemoryVector[slot].block.expired()) {
                memory = mMemoryVector[slot].memory;
                break;
            }
        }
@@ -864,10 +887,11 @@ public:

        std::shared_ptr<C2LinearBlock> block;
        c2_status_t err = mPool->fetchLinearBlock(size, mUsage, &block);
        if (err != C2_OK) {
        if (err != C2_OK || block == nullptr) {
            return nullptr;
        }

        mMemoryVector[slot].block = block;
        return new EncryptedLinearBlockBuffer(mFormat, block, memory, mHeapSeqNum);
    }

@@ -907,8 +931,10 @@ public:
    }

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.releaseSlot(buffer, c2buffer);
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) override {
        return mImpl.releaseSlot(buffer, c2buffer, release);
    }

    bool expireComponentBuffer(
@@ -971,14 +997,17 @@ public:
    }

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.releaseSlot(buffer, c2buffer);
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer,
            bool release) override {
        return mImpl.releaseSlot(buffer, c2buffer, release);
    }

    bool expireComponentBuffer(
            const std::shared_ptr<C2Buffer> &c2buffer) override {
        return mImpl.expireComponentBuffer(c2buffer);
    }

    void flush() override {
        // This is no-op by default unless we're in array mode where we need to keep
        // track of the flushed work.
@@ -1016,7 +1045,7 @@ public:
    }

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *) override {
            const sp<MediaCodecBuffer> &, std::shared_ptr<C2Buffer> *, bool) override {
        return false;
    }

@@ -1111,7 +1140,7 @@ public:

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.returnBuffer(buffer, c2buffer);
        return mImpl.returnBuffer(buffer, c2buffer, true);
    }

    void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) override {
@@ -1193,8 +1222,9 @@ public:
    }

    bool releaseBuffer(
            const sp<MediaCodecBuffer> &buffer, std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.releaseSlot(buffer, c2buffer);
            const sp<MediaCodecBuffer> &buffer,
            std::shared_ptr<C2Buffer> *c2buffer) override {
        return mImpl.releaseSlot(buffer, c2buffer, true);
    }

    void flush(
@@ -1626,7 +1656,7 @@ status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer
    if (buffer->size() > 0u) {
        Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
        std::shared_ptr<C2Buffer> c2buffer;
        if (!(*buffers)->releaseBuffer(buffer, &c2buffer)) {
        if (!(*buffers)->releaseBuffer(buffer, &c2buffer, false)) {
            return -ENOENT;
        }
        work->input.buffers.push_back(c2buffer);
@@ -1664,6 +1694,10 @@ status_t CCodecBufferChannel::queueInputBufferInternal(const sp<MediaCodecBuffer
    }
    if (err == C2_OK) {
        mCCodecCallback->onWorkQueued(eos);

        Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
        bool released = (*buffers)->releaseBuffer(buffer, nullptr, true);
        ALOGV("[%s] queueInputBuffer: buffer %sreleased", mName, released ? "" : "not ");
    }

    feedInputBufferIfAvailableInternal();
@@ -1992,7 +2026,7 @@ status_t CCodecBufferChannel::discardBuffer(const sp<MediaCodecBuffer> &buffer)
    bool released = false;
    {
        Mutexed<std::unique_ptr<InputBuffers>>::Locked buffers(mInputBuffers);
        if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr)) {
        if (*buffers && (*buffers)->releaseBuffer(buffer, nullptr, true)) {
            buffers.unlock();
            released = true;
            mAvailablePipelineCapacity.freeInputSlots(1, "discardBuffer");
@@ -2457,7 +2491,6 @@ void CCodecBufferChannel::stop() {
    mSync.stop();
    mFirstValidFrameIndex = mFrameIndex.load(std::memory_order_relaxed);
    if (mInputSurface != nullptr) {
        mInputSurface->disconnect();
        mInputSurface.reset();
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@
#include <cutils/native_handle.h>
#include <media/omx/1.0/WOmxNode.h>
#include <media/stagefright/MediaCodecConstants.h>
#include <media/stagefright/foundation/ALookup.h>
#include <media/stagefright/foundation/MediaDefs.h>
#include <media/stagefright/omx/OMXUtils.h>
#include <media/stagefright/xmlparser/MediaCodecsXmlParser.h>
@@ -299,7 +300,6 @@ void buildOmxInfo(const MediaCodecsXmlParser& parser,
        // OMX components don't have aliases
        for (const MediaCodecsXmlParser::Type &type : properties.typeMap) {
            const std::string &mediaType = type.first;

            std::unique_ptr<MediaCodecInfo::CapabilitiesWriter> caps =
                    info->addMediaType(mediaType.c_str());
            const MediaCodecsXmlParser::AttributeMap &attrMap = type.second;
@@ -376,7 +376,7 @@ status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) {
    }

    bool surfaceTest(Codec2Client::CreateInputSurface());
    if (option == 0 || !surfaceTest) {
    if (option == 0 || (option != 4 && !surfaceTest)) {
        buildOmxInfo(parser, writer);
    }

+4 −0
Original line number Diff line number Diff line
@@ -26,6 +26,10 @@ cc_library_shared {
        "libutils",
    ],

    static_libs: [
        "libyuv_static",
    ],

    sanitize: {
        cfi: true,
        misc_undefined: [
Loading