1 /* Copyright (c) 2012-2015, The Linux Foundataion. 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 #include <hardware/camera.h> 34 #include <utils/Log.h> 35 #include <utils/Mutex.h> 36 #include <utils/Condition.h> 37 #include <QCameraParameters.h> 38 39 #include "QCameraQueue.h" 40 #include "QCameraCmdThread.h" 41 #include "QCameraChannel.h" 42 #include "QCameraStream.h" 43 #include "QCameraStateMachine.h" 44 #include "QCameraAllocator.h" 45 #include "QCameraPostProc.h" 46 #include "QCameraThermalAdapter.h" 47 #include "QCameraMem.h" 48 #include "QCameraPerf.h" 49 50 extern "C" { 51 #include <mm_camera_interface.h> 52 #include <mm_jpeg_interface.h> 53 } 54 55 #if DISABLE_DEBUG_LOG 56 57 inline void __null_log(int, const char *, const char *, ...) {} 58 59 #ifdef ALOGD 60 #undef ALOGD 61 #define ALOGD(...) do { __null_log(0, LOG_TAG,__VA_ARGS__); } while (0) 62 #endif 63 64 #ifdef ALOGI 65 #undef ALOGI 66 #define ALOGI(...) do { __null_log(0, LOG_TAG,__VA_ARGS__); } while (0) 67 #endif 68 69 #ifdef CDBG 70 #undef CDBG 71 #define CDBG(...) do{} while(0) 72 #endif 73 74 #else 75 76 77 #ifdef CDBG 78 #undef CDBG 79 #endif //#ifdef CDBG 80 #define CDBG(fmt, args...) ALOGD_IF(gCamHalLogLevel >= 2, fmt, ##args) 81 82 #ifdef CDBG_HIGH 83 #undef CDBG_HIGH 84 #endif //#ifdef CDBG_HIGH 85 #define CDBG_HIGH(fmt, args...) ALOGD_IF(gCamHalLogLevel >= 1, fmt, ##args) 86 87 #endif // DISABLE_DEBUG_LOG 88 89 namespace qcamera { 90 91 #ifndef TRUE 92 #define TRUE 1 93 #endif 94 95 #ifndef FALSE 96 #define FALSE 0 97 #endif 98 99 typedef enum { 100 QCAMERA_CH_TYPE_ZSL, 101 QCAMERA_CH_TYPE_CAPTURE, 102 QCAMERA_CH_TYPE_PREVIEW, 103 QCAMERA_CH_TYPE_VIDEO, 104 QCAMERA_CH_TYPE_SNAPSHOT, 105 QCAMERA_CH_TYPE_RAW, 106 QCAMERA_CH_TYPE_METADATA, 107 QCAMERA_CH_TYPE_ANALYSIS, 108 QCAMERA_CH_TYPE_MAX 109 } qcamera_ch_type_enum_t; 110 111 typedef struct { 112 int32_t msg_type; 113 int32_t ext1; 114 int32_t ext2; 115 } qcamera_evt_argm_t; 116 117 #define QCAMERA_DUMP_FRM_PREVIEW 1 118 #define QCAMERA_DUMP_FRM_VIDEO (1<<1) 119 #define QCAMERA_DUMP_FRM_SNAPSHOT (1<<2) 120 #define QCAMERA_DUMP_FRM_THUMBNAIL (1<<3) 121 #define QCAMERA_DUMP_FRM_RAW (1<<4) 122 #define QCAMERA_DUMP_FRM_JPEG (1<<5) 123 124 #define QCAMERA_DUMP_FRM_MASK_ALL 0x000000ff 125 126 #define QCAMERA_ION_USE_CACHE true 127 #define QCAMERA_ION_USE_NOCACHE false 128 #define MAX_ONGOING_JOBS 25 129 130 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 131 132 extern volatile uint32_t gCamHalLogLevel; 133 134 typedef enum { 135 QCAMERA_NOTIFY_CALLBACK, 136 QCAMERA_DATA_CALLBACK, 137 QCAMERA_DATA_TIMESTAMP_CALLBACK, 138 QCAMERA_DATA_SNAPSHOT_CALLBACK 139 } qcamera_callback_type_m; 140 141 typedef void (*camera_release_callback)(void *user_data, 142 void *cookie, 143 int32_t cb_status); 144 145 typedef struct { 146 qcamera_callback_type_m cb_type; // event type 147 int32_t msg_type; // msg type 148 int32_t ext1; // extended parameter 149 int32_t ext2; // extended parameter 150 camera_memory_t * data; // ptr to data memory struct 151 unsigned int index; // index of the buf in the whole buffer 152 int64_t timestamp; // buffer timestamp 153 camera_frame_metadata_t *metadata; // meta data 154 void *user_data; // any data needs to be released after callback 155 void *cookie; // release callback cookie 156 camera_release_callback release_cb; // release callback 157 } qcamera_callback_argm_t; 158 159 class QCameraCbNotifier { 160 public: 161 QCameraCbNotifier(QCamera2HardwareInterface *parent) : 162 mNotifyCb (NULL), 163 mDataCb (NULL), 164 mDataCbTimestamp (NULL), 165 mCallbackCookie (NULL), 166 mParent (parent), 167 mDataQ(releaseNotifications, this), 168 mActive(false){} 169 170 virtual ~QCameraCbNotifier(); 171 172 virtual int32_t notifyCallback(qcamera_callback_argm_t &cbArgs); 173 virtual void setCallbacks(camera_notify_callback notifyCb, 174 camera_data_callback dataCb, 175 camera_data_timestamp_callback dataCbTimestamp, 176 void *callbackCookie); 177 virtual int32_t startSnapshots(); 178 virtual void stopSnapshots(); 179 virtual void exit(); 180 static void * cbNotifyRoutine(void * data); 181 static void releaseNotifications(void *data, void *user_data); 182 static bool matchSnapshotNotifications(void *data, void *user_data); 183 static bool matchPreviewNotifications(void *data, void *user_data); 184 virtual int32_t flushPreviewNotifications(); 185 private: 186 187 camera_notify_callback mNotifyCb; 188 camera_data_callback mDataCb; 189 camera_data_timestamp_callback mDataCbTimestamp; 190 void *mCallbackCookie; 191 QCamera2HardwareInterface *mParent; 192 193 QCameraQueue mDataQ; 194 QCameraCmdThread mProcTh; 195 bool mActive; 196 }; 197 class QCamera2HardwareInterface : public QCameraAllocator, 198 public QCameraThermalCallback, public QCameraAdjustFPS 199 { 200 public: 201 /* static variable and functions accessed by camera service */ 202 static camera_device_ops_t mCameraOps; 203 204 static int set_preview_window(struct camera_device *, 205 struct preview_stream_ops *window); 206 static void set_CallBacks(struct camera_device *, 207 camera_notify_callback notify_cb, 208 camera_data_callback data_cb, 209 camera_data_timestamp_callback data_cb_timestamp, 210 camera_request_memory get_memory, 211 void *user); 212 static void enable_msg_type(struct camera_device *, int32_t msg_type); 213 static void disable_msg_type(struct camera_device *, int32_t msg_type); 214 static int msg_type_enabled(struct camera_device *, int32_t msg_type); 215 static int start_preview(struct camera_device *); 216 static void stop_preview(struct camera_device *); 217 static int preview_enabled(struct camera_device *); 218 static int store_meta_data_in_buffers(struct camera_device *, int enable); 219 static int start_recording(struct camera_device *); 220 static void stop_recording(struct camera_device *); 221 static int recording_enabled(struct camera_device *); 222 static void release_recording_frame(struct camera_device *, const void *opaque); 223 static int auto_focus(struct camera_device *); 224 static int cancel_auto_focus(struct camera_device *); 225 static int take_picture(struct camera_device *); 226 int takeLiveSnapshot_internal(); 227 int takeBackendPic_internal(bool *JpegMemOpt, char *raw_format); 228 void clearIntPendingEvents(); 229 void checkIntPicPending(bool JpegMemOpt, char *raw_format); 230 static int cancel_picture(struct camera_device *); 231 static int set_parameters(struct camera_device *, const char *parms); 232 static char* get_parameters(struct camera_device *); 233 static void put_parameters(struct camera_device *, char *); 234 static int send_command(struct camera_device *, 235 int32_t cmd, int32_t arg1, int32_t arg2); 236 static void release(struct camera_device *); 237 static int dump(struct camera_device *, int fd); 238 static int close_camera_device(hw_device_t *); 239 240 static int register_face_image(struct camera_device *, 241 void *img_ptr, 242 cam_pp_offline_src_config_t *config); 243 public: 244 QCamera2HardwareInterface(uint32_t cameraId); 245 virtual ~QCamera2HardwareInterface(); 246 int openCamera(struct hw_device_t **hw_device); 247 248 static int getCapabilities(uint32_t cameraId, struct camera_info *info); 249 static int initCapabilities(uint32_t cameraId, mm_camera_vtbl_t *cameraHandle); 250 cam_capability_t *getCamHalCapabilities(); 251 252 // Implementation of QCameraAllocator 253 virtual QCameraMemory *allocateStreamBuf(cam_stream_type_t stream_type, 254 size_t size, int stride, int scanline, uint8_t &bufferCnt); 255 virtual int32_t allocateMoreStreamBuf(QCameraMemory *mem_obj, 256 size_t size, uint8_t &bufferCnt); 257 258 virtual QCameraHeapMemory *allocateStreamInfoBuf(cam_stream_type_t stream_type); 259 virtual QCameraHeapMemory *allocateMiscBuf(cam_stream_info_t *streamInfo); 260 virtual QCameraMemory *allocateStreamUserBuf(cam_stream_info_t *streamInfo); 261 262 // Implementation of QCameraThermalCallback 263 virtual int thermalEvtHandle(qcamera_thermal_level_enum_t *level, 264 void *userdata, void *data); 265 266 virtual int recalcFPSRange(int &minFPS, int &maxFPS, 267 cam_fps_range_t &adjustedRange); 268 269 friend class QCameraStateMachine; 270 friend class QCameraPostProcessor; 271 friend class QCameraCbNotifier; 272 273 private: 274 int setPreviewWindow(struct preview_stream_ops *window); 275 int setCallBacks( 276 camera_notify_callback notify_cb, 277 camera_data_callback data_cb, 278 camera_data_timestamp_callback data_cb_timestamp, 279 camera_request_memory get_memory, 280 void *user); 281 int enableMsgType(int32_t msg_type); 282 int disableMsgType(int32_t msg_type); 283 int msgTypeEnabled(int32_t msg_type); 284 int msgTypeEnabledWithLock(int32_t msg_type); 285 int startPreview(); 286 int stopPreview(); 287 int storeMetaDataInBuffers(int enable); 288 int startRecording(); 289 int stopRecording(); 290 int releaseRecordingFrame(const void *opaque); 291 int autoFocus(); 292 int cancelAutoFocus(); 293 int takePicture(); 294 int stopCaptureChannel(bool destroy); 295 int cancelPicture(); 296 int takeLiveSnapshot(); 297 int takePictureInternal(); 298 int cancelLiveSnapshot(); 299 char* getParameters(); 300 int putParameters(char *); 301 int sendCommand(int32_t cmd, int32_t &arg1, int32_t &arg2); 302 int release(); 303 int dump(int fd); 304 int registerFaceImage(void *img_ptr, 305 cam_pp_offline_src_config_t *config, 306 int32_t &faceID); 307 int32_t longShot(); 308 309 int openCamera(); 310 int closeCamera(); 311 312 int processAPI(qcamera_sm_evt_enum_t api, void *api_payload); 313 int processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload); 314 int processSyncEvt(qcamera_sm_evt_enum_t evt, void *evt_payload); 315 void lockAPI(); 316 void waitAPIResult(qcamera_sm_evt_enum_t api_evt, qcamera_api_result_t *apiResult); 317 void unlockAPI(); 318 void signalAPIResult(qcamera_api_result_t *result); 319 void signalEvtResult(qcamera_api_result_t *result); 320 321 int calcThermalLevel(qcamera_thermal_level_enum_t level, 322 const int minFPSi, const int maxFPSi, cam_fps_range_t &adjustedRange, 323 enum msm_vfe_frame_skip_pattern &skipPattern); 324 int updateThermalLevel(void *level); 325 326 // update entris to set parameters and check if restart is needed 327 int updateParameters(const char *parms, bool &needRestart); 328 // send request to server to set parameters 329 int commitParameterChanges(); 330 331 bool isCaptureShutterEnabled(); 332 bool needDebugFps(); 333 bool isRegularCapture(); 334 bool isCACEnabled(); 335 bool is4k2kResolution(cam_dimension_t* resolution); 336 bool isAFRunning(); 337 bool isPreviewRestartEnabled(); 338 bool needReprocess(); 339 bool needRotationReprocess(); 340 bool needScaleReprocess(); 341 void debugShowVideoFPS(); 342 void debugShowPreviewFPS(); 343 void dumpJpegToFile(const void *data, size_t size, uint32_t index); 344 void dumpFrameToFile(QCameraStream *stream, 345 mm_camera_buf_def_t *frame, uint32_t dump_type); 346 void dumpMetadataToFile(QCameraStream *stream, 347 mm_camera_buf_def_t *frame,char *type); 348 void releaseSuperBuf(mm_camera_super_buf_t *super_buf); 349 void playShutter(); 350 void getThumbnailSize(cam_dimension_t &dim); 351 uint32_t getJpegQuality(); 352 inline bool getCancelAutoFocus(){ return mCancelAutoFocus; } 353 inline void setCancelAutoFocus(bool flag){ mCancelAutoFocus = flag; } 354 QCameraExif *getExifData(); 355 cam_sensor_t getSensorType(); 356 357 int32_t processAutoFocusEvent(cam_auto_focus_data_t &focus_data); 358 int32_t processZoomEvent(cam_crop_data_t &crop_info); 359 int32_t processPrepSnapshotDoneEvent(cam_prep_snapshot_state_t prep_snapshot_state); 360 int32_t processASDUpdate(cam_auto_scene_t scene); 361 int32_t processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_job); 362 int32_t processHDRData(cam_asd_hdr_scene_data_t hdr_scene); 363 int32_t processRetroAECUnlock(); 364 int32_t processZSLCaptureDone(); 365 int32_t processSceneData(cam_scene_mode_type scene); 366 int32_t transAwbMetaToParams(cam_awb_params_t &awb_params); 367 int32_t processFocusPositionInfo(cam_focus_pos_info_t &cur_pos_info); 368 int32_t processAEInfo(cam_3a_params_t &ae_params); 369 370 int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); 371 int32_t sendDataNotify(int32_t msg_type, 372 camera_memory_t *data, 373 uint8_t index, 374 camera_frame_metadata_t *metadata); 375 376 int32_t sendPreviewCallback(QCameraStream *stream, 377 QCameraGrallocMemory *memory, uint32_t idx); 378 int32_t selectScene(QCameraChannel *pChannel, 379 mm_camera_super_buf_t *recvd_frame); 380 381 int32_t addChannel(qcamera_ch_type_enum_t ch_type); 382 int32_t startChannel(qcamera_ch_type_enum_t ch_type); 383 int32_t stopChannel(qcamera_ch_type_enum_t ch_type); 384 int32_t delChannel(qcamera_ch_type_enum_t ch_type, bool destroy = true); 385 int32_t addPreviewChannel(); 386 int32_t addSnapshotChannel(); 387 int32_t addVideoChannel(); 388 int32_t addZSLChannel(); 389 int32_t addCaptureChannel(); 390 int32_t addRawChannel(); 391 int32_t addMetaDataChannel(); 392 int32_t addAnalysisChannel(); 393 QCameraReprocessChannel *addReprocChannel(QCameraChannel *pInputChannel); 394 QCameraReprocessChannel *addOfflineReprocChannel( 395 cam_pp_offline_src_config_t &img_config, 396 cam_pp_feature_config_t &pp_feature, 397 stream_cb_routine stream_cb, 398 void *userdata); 399 int32_t addStreamToChannel(QCameraChannel *pChannel, 400 cam_stream_type_t streamType, 401 stream_cb_routine streamCB, 402 void *userData); 403 int32_t preparePreview(); 404 void unpreparePreview(); 405 int32_t prepareRawStream(QCameraChannel *pChannel); 406 QCameraChannel *getChannelByHandle(uint32_t channelHandle); 407 mm_camera_buf_def_t *getSnapshotFrame(mm_camera_super_buf_t *recvd_frame); 408 int32_t processFaceDetectionResult(cam_face_detection_data_t *fd_data); 409 int32_t processHistogramStats(cam_hist_stats_t &stats_data); 410 int32_t setHistogram(bool histogram_en); 411 int32_t setFaceDetection(bool enabled); 412 int32_t prepareHardwareForSnapshot(int32_t afNeeded); 413 bool needProcessPreviewFrame(); 414 bool isNoDisplayMode() {return mParameters.isNoDisplayMode();}; 415 bool isZSLMode() {return mParameters.isZSLMode();}; 416 bool isRdiMode() {return mParameters.isRdiMode();}; 417 uint8_t numOfSnapshotsExpected() { 418 return mParameters.getNumOfSnapshots();}; 419 bool isSecureMode() {return mParameters.isSecureMode();}; 420 bool isLongshotEnabled() { return mLongshotEnabled; }; 421 bool isHFRMode() {return mParameters.isHfrMode();}; 422 bool isLiveSnapshot() {return m_stateMachine.isRecording();}; 423 void setRetroPicture(bool enable) { bRetroPicture = enable; }; 424 bool isRetroPicture() {return bRetroPicture; }; 425 bool isHDRMode() {return mParameters.isHDREnabled();}; 426 uint8_t getBufNumRequired(cam_stream_type_t stream_type); 427 bool needFDMetadata(qcamera_ch_type_enum_t channel_type); 428 int32_t configureOnlineRotation(QCameraChannel &ch); 429 int32_t declareSnapshotStreams(); 430 int32_t unconfigureAdvancedCapture(); 431 int32_t configureAdvancedCapture(); 432 int32_t configureAFBracketing(bool enable = true); 433 int32_t configureHDRBracketing(); 434 int32_t stopAdvancedCapture(QCameraPicChannel *pChannel); 435 int32_t startAdvancedCapture(QCameraPicChannel *pChannel); 436 int32_t configureOptiZoom(); 437 int32_t configureStillMore(); 438 int32_t configureAEBracketing(); 439 int32_t updatePostPreviewParameters(); 440 inline void setOutputImageCount(uint32_t aCount) {mOutputCount = aCount;} 441 inline uint32_t getOutputImageCount() {return mOutputCount;} 442 bool processUFDumps(qcamera_jpeg_evt_payload_t *evt); 443 void captureDone(); 444 int32_t updateMetadata(metadata_buffer_t *pMetaData); 445 446 int32_t getPPConfig(cam_pp_feature_config_t &pp_config, int curCount); 447 static void camEvtHandle(uint32_t camera_handle, 448 mm_camera_event_t *evt, 449 void *user_data); 450 static void jpegEvtHandle(jpeg_job_status_t status, 451 uint32_t client_hdl, 452 uint32_t jobId, 453 mm_jpeg_output_t *p_buf, 454 void *userdata); 455 456 static void *evtNotifyRoutine(void *data); 457 458 // functions for different data notify cb 459 static void zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, void *userdata); 460 static void capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 461 void *userdata); 462 static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 463 void *userdata); 464 static void rdi_mode_stream_cb_routine(mm_camera_super_buf_t *frame, 465 QCameraStream *stream, 466 void *userdata); 467 static void nodisplay_preview_stream_cb_routine(mm_camera_super_buf_t *frame, 468 QCameraStream *stream, 469 void *userdata); 470 static void preview_stream_cb_routine(mm_camera_super_buf_t *frame, 471 QCameraStream *stream, 472 void *userdata); 473 static void postview_stream_cb_routine(mm_camera_super_buf_t *frame, 474 QCameraStream *stream, 475 void *userdata); 476 static void video_stream_cb_routine(mm_camera_super_buf_t *frame, 477 QCameraStream *stream, 478 void *userdata); 479 static void snapshot_channel_cb_routine(mm_camera_super_buf_t *frame, 480 void *userdata); 481 static void raw_stream_cb_routine(mm_camera_super_buf_t *frame, 482 QCameraStream *stream, 483 void *userdata); 484 static void preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 485 QCameraStream * stream, 486 void * userdata); 487 static void snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 488 QCameraStream * stream, 489 void * userdata); 490 static void metadata_stream_cb_routine(mm_camera_super_buf_t *frame, 491 QCameraStream *stream, 492 void *userdata); 493 static void reprocess_stream_cb_routine(mm_camera_super_buf_t *frame, 494 QCameraStream *stream, 495 void *userdata); 496 497 static void releaseCameraMemory(void *data, 498 void *cookie, 499 int32_t cbStatus); 500 static void returnStreamBuffer(void *data, 501 void *cookie, 502 int32_t cbStatus); 503 static void getLogLevel(); 504 505 private: 506 camera_device_t mCameraDevice; 507 uint32_t mCameraId; 508 mm_camera_vtbl_t *mCameraHandle; 509 bool mCameraOpened; 510 511 preview_stream_ops_t *mPreviewWindow; 512 QCameraParameters mParameters; 513 int32_t mMsgEnabled; 514 int mStoreMetaDataInFrame; 515 516 camera_notify_callback mNotifyCb; 517 camera_data_callback mDataCb; 518 camera_data_timestamp_callback mDataCbTimestamp; 519 camera_request_memory mGetMemory; 520 void *mCallbackCookie; 521 522 QCameraStateMachine m_stateMachine; // state machine 523 bool m_smThreadActive; 524 QCameraPostProcessor m_postprocessor; // post processor 525 QCameraThermalAdapter &m_thermalAdapter; 526 QCameraCbNotifier m_cbNotifier; 527 QCameraPerfLock m_perfLock; 528 pthread_mutex_t m_lock; 529 pthread_cond_t m_cond; 530 api_result_list *m_apiResultList; 531 QCameraMemoryPool m_memoryPool; 532 533 pthread_mutex_t m_evtLock; 534 pthread_cond_t m_evtCond; 535 qcamera_api_result_t m_evtResult; 536 537 pthread_mutex_t m_parm_lock; 538 539 QCameraChannel *m_channels[QCAMERA_CH_TYPE_MAX]; // array holding channel ptr 540 541 bool m_bPreviewStarted; //flag indicates first preview frame callback is received 542 bool m_bRecordStarted; //flag indicates Recording is started for first time 543 544 // Signifies if ZSL Retro Snapshots are enabled 545 bool bRetroPicture; 546 // Signifies AEC locked during zsl snapshots 547 bool m_bLedAfAecLock; 548 cam_autofocus_state_t m_currentFocusState; 549 550 uint32_t mDumpFrmCnt; // frame dump count 551 uint32_t mDumpSkipCnt; // frame skip count 552 mm_jpeg_exif_params_t mExifParams; 553 qcamera_thermal_level_enum_t mThermalLevel; 554 bool mCancelAutoFocus; 555 bool m_HDRSceneEnabled; 556 bool mLongshotEnabled; 557 558 int32_t m_max_pic_width; 559 int32_t m_max_pic_height; 560 pthread_t mLiveSnapshotThread; 561 pthread_t mIntPicThread; 562 bool mFlashNeeded; 563 uint32_t mDeviceRotation; 564 uint32_t mCaptureRotation; 565 uint32_t mJpegExifRotation; 566 bool mUseJpegExifRotation; 567 bool mIs3ALocked; 568 bool mPrepSnapRun; 569 int32_t mZoomLevel; 570 571 int mVFrameCount; 572 int mVLastFrameCount; 573 nsecs_t mVLastFpsTime; 574 double mVFps; 575 int mPFrameCount; 576 int mPLastFrameCount; 577 nsecs_t mPLastFpsTime; 578 double mPFps; 579 580 //eztune variables for communication with eztune server at backend 581 bool m_bIntJpegEvtPending; 582 bool m_bIntRawEvtPending; 583 char m_BackendFileName[QCAMERA_MAX_FILEPATH_LENGTH]; 584 size_t mBackendFileSize; 585 pthread_mutex_t m_int_lock; 586 pthread_cond_t m_int_cond; 587 588 enum DefferedWorkCmd { 589 CMD_DEFF_ALLOCATE_BUFF, 590 CMD_DEFF_PPROC_START, 591 CMD_DEFF_MAX 592 }; 593 594 typedef struct { 595 QCameraChannel *ch; 596 cam_stream_type_t type; 597 } DefferAllocBuffArgs; 598 599 typedef union { 600 DefferAllocBuffArgs allocArgs; 601 QCameraChannel *pprocArgs; 602 } DefferWorkArgs; 603 604 bool mDeffOngoingJobs[MAX_ONGOING_JOBS]; 605 606 struct DeffWork 607 { 608 DeffWork(DefferedWorkCmd cmd_, 609 uint32_t id_, 610 DefferWorkArgs args_) 611 : cmd(cmd_), 612 id(id_), 613 args(args_){}; 614 615 DefferedWorkCmd cmd; 616 uint32_t id; 617 DefferWorkArgs args; 618 }; 619 620 QCameraCmdThread mDefferedWorkThread; 621 QCameraQueue mCmdQueue; 622 623 Mutex mDeffLock; 624 Condition mDeffCond; 625 626 int32_t queueDefferedWork(DefferedWorkCmd cmd, 627 DefferWorkArgs args); 628 int32_t waitDefferedWork(int32_t &job_id); 629 static void *defferedWorkRoutine(void *obj); 630 631 int32_t mSnapshotJob; 632 int32_t mPostviewJob; 633 int32_t mMetadataJob; 634 int32_t mReprocJob; 635 int32_t mRawdataJob; 636 uint32_t mOutputCount; 637 uint32_t mInputCount; 638 bool mAdvancedCaptureConfigured; 639 bool mHDRBracketingEnabled; 640 }; 641 642 }; // namespace qcamera 643 644 #endif /* __QCAMERA2HARDWAREINTERFACE_H__ */ 645