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

Commit 8e776104 authored by Carlos Martinez Romero's avatar Carlos Martinez Romero
Browse files

Change the ZSLProcessor to use a Surface.

Add a Surface stream API to the CameraDeviceBase and use it down to the
ZSLProcessor. The functionality does not change, but the IGBP
dependency is removed.

Test: N/A
Flag: com.android.graphics.libgui.flags.wb_camera3_and_processors
Bug: 342199002
BYPASS_IGBP_IGBC_API_REASON=warren buffers

Change-Id: I1695a4b6ff321ec0ed74da29c3238257ecec72d1
parent 6a612ebe
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
@@ -142,8 +142,12 @@ ZslProcessor::ZslProcessor(
        mHasFocuser(false),
        mInputBuffer(nullptr),
        mProducer(nullptr),
#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
        mInputSurface(nullptr),
#else
        mInputProducer(nullptr),
        mInputProducerSlot(-1),
#endif
        mBuffersToDetach(0) {
    // Initialize buffer queue and frame list based on pipeline max depth.
    size_t pipelineMaxDepth = kDefaultMaxPipelineDepth;
@@ -331,10 +335,17 @@ status_t ZslProcessor::deleteStream() {
        mInputStreamId = NO_STREAM;
    }

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    if (nullptr != mInputSurface.get()) {
        // The surface destructor calls disconnect
        mInputSurface.clear();
    }
#else
    if (nullptr != mInputProducer.get()) {
        mInputProducer->disconnect(NATIVE_WINDOW_API_CPU);
        mInputProducer.clear();
    }
#endif

    return OK;
}
@@ -393,11 +404,19 @@ void ZslProcessor::notifyInputReleased() {

void ZslProcessor::doNotifyInputReleasedLocked() {
    assert(nullptr != mInputBuffer.get());
#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    assert(nullptr != mInputSurface.get());
#else
    assert(nullptr != mInputProducer.get());
#endif

    sp<GraphicBuffer> gb;
    sp<Fence> fence;
#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    auto rc = mInputSurface->detachNextBuffer(&gb, &fence);
#else
    auto rc = mInputProducer->detachNextBuffer(&gb, &fence);
#endif
    if (NO_ERROR != rc) {
        ALOGE("%s: Failed to detach buffer from input producer: %d",
            __FUNCTION__, rc);
@@ -456,9 +475,15 @@ status_t ZslProcessor::pushToReprocess(int32_t requestId) {
            __FUNCTION__, (unsigned int) metadataIdx);
    }

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    if (nullptr == mInputSurface.get()) {
        res = client->getCameraDevice()->getInputSurface(
            &mInputSurface);
#else
    if (nullptr == mInputProducer.get()) {
        res = client->getCameraDevice()->getInputBufferProducer(
            &mInputProducer);
#endif
        if (res != OK) {
            ALOGE("%s: Camera %d: Unable to retrieve input producer: "
                    "%s (%d)", __FUNCTION__, client->getCameraId(),
@@ -466,9 +491,14 @@ status_t ZslProcessor::pushToReprocess(int32_t requestId) {
            return res;
        }

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
        res = mInputSurface->connect(NATIVE_WINDOW_API_CPU, new InputProducerListener(this),
            false);
#else
        IGraphicBufferProducer::QueueBufferOutput output;
        res = mInputProducer->connect(new InputProducerListener(this),
            NATIVE_WINDOW_API_CPU, false, &output);
#endif
        if (res != OK) {
            ALOGE("%s: Camera %d: Unable to connect to input producer: "
                    "%s (%d)", __FUNCTION__, client->getCameraId(),
@@ -629,19 +659,32 @@ status_t ZslProcessor::enqueueInputBufferByTimestamp(
    }

    BufferItem &item = mInputBuffer->getBufferItem();
#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    auto rc = mInputSurface->attachBuffer(item.mGraphicBuffer->getNativeBuffer());
#else
    auto rc = mInputProducer->attachBuffer(&mInputProducerSlot,
        item.mGraphicBuffer);
#endif
    if (OK != rc) {
        ALOGE("%s: Failed to attach input ZSL buffer to producer: %d",
            __FUNCTION__, rc);
        return rc;
    }

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    mInputSurface->setBuffersTimestamp(item.mTimestamp);
    mInputSurface->setBuffersDataSpace(static_cast<ui::Dataspace>(item.mDataSpace));
    mInputSurface->setCrop(&item.mCrop);
    mInputSurface->setScalingMode(item.mScalingMode);
    mInputSurface->setBuffersTransform(item.mTransform);
    rc = mInputSurface->queueBuffer(item.mGraphicBuffer, item.mFence);
#else
    IGraphicBufferProducer::QueueBufferOutput output;
    IGraphicBufferProducer::QueueBufferInput input(item.mTimestamp,
            item.mIsAutoTimestamp, item.mDataSpace, item.mCrop,
            item.mScalingMode, item.mTransform, item.mFence);
    rc = mInputProducer->queueBuffer(mInputProducerSlot, input, &output);
#endif
    if (OK != rc) {
        ALOGE("%s: Failed to queue ZSL buffer to producer: %d",
            __FUNCTION__, rc);
+22 −1
Original line number Diff line number Diff line
@@ -24,8 +24,9 @@
#include <utils/Condition.h>
#include <gui/BufferItem.h>
#include <gui/BufferItemConsumer.h>
#include <gui/RingBufferConsumer.h>
#include <gui/Flags.h>
#include <gui/IProducerListener.h>
#include <gui/RingBufferConsumer.h>
#include <camera/CameraMetadata.h>

#include "api1/client2/FrameProcessor.h"
@@ -83,6 +84,20 @@ class ZslProcessor :

  private:

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    class InputProducerListener : public SurfaceListener {
    public:
        InputProducerListener(wp<ZslProcessor> parent) : mParent(parent) {}
        virtual void onBufferReleased() override;
        virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /* buffers */)
            override {}
        virtual void onBufferDetached(int /* slot */) override {}
        virtual bool needsReleaseNotify() override { return true; }

    private:
        wp<ZslProcessor> mParent;
    };
#else
    class InputProducerListener : public BnProducerListener {
    public:
        InputProducerListener(wp<ZslProcessor> parent) : mParent(parent) {}
@@ -92,6 +107,7 @@ class ZslProcessor :
    private:
        wp<ZslProcessor> mParent;
    };
#endif

    static const nsecs_t kWaitDuration = 10000000; // 10 ms
    nsecs_t mLatestClearedBufferTimestamp;
@@ -139,8 +155,13 @@ class ZslProcessor :
    // Input buffer queued into HAL
    sp<RingBufferConsumer::PinnedBufferItem> mInputBuffer;
    sp<RingBufferConsumer>                   mProducer;

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    sp<Surface>                              mInputSurface;
#else
    sp<IGraphicBufferProducer>               mInputProducer;
    int                                      mInputProducerSlot;
#endif

    Condition                                mBuffersToDetachSignal;
    int                                      mBuffersToDetach;
+13 −0
Original line number Diff line number Diff line
@@ -1240,6 +1240,18 @@ binder::Status CameraDeviceClient::getInputSurface(/*out*/ view::Surface *inputS
    if (!mDevice.get()) {
        return STATUS_ERROR(CameraService::ERROR_DISCONNECTED, "Camera device no longer alive");
    }
#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    sp<Surface> surface;
    status_t err = mDevice->getInputSurface(&surface);
    if (err != OK) {
        res = STATUS_ERROR_FMT(CameraService::ERROR_INVALID_OPERATION,
                "Camera %s: Error getting input Surface: %s (%d)",
                mCameraIdStr.c_str(), strerror(-err), err);
    } else {
        inputSurface->name = toString16("CameraInput");
        inputSurface->graphicBufferProducer = surface->getIGraphicBufferProducer();
    }
#else
    sp<IGraphicBufferProducer> producer;
    status_t err = mDevice->getInputBufferProducer(&producer);
    if (err != OK) {
@@ -1250,6 +1262,7 @@ binder::Status CameraDeviceClient::getInputSurface(/*out*/ view::Surface *inputS
        inputSurface->name = toString16("CameraInput");
        inputSurface->graphicBufferProducer = producer;
    }
#endif
    return res;
}

+6 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <utils/KeyedVector.h>
#include <utils/Timers.h>
#include <utils/List.h>
#include <gui/Flags.h>

#include "hardware/camera2.h"
#include "camera/CameraMetadata.h"
@@ -305,9 +306,14 @@ class CameraDeviceBase : public virtual FrameProducer {
     */
    virtual void getOfflineStreamIds(std::vector<int> *offlineStreamIds) = 0;

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
    // get the surface of the input stream
    virtual status_t getInputSurface(sp<Surface> *surface) = 0;
#else
    // get the buffer producer of the input stream
    virtual status_t getInputBufferProducer(
            sp<IGraphicBufferProducer> *producer) = 0;
#endif

    /**
     * Create a metadata buffer with fields that the HAL device believes are
+16 −0
Original line number Diff line number Diff line
@@ -1441,6 +1441,21 @@ status_t Camera3Device::filterParamsAndConfigureLocked(const CameraMetadata& par
    return configureStreamsLocked(operatingMode, filteredParams);
}

#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
status_t Camera3Device::getInputSurface(sp<Surface> *surface) {
    ATRACE_CALL();
    Mutex::Autolock il(mInterfaceLock);
    Mutex::Autolock l(mLock);

    if (surface == NULL) {
        return BAD_VALUE;
    } else if (mInputStream == NULL) {
        return INVALID_OPERATION;
    }

    return mInputStream->getInputSurface(surface);
}
#else
status_t Camera3Device::getInputBufferProducer(
        sp<IGraphicBufferProducer> *producer) {
    ATRACE_CALL();
@@ -1455,6 +1470,7 @@ status_t Camera3Device::getInputBufferProducer(

    return mInputStream->getInputBufferProducer(producer);
}
#endif

status_t Camera3Device::createDefaultRequest(camera_request_template_t templateId,
        CameraMetadata *request) {
Loading