1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef BASE_CAMERA_ADAPTER_H
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define BASE_CAMERA_ADAPTER_H
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevclass BaseCameraAdapter : public CameraAdapter
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpublic:
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BaseCameraAdapter();
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual ~BaseCameraAdapter();
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialzes the camera adapter creates any resources required
359a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    virtual status_t initialize(CameraProperties::Properties*) = 0;
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual int setErrorHandler(ErrorNotifier *errorNotifier);
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Message/Frame notification APIs
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void enableMsgType(int32_t msgs, frame_callback callback=NULL, event_callback eventCb=NULL, void* cookie=NULL);
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void disableMsgType(int32_t msgs, void* cookie);
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void returnFrame(void * frameBuf, CameraFrame::FrameType frameType);
438e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    virtual void addFramePointers(void *frameBuf, void *y_uv);
448e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    virtual void removeFramePointers();
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //APIs to configure Camera adapter and get the current parameter set
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t setParameters(const CameraParameters& params) = 0;
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void getParameters(CameraParameters& params)  = 0;
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //API to send a command to the camera
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t sendCommand(CameraCommands operation, int value1 = 0, int value2 = 0, int value3 = 0 );
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data);
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t registerEndCaptureCallback(end_image_capture_callback callback, void *user_data);
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Retrieves the current Adapter state
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual AdapterState getState();
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Retrieves the next Adapter state
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual AdapterState getNextState();
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
62a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    // Rolls the state machine back to INTIALIZED_STATE from the current state
63a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    virtual status_t rollbackToInitializedState();
64a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevprotected:
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //The first two methods will try to switch the adapter state.
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Every call to setState() should be followed by a corresponding
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //call to commitState(). If the state switch fails, then it will
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //get reset to the previous state via rollbackState().
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t setState(CameraCommands operation);
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t commitState();
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t rollbackState();
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Retrieves the current Adapter state - for internal use (not locked)
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t getState(AdapterState &state);
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Retrieves the next Adapter state - for internal use (not locked)
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t getNextState(AdapterState &state);
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //-----------Interface that needs to be implemented by deriving classes --------------------
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implmented by deriving classes in order to start image capture
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t takePicture();
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implmented by deriving classes in order to start image capture
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t stopImageCapture();
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implmented by deriving classes in order to start temporal bracketing
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t startBracketing(int range);
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order to stop temporal bracketing
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t stopBracketing();
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in oder to initiate autoFocus
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t autoFocus();
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in oder to initiate autoFocus
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t cancelAutoFocus();
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be called by deriving classes in order to do some bookkeeping
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t startVideoCapture();
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be called by deriving classes in order to do some bookkeeping
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t stopVideoCapture();
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order to start camera preview
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t startPreview();
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order to stop camera preview
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t stopPreview();
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order to start smooth zoom
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t startSmoothZoom(int targetIdx);
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order to stop smooth zoom
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t stopSmoothZoom();
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order to stop smooth zoom
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable);
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Should be implemented by deriving classes in order queue a released buffer in CameraAdapter
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType);
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //API to get the frame size required to be allocated. This size is used to override the size passed
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //by camera service when VSTAB/VNF is turned ON for example
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t getFrameSize(size_t &width, size_t &height);
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //API to get required data frame size
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t getFrameDataSize(size_t &dataFrameSize, size_t bufferCount);
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //API to get required picture buffers size with the current configuration in CameraParameters
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t getPictureBufferSize(size_t &length, size_t bufferCount);
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Should be implemented by deriving classes in order to start face detection
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // ( if supported )
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t startFaceDetection();
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Should be implemented by deriving classes in order to stop face detection
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // ( if supported )
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual status_t stopFaceDetection();
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1417016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    virtual status_t switchToExecuting();
1427016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Receive orientation events from CameraHal
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    virtual void onOrientationEvent(uint32_t orientation, uint32_t tilt);
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // ---------------------Interface ends-----------------------------------
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
148057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    status_t notifyFocusSubscribers(CameraHalEvent::FocusStatus status);
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t notifyShutterSubscribers();
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t notifyZoomSubscribers(int zoomIdx, bool targetReached);
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t notifyFaceSubscribers(sp<CameraFDResult> &faces);
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Send the frame to subscribers
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t sendFrameToSubscribers(CameraFrame *frame);
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Resets the refCount for this particular frame
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t resetFrameRefCount(CameraFrame &frame);
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //A couple of helper functions
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount);
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType);
1625e02dd977e79ee977ee063496033bbc363a70780Akwasi Boateng    int setInitFrameRefCount(void* buf, unsigned int mask);
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
164348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu// private member functions
165348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luuprivate:
166348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu    status_t __sendFrameToSubscribers(CameraFrame* frame,
167348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                                      KeyedVector<int, frame_callback> *subscribers,
168348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu                                      CameraFrame::FrameType frameType);
169a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu    status_t rollbackToPreviousState();
170348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu
171348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu// protected data types and variables
172348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luuprotected:
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum FrameState {
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        STOPPED = 0,
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        RUNNING
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum FrameCommands {
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        START_PREVIEW = 0,
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        START_RECORDING,
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        RETURN_FRAME,
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        STOP_PREVIEW,
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        STOP_RECORDING,
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        DO_AUTOFOCUS,
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        TAKE_PICTURE,
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        FRAME_EXIT
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    enum AdapterCommands {
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ACK = 0,
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ERROR
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct timeval mStartFocus;
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct timeval mStartCapture;
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mReturnFrameLock;
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Lock protecting the Adapter state
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mLock;
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    AdapterState mAdapterState;
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    AdapterState mNextState;
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Different frame subscribers get stored using these
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, frame_callback> mFrameSubscribers;
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, frame_callback> mFrameDataSubscribers;
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, frame_callback> mVideoSubscribers;
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, frame_callback> mImageSubscribers;
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, frame_callback> mRawSubscribers;
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, event_callback> mFocusSubscribers;
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, event_callback> mZoomSubscribers;
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, event_callback> mShutterSubscribers;
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, event_callback> mFaceSubscribers;
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Preview buffer management data
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int *mPreviewBuffers;
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewBufferCount;
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t mPreviewBuffersLength;
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, int> mPreviewBuffersAvailable;
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mPreviewBufferLock;
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Video buffer management data
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int *mVideoBuffers;
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, int> mVideoBuffersAvailable;
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mVideoBuffersCount;
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t mVideoBuffersLength;
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mVideoBufferLock;
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Image buffer management data
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int *mCaptureBuffers;
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, bool> mCaptureBuffersAvailable;
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mCaptureBuffersCount;
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t mCaptureBuffersLength;
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mCaptureBufferLock;
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Metadata buffermanagement
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int *mPreviewDataBuffers;
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    KeyedVector<int, bool> mPreviewDataBuffersAvailable;
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int mPreviewDataBuffersCount;
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t mPreviewDataBuffersLength;
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mPreviewDataBufferLock;
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIUTILS::MessageQueue mFrameQ;
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIUTILS::MessageQueue mAdapterQ;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mutable Mutex mSubscriberLock;
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ErrorNotifier *mErrorNotifier;
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    release_image_buffers_callback mReleaseImageBuffersCallback;
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    end_image_capture_callback mEndImageCaptureCallback;
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void *mReleaseData;
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    void *mEndCaptureData;
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool mRecording;
256c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
257c493114006e0e136c8c88c2fc9865994054959bfSundar Raman    uint32_t mFramesWithDucati;
258c493114006e0e136c8c88c2fc9865994054959bfSundar Raman    uint32_t mFramesWithDisplay;
259c493114006e0e136c8c88c2fc9865994054959bfSundar Raman    uint32_t mFramesWithEncoder;
260c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
261c493114006e0e136c8c88c2fc9865994054959bfSundar Raman#ifdef DEBUG_LOG
262c493114006e0e136c8c88c2fc9865994054959bfSundar Raman    KeyedVector<int, bool> mBuffersWithDucati;
263c493114006e0e136c8c88c2fc9865994054959bfSundar Raman#endif
264c493114006e0e136c8c88c2fc9865994054959bfSundar Raman
2658e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng    KeyedVector<void *, CameraFrame *> mFrameQueue;
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //BASE_CAMERA_ADAPTER_H
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
273