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

Commit 0487b78e authored by Wonsik Kim's avatar Wonsik Kim
Browse files

CCodec: limit # of active slots instead of # of client buffers

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


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


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


@@ -639,11 +640,11 @@ void BuffersArrayImpl::grow(
    }
    }
}
}


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


// LinearOutputBuffers
// LinearOutputBuffers
+11 −11
Original line number Original line Diff line number Diff line
@@ -72,7 +72,7 @@ public:
    /**
    /**
     * Return number of buffers the client owns.
     * 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.
     * 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
     * Return the number of buffers that are sent to the client but not released
     * yet.
     * yet.
     */
     */
    size_t numClientBuffers() const;
    size_t numActiveSlots() const;


    /**
    /**
     * Return the number of buffers that are sent to the component but not
     * 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
     * Return the number of buffers that are sent to the client but not released
     * yet.
     * yet.
     */
     */
    size_t numClientBuffers() const;
    size_t numActiveSlots() const;


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


    void flush() override;
    void flush() override;


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


    void getArray(Vector<sp<MediaCodecBuffer>> *array) const final;
    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
     * 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;
    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.
     * Return an appropriate Codec2Buffer object for the type of buffers.