Camera2: Still image support

- Add stream / request creation for still image capture
- Add takePicture call
- Add callback handler
- Fix shutdown bugs (wait until requests have drained)

Bug: 6243944

Change-Id: Id73eb7090e61b40b90348d1eb262f641ea5f3229
diff --git a/services/camera/libcameraservice/Camera2Client.h b/services/camera/libcameraservice/Camera2Client.h
index e2a0086..5457343 100644
--- a/services/camera/libcameraservice/Camera2Client.h
+++ b/services/camera/libcameraservice/Camera2Client.h
@@ -20,6 +20,9 @@
 #include "Camera2Device.h"
 #include "CameraService.h"
 #include "camera/CameraParameters.h"
+#include <binder/MemoryBase.h>
+#include <binder/MemoryHeapBase.h>
+#include <gui/CpuConsumer.h>
 
 namespace android {
 
@@ -73,7 +76,8 @@
         WAITING_FOR_PREVIEW_WINDOW,
         PREVIEW,
         RECORD,
-        STILL_CAPTURE
+        STILL_CAPTURE,
+        VIDEO_SNAPSHOT
     } mState;
 
     /** ICamera interface-related private members */
@@ -82,11 +86,15 @@
     // Ensures serialization between incoming ICamera calls
     mutable Mutex mICameraLock;
 
-    status_t setPreviewWindow(const sp<IBinder>& binder,
-            const sp<ANativeWindow>& window);
-    void stopPreviewLocked();
+    // The following must be called with mICamaeraLock already locked
 
-    // Mutex that must be locked before accessing mParams, mParamsFlattened
+    status_t setPreviewWindowLocked(const sp<IBinder>& binder,
+            const sp<ANativeWindow>& window);
+
+    void stopPreviewLocked();
+    status_t startPreviewLocked();
+
+    // Mutex that must be locked before accessing mParameters, mParamsFlattened
     mutable Mutex mParamsLock;
     String8 mParamsFlattened;
     // Current camera state; this is the contents of the CameraParameters object
@@ -164,16 +172,34 @@
 
     /** Camera device-related private members */
 
+    // Simple listener that forwards frame available notifications from
+    // a CPU consumer to the capture notification
+    class CaptureWaiter: public CpuConsumer::FrameAvailableListener {
+      public:
+        CaptureWaiter(Camera2Client *parent) : mParent(parent) {}
+        void onFrameAvailable() { mParent->onCaptureAvailable(); }
+      private:
+        Camera2Client *mParent;
+    };
+
+    void onCaptureAvailable();
+
     // Number of zoom steps to simulate
     static const unsigned int NUM_ZOOM_STEPS = 10;
-    // Used with mPreviewStreamId
-    static const int NO_PREVIEW_STREAM = -1;
+    // Used with mPreviewStreamId, mCaptureStreamId
+    static const int NO_STREAM = -1;
 
     sp<IBinder> mPreviewSurface;
     int mPreviewStreamId;
     camera_metadata_t *mPreviewRequest;
 
+    int mCaptureStreamId;
+    sp<CpuConsumer>    mCaptureConsumer;
+    sp<ANativeWindow>  mCaptureWindow;
+    sp<CaptureWaiter>  mCaptureWaiter;
     camera_metadata_t *mCaptureRequest;
+    sp<MemoryHeapBase> mCaptureHeap;
+    sp<MemoryBase>     mCaptureMemory;
 
     sp<Camera2Device> mDevice;
 
@@ -194,6 +220,11 @@
     // Update preview request based on mParams
     status_t updatePreviewRequest();
 
+    // Update capture request based on mParams
+    status_t updateCaptureRequest();
+    // Update capture stream based on mParams
+    status_t updateCaptureStream();
+
     // Convert camera1 preview format string to camera2 enum
     static int formatStringToEnum(const char *format);
     static const char *formatEnumToString(int format);