Remove some usage of IGBPs in the ICamera.
This change removes the usage of IGBPs in ICamera and the surrounding
code where reasonable. This is part of a refactor outline at go/warren-buffers.
BYPASS_IGBP_IGBC_API_REASON: this CL is part of the migration.
Bug: 342197849
Test: atest android.hardware.cts.CameraTest
Flag: com.android.graphics.libgui.flags.wb_libcameraservice
Change-Id: I06fbf42e6a249f3b30266ac5b3dad0bdbc4f585a
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 5eb2536..d0c3361 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -24,18 +24,19 @@
#include <android/hardware/camera2/BnCameraInjectionSession.h>
#include <android/hardware/camera2/ICameraInjectionCallback.h>
-#include <cutils/multiuser.h>
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
#include <binder/ActivityManager.h>
#include <binder/AppOpsManager.h>
#include <binder/BinderService.h>
-#include <binder/IServiceManager.h>
#include <binder/IActivityManager.h>
#include <binder/IAppOpsCallback.h>
+#include <binder/IServiceManager.h>
#include <binder/IUidObserver.h>
+#include <cutils/multiuser.h>
+#include <gui/Flags.h>
#include <hardware/camera.h>
#include <sensorprivacy/SensorPrivacyManager.h>
+#include <utils/KeyedVector.h>
+#include <utils/Vector.h>
#include <android/hardware/camera/common/1.0/types.h>
@@ -543,10 +544,9 @@
virtual status_t connect(const sp<hardware::ICameraClient>& client) = 0;
virtual status_t lock() = 0;
virtual status_t unlock() = 0;
- virtual status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0;
+ virtual status_t setPreviewTarget(const sp<SurfaceType>& target) = 0;
virtual void setPreviewCallbackFlag(int flag) = 0;
- virtual status_t setPreviewCallbackTarget(
- const sp<IGraphicBufferProducer>& callbackProducer) = 0;
+ virtual status_t setPreviewCallbackTarget(const sp<SurfaceType>& target) = 0;
virtual status_t startPreview() = 0;
virtual void stopPreview() = 0;
virtual bool previewEnabled() = 0;
@@ -561,7 +561,7 @@
virtual status_t setParameters(const String8& params) = 0;
virtual String8 getParameters() const = 0;
virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0;
- virtual status_t setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) = 0;
+ virtual status_t setVideoTarget(const sp<SurfaceType>& target) = 0;
// Interface used by CameraService
Client(const sp<CameraService>& cameraService,
diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp
index 861414f..af422a7 100644
--- a/services/camera/libcameraservice/api1/Camera2Client.cpp
+++ b/services/camera/libcameraservice/api1/Camera2Client.cpp
@@ -30,6 +30,7 @@
#include <com_android_internal_camera_flags.h>
#include <cutils/properties.h>
#include <gui/Surface.h>
+#include <gui/view/Surface.h>
#include "api1/Camera2Client.h"
@@ -587,26 +588,56 @@
return EBUSY;
}
-status_t Camera2Client::setPreviewTarget(
- const sp<IGraphicBufferProducer>& bufferProducer) {
+status_t Camera2Client::setPreviewTarget(const sp<SurfaceType>& target) {
ATRACE_CALL();
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock icl(mBinderSerializationLock);
status_t res;
- if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
+ if ((res = checkPid(__FUNCTION__)) != OK) return res;
- sp<IBinder> binder;
- sp<Surface> window;
- if (bufferProducer != 0) {
- binder = IInterface::asBinder(bufferProducer);
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ sp<Surface> surface;
+ view::Surface viewSurface;
+ if (target != nullptr) {
// Using controlledByApp flag to ensure that the buffer queue remains in
// async mode for the old camera API, where many applications depend
// on that behavior.
- window = new Surface(bufferProducer, /*controlledByApp*/ true);
+ surface = new Surface(target->getIGraphicBufferProducer(), true);
+ viewSurface = view::Surface::fromSurface(surface);
+ }
+ return setPreviewWindowL(viewSurface, surface);
+#else
+ sp<IBinder> binder;
+ sp<Surface> window;
+ if (target != 0) {
+ binder = IInterface::asBinder(target);
+ // Using controlledByApp flag to ensure that the buffer queue remains in
+ // async mode for the old camera API, where many applications depend
+ // on that behavior.
+ window = new Surface(target, /*controlledByApp*/ true);
}
return setPreviewWindowL(binder, window);
+#endif
}
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+status_t Camera2Client::setPreviewWindowL(const view::Surface& viewSurface,
+ const sp<Surface>& window) {
+ ATRACE_CALL();
+ status_t res;
+
+ uint64_t viewSurfaceID;
+ res = viewSurface.getUniqueId(&viewSurfaceID);
+ if (res != OK) {
+ ALOGE("%s: Camera %d: Could not getUniqueId.", __FUNCTION__, mCameraId);
+ return res;
+ }
+
+ if (viewSurfaceID == mPreviewViewSurfaceID) {
+ ALOGV("%s: Camera %d: New window is same as old window", __FUNCTION__, mCameraId);
+ return NO_ERROR;
+ }
+#else
status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
const sp<Surface>& window) {
ATRACE_CALL();
@@ -617,6 +648,7 @@
__FUNCTION__, mCameraId);
return NO_ERROR;
}
+#endif
Parameters::State state;
{
@@ -628,9 +660,8 @@
case Parameters::RECORD:
case Parameters::STILL_CAPTURE:
case Parameters::VIDEO_SNAPSHOT:
- ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
- __FUNCTION__, mCameraId,
- Parameters::getStateName(state));
+ ALOGE("%s: Camera %d: Cannot set preview display while in state %s", __FUNCTION__,
+ mCameraId, Parameters::getStateName(state));
return INVALID_OPERATION;
case Parameters::STOPPED:
case Parameters::WAITING_FOR_PREVIEW_WINDOW:
@@ -640,19 +671,23 @@
// Already running preview - need to stop and create a new stream
res = stopStream();
if (res != OK) {
- ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
- __FUNCTION__, strerror(-res), res);
+ ALOGE("%s: Unable to stop preview to swap windows: %s (%d)", __FUNCTION__,
+ strerror(-res), res);
return res;
}
state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
break;
}
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ mPreviewViewSurfaceID = viewSurfaceID;
+#else
mPreviewSurface = binder;
+#endif
+
res = mStreamingProcessor->setPreviewWindow(window);
if (res != OK) {
- ALOGE("%s: Unable to set new preview window: %s (%d)",
- __FUNCTION__, strerror(-res), res);
+ ALOGE("%s: Unable to set new preview window: %s (%d)", __FUNCTION__, strerror(-res), res);
return res;
}
@@ -725,23 +760,26 @@
}
}
-status_t Camera2Client::setPreviewCallbackTarget(
- const sp<IGraphicBufferProducer>& callbackProducer) {
+status_t Camera2Client::setPreviewCallbackTarget(const sp<SurfaceType>& target) {
ATRACE_CALL();
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock icl(mBinderSerializationLock);
status_t res;
- if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
+ if ((res = checkPid(__FUNCTION__)) != OK) return res;
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ sp<Surface> window = target;
+#else
sp<Surface> window;
- if (callbackProducer != 0) {
- window = new Surface(callbackProducer);
+ if (target != 0) {
+ window = new Surface(target);
}
+#endif
res = mCallbackProcessor->setCallbackWindow(window);
if (res != OK) {
- ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
- __FUNCTION__, mCameraId, strerror(-res), res);
+ ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)", __FUNCTION__,
+ mCameraId, strerror(-res), res);
return res;
}
@@ -757,7 +795,7 @@
l.mParameters.previewCallbackSurface = false;
}
- switch(l.mParameters.state) {
+ switch (l.mParameters.state) {
case Parameters::PREVIEW:
res = startPreviewL(l.mParameters, true);
break;
@@ -769,15 +807,13 @@
break;
}
if (res != OK) {
- ALOGE("%s: Camera %d: Unable to refresh request in state %s",
- __FUNCTION__, mCameraId,
- Parameters::getStateName(l.mParameters.state));
+ ALOGE("%s: Camera %d: Unable to refresh request in state %s", __FUNCTION__, mCameraId,
+ Parameters::getStateName(l.mParameters.state));
}
return OK;
}
-
status_t Camera2Client::startPreview() {
ATRACE_CALL();
ALOGV("%s: E", __FUNCTION__);
@@ -2266,29 +2302,47 @@
return res;
}
-status_t Camera2Client::setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) {
+status_t Camera2Client::setVideoTarget(const sp<SurfaceType>& target) {
ATRACE_CALL();
ALOGV("%s: E", __FUNCTION__);
Mutex::Autolock icl(mBinderSerializationLock);
status_t res;
if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
- sp<IBinder> binder = IInterface::asBinder(bufferProducer);
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ uint64_t videoSurfaceID;
+ res = target->getUniqueId(&videoSurfaceID);
+ if (res != OK) {
+ ALOGE("%s: Camera %d: Could not getUniqueId in setVideoTarget.", __FUNCTION__, mCameraId);
+ return res;
+ }
+ if (videoSurfaceID == mVideoSurfaceID) {
+ ALOGE("%s: Camera %d: New video window is same as old video window", __FUNCTION__,
+ mCameraId);
+ return NO_ERROR;
+ }
+#else
+ sp<IBinder> binder = IInterface::asBinder(target);
if (binder == mVideoSurface) {
ALOGV("%s: Camera %d: New video window is same as old video window",
__FUNCTION__, mCameraId);
return NO_ERROR;
}
+#endif
sp<Surface> window;
int format;
android_dataspace dataSpace;
- if (bufferProducer != nullptr) {
+ if (target != nullptr) {
// Using controlledByApp flag to ensure that the buffer queue remains in
// async mode for the old camera API, where many applications depend
// on that behavior.
- window = new Surface(bufferProducer, /*controlledByApp*/ true);
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ window = new Surface(target->getIGraphicBufferProducer(), /*controlledByApp*/ true);
+#else
+ window = new Surface(target, /*controlledByApp*/ true);
+#endif
ANativeWindow *anw = window.get();
@@ -2327,7 +2381,11 @@
return INVALID_OPERATION;
}
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ mVideoSurfaceID = videoSurfaceID;
+#else
mVideoSurface = binder;
+#endif
res = mStreamingProcessor->setRecordingWindow(window);
if (res != OK) {
ALOGE("%s: Unable to set new recording window: %s (%d)",
diff --git a/services/camera/libcameraservice/api1/Camera2Client.h b/services/camera/libcameraservice/api1/Camera2Client.h
index a0c9f2d..ce668dd 100644
--- a/services/camera/libcameraservice/api1/Camera2Client.h
+++ b/services/camera/libcameraservice/api1/Camera2Client.h
@@ -17,12 +17,14 @@
#ifndef ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_H
#define ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_H
-#include "CameraService.h"
-#include "common/CameraDeviceBase.h"
-#include "common/Camera2ClientBase.h"
-#include "api1/client2/Parameters.h"
-#include "api1/client2/FrameProcessor.h"
+#include <gui/Flags.h>
+#include <gui/view/Surface.h>
#include <media/RingBuffer.h>
+#include "CameraService.h"
+#include "api1/client2/FrameProcessor.h"
+#include "api1/client2/Parameters.h"
+#include "common/Camera2ClientBase.h"
+#include "common/CameraDeviceBase.h"
namespace android {
@@ -53,11 +55,9 @@
virtual status_t connect(const sp<hardware::ICameraClient>& client);
virtual status_t lock();
virtual status_t unlock();
- virtual status_t setPreviewTarget(
- const sp<IGraphicBufferProducer>& bufferProducer);
+ virtual status_t setPreviewTarget(const sp<SurfaceType>& target);
virtual void setPreviewCallbackFlag(int flag);
- virtual status_t setPreviewCallbackTarget(
- const sp<IGraphicBufferProducer>& callbackProducer);
+ virtual status_t setPreviewCallbackTarget(const sp<SurfaceType>& target);
virtual status_t startPreview();
virtual void stopPreview();
@@ -78,7 +78,7 @@
virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
virtual void notifyError(int32_t errorCode,
const CaptureResultExtras& resultExtras);
- virtual status_t setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);
+ virtual status_t setVideoTarget(const sp<SurfaceType>& target);
virtual status_t setAudioRestriction(int mode);
virtual int32_t getGlobalAudioRestriction();
virtual status_t setRotateAndCropOverride(uint8_t rotateAndCrop, bool fromHal = false);
@@ -183,8 +183,12 @@
/** ICamera interface-related private members */
typedef camera2::Parameters Parameters;
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ status_t setPreviewWindowL(const view::Surface& viewSurface, const sp<Surface>& window);
+#else
status_t setPreviewWindowL(const sp<IBinder>& binder,
const sp<Surface>& window);
+#endif
status_t startPreviewL(Parameters ¶ms, bool restart);
void stopPreviewL();
status_t startRecordingL(Parameters ¶ms, bool restart);
@@ -221,8 +225,13 @@
/* Preview/Recording related members */
+#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ uint64_t mPreviewViewSurfaceID;
+ uint64_t mVideoSurfaceID;
+#else
sp<IBinder> mPreviewSurface;
sp<IBinder> mVideoSurface;
+#endif
sp<camera2::StreamingProcessor> mStreamingProcessor;
/** Preview callback related members */
diff --git a/services/camera/libcameraservice/libcameraservice_fuzzer/camera_service_fuzzer.cpp b/services/camera/libcameraservice/libcameraservice_fuzzer/camera_service_fuzzer.cpp
index 12ac33f..86e2c70 100644
--- a/services/camera/libcameraservice/libcameraservice_fuzzer/camera_service_fuzzer.cpp
+++ b/services/camera/libcameraservice/libcameraservice_fuzzer/camera_service_fuzzer.cpp
@@ -40,6 +40,7 @@
#include <fakeservicemanager/FakeServiceManager.h>
#include <fuzzbinder/random_binder.h>
#include <gui/BufferItemConsumer.h>
+#include <gui/Flags.h>
#include <gui/IGraphicBufferProducer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
@@ -620,7 +621,11 @@
previewSurface = surfaceControl->getSurface();
if (previewSurface.get()) {
- cameraDevice->setPreviewTarget(previewSurface->getIGraphicBufferProducer());
+ cameraDevice->setPreviewTarget(previewSurface
+#if !WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ ->getIGraphicBufferProducer()
+#endif
+ );
}
}
cameraDevice->setPreviewCallbackFlag(CAMERA_FRAME_CALLBACK_FLAG_CAMCORDER);
@@ -675,7 +680,11 @@
.apply();
sp<Surface> previewSurfaceVideo = surfaceControlVideo->getSurface();
if (previewSurfaceVideo.get()) {
- cameraDevice->setVideoTarget(previewSurfaceVideo->getIGraphicBufferProducer());
+ cameraDevice->setVideoTarget(previewSurfaceVideo
+#if !WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
+ ->getIGraphicBufferProducer()
+#endif
+ );
}
}
cameraDevice->stopPreview();