SLProject  4.3.020
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
SENSAndroidCamera.h
Go to the documentation of this file.
1 /**
2  * \file SENSAndroidCamera.h
3  * \authors Michael Goettlicher, Luc Girod, Marcus Hudritsch
4  * \date Winter 2016
5  * \remarks Please use clangformat to format the code. See more code style on
6  * https://github.com/cpvrlab/SLProject4/wiki/SLProject-Coding-Style
7  * \copyright http://opensource.org/licenses/GPL-3.0
8 */
9 
10 #ifndef SENS_ANDROID_CAMERA_H
11 #define SENS_ANDROID_CAMERA_H
12 
13 #include <string>
14 #include <map>
15 #include <thread>
16 
17 #include <SENSCamera.h>
18 #include <camera/NdkCameraDevice.h>
19 #include <camera/NdkCameraManager.h>
20 #include <media/NdkImageReader.h>
21 #include <SENSException.h>
22 
23 //-----------------------------------------------------------------------------
25 {
26  READY = 0, // session is ready
27  ACTIVE, // session is busy
28  CLOSED, // session is closed(by itself or a new session evicts)
29  MAX_STATE
30 };
31 //-----------------------------------------------------------------------------
33 {
34 public:
37 
38  const SENSCameraConfig& start(std::string deviceId,
39  const SENSCameraStreamConfig& streamConfig,
40  bool provideIntrinsics = true) override;
41 
42  void stop() override;
43 
44  const SENSCaptureProps& captureProperties() override;
45 
46  //callbacks
47  void onDeviceDisconnected(ACameraDevice* dev);
48  void onDeviceError(ACameraDevice* dev, int err);
49  void onCameraStatusChanged(const char* id, bool available);
50  void onSessionState(ACameraCaptureSession* ses, CaptureSessionState state);
51  void imageCallback(AImageReader* reader);
52 
53 private:
54  //start camera selected in initOptimalCamera as soon as it is available
55  void openCamera();
56  void createCaptureSession();
57 
58  ACameraManager_AvailabilityCallbacks _cameraManagerAvailabilityCallbacks;
59 
60  static cv::Mat convertToYuv(AImage* image);
61 
62  ACameraManager* _cameraManager = nullptr;
63  ACameraDevice* _cameraDevice = nullptr;
64  AImageReader* _imageReader = nullptr;
65  ANativeWindow* _surface = nullptr;
66  ACaptureSessionOutput* _captureSessionOutput = nullptr;
67  ACaptureSessionOutputContainer* _captureSessionOutputContainer = nullptr;
68  ACameraOutputTarget* _cameraOutputTarget = nullptr;
69  ACaptureRequest* _captureRequest = nullptr;
70  ACameraCaptureSession* _captureSession = nullptr;
71 
73  std::condition_variable _captureSessionStateCV;
75 
76  //map to track, which cameras are available (we start our camera () as soon as it is available and
77  // stop it as soon as it becomes unavailable)
78  std::map<std::string, bool> _cameraAvailability;
80  std::condition_variable _openCameraCV;
81 
82  //wait in start() until camera is opened
83  std::atomic<bool> _cameraDeviceOpened{false}; // free to use ( no other apps are using it)
84 
85  //camera state
86  cv::Size _captureSize;
87 };
88 //-----------------------------------------------------------------------------
89 #endif //SENS_ANDROID_CAMERA_H
CaptureSessionState
ACaptureRequest * _captureRequest
void onDeviceError(ACameraDevice *dev, int err)
std::atomic< bool > _cameraDeviceOpened
AImageReader * _imageReader
void onSessionState(ACameraCaptureSession *ses, CaptureSessionState state)
ACaptureSessionOutput * _captureSessionOutput
static cv::Mat convertToYuv(AImage *image)
ACameraManager_AvailabilityCallbacks _cameraManagerAvailabilityCallbacks
ACameraOutputTarget * _cameraOutputTarget
std::condition_variable _openCameraCV
std::mutex _captureSessionStateMutex
CaptureSessionState _captureSessionState
void stop() override
Stop a started camera device.
ANativeWindow * _surface
const SENSCaptureProps & captureProperties() override
Get SENSCaptureProps which contains necessary information about all available camera devices and thei...
ACameraCaptureSession * _captureSession
ACameraManager * _cameraManager
void onDeviceDisconnected(ACameraDevice *dev)
void imageCallback(AImageReader *reader)
std::condition_variable _captureSessionStateCV
std::map< std::string, bool > _cameraAvailability
const SENSCameraConfig & start(std::string deviceId, const SENSCameraStreamConfig &streamConfig, bool provideIntrinsics=true) override
ACaptureSessionOutputContainer * _captureSessionOutputContainer
std::mutex _cameraAvailabilityMutex
ACameraDevice * _cameraDevice
void onCameraStatusChanged(const char *id, bool available)
Implementation of common functionality and members.
Definition: SENSCamera.h:197