Fixes overlays in Surround View 3D
- Adds missing impl. of updateOverlays() call in sv 3d session
- Fixes bug that incorrectly checks the camera resolution.
Bug: 160028656
Bug: 162599435
Test: mm -j, verfied by sv_app
Change-Id: I9dc8a9cdf39c1405b5df516f2421fa2dbb3138ef
Merged-In: I9dc8a9cdf39c1405b5df516f2421fa2dbb3138ef
(cherry picked from commit 9e10e051621b671e9fccce7845465146e2fea195)
diff --git a/surround_view/service-impl/SurroundView3dSession.cpp b/surround_view/service-impl/SurroundView3dSession.cpp
index f2d7c2e..2c7861d 100644
--- a/surround_view/service-impl/SurroundView3dSession.cpp
+++ b/surround_view/service-impl/SurroundView3dSession.cpp
@@ -460,7 +460,10 @@
return {};
}
-bool VerifyOverlayData(const OverlaysData& overlaysData) {
+bool VerifyAndGetOverlays(const OverlaysData& overlaysData, std::vector<Overlay>* svCoreOverlays) {
+ // Clear the overlays.
+ svCoreOverlays->clear();
+
// Check size of shared memory matches overlaysMemoryDesc.
const int kVertexSize = 16;
const int kIdSize = 2;
@@ -468,8 +471,8 @@
for (auto& overlayMemDesc : overlaysData.overlaysMemoryDesc) {
memDescSize += kIdSize + kVertexSize * overlayMemDesc.verticesCount;
}
- if (memDescSize != overlaysData.overlaysMemory.size()) {
- LOG(ERROR) << "shared memory and overlaysMemoryDesc size mismatch.";
+ if (overlaysData.overlaysMemory.size() < memDescSize) {
+ LOG(ERROR) << "Allocated shared memory size is less than overlaysMemoryDesc size.";
return false;
}
@@ -494,12 +497,14 @@
if (overlayIdSet.find(overlayMemDesc.id) != overlayIdSet.end()) {
LOG(ERROR) << "Duplicate id within memory descriptor.";
+ svCoreOverlays->clear();
return false;
}
overlayIdSet.insert(overlayMemDesc.id);
if(overlayMemDesc.verticesCount < 3) {
LOG(ERROR) << "Less than 3 vertices.";
+ svCoreOverlays->clear();
return false;
}
@@ -507,34 +512,43 @@
overlayMemDesc.verticesCount % 3 != 0) {
LOG(ERROR) << "Triangles primitive does not have vertices "
<< "multiple of 3.";
+ svCoreOverlays->clear();
return false;
}
const uint16_t overlayId = *((uint16_t*)(pData + idOffset));
if (overlayId != overlayMemDesc.id) {
- LOG(ERROR) << "Overlay id mismatch "
- << overlayId
- << ", "
- << overlayMemDesc.id;
+ LOG(ERROR) << "Overlay id mismatch " << overlayId << ", " << overlayMemDesc.id;
+ svCoreOverlays->clear();
return false;
}
+ // Copy over shared memory data to sv core overlays.
+ Overlay svCoreOverlay;
+ svCoreOverlay.id = overlayMemDesc.id;
+ svCoreOverlay.vertices.resize(overlayMemDesc.verticesCount);
+ uint8_t* verticesDataPtr = pData + idOffset + kIdSize;
+ memcpy(svCoreOverlay.vertices.data(), verticesDataPtr,
+ kVertexSize * overlayMemDesc.verticesCount);
+ svCoreOverlays->push_back(svCoreOverlay);
+
idOffset += kIdSize + (kVertexSize * overlayMemDesc.verticesCount);
}
return true;
}
-// TODO(b/150412555): the overlay related methods are incomplete.
-Return<SvResult> SurroundView3dSession::updateOverlays(
- const OverlaysData& overlaysData) {
+Return<SvResult> SurroundView3dSession::updateOverlays(const OverlaysData& overlaysData) {
+ LOG(DEBUG) << __FUNCTION__;
- if(!VerifyOverlayData(overlaysData)) {
- LOG(ERROR) << "VerifyOverlayData failed.";
+ scoped_lock <mutex> lock(mAccessLock);
+ if(!VerifyAndGetOverlays(overlaysData, &mOverlays)) {
+ LOG(ERROR) << "VerifyAndGetOverlays failed.";
return SvResult::INVALID_ARG;
}
+ mOverlayIsUpdated = true;
return SvResult::OK;
}
@@ -566,8 +580,9 @@
Point3dFloat point3d = {false, 0.0, 0.0, 0.0};
// Verify if camera point is within the camera resolution bounds.
- point3d.isValid = (cameraPoint.x >= 0 && cameraPoint.x < mConfig.width &&
- cameraPoint.y >= 0 && cameraPoint.y < mConfig.height);
+ const Size2dInteger cameraSize = mCameraParams[cameraIndex].size;
+ point3d.isValid = (cameraPoint.x >= 0 && cameraPoint.x < cameraSize.width &&
+ cameraPoint.y >= 0 && cameraPoint.y < cameraSize.height);
if (!point3d.isValid) {
LOG(WARNING) << "Camera point (" << cameraPoint.x << ", " << cameraPoint.y
<< ") is out of camera resolution bounds.";
@@ -650,6 +665,17 @@
}
}
+ // Set 3d overlays.
+ {
+ scoped_lock<mutex> lock(mAccessLock);
+ if (mOverlayIsUpdated) {
+ if (!mSurroundView->Set3dOverlay(mOverlays)) {
+ LOG(ERROR) << "Set 3d overlays failed.";
+ }
+ mOverlayIsUpdated = false;
+ }
+ }
+
// TODO(b/150412555): do not use the setViews for frames generation
// since there is a discrepancy between the HIDL APIs and core lib APIs.
array<array<float, 4>, 4> matrix;
diff --git a/surround_view/service-impl/SurroundView3dSession.h b/surround_view/service-impl/SurroundView3dSession.h
index 2c3626a..6c2b8ce 100644
--- a/surround_view/service-impl/SurroundView3dSession.h
+++ b/surround_view/service-impl/SurroundView3dSession.h
@@ -180,6 +180,9 @@
AnimationModule* mAnimationModule;
IOModuleConfig* mIOModuleConfig;
+ std::vector<Overlay> mOverlays GUARDED_BY(mAccessLock);
+ bool mOverlayIsUpdated GUARDED_BY(mAccessLock) = false;
+
std::vector<VehiclePropValue> mPropertyValues;
};