Add FMQ support to camera2 SDK for metadata transfer
This CL adds support for CaptureResult metadata to be transferred over
FMQ instead of binder copies.
Bug: 362791857
Flag: com.android.internal.camera.flags.fmq_metadata
Test: GCA
Test: Perfetto profiling shows decreased cameraserver to client
onResultReceived latency
Change-Id: Ia8df1a4cef5008c06dc2ca4fdd319704d5e049ab
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.cpp b/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.cpp
index 70647b4..950ea05 100644
--- a/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.cpp
+++ b/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.cpp
@@ -174,11 +174,19 @@
}
binder::Status AidlCameraDeviceCallbacks::onResultReceived(
- const CameraMetadataNative& result,
+ const CameraMetadataInfo &resultInfo,
const UCaptureResultExtras& resultExtras,
const ::std::vector<UPhysicalCaptureResultInfo>& physicalCaptureResultInfos) {
// Wrap CameraMetadata, resultExtras and physicalCaptureResultInfos in on
// sp<RefBase>-able structure and post it.
+ // We modify metadata - since we want to filter out tags based on the vndk
+ // version, and also this communication is an in process function call.
+ // So we don't use FMQ for the shim layer. FMQ is still used for VNDK IPC.
+ if (resultInfo.getTag() != CameraMetadataInfo::metadata) {
+ ALOGE("Vendor callbacks got metadata in fmq ? ");
+ return binder::Status::ok();
+ }
+ const CameraMetadataNative &result = resultInfo.get<CameraMetadataInfo::metadata>();
sp<ResultWrapper> resultWrapper = new ResultWrapper(const_cast<CameraMetadataNative &>(result),
resultExtras, physicalCaptureResultInfos);
sp<AMessage> msg = new AMessage(kWhatResultReceived, mHandler);
diff --git a/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.h b/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.h
index 07bf7d8..6504cdc 100644
--- a/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.h
+++ b/services/camera/libcameraservice/aidl/AidlCameraDeviceCallbacks.h
@@ -46,6 +46,7 @@
using ::android::frameworks::cameraservice::utils::DeathPipe;
using ::android::hardware::camera2::impl::CameraMetadataNative;
+using CameraMetadataInfo = android::hardware::camera2::CameraMetadataInfo;
using CaptureResultMetadataQueue = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
class AidlCameraDeviceCallbacks : public UBnCameraDeviceCallbacks {
@@ -65,7 +66,8 @@
int64_t timestamp) override;
binder::Status onResultReceived(
- const CameraMetadataNative& result, const CaptureResultExtras& resultExtras,
+ const CameraMetadataInfo &resultInfo,
+ const CaptureResultExtras& resultExtras,
const std::vector<PhysicalCaptureResultInfo>& physicalCaptureResultInfos) override;
binder::Status onPrepared(int32_t streamId) override;
diff --git a/services/camera/libcameraservice/aidl/AidlCameraService.cpp b/services/camera/libcameraservice/aidl/AidlCameraService.cpp
index a2c431e..46e2280 100644
--- a/services/camera/libcameraservice/aidl/AidlCameraService.cpp
+++ b/services/camera/libcameraservice/aidl/AidlCameraService.cpp
@@ -177,7 +177,7 @@
kDefaultDeviceId);
clientAttribution.packageName = "";
clientAttribution.attributionTag = std::nullopt;
- binder::Status serviceRet = mCameraService->connectDevice(
+ binder::Status serviceRet = mCameraService->connectDeviceVendor(
callbacks,
in_cameraId,
/* scoreOffset= */ 0,
diff --git a/services/camera/libcameraservice/aidl/AidlUtils.cpp b/services/camera/libcameraservice/aidl/AidlUtils.cpp
index 1ec5072..ea7b9c0 100644
--- a/services/camera/libcameraservice/aidl/AidlUtils.cpp
+++ b/services/camera/libcameraservice/aidl/AidlUtils.cpp
@@ -32,6 +32,7 @@
using aimg::AImageReader_getHGBPFromHandle;
using hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
+using CameraMetadataInfo = android::hardware::camera2::CameraMetadataInfo;
// Note: existing data in dst will be gone. Caller still owns the memory of src
void cloneToAidl(const camera_metadata_t* src, SCameraMetadata* dst) {
@@ -254,7 +255,8 @@
SPhysicalCaptureResultInfo dst;
dst.physicalCameraId = src.mPhysicalCameraId;
- const camera_metadata_t *rawMetadata = src.mPhysicalCameraMetadata.getAndLock();
+ const camera_metadata_t *rawMetadata =
+ src.mCameraMetadataInfo.get<CameraMetadataInfo::metadata>().getAndLock();
// Try using fmq at first.
size_t metadata_size = get_camera_metadata_size(rawMetadata);
if ((metadata_size > 0) && (fmq->availableToWrite() > 0)) {
@@ -267,7 +269,7 @@
dst.physicalCameraMetadata.set<SCaptureMetadataInfo::metadata>(std::move(metadata));
}
}
- src.mPhysicalCameraMetadata.unlock(rawMetadata);
+ src.mCameraMetadataInfo.get<CameraMetadataInfo::metadata>().unlock(rawMetadata);
return dst;
}