Camera NDK library: capture session implementation

Bug: 23012001
Change-Id: I3fd93205dcf1b9ed5a947cb944919eb531f219fc
diff --git a/camera/ndk/NdkCameraDevice.cpp b/camera/ndk/NdkCameraDevice.cpp
index c747c1b..281d3e7 100644
--- a/camera/ndk/NdkCameraDevice.cpp
+++ b/camera/ndk/NdkCameraDevice.cpp
@@ -22,7 +22,7 @@
 #include <utils/Trace.h>
 
 #include <NdkCameraDevice.h>
-#include "impl/ACameraDevice.h"
+#include "impl/ACameraCaptureSession.h"
 
 using namespace android;
 
@@ -54,7 +54,7 @@
         ACaptureRequest** request) {
     ATRACE_CALL();
     if (device == nullptr || request == nullptr) {
-        ALOGE("%s: invalid argument! device 0x%p request 0x%p",
+        ALOGE("%s: invalid argument! device %p request %p",
                 __FUNCTION__, device, request);
         return ACAMERA_ERROR_INVALID_PARAMETER;
     }
@@ -73,53 +73,89 @@
     return device->createCaptureRequest(templateId, request);
 }
 
-struct ACaptureSessionOutputContainer;
-
-struct ACaptureSessionOutput;
-
 EXPORT
-camera_status_t ACaptureSessionOutputContainer_create(/*out*/ACaptureSessionOutputContainer**) {
+camera_status_t ACaptureSessionOutputContainer_create(
+        /*out*/ACaptureSessionOutputContainer** out) {
     ATRACE_CALL();
+    if (out == nullptr) {
+        ALOGE("%s: Error: out null", __FUNCTION__);
+        return ACAMERA_ERROR_INVALID_PARAMETER;
+    }
+    *out = new ACaptureSessionOutputContainer();
     return ACAMERA_OK;
 }
 
 EXPORT
-void ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer*) {
+void ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer* container) {
     ATRACE_CALL();
+    if (container != nullptr) {
+        delete container;
+    }
     return;
 }
 
 EXPORT
-camera_status_t ACaptureSessionOutput_create(ANativeWindow*, /*out*/ACaptureSessionOutput**) {
+camera_status_t ACaptureSessionOutput_create(
+        ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
     ATRACE_CALL();
+    if (window == nullptr || out == nullptr) {
+        ALOGE("%s: Error: bad argument. window %p, out %p",
+                __FUNCTION__, window, out);
+        return ACAMERA_ERROR_INVALID_PARAMETER;
+    }
+    *out = new ACaptureSessionOutput(window);
     return ACAMERA_OK;
 }
 
 EXPORT
-void ACaptureSessionOutput_free(ACaptureSessionOutput*) {
+void ACaptureSessionOutput_free(ACaptureSessionOutput* output) {
     ATRACE_CALL();
+    if (output != nullptr) {
+        delete output;
+    }
     return;
 }
 
 EXPORT
 camera_status_t ACaptureSessionOutputContainer_add(
-        ACaptureSessionOutputContainer*, const ACaptureSessionOutput*) {
+        ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
     ATRACE_CALL();
+    if (container == nullptr || output == nullptr) {
+        ALOGE("%s: Error: invalid input: container %p, output %p",
+                __FUNCTION__, container, output);
+        return ACAMERA_ERROR_INVALID_PARAMETER;
+    }
+    auto pair = container->mOutputs.insert(*output);
+    if (!pair.second) {
+        ALOGW("%s: output %p already exists!", __FUNCTION__, output);
+    }
     return ACAMERA_OK;
 }
 
 EXPORT
 camera_status_t ACaptureSessionOutputContainer_remove(
-        ACaptureSessionOutputContainer*, const ACaptureSessionOutput*) {
+        ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
     ATRACE_CALL();
+    if (container == nullptr || output == nullptr) {
+        ALOGE("%s: Error: invalid input: container %p, output %p",
+                __FUNCTION__, container, output);
+        return ACAMERA_ERROR_INVALID_PARAMETER;
+    }
+    container->mOutputs.erase(*output);
     return ACAMERA_OK;
 }
 
 EXPORT
 camera_status_t ACameraDevice_createCaptureSession(
-        ACameraDevice*,
+        ACameraDevice* device,
         const ACaptureSessionOutputContainer*       outputs,
-        const ACameraCaptureSession_stateCallbacks* callbacks) {
+        const ACameraCaptureSession_stateCallbacks* callbacks,
+        /*out*/ACameraCaptureSession** session) {
     ATRACE_CALL();
-    return ACAMERA_OK;
+    if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
+        ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
+                __FUNCTION__, device, outputs, callbacks, session);
+        return ACAMERA_ERROR_INVALID_PARAMETER;
+    }
+    return device->createCaptureSession(outputs, callbacks, session);
 }