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;
 };