aboutsummaryrefslogtreecommitdiff
path: root/camera/QCamera2/HAL/QCamera2HWI.h
diff options
context:
space:
mode:
Diffstat (limited to 'camera/QCamera2/HAL/QCamera2HWI.h')
-rw-r--r--camera/QCamera2/HAL/QCamera2HWI.h795
1 files changed, 795 insertions, 0 deletions
diff --git a/camera/QCamera2/HAL/QCamera2HWI.h b/camera/QCamera2/HAL/QCamera2HWI.h
new file mode 100644
index 0000000..0c1a00a
--- /dev/null
+++ b/camera/QCamera2/HAL/QCamera2HWI.h
@@ -0,0 +1,795 @@
+/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef __QCAMERA2HARDWAREINTERFACE_H__
+#define __QCAMERA2HARDWAREINTERFACE_H__
+
+// System dependencies
+#include <utils/Mutex.h>
+#include <utils/Condition.h>
+
+// Camera dependencies
+#include "camera.h"
+#include "QCameraAllocator.h"
+#include "QCameraChannel.h"
+#include "QCameraCmdThread.h"
+#include "QCameraDisplay.h"
+#include "QCameraMem.h"
+#include "QCameraParameters.h"
+#include "QCameraParametersIntf.h"
+#include "QCameraPerf.h"
+#include "QCameraPostProc.h"
+#include "QCameraQueue.h"
+#include "QCameraStream.h"
+#include "QCameraStateMachine.h"
+#include "QCameraThermalAdapter.h"
+
+#ifdef TARGET_TS_MAKEUP
+#include "ts_makeup_engine.h"
+#include "ts_detectface_engine.h"
+#endif
+extern "C" {
+#include "mm_camera_interface.h"
+#include "mm_jpeg_interface.h"
+}
+
+#include "QCameraTrace.h"
+
+namespace qcamera {
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+typedef enum {
+ QCAMERA_CH_TYPE_ZSL,
+ QCAMERA_CH_TYPE_CAPTURE,
+ QCAMERA_CH_TYPE_PREVIEW,
+ QCAMERA_CH_TYPE_VIDEO,
+ QCAMERA_CH_TYPE_SNAPSHOT,
+ QCAMERA_CH_TYPE_RAW,
+ QCAMERA_CH_TYPE_METADATA,
+ QCAMERA_CH_TYPE_ANALYSIS,
+ QCAMERA_CH_TYPE_CALLBACK,
+ QCAMERA_CH_TYPE_MAX
+} qcamera_ch_type_enum_t;
+
+typedef struct {
+ int32_t msg_type;
+ int32_t ext1;
+ int32_t ext2;
+} qcamera_evt_argm_t;
+
+#define QCAMERA_DUMP_FRM_PREVIEW 1
+#define QCAMERA_DUMP_FRM_VIDEO (1<<1)
+#define QCAMERA_DUMP_FRM_SNAPSHOT (1<<2)
+#define QCAMERA_DUMP_FRM_THUMBNAIL (1<<3)
+#define QCAMERA_DUMP_FRM_RAW (1<<4)
+#define QCAMERA_DUMP_FRM_JPEG (1<<5)
+#define QCAMERA_DUMP_FRM_INPUT_REPROCESS (1<<6)
+
+#define QCAMERA_DUMP_FRM_MASK_ALL 0x000000ff
+
+#define QCAMERA_ION_USE_CACHE true
+#define QCAMERA_ION_USE_NOCACHE false
+#define MAX_ONGOING_JOBS 25
+
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+#define EXIF_ASCII_PREFIX_SIZE 8 //(sizeof(ExifAsciiPrefix))
+
+typedef enum {
+ QCAMERA_NOTIFY_CALLBACK,
+ QCAMERA_DATA_CALLBACK,
+ QCAMERA_DATA_TIMESTAMP_CALLBACK,
+ QCAMERA_DATA_SNAPSHOT_CALLBACK
+} qcamera_callback_type_m;
+
+typedef void (*camera_release_callback)(void *user_data,
+ void *cookie,
+ int32_t cb_status);
+typedef void (*jpeg_data_callback)(int32_t msg_type,
+ const camera_memory_t *data, unsigned int index,
+ camera_frame_metadata_t *metadata, void *user,
+ uint32_t frame_idx, camera_release_callback release_cb,
+ void *release_cookie, void *release_data);
+
+typedef struct {
+ qcamera_callback_type_m cb_type; // event type
+ int32_t msg_type; // msg type
+ int32_t ext1; // extended parameter
+ int32_t ext2; // extended parameter
+ camera_memory_t * data; // ptr to data memory struct
+ unsigned int index; // index of the buf in the whole buffer
+ int64_t timestamp; // buffer timestamp
+ camera_frame_metadata_t *metadata; // meta data
+ void *user_data; // any data needs to be released after callback
+ void *cookie; // release callback cookie
+ camera_release_callback release_cb; // release callback
+ uint32_t frame_index; // frame index for the buffer
+} qcamera_callback_argm_t;
+
+class QCameraCbNotifier {
+public:
+ QCameraCbNotifier(QCamera2HardwareInterface *parent) :
+ mNotifyCb (NULL),
+ mDataCb (NULL),
+ mDataCbTimestamp (NULL),
+ mCallbackCookie (NULL),
+ mJpegCb(NULL),
+ mJpegCallbackCookie(NULL),
+ mParent (parent),
+ mDataQ(releaseNotifications, this),
+ mActive(false){}
+
+ virtual ~QCameraCbNotifier();
+
+ virtual int32_t notifyCallback(qcamera_callback_argm_t &cbArgs);
+ virtual void setCallbacks(camera_notify_callback notifyCb,
+ camera_data_callback dataCb,
+ camera_data_timestamp_callback dataCbTimestamp,
+ void *callbackCookie);
+ virtual void setJpegCallBacks(
+ jpeg_data_callback jpegCb, void *callbackCookie);
+ virtual int32_t startSnapshots();
+ virtual void stopSnapshots();
+ virtual void exit();
+ static void * cbNotifyRoutine(void * data);
+ static void releaseNotifications(void *data, void *user_data);
+ static bool matchSnapshotNotifications(void *data, void *user_data);
+ static bool matchPreviewNotifications(void *data, void *user_data);
+ static bool matchTimestampNotifications(void *data, void *user_data);
+ virtual int32_t flushPreviewNotifications();
+ virtual int32_t flushVideoNotifications();
+private:
+
+ camera_notify_callback mNotifyCb;
+ camera_data_callback mDataCb;
+ camera_data_timestamp_callback mDataCbTimestamp;
+ void *mCallbackCookie;
+ jpeg_data_callback mJpegCb;
+ void *mJpegCallbackCookie;
+ QCamera2HardwareInterface *mParent;
+
+ QCameraQueue mDataQ;
+ QCameraCmdThread mProcTh;
+ bool mActive;
+};
+class QCamera2HardwareInterface : public QCameraAllocator,
+ public QCameraThermalCallback, public QCameraAdjustFPS
+{
+public:
+ /* static variable and functions accessed by camera service */
+ static camera_device_ops_t mCameraOps;
+
+ static int set_preview_window(struct camera_device *,
+ struct preview_stream_ops *window);
+ static void set_CallBacks(struct camera_device *,
+ camera_notify_callback notify_cb,
+ camera_data_callback data_cb,
+ camera_data_timestamp_callback data_cb_timestamp,
+ camera_request_memory get_memory,
+ void *user);
+ static void enable_msg_type(struct camera_device *, int32_t msg_type);
+ static void disable_msg_type(struct camera_device *, int32_t msg_type);
+ static int msg_type_enabled(struct camera_device *, int32_t msg_type);
+ static int start_preview(struct camera_device *);
+ static void stop_preview(struct camera_device *);
+ static int preview_enabled(struct camera_device *);
+ static int store_meta_data_in_buffers(struct camera_device *, int enable);
+ static int restart_start_preview(struct camera_device *);
+ static int restart_stop_preview(struct camera_device *);
+ static int pre_start_recording(struct camera_device *);
+ static int start_recording(struct camera_device *);
+ static void stop_recording(struct camera_device *);
+ static int recording_enabled(struct camera_device *);
+ static void release_recording_frame(struct camera_device *, const void *opaque);
+ static int auto_focus(struct camera_device *);
+ static int cancel_auto_focus(struct camera_device *);
+ static int pre_take_picture(struct camera_device *);
+ static int take_picture(struct camera_device *);
+ int takeLiveSnapshot_internal();
+ int cancelLiveSnapshot_internal();
+ int takeBackendPic_internal(bool *JpegMemOpt, char *raw_format);
+ void clearIntPendingEvents();
+ void checkIntPicPending(bool JpegMemOpt, char *raw_format);
+ static int cancel_picture(struct camera_device *);
+ static int set_parameters(struct camera_device *, const char *parms);
+ static int stop_after_set_params(struct camera_device *);
+ static int commit_params(struct camera_device *);
+ static int restart_after_set_params(struct camera_device *);
+ static char* get_parameters(struct camera_device *);
+ static void put_parameters(struct camera_device *, char *);
+ static int send_command(struct camera_device *,
+ int32_t cmd, int32_t arg1, int32_t arg2);
+ static int send_command_restart(struct camera_device *,
+ int32_t cmd, int32_t arg1, int32_t arg2);
+ static void release(struct camera_device *);
+ static int dump(struct camera_device *, int fd);
+ static int close_camera_device(hw_device_t *);
+
+ static int register_face_image(struct camera_device *,
+ void *img_ptr,
+ cam_pp_offline_src_config_t *config);
+ static int prepare_preview(struct camera_device *);
+ static int prepare_snapshot(struct camera_device *device);
+
+public:
+ QCamera2HardwareInterface(uint32_t cameraId);
+ virtual ~QCamera2HardwareInterface();
+ int openCamera(struct hw_device_t **hw_device);
+
+ // Dual camera specific oprations
+ int bundleRelatedCameras(bool syncOn,
+ uint32_t related_sensor_session_id);
+ int getCameraSessionId(uint32_t* session_id);
+ const cam_sync_related_sensors_event_info_t* getRelatedCamSyncInfo(
+ void);
+ int32_t setRelatedCamSyncInfo(
+ cam_sync_related_sensors_event_info_t* info);
+ bool isFrameSyncEnabled(void);
+ int32_t setFrameSyncEnabled(bool enable);
+ int32_t setMpoComposition(bool enable);
+ bool getMpoComposition(void);
+ bool getRecordingHintValue(void);
+ int32_t setRecordingHintValue(int32_t value);
+ bool isPreviewRestartNeeded(void) { return mPreviewRestartNeeded; };
+ static int getCapabilities(uint32_t cameraId,
+ struct camera_info *info, cam_sync_type_t *cam_type);
+ static int initCapabilities(uint32_t cameraId, mm_camera_vtbl_t *cameraHandle);
+ cam_capability_t *getCamHalCapabilities();
+
+ // Implementation of QCameraAllocator
+ virtual QCameraMemory *allocateStreamBuf(cam_stream_type_t stream_type,
+ size_t size, int stride, int scanline, uint8_t &bufferCnt);
+ virtual int32_t allocateMoreStreamBuf(QCameraMemory *mem_obj,
+ size_t size, uint8_t &bufferCnt);
+
+ virtual QCameraHeapMemory *allocateStreamInfoBuf(cam_stream_type_t stream_type);
+ virtual QCameraHeapMemory *allocateMiscBuf(cam_stream_info_t *streamInfo);
+ virtual QCameraMemory *allocateStreamUserBuf(cam_stream_info_t *streamInfo);
+ virtual void waitForDeferredAlloc(cam_stream_type_t stream_type);
+
+ // Implementation of QCameraThermalCallback
+ virtual int thermalEvtHandle(qcamera_thermal_level_enum_t *level,
+ void *userdata, void *data);
+
+ virtual int recalcFPSRange(int &minFPS, int &maxFPS,
+ const float &minVideoFPS, const float &maxVideoFPS,
+ cam_fps_range_t &adjustedRange);
+
+ friend class QCameraStateMachine;
+ friend class QCameraPostProcessor;
+ friend class QCameraCbNotifier;
+ friend class QCameraMuxer;
+
+ void setJpegCallBacks(jpeg_data_callback jpegCb,
+ void *callbackCookie);
+ int32_t initJpegHandle();
+ int32_t deinitJpegHandle();
+ int32_t setJpegHandleInfo(mm_jpeg_ops_t *ops,
+ mm_jpeg_mpo_ops_t *mpo_ops, uint32_t pJpegClientHandle);
+ int32_t getJpegHandleInfo(mm_jpeg_ops_t *ops,
+ mm_jpeg_mpo_ops_t *mpo_ops, uint32_t *pJpegClientHandle);
+ uint32_t getCameraId() { return mCameraId; };
+ bool bLiveSnapshot;
+private:
+ int setPreviewWindow(struct preview_stream_ops *window);
+ int setCallBacks(
+ camera_notify_callback notify_cb,
+ camera_data_callback data_cb,
+ camera_data_timestamp_callback data_cb_timestamp,
+ camera_request_memory get_memory,
+ void *user);
+ int enableMsgType(int32_t msg_type);
+ int disableMsgType(int32_t msg_type);
+ int msgTypeEnabled(int32_t msg_type);
+ int msgTypeEnabledWithLock(int32_t msg_type);
+ int startPreview();
+ int stopPreview();
+ int storeMetaDataInBuffers(int enable);
+ int preStartRecording();
+ int startRecording();
+ int stopRecording();
+ int releaseRecordingFrame(const void *opaque);
+ int autoFocus();
+ int cancelAutoFocus();
+ int preTakePicture();
+ int takePicture();
+ int stopCaptureChannel(bool destroy);
+ int cancelPicture();
+ int takeLiveSnapshot();
+ int takePictureInternal();
+ int cancelLiveSnapshot();
+ char* getParameters() {return mParameters.getParameters(); }
+ int putParameters(char *);
+ int sendCommand(int32_t cmd, int32_t &arg1, int32_t &arg2);
+ int release();
+ int dump(int fd);
+ int registerFaceImage(void *img_ptr,
+ cam_pp_offline_src_config_t *config,
+ int32_t &faceID);
+ int32_t longShot();
+
+ uint32_t deferPPInit();
+ int openCamera();
+ int closeCamera();
+
+ int processAPI(qcamera_sm_evt_enum_t api, void *api_payload);
+ int processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
+ int processSyncEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
+ void lockAPI();
+ void waitAPIResult(qcamera_sm_evt_enum_t api_evt, qcamera_api_result_t *apiResult);
+ void unlockAPI();
+ void signalAPIResult(qcamera_api_result_t *result);
+ void signalEvtResult(qcamera_api_result_t *result);
+
+ int calcThermalLevel(qcamera_thermal_level_enum_t level,
+ const int minFPSi, const int maxFPSi,
+ const float &minVideoFPS, const float &maxVideoFPS,
+ cam_fps_range_t &adjustedRange,
+ enum msm_vfe_frame_skip_pattern &skipPattern);
+ int updateThermalLevel(void *level);
+
+ // update entris to set parameters and check if restart is needed
+ int updateParameters(const char *parms, bool &needRestart);
+ // send request to server to set parameters
+ int commitParameterChanges();
+
+ bool isCaptureShutterEnabled();
+ bool needDebugFps();
+ bool isRegularCapture();
+ bool isCACEnabled();
+ bool is4k2kResolution(cam_dimension_t* resolution);
+ bool isPreviewRestartEnabled();
+ bool needReprocess();
+ bool needRotationReprocess();
+ void debugShowVideoFPS();
+ void debugShowPreviewFPS();
+ void dumpJpegToFile(const void *data, size_t size, uint32_t index);
+ void dumpFrameToFile(QCameraStream *stream,
+ mm_camera_buf_def_t *frame, uint32_t dump_type, const char *misc = NULL);
+ void dumpMetadataToFile(QCameraStream *stream,
+ mm_camera_buf_def_t *frame,char *type);
+ void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
+ void playShutter();
+ void getThumbnailSize(cam_dimension_t &dim);
+ uint32_t getJpegQuality();
+ QCameraExif *getExifData();
+ cam_sensor_t getSensorType();
+ bool isLowPowerMode();
+
+ int32_t processAutoFocusEvent(cam_auto_focus_data_t &focus_data);
+ int32_t processZoomEvent(cam_crop_data_t &crop_info);
+ int32_t processPrepSnapshotDoneEvent(cam_prep_snapshot_state_t prep_snapshot_state);
+ int32_t processASDUpdate(cam_asd_decision_t asd_decision);
+ int32_t processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_job);
+ int32_t processHDRData(cam_asd_hdr_scene_data_t hdr_scene);
+ int32_t processRetroAECUnlock();
+ int32_t processZSLCaptureDone();
+ int32_t processSceneData(cam_scene_mode_type scene);
+ int32_t transAwbMetaToParams(cam_awb_params_t &awb_params);
+ int32_t processFocusPositionInfo(cam_focus_pos_info_t &cur_pos_info);
+ int32_t processAEInfo(cam_3a_params_t &ae_params);
+
+ int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
+ int32_t sendDataNotify(int32_t msg_type,
+ camera_memory_t *data,
+ uint8_t index,
+ camera_frame_metadata_t *metadata,
+ uint32_t frame_idx);
+
+ int32_t sendPreviewCallback(QCameraStream *stream,
+ QCameraMemory *memory, uint32_t idx);
+ int32_t selectScene(QCameraChannel *pChannel,
+ mm_camera_super_buf_t *recvd_frame);
+
+ int32_t addChannel(qcamera_ch_type_enum_t ch_type);
+ int32_t startChannel(qcamera_ch_type_enum_t ch_type);
+ int32_t stopChannel(qcamera_ch_type_enum_t ch_type);
+ int32_t delChannel(qcamera_ch_type_enum_t ch_type, bool destroy = true);
+ int32_t addPreviewChannel();
+ int32_t addSnapshotChannel();
+ int32_t addVideoChannel();
+ int32_t addZSLChannel();
+ int32_t addCaptureChannel();
+ int32_t addRawChannel();
+ int32_t addMetaDataChannel();
+ int32_t addAnalysisChannel();
+ QCameraReprocessChannel *addReprocChannel(QCameraChannel *pInputChannel,
+ int8_t cur_channel_index = 0);
+ QCameraReprocessChannel *addOfflineReprocChannel(
+ cam_pp_offline_src_config_t &img_config,
+ cam_pp_feature_config_t &pp_feature,
+ stream_cb_routine stream_cb,
+ void *userdata);
+ int32_t addCallbackChannel();
+
+ int32_t addStreamToChannel(QCameraChannel *pChannel,
+ cam_stream_type_t streamType,
+ stream_cb_routine streamCB,
+ void *userData);
+ int32_t preparePreview();
+ void unpreparePreview();
+ int32_t prepareRawStream(QCameraChannel *pChannel);
+ QCameraChannel *getChannelByHandle(uint32_t channelHandle);
+ mm_camera_buf_def_t *getSnapshotFrame(mm_camera_super_buf_t *recvd_frame);
+ int32_t processFaceDetectionResult(cam_faces_data_t *fd_data);
+ bool needPreviewFDCallback(uint8_t num_faces);
+ int32_t processHistogramStats(cam_hist_stats_t &stats_data);
+ int32_t setHistogram(bool histogram_en);
+ int32_t setFaceDetection(bool enabled);
+ int32_t prepareHardwareForSnapshot(int32_t afNeeded);
+ bool needProcessPreviewFrame(uint32_t frameID);
+ bool needSendPreviewCallback();
+ bool isNoDisplayMode() {return mParameters.isNoDisplayMode();};
+ bool isZSLMode() {return mParameters.isZSLMode();};
+ bool isRdiMode() {return mParameters.isRdiMode();};
+ uint8_t numOfSnapshotsExpected() {
+ return mParameters.getNumOfSnapshots();};
+ bool isSecureMode() {return mParameters.isSecureMode();};
+ bool isLongshotEnabled() { return mLongshotEnabled; };
+ bool isHFRMode() {return mParameters.isHfrMode();};
+ bool isLiveSnapshot() {return m_stateMachine.isRecording();};
+ void setRetroPicture(bool enable) { bRetroPicture = enable; };
+ bool isRetroPicture() {return bRetroPicture; };
+ bool isHDRMode() {return mParameters.isHDREnabled();};
+ uint8_t getBufNumRequired(cam_stream_type_t stream_type);
+ bool needFDMetadata(qcamera_ch_type_enum_t channel_type);
+ int32_t configureOnlineRotation(QCameraChannel &ch);
+ int32_t declareSnapshotStreams();
+ int32_t unconfigureAdvancedCapture();
+ int32_t configureAdvancedCapture();
+ int32_t configureAFBracketing(bool enable = true);
+ int32_t configureHDRBracketing();
+ int32_t stopAdvancedCapture(QCameraPicChannel *pChannel);
+ int32_t startAdvancedCapture(QCameraPicChannel *pChannel);
+ int32_t configureOptiZoom();
+ int32_t configureStillMore();
+ int32_t configureAEBracketing();
+ int32_t updatePostPreviewParameters();
+ inline void setOutputImageCount(uint32_t aCount) {mOutputCount = aCount;}
+ inline uint32_t getOutputImageCount() {return mOutputCount;}
+ bool processUFDumps(qcamera_jpeg_evt_payload_t *evt);
+ void captureDone();
+ int32_t updateMetadata(metadata_buffer_t *pMetaData);
+ void fillFacesData(cam_faces_data_t &faces_data, metadata_buffer_t *metadata);
+
+ int32_t getPPConfig(cam_pp_feature_config_t &pp_config,
+ int8_t curIndex = 0, bool multipass = FALSE);
+ virtual uint32_t scheduleBackgroundTask(BackgroundTask* bgTask);
+ virtual int32_t waitForBackgroundTask(uint32_t &taskId);
+ bool needDeferred(cam_stream_type_t stream_type);
+ static void camEvtHandle(uint32_t camera_handle,
+ mm_camera_event_t *evt,
+ void *user_data);
+ static void jpegEvtHandle(jpeg_job_status_t status,
+ uint32_t client_hdl,
+ uint32_t jobId,
+ mm_jpeg_output_t *p_buf,
+ void *userdata);
+
+ static void *evtNotifyRoutine(void *data);
+
+ // functions for different data notify cb
+ static void zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, void *userdata);
+ static void capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
+ void *userdata);
+ static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
+ void *userdata);
+ static void rdi_mode_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void nodisplay_preview_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void preview_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void synchronous_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream, void *userdata);
+ static void postview_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void video_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void snapshot_channel_cb_routine(mm_camera_super_buf_t *frame,
+ void *userdata);
+ static void raw_channel_cb_routine(mm_camera_super_buf_t *frame,
+ void *userdata);
+ static void raw_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame,
+ QCameraStream * stream,
+ void * userdata);
+ static void snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame,
+ QCameraStream * stream,
+ void * userdata);
+ static void metadata_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+ static void callback_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream, void *userdata);
+ static void reprocess_stream_cb_routine(mm_camera_super_buf_t *frame,
+ QCameraStream *stream,
+ void *userdata);
+
+ static void releaseCameraMemory(void *data,
+ void *cookie,
+ int32_t cbStatus);
+ static void returnStreamBuffer(void *data,
+ void *cookie,
+ int32_t cbStatus);
+ static void getLogLevel();
+
+ int32_t startRAWChannel(QCameraChannel *pChannel);
+ int32_t stopRAWChannel();
+
+ inline bool getNeedRestart() {return m_bNeedRestart;}
+ inline void setNeedRestart(bool needRestart) {m_bNeedRestart = needRestart;}
+
+ /*Start display skip. Skip starts after
+ skipCnt number of frames from current frame*/
+ void setDisplaySkip(bool enabled, uint8_t skipCnt = 0);
+ /*Caller can specify range frameID to skip.
+ if end is 0, all the frames after start will be skipped*/
+ void setDisplayFrameSkip(uint32_t start = 0, uint32_t end = 0);
+ /*Verifies if frameId is valid to skip*/
+ bool isDisplayFrameToSkip(uint32_t frameId);
+
+private:
+ camera_device_t mCameraDevice;
+ uint32_t mCameraId;
+ mm_camera_vtbl_t *mCameraHandle;
+ bool mCameraOpened;
+
+ cam_jpeg_metadata_t mJpegMetadata;
+ bool m_bRelCamCalibValid;
+
+ preview_stream_ops_t *mPreviewWindow;
+ QCameraParametersIntf mParameters;
+ int32_t mMsgEnabled;
+ int mStoreMetaDataInFrame;
+
+ camera_notify_callback mNotifyCb;
+ camera_data_callback mDataCb;
+ camera_data_timestamp_callback mDataCbTimestamp;
+ camera_request_memory mGetMemory;
+ jpeg_data_callback mJpegCb;
+ void *mCallbackCookie;
+ void *mJpegCallbackCookie;
+ bool m_bMpoEnabled;
+
+ QCameraStateMachine m_stateMachine; // state machine
+ bool m_smThreadActive;
+ QCameraPostProcessor m_postprocessor; // post processor
+ QCameraThermalAdapter &m_thermalAdapter;
+ QCameraCbNotifier m_cbNotifier;
+ QCameraPerfLock m_perfLock;
+ pthread_mutex_t m_lock;
+ pthread_cond_t m_cond;
+ api_result_list *m_apiResultList;
+ QCameraMemoryPool m_memoryPool;
+
+ pthread_mutex_t m_evtLock;
+ pthread_cond_t m_evtCond;
+ qcamera_api_result_t m_evtResult;
+
+
+ QCameraChannel *m_channels[QCAMERA_CH_TYPE_MAX]; // array holding channel ptr
+
+ bool m_bPreviewStarted; //flag indicates first preview frame callback is received
+ bool m_bRecordStarted; //flag indicates Recording is started for first time
+
+ // Signifies if ZSL Retro Snapshots are enabled
+ bool bRetroPicture;
+ // Signifies AEC locked during zsl snapshots
+ bool m_bLedAfAecLock;
+ cam_af_state_t m_currentFocusState;
+
+ uint32_t mDumpFrmCnt; // frame dump count
+ uint32_t mDumpSkipCnt; // frame skip count
+ mm_jpeg_exif_params_t mExifParams;
+ qcamera_thermal_level_enum_t mThermalLevel;
+ bool mActiveAF;
+ bool m_HDRSceneEnabled;
+ bool mLongshotEnabled;
+
+ pthread_t mLiveSnapshotThread;
+ pthread_t mIntPicThread;
+ bool mFlashNeeded;
+ uint32_t mDeviceRotation;
+ uint32_t mCaptureRotation;
+ uint32_t mJpegExifRotation;
+ bool mUseJpegExifRotation;
+ bool mIs3ALocked;
+ bool mPrepSnapRun;
+ int32_t mZoomLevel;
+ // Flag to indicate whether preview restart needed (for dual camera mode)
+ bool mPreviewRestartNeeded;
+
+ int mVFrameCount;
+ int mVLastFrameCount;
+ nsecs_t mVLastFpsTime;
+ double mVFps;
+ int mPFrameCount;
+ int mPLastFrameCount;
+ nsecs_t mPLastFpsTime;
+ double mPFps;
+ uint8_t mInstantAecFrameCount;
+
+ //eztune variables for communication with eztune server at backend
+ bool m_bIntJpegEvtPending;
+ bool m_bIntRawEvtPending;
+ char m_BackendFileName[QCAMERA_MAX_FILEPATH_LENGTH];
+ size_t mBackendFileSize;
+ pthread_mutex_t m_int_lock;
+ pthread_cond_t m_int_cond;
+
+ enum DeferredWorkCmd {
+ CMD_DEF_ALLOCATE_BUFF,
+ CMD_DEF_PPROC_START,
+ CMD_DEF_PPROC_INIT,
+ CMD_DEF_METADATA_ALLOC,
+ CMD_DEF_CREATE_JPEG_SESSION,
+ CMD_DEF_PARAM_ALLOC,
+ CMD_DEF_PARAM_INIT,
+ CMD_DEF_GENERIC,
+ CMD_DEF_MAX
+ };
+
+ typedef struct {
+ QCameraChannel *ch;
+ cam_stream_type_t type;
+ } DeferAllocBuffArgs;
+
+ typedef struct {
+ uint8_t bufferCnt;
+ size_t size;
+ } DeferMetadataAllocArgs;
+
+ typedef struct {
+ jpeg_encode_callback_t jpeg_cb;
+ void *user_data;
+ } DeferPProcInitArgs;
+
+ typedef union {
+ DeferAllocBuffArgs allocArgs;
+ QCameraChannel *pprocArgs;
+ DeferMetadataAllocArgs metadataAllocArgs;
+ DeferPProcInitArgs pprocInitArgs;
+ BackgroundTask *genericArgs;
+ } DeferWorkArgs;
+
+ typedef struct {
+ uint32_t mDefJobId;
+
+ //Job status is needed to check job was successful or failed
+ //Error code when job was not sucessful and there is error
+ //0 when is initialized.
+ //for sucessfull job, do not need to maintain job status
+ int32_t mDefJobStatus;
+ } DefOngoingJob;
+
+ DefOngoingJob mDefOngoingJobs[MAX_ONGOING_JOBS];
+
+ struct DefWork
+ {
+ DefWork(DeferredWorkCmd cmd_,
+ uint32_t id_,
+ DeferWorkArgs args_)
+ : cmd(cmd_),
+ id(id_),
+ args(args_){};
+
+ DeferredWorkCmd cmd;
+ uint32_t id;
+ DeferWorkArgs args;
+ };
+
+ QCameraCmdThread mDeferredWorkThread;
+ QCameraQueue mCmdQueue;
+
+ Mutex mDefLock;
+ Condition mDefCond;
+
+ uint32_t queueDeferredWork(DeferredWorkCmd cmd,
+ DeferWorkArgs args);
+ uint32_t dequeueDeferredWork(DefWork* dw, int32_t jobStatus);
+ int32_t waitDeferredWork(uint32_t &job_id);
+ static void *deferredWorkRoutine(void *obj);
+ bool checkDeferredWork(uint32_t &job_id);
+ int32_t getDefJobStatus(uint32_t &job_id);
+
+ uint32_t mReprocJob;
+ uint32_t mJpegJob;
+ uint32_t mMetadataAllocJob;
+ uint32_t mInitPProcJob;
+ uint32_t mParamAllocJob;
+ uint32_t mParamInitJob;
+ uint32_t mOutputCount;
+ uint32_t mInputCount;
+ bool mAdvancedCaptureConfigured;
+ bool mHDRBracketingEnabled;
+ int32_t mNumPreviewFaces;
+ // Jpeg Handle shared between HWI instances
+ mm_jpeg_ops_t mJpegHandle;
+ // MPO handle shared between HWI instances
+ // this is needed for MPO composition of related
+ // cam images
+ mm_jpeg_mpo_ops_t mJpegMpoHandle;
+ uint32_t mJpegClientHandle;
+ bool mJpegHandleOwner;
+ //ts add for makeup
+#ifdef TARGET_TS_MAKEUP
+ TSRect mFaceRect;
+ bool TsMakeupProcess_Preview(mm_camera_buf_def_t *pFrame,QCameraStream * pStream);
+ bool TsMakeupProcess_Snapshot(mm_camera_buf_def_t *pFrame,QCameraStream * pStream);
+ bool TsMakeupProcess(mm_camera_buf_def_t *frame,QCameraStream * stream,TSRect& faceRect);
+#endif
+ QCameraMemory *mMetadataMem;
+ QCameraVideoMemory *mVideoMem;
+
+ static uint32_t sNextJobId;
+
+ //Gralloc memory details
+ pthread_mutex_t mGrallocLock;
+ uint8_t mEnqueuedBuffers;
+ bool mCACDoneReceived;
+
+ //GPU library to read buffer padding details.
+ void *lib_surface_utils;
+ int (*LINK_get_surface_pixel_alignment)();
+ uint32_t mSurfaceStridePadding;
+
+ //QCamera Display Object
+ QCameraDisplay mCameraDisplay;
+
+ bool m_bNeedRestart;
+ Mutex mMapLock;
+ Condition mMapCond;
+
+ //Used to decide the next frameID to be skipped
+ uint32_t mLastPreviewFrameID;
+ //FrameID to start frame skip.
+ uint32_t mFrameSkipStart;
+ /*FrameID to stop frameskip. If this is not set,
+ all frames are skipped till we set this*/
+ uint32_t mFrameSkipEnd;
+};
+
+}; // namespace qcamera
+
+#endif /* __QCAMERA2HARDWAREINTERFACE_H__ */