1 /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of The Linux Foundation nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #ifndef __QCAMERA2HARDWAREINTERFACE_H__
31 #define __QCAMERA2HARDWAREINTERFACE_H__
32 
33 // System dependencies
34 #include <utils/Mutex.h>
35 #include <utils/Condition.h>
36 
37 // Camera dependencies
38 #include "camera.h"
39 #include "QCameraAllocator.h"
40 #include "QCameraChannel.h"
41 #include "QCameraCmdThread.h"
42 #include "QCameraDisplay.h"
43 #include "QCameraMem.h"
44 #include "QCameraParameters.h"
45 #include "QCameraParametersIntf.h"
46 #include "QCameraPerf.h"
47 #include "QCameraPostProc.h"
48 #include "QCameraQueue.h"
49 #include "QCameraStream.h"
50 #include "QCameraStateMachine.h"
51 #include "QCameraThermalAdapter.h"
52 
53 #ifdef TARGET_TS_MAKEUP
54 #include "ts_makeup_engine.h"
55 #include "ts_detectface_engine.h"
56 #endif
57 extern "C" {
58 #include "mm_camera_interface.h"
59 #include "mm_jpeg_interface.h"
60 }
61 
62 #include "QCameraTrace.h"
63 
64 namespace qcamera {
65 
66 #ifndef TRUE
67 #define TRUE 1
68 #endif
69 
70 #ifndef FALSE
71 #define FALSE 0
72 #endif
73 
74 typedef enum {
75     QCAMERA_CH_TYPE_ZSL,
76     QCAMERA_CH_TYPE_CAPTURE,
77     QCAMERA_CH_TYPE_PREVIEW,
78     QCAMERA_CH_TYPE_VIDEO,
79     QCAMERA_CH_TYPE_SNAPSHOT,
80     QCAMERA_CH_TYPE_RAW,
81     QCAMERA_CH_TYPE_METADATA,
82     QCAMERA_CH_TYPE_ANALYSIS,
83     QCAMERA_CH_TYPE_CALLBACK,
84     QCAMERA_CH_TYPE_MAX
85 } qcamera_ch_type_enum_t;
86 
87 typedef struct {
88     int32_t msg_type;
89     int32_t ext1;
90     int32_t ext2;
91 } qcamera_evt_argm_t;
92 
93 #define QCAMERA_DUMP_FRM_PREVIEW             1
94 #define QCAMERA_DUMP_FRM_VIDEO               (1<<1)
95 #define QCAMERA_DUMP_FRM_SNAPSHOT            (1<<2)
96 #define QCAMERA_DUMP_FRM_THUMBNAIL           (1<<3)
97 #define QCAMERA_DUMP_FRM_RAW                 (1<<4)
98 #define QCAMERA_DUMP_FRM_JPEG                (1<<5)
99 #define QCAMERA_DUMP_FRM_INPUT_REPROCESS     (1<<6)
100 
101 #define QCAMERA_DUMP_FRM_MASK_ALL    0x000000ff
102 
103 #define QCAMERA_ION_USE_CACHE   true
104 #define QCAMERA_ION_USE_NOCACHE false
105 #define MAX_ONGOING_JOBS 25
106 
107 #define MAX(a, b) ((a) > (b) ? (a) : (b))
108 
109 #define EXIF_ASCII_PREFIX_SIZE           8   //(sizeof(ExifAsciiPrefix))
110 
111 typedef enum {
112     QCAMERA_NOTIFY_CALLBACK,
113     QCAMERA_DATA_CALLBACK,
114     QCAMERA_DATA_TIMESTAMP_CALLBACK,
115     QCAMERA_DATA_SNAPSHOT_CALLBACK
116 } qcamera_callback_type_m;
117 
118 typedef void (*camera_release_callback)(void *user_data,
119                                         void *cookie,
120                                         int32_t cb_status);
121 typedef void (*jpeg_data_callback)(int32_t msg_type,
122         const camera_memory_t *data, unsigned int index,
123         camera_frame_metadata_t *metadata, void *user,
124         uint32_t frame_idx, camera_release_callback release_cb,
125         void *release_cookie, void *release_data);
126 
127 typedef struct {
128     qcamera_callback_type_m  cb_type;    // event type
129     int32_t                  msg_type;   // msg type
130     int32_t                  ext1;       // extended parameter
131     int32_t                  ext2;       // extended parameter
132     camera_memory_t *        data;       // ptr to data memory struct
133     unsigned int             index;      // index of the buf in the whole buffer
134     int64_t                  timestamp;  // buffer timestamp
135     camera_frame_metadata_t *metadata;   // meta data
136     void                    *user_data;  // any data needs to be released after callback
137     void                    *cookie;     // release callback cookie
138     camera_release_callback  release_cb; // release callback
139     uint32_t                 frame_index;  // frame index for the buffer
140 } qcamera_callback_argm_t;
141 
142 class QCameraCbNotifier {
143 public:
QCameraCbNotifier(QCamera2HardwareInterface * parent)144     QCameraCbNotifier(QCamera2HardwareInterface *parent) :
145                           mNotifyCb (NULL),
146                           mDataCb (NULL),
147                           mDataCbTimestamp (NULL),
148                           mCallbackCookie (NULL),
149                           mJpegCb(NULL),
150                           mJpegCallbackCookie(NULL),
151                           mParent (parent),
152                           mDataQ(releaseNotifications, this),
153                           mActive(false){}
154 
155     virtual ~QCameraCbNotifier();
156 
157     virtual int32_t notifyCallback(qcamera_callback_argm_t &cbArgs);
158     virtual void setCallbacks(camera_notify_callback notifyCb,
159                               camera_data_callback dataCb,
160                               camera_data_timestamp_callback dataCbTimestamp,
161                               void *callbackCookie);
162     virtual void setJpegCallBacks(
163             jpeg_data_callback jpegCb, void *callbackCookie);
164     virtual int32_t startSnapshots();
165     virtual void stopSnapshots();
166     virtual void exit();
167     static void * cbNotifyRoutine(void * data);
168     static void releaseNotifications(void *data, void *user_data);
169     static bool matchSnapshotNotifications(void *data, void *user_data);
170     static bool matchPreviewNotifications(void *data, void *user_data);
171     virtual int32_t flushPreviewNotifications();
172 private:
173 
174     camera_notify_callback         mNotifyCb;
175     camera_data_callback           mDataCb;
176     camera_data_timestamp_callback mDataCbTimestamp;
177     void                          *mCallbackCookie;
178     jpeg_data_callback             mJpegCb;
179     void                          *mJpegCallbackCookie;
180     QCamera2HardwareInterface     *mParent;
181 
182     QCameraQueue     mDataQ;
183     QCameraCmdThread mProcTh;
184     bool             mActive;
185 };
186 class QCamera2HardwareInterface : public QCameraAllocator,
187         public QCameraThermalCallback, public QCameraAdjustFPS
188 {
189 public:
190     /* static variable and functions accessed by camera service */
191     static camera_device_ops_t mCameraOps;
192 
193     static int set_preview_window(struct camera_device *,
194         struct preview_stream_ops *window);
195     static void set_CallBacks(struct camera_device *,
196         camera_notify_callback notify_cb,
197         camera_data_callback data_cb,
198         camera_data_timestamp_callback data_cb_timestamp,
199         camera_request_memory get_memory,
200         void *user);
201     static void enable_msg_type(struct camera_device *, int32_t msg_type);
202     static void disable_msg_type(struct camera_device *, int32_t msg_type);
203     static int msg_type_enabled(struct camera_device *, int32_t msg_type);
204     static int start_preview(struct camera_device *);
205     static void stop_preview(struct camera_device *);
206     static int preview_enabled(struct camera_device *);
207     static int store_meta_data_in_buffers(struct camera_device *, int enable);
208     static int restart_start_preview(struct camera_device *);
209     static int restart_stop_preview(struct camera_device *);
210     static int pre_start_recording(struct camera_device *);
211     static int start_recording(struct camera_device *);
212     static void stop_recording(struct camera_device *);
213     static int recording_enabled(struct camera_device *);
214     static void release_recording_frame(struct camera_device *, const void *opaque);
215     static int auto_focus(struct camera_device *);
216     static int cancel_auto_focus(struct camera_device *);
217     static int pre_take_picture(struct camera_device *);
218     static int take_picture(struct camera_device *);
219     int takeLiveSnapshot_internal();
220     int takeBackendPic_internal(bool *JpegMemOpt, char *raw_format);
221     void clearIntPendingEvents();
222     void checkIntPicPending(bool JpegMemOpt, char *raw_format);
223     static int cancel_picture(struct camera_device *);
224     static int set_parameters(struct camera_device *, const char *parms);
225     static int stop_after_set_params(struct camera_device *);
226     static int commit_params(struct camera_device *);
227     static int restart_after_set_params(struct camera_device *);
228     static char* get_parameters(struct camera_device *);
229     static void put_parameters(struct camera_device *, char *);
230     static int send_command(struct camera_device *,
231               int32_t cmd, int32_t arg1, int32_t arg2);
232     static int send_command_restart(struct camera_device *,
233             int32_t cmd, int32_t arg1, int32_t arg2);
234     static void release(struct camera_device *);
235     static int dump(struct camera_device *, int fd);
236     static int close_camera_device(hw_device_t *);
237 
238     static int register_face_image(struct camera_device *,
239                                    void *img_ptr,
240                                    cam_pp_offline_src_config_t *config);
241     static int prepare_preview(struct camera_device *);
242     static int prepare_snapshot(struct camera_device *device);
243 
244 public:
245     QCamera2HardwareInterface(uint32_t cameraId);
246     virtual ~QCamera2HardwareInterface();
247     int openCamera(struct hw_device_t **hw_device);
248 
249     // Dual camera specific oprations
250     int bundleRelatedCameras(bool syncOn,
251             uint32_t related_sensor_session_id);
252     int getCameraSessionId(uint32_t* session_id);
253     const cam_sync_related_sensors_event_info_t* getRelatedCamSyncInfo(
254             void);
255     int32_t setRelatedCamSyncInfo(
256             cam_sync_related_sensors_event_info_t* info);
257     int32_t setMpoComposition(bool enable);
258     bool getMpoComposition(void);
259     bool getRecordingHintValue(void);
260     int32_t setRecordingHintValue(int32_t value);
isPreviewRestartNeeded(void)261     bool isPreviewRestartNeeded(void) { return mPreviewRestartNeeded; };
262     static int getCapabilities(uint32_t cameraId,
263             struct camera_info *info, cam_sync_type_t *cam_type);
264     static int initCapabilities(uint32_t cameraId, mm_camera_vtbl_t *cameraHandle);
265     cam_capability_t *getCamHalCapabilities();
266 
267     // Implementation of QCameraAllocator
268     virtual QCameraMemory *allocateStreamBuf(cam_stream_type_t stream_type,
269             size_t size, int stride, int scanline, uint8_t &bufferCnt);
270     virtual int32_t allocateMoreStreamBuf(QCameraMemory *mem_obj,
271             size_t size, uint8_t &bufferCnt);
272 
273     virtual QCameraHeapMemory *allocateStreamInfoBuf(cam_stream_type_t stream_type);
274     virtual QCameraHeapMemory *allocateMiscBuf(cam_stream_info_t *streamInfo);
275     virtual QCameraMemory *allocateStreamUserBuf(cam_stream_info_t *streamInfo);
276     virtual void waitForDeferredAlloc(cam_stream_type_t stream_type);
277 
278     // Implementation of QCameraThermalCallback
279     virtual int thermalEvtHandle(qcamera_thermal_level_enum_t *level,
280             void *userdata, void *data);
281 
282     virtual int recalcFPSRange(int &minFPS, int &maxFPS,
283             const float &minVideoFPS, const float &maxVideoFPS,
284             cam_fps_range_t &adjustedRange);
285 
286     friend class QCameraStateMachine;
287     friend class QCameraPostProcessor;
288     friend class QCameraCbNotifier;
289     friend class QCameraMuxer;
290 
291     void setJpegCallBacks(jpeg_data_callback jpegCb,
292             void *callbackCookie);
293     int32_t initJpegHandle();
294     int32_t deinitJpegHandle();
295     int32_t setJpegHandleInfo(mm_jpeg_ops_t *ops,
296             mm_jpeg_mpo_ops_t *mpo_ops, uint32_t pJpegClientHandle);
297     int32_t getJpegHandleInfo(mm_jpeg_ops_t *ops,
298             mm_jpeg_mpo_ops_t *mpo_ops, uint32_t *pJpegClientHandle);
getCameraId()299     uint32_t getCameraId() { return mCameraId; };
300 private:
301     int setPreviewWindow(struct preview_stream_ops *window);
302     int setCallBacks(
303         camera_notify_callback notify_cb,
304         camera_data_callback data_cb,
305         camera_data_timestamp_callback data_cb_timestamp,
306         camera_request_memory get_memory,
307         void *user);
308     int enableMsgType(int32_t msg_type);
309     int disableMsgType(int32_t msg_type);
310     int msgTypeEnabled(int32_t msg_type);
311     int msgTypeEnabledWithLock(int32_t msg_type);
312     int startPreview();
313     int stopPreview();
314     int storeMetaDataInBuffers(int enable);
315     int preStartRecording();
316     int startRecording();
317     int stopRecording();
318     int releaseRecordingFrame(const void *opaque);
319     int autoFocus();
320     int cancelAutoFocus();
321     int preTakePicture();
322     int takePicture();
323     int stopCaptureChannel(bool destroy);
324     int cancelPicture();
325     int takeLiveSnapshot();
326     int takePictureInternal();
327     int cancelLiveSnapshot();
getParameters()328     char* getParameters() {return mParameters.getParameters(); }
329     int putParameters(char *);
330     int sendCommand(int32_t cmd, int32_t &arg1, int32_t &arg2);
331     int release();
332     int dump(int fd);
333     int registerFaceImage(void *img_ptr,
334                           cam_pp_offline_src_config_t *config,
335                           int32_t &faceID);
336     int32_t longShot();
337 
338     uint32_t deferPPInit();
339     int openCamera();
340     int closeCamera();
341 
342     int processAPI(qcamera_sm_evt_enum_t api, void *api_payload);
343     int processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
344     int processSyncEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
345     void lockAPI();
346     void waitAPIResult(qcamera_sm_evt_enum_t api_evt, qcamera_api_result_t *apiResult);
347     void unlockAPI();
348     void signalAPIResult(qcamera_api_result_t *result);
349     void signalEvtResult(qcamera_api_result_t *result);
350 
351     int calcThermalLevel(qcamera_thermal_level_enum_t level,
352             const int minFPSi, const int maxFPSi,
353             const float &minVideoFPS, const float &maxVideoFPS,
354             cam_fps_range_t &adjustedRange,
355             enum msm_vfe_frame_skip_pattern &skipPattern);
356     int updateThermalLevel(void *level);
357 
358     // update entris to set parameters and check if restart is needed
359     int updateParameters(const char *parms, bool &needRestart);
360     // send request to server to set parameters
361     int commitParameterChanges();
362 
363     bool isCaptureShutterEnabled();
364     bool needDebugFps();
365     bool isRegularCapture();
366     bool isCACEnabled();
367     bool is4k2kResolution(cam_dimension_t* resolution);
368     bool isPreviewRestartEnabled();
369     bool needReprocess();
370     bool needRotationReprocess();
371     void debugShowVideoFPS();
372     void debugShowPreviewFPS();
373     void dumpJpegToFile(const void *data, size_t size, uint32_t index);
374     void dumpFrameToFile(QCameraStream *stream,
375             mm_camera_buf_def_t *frame, uint32_t dump_type, const char *misc = NULL);
376     void dumpMetadataToFile(QCameraStream *stream,
377                             mm_camera_buf_def_t *frame,char *type);
378     void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
379     void playShutter();
380     void getThumbnailSize(cam_dimension_t &dim);
381     uint32_t getJpegQuality();
382     QCameraExif *getExifData();
383     cam_sensor_t getSensorType();
384     bool isLowPowerMode();
385 
386     int32_t processAutoFocusEvent(cam_auto_focus_data_t &focus_data);
387     int32_t processZoomEvent(cam_crop_data_t &crop_info);
388     int32_t processPrepSnapshotDoneEvent(cam_prep_snapshot_state_t prep_snapshot_state);
389     int32_t processASDUpdate(cam_asd_decision_t asd_decision);
390     int32_t processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_job);
391     int32_t processHDRData(cam_asd_hdr_scene_data_t hdr_scene);
392     int32_t processRetroAECUnlock();
393     int32_t processZSLCaptureDone();
394     int32_t processSceneData(cam_scene_mode_type scene);
395     int32_t transAwbMetaToParams(cam_awb_params_t &awb_params);
396     int32_t processFocusPositionInfo(cam_focus_pos_info_t &cur_pos_info);
397     int32_t processAEInfo(cam_3a_params_t &ae_params);
398 
399     int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
400     int32_t sendDataNotify(int32_t msg_type,
401             camera_memory_t *data,
402             uint8_t index,
403             camera_frame_metadata_t *metadata,
404             uint32_t frame_idx);
405 
406     int32_t sendPreviewCallback(QCameraStream *stream,
407             QCameraMemory *memory, uint32_t idx);
408     int32_t selectScene(QCameraChannel *pChannel,
409             mm_camera_super_buf_t *recvd_frame);
410 
411     int32_t addChannel(qcamera_ch_type_enum_t ch_type);
412     int32_t startChannel(qcamera_ch_type_enum_t ch_type);
413     int32_t stopChannel(qcamera_ch_type_enum_t ch_type);
414     int32_t delChannel(qcamera_ch_type_enum_t ch_type, bool destroy = true);
415     int32_t addPreviewChannel();
416     int32_t addSnapshotChannel();
417     int32_t addVideoChannel();
418     int32_t addZSLChannel();
419     int32_t addCaptureChannel();
420     int32_t addRawChannel();
421     int32_t addMetaDataChannel();
422     int32_t addAnalysisChannel();
423     QCameraReprocessChannel *addReprocChannel(QCameraChannel *pInputChannel,
424             int8_t cur_channel_index = 0);
425     QCameraReprocessChannel *addOfflineReprocChannel(
426                                                 cam_pp_offline_src_config_t &img_config,
427                                                 cam_pp_feature_config_t &pp_feature,
428                                                 stream_cb_routine stream_cb,
429                                                 void *userdata);
430     int32_t addCallbackChannel();
431 
432     int32_t addStreamToChannel(QCameraChannel *pChannel,
433                                cam_stream_type_t streamType,
434                                stream_cb_routine streamCB,
435                                void *userData);
436     int32_t preparePreview();
437     void unpreparePreview();
438     int32_t prepareRawStream(QCameraChannel *pChannel);
439     QCameraChannel *getChannelByHandle(uint32_t channelHandle);
440     mm_camera_buf_def_t *getSnapshotFrame(mm_camera_super_buf_t *recvd_frame);
441     int32_t processFaceDetectionResult(cam_faces_data_t *fd_data);
442     bool needPreviewFDCallback(uint8_t num_faces);
443     int32_t processHistogramStats(cam_hist_stats_t &stats_data);
444     int32_t setHistogram(bool histogram_en);
445     int32_t setFaceDetection(bool enabled);
446     int32_t prepareHardwareForSnapshot(int32_t afNeeded);
447     bool needProcessPreviewFrame(uint32_t frameID);
448     bool needSendPreviewCallback();
isNoDisplayMode()449     bool isNoDisplayMode() {return mParameters.isNoDisplayMode();};
isZSLMode()450     bool isZSLMode() {return mParameters.isZSLMode();};
isRdiMode()451     bool isRdiMode() {return mParameters.isRdiMode();};
numOfSnapshotsExpected()452     uint8_t numOfSnapshotsExpected() {
453         return mParameters.getNumOfSnapshots();};
isSecureMode()454     bool isSecureMode() {return mParameters.isSecureMode();};
isLongshotEnabled()455     bool isLongshotEnabled() { return mLongshotEnabled; };
isHFRMode()456     bool isHFRMode() {return mParameters.isHfrMode();};
isLiveSnapshot()457     bool isLiveSnapshot() {return m_stateMachine.isRecording();};
setRetroPicture(bool enable)458     void setRetroPicture(bool enable) { bRetroPicture = enable; };
isRetroPicture()459     bool isRetroPicture() {return bRetroPicture; };
isHDRMode()460     bool isHDRMode() {return mParameters.isHDREnabled();};
461     uint8_t getBufNumRequired(cam_stream_type_t stream_type);
462     bool needFDMetadata(qcamera_ch_type_enum_t channel_type);
463     int32_t configureOnlineRotation(QCameraChannel &ch);
464     int32_t declareSnapshotStreams();
465     int32_t unconfigureAdvancedCapture();
466     int32_t configureAdvancedCapture();
467     int32_t configureAFBracketing(bool enable = true);
468     int32_t configureHDRBracketing();
469     int32_t stopAdvancedCapture(QCameraPicChannel *pChannel);
470     int32_t startAdvancedCapture(QCameraPicChannel *pChannel);
471     int32_t configureOptiZoom();
472     int32_t configureStillMore();
473     int32_t configureAEBracketing();
474     int32_t updatePostPreviewParameters();
setOutputImageCount(uint32_t aCount)475     inline void setOutputImageCount(uint32_t aCount) {mOutputCount = aCount;}
getOutputImageCount()476     inline uint32_t getOutputImageCount() {return mOutputCount;}
477     bool processUFDumps(qcamera_jpeg_evt_payload_t *evt);
478     void captureDone();
479     int32_t updateMetadata(metadata_buffer_t *pMetaData);
480     void fillFacesData(cam_faces_data_t &faces_data, metadata_buffer_t *metadata);
481 
482     int32_t getPPConfig(cam_pp_feature_config_t &pp_config,
483             int8_t curIndex = 0, bool multipass = FALSE);
484     virtual uint32_t scheduleBackgroundTask(BackgroundTask* bgTask);
485     virtual int32_t waitForBackgroundTask(uint32_t &taskId);
486     bool needDeferred(cam_stream_type_t stream_type);
487     static void camEvtHandle(uint32_t camera_handle,
488                           mm_camera_event_t *evt,
489                           void *user_data);
490     static void jpegEvtHandle(jpeg_job_status_t status,
491                               uint32_t client_hdl,
492                               uint32_t jobId,
493                               mm_jpeg_output_t *p_buf,
494                               void *userdata);
495 
496     static void *evtNotifyRoutine(void *data);
497 
498     // functions for different data notify cb
499     static void zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, void *userdata);
500     static void capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
501                                            void *userdata);
502     static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
503                                             void *userdata);
504     static void rdi_mode_stream_cb_routine(mm_camera_super_buf_t *frame,
505                                               QCameraStream *stream,
506                                               void *userdata);
507     static void nodisplay_preview_stream_cb_routine(mm_camera_super_buf_t *frame,
508                                                     QCameraStream *stream,
509                                                     void *userdata);
510     static void preview_stream_cb_routine(mm_camera_super_buf_t *frame,
511                                           QCameraStream *stream,
512                                           void *userdata);
513     static void synchronous_stream_cb_routine(mm_camera_super_buf_t *frame,
514             QCameraStream *stream, void *userdata);
515     static void postview_stream_cb_routine(mm_camera_super_buf_t *frame,
516                                            QCameraStream *stream,
517                                            void *userdata);
518     static void video_stream_cb_routine(mm_camera_super_buf_t *frame,
519                                         QCameraStream *stream,
520                                         void *userdata);
521     static void snapshot_channel_cb_routine(mm_camera_super_buf_t *frame,
522            void *userdata);
523     static void raw_channel_cb_routine(mm_camera_super_buf_t *frame,
524             void *userdata);
525     static void raw_stream_cb_routine(mm_camera_super_buf_t *frame,
526                                       QCameraStream *stream,
527                                       void *userdata);
528     static void preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame,
529                                               QCameraStream * stream,
530                                               void * userdata);
531     static void snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame,
532                                                QCameraStream * stream,
533                                                void * userdata);
534     static void metadata_stream_cb_routine(mm_camera_super_buf_t *frame,
535                                            QCameraStream *stream,
536                                            void *userdata);
537     static void callback_stream_cb_routine(mm_camera_super_buf_t *frame,
538             QCameraStream *stream, void *userdata);
539     static void reprocess_stream_cb_routine(mm_camera_super_buf_t *frame,
540                                             QCameraStream *stream,
541                                             void *userdata);
542 
543     static void releaseCameraMemory(void *data,
544                                     void *cookie,
545                                     int32_t cbStatus);
546     static void returnStreamBuffer(void *data,
547                                    void *cookie,
548                                    int32_t cbStatus);
549     static void getLogLevel();
550 
551     int32_t startRAWChannel(QCameraChannel *pChannel);
552     int32_t stopRAWChannel();
553 
getNeedRestart()554     inline bool getNeedRestart() {return m_bNeedRestart;}
setNeedRestart(bool needRestart)555     inline void setNeedRestart(bool needRestart) {m_bNeedRestart = needRestart;}
556 
557     /*Start display skip. Skip starts after
558     skipCnt number of frames from current frame*/
559     void setDisplaySkip(bool enabled, uint8_t skipCnt = 0);
560     /*Caller can specify range frameID to skip.
561     if end is 0, all the frames after start will be skipped*/
562     void setDisplayFrameSkip(uint32_t start = 0, uint32_t end = 0);
563     /*Verifies if frameId is valid to skip*/
564     bool isDisplayFrameToSkip(uint32_t frameId);
565 
566 private:
567     camera_device_t   mCameraDevice;
568     uint32_t          mCameraId;
569     mm_camera_vtbl_t *mCameraHandle;
570     bool mCameraOpened;
571 
572     cam_jpeg_metadata_t mJpegMetadata;
573     bool m_bRelCamCalibValid;
574 
575     preview_stream_ops_t *mPreviewWindow;
576     QCameraParametersIntf mParameters;
577     int32_t               mMsgEnabled;
578     int                   mStoreMetaDataInFrame;
579 
580     camera_notify_callback         mNotifyCb;
581     camera_data_callback           mDataCb;
582     camera_data_timestamp_callback mDataCbTimestamp;
583     camera_request_memory          mGetMemory;
584     jpeg_data_callback             mJpegCb;
585     void                          *mCallbackCookie;
586     void                          *mJpegCallbackCookie;
587     bool                           m_bMpoEnabled;
588 
589     QCameraStateMachine m_stateMachine;   // state machine
590     bool m_smThreadActive;
591     QCameraPostProcessor m_postprocessor; // post processor
592     QCameraThermalAdapter &m_thermalAdapter;
593     QCameraCbNotifier m_cbNotifier;
594     QCameraPerfLock m_perfLock;
595     pthread_mutex_t m_lock;
596     pthread_cond_t m_cond;
597     api_result_list *m_apiResultList;
598     QCameraMemoryPool m_memoryPool;
599 
600     pthread_mutex_t m_evtLock;
601     pthread_cond_t m_evtCond;
602     qcamera_api_result_t m_evtResult;
603 
604 
605     QCameraChannel *m_channels[QCAMERA_CH_TYPE_MAX]; // array holding channel ptr
606 
607     bool m_bPreviewStarted;             //flag indicates first preview frame callback is received
608     bool m_bRecordStarted;             //flag indicates Recording is started for first time
609 
610     // Signifies if ZSL Retro Snapshots are enabled
611     bool bRetroPicture;
612     // Signifies AEC locked during zsl snapshots
613     bool m_bLedAfAecLock;
614     cam_af_state_t m_currentFocusState;
615 
616     uint32_t mDumpFrmCnt;  // frame dump count
617     uint32_t mDumpSkipCnt; // frame skip count
618     mm_jpeg_exif_params_t mExifParams;
619     qcamera_thermal_level_enum_t mThermalLevel;
620     bool mActiveAF;
621     bool m_HDRSceneEnabled;
622     bool mLongshotEnabled;
623 
624     pthread_t mLiveSnapshotThread;
625     pthread_t mIntPicThread;
626     bool mFlashNeeded;
627     uint32_t mDeviceRotation;
628     uint32_t mCaptureRotation;
629     uint32_t mJpegExifRotation;
630     bool mUseJpegExifRotation;
631     bool mIs3ALocked;
632     bool mPrepSnapRun;
633     int32_t mZoomLevel;
634     // Flag to indicate whether preview restart needed (for dual camera mode)
635     bool mPreviewRestartNeeded;
636 
637     int mVFrameCount;
638     int mVLastFrameCount;
639     nsecs_t mVLastFpsTime;
640     double mVFps;
641     int mPFrameCount;
642     int mPLastFrameCount;
643     nsecs_t mPLastFpsTime;
644     double mPFps;
645     uint8_t mInstantAecFrameCount;
646 
647     //eztune variables for communication with eztune server at backend
648     bool m_bIntJpegEvtPending;
649     bool m_bIntRawEvtPending;
650     char m_BackendFileName[QCAMERA_MAX_FILEPATH_LENGTH];
651     size_t mBackendFileSize;
652     pthread_mutex_t m_int_lock;
653     pthread_cond_t m_int_cond;
654 
655     enum DeferredWorkCmd {
656         CMD_DEF_ALLOCATE_BUFF,
657         CMD_DEF_PPROC_START,
658         CMD_DEF_PPROC_INIT,
659         CMD_DEF_METADATA_ALLOC,
660         CMD_DEF_CREATE_JPEG_SESSION,
661         CMD_DEF_PARAM_ALLOC,
662         CMD_DEF_PARAM_INIT,
663         CMD_DEF_GENERIC,
664         CMD_DEF_MAX
665     };
666 
667     typedef struct {
668         QCameraChannel *ch;
669         cam_stream_type_t type;
670     } DeferAllocBuffArgs;
671 
672     typedef struct {
673         uint8_t bufferCnt;
674         size_t size;
675     } DeferMetadataAllocArgs;
676 
677     typedef struct {
678         jpeg_encode_callback_t jpeg_cb;
679         void *user_data;
680     } DeferPProcInitArgs;
681 
682     typedef union {
683         DeferAllocBuffArgs allocArgs;
684         QCameraChannel *pprocArgs;
685         DeferMetadataAllocArgs metadataAllocArgs;
686         DeferPProcInitArgs pprocInitArgs;
687         BackgroundTask *genericArgs;
688     } DeferWorkArgs;
689 
690     typedef struct {
691         uint32_t mDefJobId;
692 
693         //Job status is needed to check job was successful or failed
694         //Error code when job was not sucessful and there is error
695         //0 when is initialized.
696         //for sucessfull job, do not need to maintain job status
697         int32_t mDefJobStatus;
698     } DefOngoingJob;
699 
700     DefOngoingJob mDefOngoingJobs[MAX_ONGOING_JOBS];
701 
702     struct DefWork
703     {
DefWorkDefWork704         DefWork(DeferredWorkCmd cmd_,
705                  uint32_t id_,
706                  DeferWorkArgs args_)
707             : cmd(cmd_),
708               id(id_),
709               args(args_){};
710 
711         DeferredWorkCmd cmd;
712         uint32_t id;
713         DeferWorkArgs args;
714     };
715 
716     QCameraCmdThread      mDeferredWorkThread;
717     QCameraQueue          mCmdQueue;
718 
719     Mutex                 mDefLock;
720     Condition             mDefCond;
721 
722     uint32_t queueDeferredWork(DeferredWorkCmd cmd,
723                                DeferWorkArgs args);
724     uint32_t dequeueDeferredWork(DefWork* dw, int32_t jobStatus);
725     int32_t waitDeferredWork(uint32_t &job_id);
726     static void *deferredWorkRoutine(void *obj);
727     bool checkDeferredWork(uint32_t &job_id);
728     int32_t getDefJobStatus(uint32_t &job_id);
729 
730     uint32_t mReprocJob;
731     uint32_t mJpegJob;
732     uint32_t mMetadataAllocJob;
733     uint32_t mInitPProcJob;
734     uint32_t mParamAllocJob;
735     uint32_t mParamInitJob;
736     uint32_t mOutputCount;
737     uint32_t mInputCount;
738     bool mAdvancedCaptureConfigured;
739     bool mHDRBracketingEnabled;
740     int32_t mNumPreviewFaces;
741     // Jpeg Handle shared between HWI instances
742     mm_jpeg_ops_t         mJpegHandle;
743     // MPO handle shared between HWI instances
744     // this is needed for MPO composition of related
745     // cam images
746     mm_jpeg_mpo_ops_t     mJpegMpoHandle;
747     uint32_t              mJpegClientHandle;
748     bool                  mJpegHandleOwner;
749 
750    //ts add for makeup
751 #ifdef TARGET_TS_MAKEUP
752     TSRect mFaceRect;
753     bool TsMakeupProcess_Preview(mm_camera_buf_def_t *pFrame,QCameraStream * pStream);
754     bool TsMakeupProcess_Snapshot(mm_camera_buf_def_t *pFrame,QCameraStream * pStream);
755     bool TsMakeupProcess(mm_camera_buf_def_t *frame,QCameraStream * stream,TSRect& faceRect);
756 #endif
757     QCameraMemory *mMetadataMem;
758 
759     static uint32_t sNextJobId;
760 
761     //Gralloc memory details
762     pthread_mutex_t mGrallocLock;
763     uint8_t mEnqueuedBuffers;
764     bool mCACDoneReceived;
765 
766     //GPU library to read buffer padding details.
767     void *lib_surface_utils;
768     int (*LINK_get_surface_pixel_alignment)();
769     uint32_t mSurfaceStridePadding;
770 
771     //QCamera Display Object
772     QCameraDisplay mCameraDisplay;
773 
774     bool m_bNeedRestart;
775     Mutex mMapLock;
776     Condition mMapCond;
777 
778     //Used to decide the next frameID to be skipped
779     uint32_t mLastPreviewFrameID;
780     //FrameID to start frame skip.
781     uint32_t mFrameSkipStart;
782     /*FrameID to stop frameskip. If this is not set,
783     all frames are skipped till we set this*/
784     uint32_t mFrameSkipEnd;
785 };
786 
787 }; // namespace qcamera
788 
789 #endif /* __QCAMERA2HARDWAREINTERFACE_H__ */
790