Home | History | Annotate | Download | only in impl
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #ifndef _ACAMERA_CAPTURE_SESSION_H
     17 #define _ACAMERA_CAPTURE_SESSION_H
     18 
     19 #include <set>
     20 #include <string>
     21 #include <hardware/camera3.h>
     22 #include <camera/NdkCameraDevice.h>
     23 
     24 #ifdef __ANDROID_VNDK__
     25 #include "ndk_vendor/impl/ACameraDevice.h"
     26 #include "ndk_vendor/impl/ACameraCaptureSessionVendor.h"
     27 #else
     28 #include "ACameraDevice.h"
     29 
     30 using namespace android;
     31 
     32 struct ACaptureSessionOutput {
     33     explicit ACaptureSessionOutput(ACameraWindowType* window, bool isShared = false,
     34             const char* physicalCameraId = "") :
     35             mWindow(window), mIsShared(isShared), mPhysicalCameraId(physicalCameraId) {};
     36 
     37     bool operator == (const ACaptureSessionOutput& other) const {
     38         return mWindow == other.mWindow;
     39     }
     40     bool operator != (const ACaptureSessionOutput& other) const {
     41         return mWindow != other.mWindow;
     42     }
     43     bool operator < (const ACaptureSessionOutput& other) const {
     44         return mWindow < other.mWindow;
     45     }
     46     bool operator > (const ACaptureSessionOutput& other) const {
     47         return mWindow > other.mWindow;
     48     }
     49 
     50     ACameraWindowType* mWindow;
     51     std::set<ACameraWindowType *> mSharedWindows;
     52     bool           mIsShared;
     53     int            mRotation = CAMERA3_STREAM_ROTATION_0;
     54     std::string mPhysicalCameraId;
     55 };
     56 #endif
     57 
     58 struct ACaptureSessionOutputContainer {
     59     std::set<ACaptureSessionOutput> mOutputs;
     60 };
     61 
     62 /**
     63  * ACameraCaptureSession opaque struct definition
     64  * Leave outside of android namespace because it's NDK struct
     65  */
     66 struct ACameraCaptureSession : public RefBase {
     67   public:
     68     ACameraCaptureSession(
     69             int id,
     70             const ACaptureSessionOutputContainer* outputs,
     71             const ACameraCaptureSession_stateCallbacks* cb,
     72             android::acam::CameraDevice* device) :
     73             mId(id), mOutput(*outputs), mUserSessionCallback(*cb),
     74             mDevice(device) {}
     75 
     76     // This can be called in app calling close() or after some app callback is finished
     77     // Make sure the caller does not hold device or session lock!
     78     ~ACameraCaptureSession();
     79 
     80     // No API except Session_Close will work if device is closed
     81     // A session will enter closed state when one of the following happens:
     82     //     1. Explicitly closed by app
     83     //     2. Replaced by a newer session
     84     //     3. Device is closed
     85     bool isClosed() { Mutex::Autolock _l(mSessionLock); return mIsClosed; }
     86 
     87     // Close the session and mark app no longer need this session.
     88     void closeByApp();
     89 
     90     camera_status_t stopRepeating();
     91 
     92     camera_status_t abortCaptures();
     93 
     94     template<class T>
     95     camera_status_t setRepeatingRequest(
     96             /*optional*/T* cbs,
     97             int numRequests, ACaptureRequest** requests,
     98             /*optional*/int* captureSequenceId);
     99 
    100     template<class T>
    101     camera_status_t capture(
    102             /*optional*/T* cbs,
    103             int numRequests, ACaptureRequest** requests,
    104             /*optional*/int* captureSequenceId);
    105 
    106     camera_status_t updateOutputConfiguration(ACaptureSessionOutput *output);
    107 
    108     ACameraDevice* getDevice();
    109 
    110   private:
    111     friend class android::acam::CameraDevice;
    112 
    113     // Close session because app close camera device, camera device got ERROR_DISCONNECTED,
    114     // or a new session is replacing this session.
    115     void closeByDevice();
    116 
    117     sp<android::acam::CameraDevice> getDeviceSp();
    118 
    119     const int mId;
    120     const ACaptureSessionOutputContainer mOutput;
    121     const ACameraCaptureSession_stateCallbacks mUserSessionCallback;
    122     const wp<android::acam::CameraDevice> mDevice;
    123     bool  mIsClosed = false;
    124     bool  mClosedByApp = false;
    125     Mutex mSessionLock;
    126 };
    127 
    128 #endif // _ACAMERA_CAPTURE_SESSION_H
    129