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
diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp
index d4953c1..0f1d0ff 100644
--- a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp
+++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp
@@ -142,8 +142,12 @@
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 @@
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::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 @@
__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 @@
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 @@
}
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);
diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.h b/services/camera/libcameraservice/api1/client2/ZslProcessor.h
index 3186233..a98160a 100644
--- a/services/camera/libcameraservice/api1/client2/ZslProcessor.h
+++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.h
@@ -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 @@
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 @@
private:
wp<ZslProcessor> mParent;
};
+#endif
static const nsecs_t kWaitDuration = 10000000; // 10 ms
nsecs_t mLatestClearedBufferTimestamp;
@@ -139,8 +155,13 @@
// 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;
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
index 8c44e35..f469aad 100644
--- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
@@ -1240,6 +1240,18 @@
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 @@
inputSurface->name = toString16("CameraInput");
inputSurface->graphicBufferProducer = producer;
}
+#endif
return res;
}
diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h
index aceb5c0..9c8f5ad 100644
--- a/services/camera/libcameraservice/common/CameraDeviceBase.h
+++ b/services/camera/libcameraservice/common/CameraDeviceBase.h
@@ -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 @@
*/
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
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 0cb9b1d..bb54f25 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1441,6 +1441,21 @@
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 @@
return mInputStream->getInputBufferProducer(producer);
}
+#endif
status_t Camera3Device::createDefaultRequest(camera_request_template_t templateId,
CameraMetadata *request) {
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 3cfe3c9..3c45c1a 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -31,6 +31,7 @@
#include <utils/Timers.h>
#include <camera/CaptureResult.h>
+#include <gui/Flags.h>
#include "CameraServiceWatchdog.h"
#include <aidl/android/hardware/camera/device/CameraBlob.h>
@@ -197,8 +198,12 @@
status_t configureStreams(const CameraMetadata& sessionParams,
int operatingMode =
camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_NORMAL_MODE) override;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ status_t getInputSurface(sp<Surface> *surface) override;
+#else
status_t getInputBufferProducer(
sp<IGraphicBufferProducer> *producer) override;
+#endif
void getOfflineStreamIds(std::vector<int> *offlineStreamIds) override;
diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.cpp b/services/camera/libcameraservice/device3/Camera3InputStream.cpp
index f9b6037..999f563 100644
--- a/services/camera/libcameraservice/device3/Camera3InputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3InputStream.cpp
@@ -182,6 +182,21 @@
/*output*/false, /*transform*/ -1);
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3InputStream::getInputSurfaceLocked(sp<Surface> *surface) {
+ ATRACE_CALL();
+
+ if (surface == NULL) {
+ return BAD_VALUE;
+ } else if (mSurface == NULL) {
+ ALOGE("%s: No input stream is configured", __FUNCTION__);
+ return INVALID_OPERATION;
+ }
+
+ *surface = mSurface;
+ return OK;
+}
+#else
status_t Camera3InputStream::getInputBufferProducerLocked(
sp<IGraphicBufferProducer> *producer) {
ATRACE_CALL();
@@ -196,6 +211,7 @@
*producer = mProducer;
return OK;
}
+#endif
status_t Camera3InputStream::disconnectLocked() {
@@ -284,7 +300,12 @@
mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
mConsumer->setMaxAcquiredBufferCount(mTotalBufferCount);
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ mSurface = mConsumer->getSurface();
+#else
mProducer = mConsumer->getSurface()->getIGraphicBufferProducer();
+#endif // WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+
#else
mConsumer = new BufferItemConsumer(consumer, mUsage,
mTotalBufferCount);
diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.h b/services/camera/libcameraservice/device3/Camera3InputStream.h
index a99c364..b1603e5 100644
--- a/services/camera/libcameraservice/device3/Camera3InputStream.h
+++ b/services/camera/libcameraservice/device3/Camera3InputStream.h
@@ -18,6 +18,7 @@
#define ANDROID_SERVERS_CAMERA3_INPUT_STREAM_H
#include <utils/RefBase.h>
+#include <gui/Flags.h>
#include <gui/Surface.h>
#include <gui/BufferItemConsumer.h>
@@ -50,7 +51,11 @@
private:
sp<BufferItemConsumer> mConsumer;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ sp<Surface> mSurface;
+#else
sp<IGraphicBufferProducer> mProducer;
+#endif
Vector<BufferItem> mBuffersInFlight;
static const std::string FAKE_ID;
@@ -75,8 +80,12 @@
virtual status_t getInputBufferLocked(camera_stream_buffer *buffer, Size *size);
virtual status_t returnInputBufferLocked(
const camera_stream_buffer &buffer);
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ virtual status_t getInputSurfaceLocked(sp<Surface> *surface);
+#else
virtual status_t getInputBufferProducerLocked(
sp<IGraphicBufferProducer> *producer);
+#endif
virtual status_t disconnectLocked();
virtual status_t configureQueueLocked();
diff --git a/services/camera/libcameraservice/device3/Camera3Stream.cpp b/services/camera/libcameraservice/device3/Camera3Stream.cpp
index ceb3d30..ae76e60 100644
--- a/services/camera/libcameraservice/device3/Camera3Stream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Stream.cpp
@@ -871,12 +871,21 @@
return res;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3Stream::getInputSurface(sp<Surface> *surface) {
+ ATRACE_CALL();
+ Mutex::Autolock l(mLock);
+
+ return getInputSurfaceLocked(surface);
+}
+#else
status_t Camera3Stream::getInputBufferProducer(sp<IGraphicBufferProducer> *producer) {
ATRACE_CALL();
Mutex::Autolock l(mLock);
return getInputBufferProducerLocked(producer);
}
+#endif
void Camera3Stream::fireBufferRequestForFrameNumber(uint64_t frameNumber,
const CameraMetadata& settings) {
@@ -990,10 +999,17 @@
ALOGE("%s: This type of stream does not support input", __FUNCTION__);
return INVALID_OPERATION;
}
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+status_t Camera3Stream::getInputSurfaceLocked(sp<Surface>*) {
+ ALOGE("%s: This type of stream does not support input", __FUNCTION__);
+ return INVALID_OPERATION;
+}
+#else
status_t Camera3Stream::getInputBufferProducerLocked(sp<IGraphicBufferProducer>*) {
ALOGE("%s: This type of stream does not support input", __FUNCTION__);
return INVALID_OPERATION;
}
+#endif
void Camera3Stream::addBufferListener(
wp<Camera3StreamBufferListener> listener) {
diff --git a/services/camera/libcameraservice/device3/Camera3Stream.h b/services/camera/libcameraservice/device3/Camera3Stream.h
index ccd1044..1519ada 100644
--- a/services/camera/libcameraservice/device3/Camera3Stream.h
+++ b/services/camera/libcameraservice/device3/Camera3Stream.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_SERVERS_CAMERA3_STREAM_H
#define ANDROID_SERVERS_CAMERA3_STREAM_H
+#include <gui/Flags.h>
#include <gui/Surface.h>
#include <utils/RefBase.h>
#include <utils/String16.h>
@@ -382,9 +383,13 @@
*/
status_t returnInputBuffer(const camera_stream_buffer &buffer);
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ status_t getInputSurface(sp<Surface> *producer);
+#else
// get the buffer producer of the input buffer queue.
// only apply to input streams.
status_t getInputBufferProducer(sp<IGraphicBufferProducer> *producer);
+#endif
/**
* Whether any of the stream's buffers are currently in use by the HAL,
@@ -534,8 +539,12 @@
virtual status_t returnInputBufferLocked(
const camera_stream_buffer &buffer);
virtual bool hasOutstandingBuffersLocked() const = 0;
+#if WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
+ virtual status_t getInputSurfaceLocked(sp<Surface> *surface);
+#else
// Get the buffer producer of the input buffer queue. Only apply to input streams.
virtual status_t getInputBufferProducerLocked(sp<IGraphicBufferProducer> *producer);
+#endif
// Can return -ENOTCONN when we are already disconnected (not an error)
virtual status_t disconnectLocked() = 0;
diff --git a/services/camera/libcameraservice/device3/Camera3StreamInterface.h b/services/camera/libcameraservice/device3/Camera3StreamInterface.h
index 4df8193..0786622 100644
--- a/services/camera/libcameraservice/device3/Camera3StreamInterface.h
+++ b/services/camera/libcameraservice/device3/Camera3StreamInterface.h
@@ -17,6 +17,7 @@
#ifndef ANDROID_SERVERS_CAMERA3_STREAM_INTERFACE_H
#define ANDROID_SERVERS_CAMERA3_STREAM_INTERFACE_H
+#include <gui/Flags.h>
#include <utils/RefBase.h>
#include <camera/camera2/OutputConfiguration.h>
@@ -435,12 +436,14 @@
*/
virtual status_t returnInputBuffer(const camera_stream_buffer &buffer) = 0;
+#if !WB_CAMERA3_AND_PROCESSORS_WITH_DEPENDENCIES
/**
* Get the buffer producer of the input buffer queue.
*
* This method only applies to input streams.
*/
virtual status_t getInputBufferProducer(sp<IGraphicBufferProducer> *producer) = 0;
+#endif
/**
* Whether any of the stream's buffers are currently in use by the HAL,