QCamera2HWI.h revision 744f5403bebb0e27140d16a5df7a341713c24a13
1/* Copyright (c) 2012-2013, 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 <hardware/power.h>
35#include <utils/Log.h>
36#include <QCameraParameters.h>
37
38#include "QCameraQueue.h"
39#include "QCameraCmdThread.h"
40#include "QCameraChannel.h"
41#include "QCameraStream.h"
42#include "QCameraStateMachine.h"
43#include "QCameraAllocator.h"
44#include "QCameraPostProc.h"
45#include "QCameraThermalAdapter.h"
46
47extern "C" {
48#include <mm_camera_interface.h>
49#include <mm_jpeg_interface.h>
50}
51
52#if DISABLE_DEBUG_LOG
53
54inline void __null_log(int, const char *, const char *, ...) {}
55
56#ifdef ALOGD
57#undef ALOGD
58#define ALOGD(...) do { __null_log(0, LOG_TAG,__VA_ARGS__); } while (0)
59#endif
60
61#ifdef ALOGI
62#undef ALOGI
63#define ALOGI(...) do { __null_log(0, LOG_TAG,__VA_ARGS__); } while (0)
64#endif
65
66#endif
67
68namespace qcamera {
69
70#ifndef TRUE
71#define TRUE 1
72#endif
73
74#ifndef FALSE
75#define FALSE 0
76#endif
77
78typedef enum {
79    QCAMERA_CH_TYPE_ZSL,
80    QCAMERA_CH_TYPE_CAPTURE,
81    QCAMERA_CH_TYPE_PREVIEW,
82    QCAMERA_CH_TYPE_VIDEO,
83    QCAMERA_CH_TYPE_SNAPSHOT,
84    QCAMERA_CH_TYPE_RAW,
85    QCAMERA_CH_TYPE_METADATA,
86    QCAMERA_CH_TYPE_MAX
87} qcamera_ch_type_enum_t;
88
89typedef struct {
90    int32_t msg_type;
91    int32_t ext1;
92    int32_t ext2;
93} qcamera_evt_argm_t;
94
95#define QCAMERA_DUMP_FRM_PREVIEW    1
96#define QCAMERA_DUMP_FRM_VIDEO      (1<<1)
97#define QCAMERA_DUMP_FRM_SNAPSHOT   (1<<2)
98#define QCAMERA_DUMP_FRM_THUMBNAIL  (1<<3)
99#define QCAMERA_DUMP_FRM_RAW        (1<<4)
100#define QCAMERA_DUMP_FRM_JPEG       (1<<5)
101
102#define QCAMERA_DUMP_FRM_MASK_ALL    0x000000ff
103
104#define QCAMERA_ION_USE_CACHE   true
105#define QCAMERA_ION_USE_NOCACHE false
106
107typedef enum {
108    QCAMERA_NOTIFY_CALLBACK,
109    QCAMERA_DATA_CALLBACK,
110    QCAMERA_DATA_TIMESTAMP_CALLBACK,
111    QCAMERA_DATA_SNAPSHOT_CALLBACK
112} qcamera_callback_type_m;
113
114typedef void (*camera_release_callback)(void *user_data, void *cookie);
115
116typedef struct {
117    qcamera_callback_type_m  cb_type;    // event type
118    int32_t                  msg_type;   // msg type
119    int32_t                  ext1;       // extended parameter
120    int32_t                  ext2;       // extended parameter
121    camera_memory_t *        data;       // ptr to data memory struct
122    unsigned int             index;      // index of the buf in the whole buffer
123    int64_t                  timestamp;  // buffer timestamp
124    camera_frame_metadata_t *metadata;   // meta data
125    void                    *user_data;  // any data needs to be released after callback
126    void                    *cookie;     // release callback cookie
127    camera_release_callback  release_cb; // release callback
128} qcamera_callback_argm_t;
129
130class QCameraCbNotifier {
131public:
132    QCameraCbNotifier(QCamera2HardwareInterface *parent) :
133                          mNotifyCb (NULL),
134                          mDataCb (NULL),
135                          mDataCbTimestamp (NULL),
136                          mCallbackCookie (NULL),
137                          mParent (parent),
138                          mDataQ(releaseNotifications, this) {}
139
140    virtual ~QCameraCbNotifier();
141
142    virtual int32_t notifyCallback(qcamera_callback_argm_t &cbArgs);
143    virtual void setCallbacks(camera_notify_callback notifyCb,
144                              camera_data_callback dataCb,
145                              camera_data_timestamp_callback dataCbTimestamp,
146                              void *callbackCookie);
147    virtual int32_t startSnapshots();
148    virtual void stopSnapshots();
149    static void * cbNotifyRoutine(void * data);
150    static void releaseNotifications(void *data, void *user_data);
151    static bool matchSnapshotNotifications(void *data, void *user_data);
152private:
153
154    camera_notify_callback         mNotifyCb;
155    camera_data_callback           mDataCb;
156    camera_data_timestamp_callback mDataCbTimestamp;
157    void                          *mCallbackCookie;
158    QCamera2HardwareInterface     *mParent;
159
160    QCameraQueue     mDataQ;
161    QCameraCmdThread mProcTh;
162};
163class QCamera2HardwareInterface : public QCameraAllocator,
164                                    public QCameraThermalCallback
165{
166public:
167    /* static variable and functions accessed by camera service */
168    static camera_device_ops_t mCameraOps;
169
170    static int set_preview_window(struct camera_device *,
171        struct preview_stream_ops *window);
172    static void set_CallBacks(struct camera_device *,
173        camera_notify_callback notify_cb,
174        camera_data_callback data_cb,
175        camera_data_timestamp_callback data_cb_timestamp,
176        camera_request_memory get_memory,
177        void *user);
178    static void enable_msg_type(struct camera_device *, int32_t msg_type);
179    static void disable_msg_type(struct camera_device *, int32_t msg_type);
180    static int msg_type_enabled(struct camera_device *, int32_t msg_type);
181    static int start_preview(struct camera_device *);
182    static void stop_preview(struct camera_device *);
183    static int preview_enabled(struct camera_device *);
184    static int store_meta_data_in_buffers(struct camera_device *, int enable);
185    static int start_recording(struct camera_device *);
186    static void stop_recording(struct camera_device *);
187    static int recording_enabled(struct camera_device *);
188    static void release_recording_frame(struct camera_device *, const void *opaque);
189    static int auto_focus(struct camera_device *);
190    static int cancel_auto_focus(struct camera_device *);
191    static int take_picture(struct camera_device *);
192    static int cancel_picture(struct camera_device *);
193    static int set_parameters(struct camera_device *, const char *parms);
194    static char* get_parameters(struct camera_device *);
195    static void put_parameters(struct camera_device *, char *);
196    static int send_command(struct camera_device *,
197              int32_t cmd, int32_t arg1, int32_t arg2);
198    static void release(struct camera_device *);
199    static int dump(struct camera_device *, int fd);
200    static int close_camera_device(hw_device_t *);
201
202    static int register_face_image(struct camera_device *,
203                                   void *img_ptr,
204                                   cam_pp_offline_src_config_t *config);
205public:
206    QCamera2HardwareInterface(int cameraId);
207    virtual ~QCamera2HardwareInterface();
208    int openCamera(struct hw_device_t **hw_device);
209
210    static int getCapabilities(int cameraId, struct camera_info *info);
211    static int initCapabilities(int cameraId);
212
213    // Implementation of QCameraAllocator
214    virtual QCameraMemory *allocateStreamBuf(cam_stream_type_t stream_type,
215                                             int size,
216                                             uint8_t &bufferCnt);
217    virtual QCameraHeapMemory *allocateStreamInfoBuf(cam_stream_type_t stream_type);
218
219    // Implementation of QCameraThermalCallback
220    virtual int thermalEvtHandle(qcamera_thermal_level_enum_t level,
221            void *userdata, void *data);
222
223    friend class QCameraStateMachine;
224    friend class QCameraPostProcessor;
225    friend class QCameraCbNotifier;
226
227private:
228    int setPreviewWindow(struct preview_stream_ops *window);
229    int setCallBacks(
230        camera_notify_callback notify_cb,
231        camera_data_callback data_cb,
232        camera_data_timestamp_callback data_cb_timestamp,
233        camera_request_memory get_memory,
234        void *user);
235    int enableMsgType(int32_t msg_type);
236    int disableMsgType(int32_t msg_type);
237    int msgTypeEnabled(int32_t msg_type);
238    int msgTypeEnabledWithLock(int32_t msg_type);
239    int startPreview();
240    int stopPreview();
241    int storeMetaDataInBuffers(int enable);
242    int startRecording();
243    int stopRecording();
244    int releaseRecordingFrame(const void *opaque);
245    int autoFocus();
246    int cancelAutoFocus();
247    int takePicture();
248    int cancelPicture();
249    int takeLiveSnapshot();
250    int cancelLiveSnapshot();
251    char* getParameters();
252    int putParameters(char *);
253    int sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
254    int release();
255    int dump(int fd);
256    int registerFaceImage(void *img_ptr,
257                          cam_pp_offline_src_config_t *config,
258                          int32_t &faceID);
259
260    int openCamera();
261    int closeCamera();
262
263    int processAPI(qcamera_sm_evt_enum_t api, void *api_payload);
264    int processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
265    int processSyncEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
266    void lockAPI();
267    void waitAPIResult(qcamera_sm_evt_enum_t api_evt);
268    void unlockAPI();
269    void signalAPIResult(qcamera_api_result_t *result);
270    void signalEvtResult(qcamera_api_result_t *result);
271
272    int updateThermalLevel(qcamera_thermal_level_enum_t level);
273
274    // update entris to set parameters and check if restart is needed
275    int updateParameters(const char *parms, bool &needRestart);
276    // send request to server to set parameters
277    int commitParameterChanges();
278
279    bool needDebugFps();
280    bool isCACEnabled();
281    bool needReprocess();
282    bool needRotationReprocess();
283    void debugShowVideoFPS();
284    void debugShowPreviewFPS();
285    void dumpFrameToFile(const void *data, uint32_t size,
286                         int index, int dump_type);
287    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
288    void playShutter();
289    void getThumbnailSize(cam_dimension_t &dim);
290    int getJpegQuality();
291    int getJpegRotation();
292    QCameraExif *getExifData();
293
294    int32_t processAutoFocusEvent(cam_auto_focus_data_t &focus_data);
295    int32_t processZoomEvent(cam_crop_data_t &crop_info);
296    int32_t processPrepSnapshotDoneEvent(cam_prep_snapshot_state_t prep_snapshot_state);
297    int32_t processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_job);
298
299    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
300    int32_t sendDataNotify(int32_t msg_type,
301                           camera_memory_t *data,
302                           uint8_t index,
303                           camera_frame_metadata_t *metadata);
304
305    int32_t addChannel(qcamera_ch_type_enum_t ch_type);
306    int32_t startChannel(qcamera_ch_type_enum_t ch_type);
307    int32_t stopChannel(qcamera_ch_type_enum_t ch_type);
308    int32_t delChannel(qcamera_ch_type_enum_t ch_type);
309    int32_t addPreviewChannel();
310    int32_t addSnapshotChannel();
311    int32_t addVideoChannel();
312    int32_t addZSLChannel();
313    int32_t addCaptureChannel();
314    int32_t addRawChannel();
315    int32_t addMetaDataChannel();
316    QCameraReprocessChannel *addOnlineReprocChannel(QCameraChannel *pInputChannel);
317    QCameraReprocessChannel *addOfflineReprocChannel(
318                                                cam_pp_offline_src_config_t &img_config,
319                                                cam_pp_feature_config_t &pp_feature,
320                                                stream_cb_routine stream_cb,
321                                                void *userdata);
322    int32_t addStreamToChannel(QCameraChannel *pChannel,
323                               cam_stream_type_t streamType,
324                               stream_cb_routine streamCB,
325                               void *userData);
326    int32_t preparePreview();
327    void unpreparePreview();
328    QCameraChannel *getChannelByHandle(uint32_t channelHandle);
329    mm_camera_buf_def_t *getSnapshotFrame(mm_camera_super_buf_t *recvd_frame);
330    int32_t processFaceDetectionResult(cam_face_detection_data_t *fd_data);
331    int32_t processHistogramStats(cam_hist_stats_t &stats_data);
332    int32_t setHistogram(bool histogram_en);
333    int32_t setFaceDetection(bool enabled);
334    int32_t prepareHardwareForSnapshot(int32_t afNeeded);
335    bool needProcessPreviewFrame() {return m_stateMachine.isPreviewRunning();};
336    bool isNoDisplayMode() {return mParameters.isNoDisplayMode();};
337    bool isZSLMode() {return mParameters.isZSLMode();};
338    uint8_t numOfSnapshotsExpected() {return mParameters.getNumOfSnapshots();};
339    uint8_t getBufNumRequired(cam_stream_type_t stream_type);
340
341    static void camEvtHandle(uint32_t camera_handle,
342                          mm_camera_event_t *evt,
343                          void *user_data);
344    static void jpegEvtHandle(jpeg_job_status_t status,
345                              uint32_t client_hdl,
346                              uint32_t jobId,
347                              mm_jpeg_output_t *p_buf,
348                              void *userdata);
349
350    static void *evtNotifyRoutine(void *data);
351
352    // functions for different data notify cb
353    static void zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, void *userdata);
354    static void capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
355                                           void *userdata);
356    static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
357                                            void *userdata);
358    static void nodisplay_preview_stream_cb_routine(mm_camera_super_buf_t *frame,
359                                                    QCameraStream *stream,
360                                                    void *userdata);
361    static void preview_stream_cb_routine(mm_camera_super_buf_t *frame,
362                                          QCameraStream *stream,
363                                          void *userdata);
364    static void postview_stream_cb_routine(mm_camera_super_buf_t *frame,
365                                           QCameraStream *stream,
366                                           void *userdata);
367    static void video_stream_cb_routine(mm_camera_super_buf_t *frame,
368                                        QCameraStream *stream,
369                                        void *userdata);
370    static void snapshot_stream_cb_routine(mm_camera_super_buf_t *frame,
371                                           QCameraStream *stream,
372                                           void *userdata);
373    static void raw_stream_cb_routine(mm_camera_super_buf_t *frame,
374                                      QCameraStream *stream,
375                                      void *userdata);
376    static void metadata_stream_cb_routine(mm_camera_super_buf_t *frame,
377                                           QCameraStream *stream,
378                                           void *userdata);
379    static void reprocess_stream_cb_routine(mm_camera_super_buf_t *frame,
380                                            QCameraStream *stream,
381                                            void *userdata);
382
383    static void releaseCameraMemory(void *data, void *cookie);
384    static void returnStreamBuffer(void *data, void *cookie);
385
386private:
387    camera_device_t   mCameraDevice;
388    uint8_t           mCameraId;
389    mm_camera_vtbl_t *mCameraHandle;
390    bool mCameraOpened;
391
392    preview_stream_ops_t *mPreviewWindow;
393    QCameraParameters mParameters;
394    int32_t               mMsgEnabled;
395    int                   mStoreMetaDataInFrame;
396
397    camera_notify_callback         mNotifyCb;
398    camera_data_callback           mDataCb;
399    camera_data_timestamp_callback mDataCbTimestamp;
400    camera_request_memory          mGetMemory;
401    void                          *mCallbackCookie;
402
403    QCameraStateMachine m_stateMachine;   // state machine
404    QCameraPostProcessor m_postprocessor; // post processor
405    QCameraThermalAdapter &m_thermalAdapter;
406    QCameraCbNotifier m_cbNotifier;
407    pthread_mutex_t m_lock;
408    pthread_cond_t m_cond;
409    qcamera_api_result_t m_apiResult;
410
411    pthread_mutex_t m_evtLock;
412    pthread_cond_t m_evtCond;
413    qcamera_api_result_t m_evtResult;
414
415    QCameraChannel *m_channels[QCAMERA_CH_TYPE_MAX]; // array holding channel ptr
416
417    bool m_bShutterSoundPlayed;         // if shutter sound had been played
418
419    // if auto focus is running, in other words, when auto_focus is called from service,
420    // and beforeany focus callback/cancel_focus happens. This flag is not an indication
421    // of whether lens is moving or not.
422    bool m_bAutoFocusRunning;
423    cam_autofocus_state_t m_currentFocusState;
424
425    // If start_zsl_snapshot is called to notify camera daemon about zsl snapshot
426    bool m_bStartZSLSnapshotCalled;
427
428    power_module_t *m_pPowerModule;   // power module
429
430    int mDumpFrmCnt;  // frame dump count
431    int mDumpSkipCnt; // frame skip count
432};
433
434}; // namespace qcamera
435
436#endif /* __QCAMERA2HARDWAREINTERFACE_H__ */
437