Camera2/3: Improve fake handshake

Change-Id: I4310ac8c078a9ca2052cf0d0c283ded6bb06b6df
diff --git a/camera/fake-pipeline2/Scene.cpp b/camera/fake-pipeline2/Scene.cpp
index ca50350..48296d2 100644
--- a/camera/fake-pipeline2/Scene.cpp
+++ b/camera/fake-pipeline2/Scene.cpp
@@ -18,7 +18,7 @@
 #define LOG_TAG "EmulatedCamera_Scene"
 #include <utils/Log.h>
 #include <stdlib.h>
-
+#include <cmath>
 #include "Scene.h"
 
 // TODO: This should probably be done host-side in OpenGL for speed and better
@@ -320,9 +320,18 @@
                 mCurrentColors[i*NUM_CHANNELS + 2],
                 mCurrentColors[i*NUM_CHANNELS + 3]);
     }
-    // Shake viewpoint
-    mHandshakeX = rand() % mMapDiv/4 - mMapDiv/8;
-    mHandshakeY = rand() % mMapDiv/4 - mMapDiv/8;
+    // Shake viewpoint; horizontal and vertical sinusoids at roughly
+    // human handshake frequencies
+    mHandshakeX =
+            ( kFreq1Magnitude * std::sin(kHorizShakeFreq1 * timeSinceIdx) +
+              kFreq2Magnitude * std::sin(kHorizShakeFreq2 * timeSinceIdx) ) *
+            mMapDiv * kShakeFraction;
+
+    mHandshakeY =
+            ( kFreq1Magnitude * std::sin(kVertShakeFreq1 * timeSinceIdx) +
+              kFreq2Magnitude * std::sin(kVertShakeFreq2 * timeSinceIdx) ) *
+            mMapDiv * kShakeFraction;
+
     // Set starting pixel
     setReadoutPixel(0,0);
 }
@@ -356,6 +365,16 @@
     return pixel;
 }
 
+// Handshake model constants.
+// Frequencies measured in a nanosecond timebase
+const float Scene::kHorizShakeFreq1 = 2 * M_PI * 2  / 1e9; // 2 Hz
+const float Scene::kHorizShakeFreq2 = 2 * M_PI * 13 / 1e9; // 13 Hz
+const float Scene::kVertShakeFreq1  = 2 * M_PI * 3  / 1e9; // 3 Hz
+const float Scene::kVertShakeFreq2  = 2 * M_PI * 11 / 1e9; // 1 Hz
+const float Scene::kFreq1Magnitude  = 5;
+const float Scene::kFreq2Magnitude  = 1;
+const float Scene::kShakeFraction   = 0.03; // As a fraction of a scene tile
+
 // RGB->YUV, Jpeg standard
 const float Scene::kRgb2Yuv[12] = {
        0.299f,    0.587f,    0.114f,    0.f,
diff --git a/camera/fake-pipeline2/Scene.h b/camera/fake-pipeline2/Scene.h
index 687e427..66d1a69 100644
--- a/camera/fake-pipeline2/Scene.h
+++ b/camera/fake-pipeline2/Scene.h
@@ -131,6 +131,17 @@
      * Constants for scene definition. These are various degrees of approximate.
      */
 
+    // Fake handshake parameters. Two shake frequencies per axis, plus magnitude
+    // as a fraction of a scene tile, and relative magnitudes for the frequencies
+    static const float kHorizShakeFreq1;
+    static const float kHorizShakeFreq2;
+    static const float kVertShakeFreq1;
+    static const float kVertShakeFreq2;
+    static const float kFreq1Magnitude;
+    static const float kFreq2Magnitude;
+
+    static const float kShakeFraction;
+
     // RGB->YUV conversion
     static const float kRgb2Yuv[12];