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

Commit f33f958a authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "CCodec: limit # of active slots instead of # of client buffers" am:...

Merge "CCodec: limit # of active slots instead of # of client buffers" am: b44ae1f1 am: 893d8879 am: df778b16

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

Change-Id: Ibb8b7727de7779fc50d0075cc28e274eec5655ef
parents ecd1c3a6 df778b16
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -625,21 +625,19 @@ void CCodecBufferChannel::feedInputBufferIfAvailableInternal() {
        Mutexed<Output>::Locked output(mOutput);
        if (!output->buffers ||
                output->buffers->hasPending() ||
                output->buffers->numClientBuffers() >= output->numSlots) {
                output->buffers->numActiveSlots() >= output->numSlots) {
            return;
        }
    }
    size_t numInputSlots = mInput.lock()->numSlots;
    for (size_t i = 0; i < numInputSlots; ++i) {
        if (mPipelineWatcher.lock()->pipelineFull()) {
            return;
        }
    size_t numActiveSlots = 0;
    while (!mPipelineWatcher.lock()->pipelineFull()) {
        sp<MediaCodecBuffer> inBuffer;
        size_t index;
        {
            Mutexed<Input>::Locked input(mInput);
            if (input->buffers->numClientBuffers() >= input->numSlots) {
                return;
            numActiveSlots = input->buffers->numActiveSlots();
            if (numActiveSlots >= input->numSlots) {
                break;
            }
            if (!input->buffers->requestNewBuffer(&index, &inBuffer)) {
                ALOGV("[%s] no new buffer available", mName);
@@ -649,6 +647,7 @@ void CCodecBufferChannel::feedInputBufferIfAvailableInternal() {
        ALOGV("[%s] new input index = %zu [%p]", mName, index, inBuffer.get());
        mCallback->onInputBufferAvailable(index, inBuffer);
    }
    ALOGV("[%s] # active slots after feedInputBufferIfAvailable = %zu", mName, numActiveSlots);
}

status_t CCodecBufferChannel::renderOutputBuffer(
+19 −18
Original line number Diff line number Diff line
@@ -495,11 +495,12 @@ void FlexBuffersImpl::flush() {
    mBuffers.clear();
}

size_t FlexBuffersImpl::numClientBuffers() const {
size_t FlexBuffersImpl::numActiveSlots() const {
    return std::count_if(
            mBuffers.begin(), mBuffers.end(),
            [](const Entry &entry) {
                return (entry.clientBuffer != nullptr);
                return (entry.clientBuffer != nullptr
                        || !entry.compBuffer.expired());
            });
}

@@ -645,11 +646,11 @@ void BuffersArrayImpl::grow(
    }
}

size_t BuffersArrayImpl::numClientBuffers() const {
size_t BuffersArrayImpl::numActiveSlots() const {
    return std::count_if(
            mBuffers.begin(), mBuffers.end(),
            [](const Entry &entry) {
                return entry.ownedByClient;
                return entry.ownedByClient || !entry.compBuffer.expired();
            });
}

@@ -699,8 +700,8 @@ void InputBuffersArray::flush() {
    mImpl.flush();
}

size_t InputBuffersArray::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t InputBuffersArray::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

sp<Codec2Buffer> InputBuffersArray::createNewBuffer() {
@@ -737,8 +738,8 @@ std::unique_ptr<InputBuffers> SlotInputBuffers::toArrayMode(size_t) {
    return nullptr;
}

size_t SlotInputBuffers::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t SlotInputBuffers::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

sp<Codec2Buffer> SlotInputBuffers::createNewBuffer() {
@@ -789,8 +790,8 @@ std::unique_ptr<InputBuffers> LinearInputBuffers::toArrayMode(size_t size) {
    return std::move(array);
}

size_t LinearInputBuffers::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t LinearInputBuffers::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

// static
@@ -966,8 +967,8 @@ std::unique_ptr<InputBuffers> GraphicMetadataInputBuffers::toArrayMode(
    return std::move(array);
}

size_t GraphicMetadataInputBuffers::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t GraphicMetadataInputBuffers::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

sp<Codec2Buffer> GraphicMetadataInputBuffers::createNewBuffer() {
@@ -1031,8 +1032,8 @@ std::unique_ptr<InputBuffers> GraphicInputBuffers::toArrayMode(size_t size) {
    return std::move(array);
}

size_t GraphicInputBuffers::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t GraphicInputBuffers::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

sp<Codec2Buffer> GraphicInputBuffers::createNewBuffer() {
@@ -1121,8 +1122,8 @@ void OutputBuffersArray::getArray(Vector<sp<MediaCodecBuffer>> *array) const {
    mImpl.getArray(array);
}

size_t OutputBuffersArray::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t OutputBuffersArray::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

void OutputBuffersArray::realloc(const std::shared_ptr<C2Buffer> &c2buffer) {
@@ -1232,8 +1233,8 @@ std::unique_ptr<OutputBuffersArray> FlexOutputBuffers::toArrayMode(size_t size)
    return array;
}

size_t FlexOutputBuffers::numClientBuffers() const {
    return mImpl.numClientBuffers();
size_t FlexOutputBuffers::numActiveSlots() const {
    return mImpl.numActiveSlots();
}

// LinearOutputBuffers
+11 −11
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ public:
    /**
     * Return number of buffers the client owns.
     */
    virtual size_t numClientBuffers() const = 0;
    virtual size_t numActiveSlots() const = 0;

    /**
     * Examine image data from the buffer and update the format if necessary.
@@ -584,7 +584,7 @@ public:
     * Return the number of buffers that are sent to the client but not released
     * yet.
     */
    size_t numClientBuffers() const;
    size_t numActiveSlots() const;

    /**
     * Return the number of buffers that are sent to the component but not
@@ -705,7 +705,7 @@ public:
     * Return the number of buffers that are sent to the client but not released
     * yet.
     */
    size_t numClientBuffers() const;
    size_t numActiveSlots() const;

    /**
     * Return the size of the array.
@@ -765,7 +765,7 @@ public:

    void flush() override;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

protected:
    sp<Codec2Buffer> createNewBuffer() override;
@@ -796,7 +796,7 @@ public:

    std::unique_ptr<InputBuffers> toArrayMode(size_t size) final;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

protected:
    sp<Codec2Buffer> createNewBuffer() final;
@@ -826,7 +826,7 @@ public:

    std::unique_ptr<InputBuffers> toArrayMode(size_t size) override;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

protected:
    sp<Codec2Buffer> createNewBuffer() override;
@@ -894,7 +894,7 @@ public:

    std::unique_ptr<InputBuffers> toArrayMode(size_t size) final;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

protected:
    sp<Codec2Buffer> createNewBuffer() override;
@@ -924,7 +924,7 @@ public:
    std::unique_ptr<InputBuffers> toArrayMode(
            size_t size) final;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

protected:
    sp<Codec2Buffer> createNewBuffer() override;
@@ -965,7 +965,7 @@ public:
        array->clear();
    }

    size_t numClientBuffers() const final {
    size_t numActiveSlots() const final {
        return 0u;
    }

@@ -1019,7 +1019,7 @@ public:

    void getArray(Vector<sp<MediaCodecBuffer>> *array) const final;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

    /**
     * Reallocate the array, filled with buffers with the same size as given
@@ -1073,7 +1073,7 @@ public:

    std::unique_ptr<OutputBuffersArray> toArrayMode(size_t size) override;

    size_t numClientBuffers() const final;
    size_t numActiveSlots() const final;

    /**
     * Return an appropriate Codec2Buffer object for the type of buffers.