• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 **     http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 
17 #ifndef ANDROID_HARDWARE_QCAMERA_HARDWARE_INTERFACE_H
18 #define ANDROID_HARDWARE_QCAMERA_HARDWARE_INTERFACE_H
19 
20 
21 #include <utils/threads.h>
22 //#include <camera/CameraHardwareInterface.h>
23 #include <hardware/camera.h>
24 #include <binder/MemoryBase.h>
25 #include <binder/MemoryHeapBase.h>
26 //#include <binder/MemoryHeapPmem.h>
27 #include <utils/threads.h>
28 #include <cutils/properties.h>
29 #include <camera/Camera.h>
30 #include "QCameraParameters.h"
31 #include <system/window.h>
32 #include <system/camera.h>
33 #include <hardware/camera.h>
34 #include <gralloc_priv.h>
35 #include <QComOMXMetadata.h>
36 
37 extern "C" {
38 #include <linux/msm_ion.h>
39 #include <mm_camera_interface2.h>
40 #include "mm_omx_jpeg_encoder.h"
41 } //extern C
42 
43 #include "QCameraHWI_Mem.h"
44 #include "QCameraStream.h"
45 #include "QCamera_Intf.h"
46 
47 #include "hdr/include/morpho_noise_reduction_ext.h"
48 //Error codes
49 #define  NOT_FOUND -1
50 #define MAX_ZOOM_RATIOS 62
51 
52 #ifdef Q12
53 #undef Q12
54 #endif
55 
56 #define Q12 4096
57 #define QCAMERA_PARM_ENABLE   1
58 #define QCAMERA_PARM_DISABLE  0
59 #define PREVIEW_TBL_MAX_SIZE  14
60 #define VIDEO_TBL_MAX_SIZE    14
61 #define THUMB_TBL_MAX_SIZE    16
62 #define HFR_TBL_MAX_SIZE      2
63 
64 struct str_map {
65     const char *const desc;
66     int val;
67 };
68 
69 struct preview_format_info_t {
70    int Hal_format;
71    cam_format_t mm_cam_format;
72    cam_pad_format_t padding;
73    int num_planar;
74 };
75 
76 typedef enum {
77   CAMERA_STATE_UNINITED,
78   CAMERA_STATE_READY,
79   CAMERA_STATE_PREVIEW_START_CMD_SENT,
80   CAMERA_STATE_PREVIEW_STOP_CMD_SENT,
81   CAMERA_STATE_PREVIEW,
82   CAMERA_STATE_RECORD_START_CMD_SENT,  /*5*/
83   CAMERA_STATE_RECORD_STOP_CMD_SENT,
84   CAMERA_STATE_RECORD,
85   CAMERA_STATE_SNAP_START_CMD_SENT,
86   CAMERA_STATE_SNAP_STOP_CMD_SENT,
87   CAMERA_STATE_SNAP_CMD_ACKED,  /*10 - snapshot comd acked, snapshot not done yet*/
88   CAMERA_STATE_ZSL_START_CMD_SENT,
89   CAMERA_STATE_ZSL,
90   CAMERA_STATE_AF_START_CMD_SENT,
91   CAMERA_STATE_AF_STOP_CMD_SENT,
92   CAMERA_STATE_ERROR, /*15*/
93 
94   /*Add any new state above*/
95   CAMERA_STATE_MAX
96 } HAL_camera_state_type_t;
97 
98 enum {
99   BUFFER_NOT_OWNED,
100   BUFFER_UNLOCKED,
101   BUFFER_LOCKED,
102 };
103 
104 typedef enum {
105   HAL_DUMP_FRM_PREVIEW = 1,
106   HAL_DUMP_FRM_VIDEO = 1<<1,
107   HAL_DUMP_FRM_MAIN = 1<<2,
108   HAL_DUMP_FRM_THUMBNAIL = 1<<3,
109 
110   /*8 bits mask*/
111   HAL_DUMP_FRM_MAX = 1 << 8
112 } HAL_cam_dump_frm_type_t;
113 
114 
115 typedef enum {
116   HAL_CAM_MODE_ZSL = 1,
117 
118   /*add new entry before and update the max entry*/
119   HAL_CAM_MODE_MAX = HAL_CAM_MODE_ZSL << 1,
120 } qQamera_mode_t;
121 
122 #define HAL_DUMP_FRM_MASK_ALL ( HAL_DUMP_FRM_PREVIEW + HAL_DUMP_FRM_VIDEO + \
123     HAL_DUMP_FRM_MAIN + HAL_DUMP_FRM_THUMBNAIL)
124 #define QCAMERA_HAL_PREVIEW_STOPPED    0
125 #define QCAMERA_HAL_PREVIEW_START      1
126 #define QCAMERA_HAL_PREVIEW_STARTED    2
127 #define QCAMERA_HAL_RECORDING_STARTED  3
128 #define QCAMERA_HAL_TAKE_PICTURE       4
129 
130 
131 typedef struct {
132      int                     buffer_count;
133 	 buffer_handle_t        *buffer_handle[MM_CAMERA_MAX_NUM_FRAMES];
134 	 struct private_handle_t *private_buffer_handle[MM_CAMERA_MAX_NUM_FRAMES];
135 	 int                     stride[MM_CAMERA_MAX_NUM_FRAMES];
136 	 uint32_t                addr_offset[MM_CAMERA_MAX_NUM_FRAMES];
137 	 uint8_t                 local_flag[MM_CAMERA_MAX_NUM_FRAMES];
138 	 camera_memory_t        *camera_memory[MM_CAMERA_MAX_NUM_FRAMES];
139      int                     main_ion_fd[MM_CAMERA_MAX_NUM_FRAMES];
140      struct ion_fd_data      ion_info_fd[MM_CAMERA_MAX_NUM_FRAMES];
141 } QCameraHalMemory_t;
142 
143 
144 typedef struct {
145      int                     buffer_count;
146      uint32_t                size;
147      uint32_t                y_offset;
148      uint32_t                cbcr_offset;
149 	 int                     fd[MM_CAMERA_MAX_NUM_FRAMES];
150 	 int                     local_flag[MM_CAMERA_MAX_NUM_FRAMES];
151 	 camera_memory_t*        camera_memory[MM_CAMERA_MAX_NUM_FRAMES];
152      camera_memory_t*        metadata_memory[MM_CAMERA_MAX_NUM_FRAMES];
153      int main_ion_fd[MM_CAMERA_MAX_NUM_FRAMES];
154      struct ion_allocation_data alloc[MM_CAMERA_MAX_NUM_FRAMES];
155      struct ion_fd_data ion_info_fd[MM_CAMERA_MAX_NUM_FRAMES];
156 } QCameraHalHeap_t;
157 
158 typedef struct {
159      camera_memory_t*  camera_memory[3];
160      int main_ion_fd[3];
161      struct ion_allocation_data alloc[3];
162      struct ion_fd_data ion_info_fd[3];
163      int fd[3];
164      int size;
165 } QCameraStatHeap_t;
166 
167 typedef struct {
168   int32_t msg_type;
169   int32_t ext1;
170   int32_t ext2;
171   void    *cookie;
172 } argm_notify_t;
173 
174 typedef struct {
175   int32_t                  msg_type;
176   camera_memory_t         *data;
177   unsigned int             index;
178   camera_frame_metadata_t *metadata;
179   void                    *cookie;
180 } argm_data_cb_t;
181 
182 typedef struct {
183   camera_notify_callback notifyCb;
184   camera_data_callback   dataCb;
185   argm_notify_t argm_notify;
186   argm_data_cb_t        argm_data_cb;
187 } app_notify_cb_t;
188 
189 /* camera_area_t
190  * rectangle with weight to store the focus and metering areas.
191  * x1, y1, x2, y2: from -1000 to 1000
192  * weight: 0 to 1000
193  */
194 typedef struct {
195     int x1, y1, x2, y2;
196     int weight;
197 } camera_area_t;
198 
199 //EXIF globals
200 static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };          // "ASCII\0\0\0"
201 static const char ExifUndefinedPrefix[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };   // "\0\0\0\0\0\0\0\0"
202 
203 //EXIF detfines
204 #define MAX_EXIF_TABLE_ENTRIES           23
205 #define GPS_PROCESSING_METHOD_SIZE       101
206 #define FOCAL_LENGTH_DECIMAL_PRECISION   100
207 #define EXIF_ASCII_PREFIX_SIZE           8   //(sizeof(ExifAsciiPrefix))
208 #define F_NUMBER_DECIMAL_PRECISION       100
209 
210 typedef struct{
211     //GPS tags
212     rat_t       latitude[3];
213     rat_t       longitude[3];
214     char        lonRef[2];
215     char        latRef[2];
216     rat_t       altitude;
217     rat_t       gpsTimeStamp[3];
218     char        gpsDateStamp[20];
219     char        gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE+GPS_PROCESSING_METHOD_SIZE];
220     //Other tags
221     char        dateTime[20];
222     char subsecTime[7];
223     rat_t       focalLength;
224     rat_t       f_number;
225     uint16_t    flashMode;
226     uint16_t    isoSpeed;
227     rat_t       exposure_time;
228 
229     bool        mAltitude;
230     bool        mLongitude;
231     bool        mLatitude;
232     bool        mTimeStamp;
233     bool        mGpsProcess;
234 
235     int         mAltitude_ref;
236     long        mGPSTimestamp;
237     int         mWbMode;
238     char        make[20];
239     char        model[20];
240 
241 } exif_values_t;
242 
243 namespace android {
244 
245 class QCameraStream;
246 
247 class QCameraHardwareInterface : public virtual RefBase {
248 public:
249 
250     QCameraHardwareInterface(int  cameraId, int mode);
251 
252     /** Set the ANativeWindow to which preview frames are sent */
253     int setPreviewWindow(preview_stream_ops_t* window);
254 
255     /** Set the notification and data callbacks */
256     void setCallbacks(camera_notify_callback notify_cb,
257             camera_data_callback data_cb,
258             camera_data_timestamp_callback data_cb_timestamp,
259             camera_request_memory get_memory,
260             void *user);
261 
262     /**
263      * The following three functions all take a msg_type, which is a bitmask of
264      * the messages defined in include/ui/Camera.h
265      */
266 
267     /**
268      * Enable a message, or set of messages.
269      */
270     void enableMsgType(int32_t msg_type);
271 
272     /**
273      * Disable a message, or a set of messages.
274      *
275      * Once received a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), camera
276      * HAL should not rely on its client to call releaseRecordingFrame() to
277      * release video recording frames sent out by the cameral HAL before and
278      * after the disableMsgType(CAMERA_MSG_VIDEO_FRAME) call. Camera HAL
279      * clients must not modify/access any video recording frame after calling
280      * disableMsgType(CAMERA_MSG_VIDEO_FRAME).
281      */
282     void disableMsgType(int32_t msg_type);
283 
284     /**
285      * Query whether a message, or a set of messages, is enabled.  Note that
286      * this is operates as an AND, if any of the messages queried are off, this
287      * will return false.
288      */
289     int msgTypeEnabled(int32_t msg_type);
290 
291     /**
292      * Start preview mode.
293      */
294     int startPreview();
295     int startPreview2();
296 
297     /**
298      * Stop a previously started preview.
299      */
300     void stopPreview();
301 
302     /**
303      * Returns true if preview is enabled.
304      */
305     int previewEnabled();
306 
307 
308     /**
309      * Request the camera HAL to store meta data or real YUV data in the video
310      * buffers sent out via CAMERA_MSG_VIDEO_FRAME for a recording session. If
311      * it is not called, the default camera HAL behavior is to store real YUV
312      * data in the video buffers.
313      *
314      * This method should be called before startRecording() in order to be
315      * effective.
316      *
317      * If meta data is stored in the video buffers, it is up to the receiver of
318      * the video buffers to interpret the contents and to find the actual frame
319      * data with the help of the meta data in the buffer. How this is done is
320      * outside of the scope of this method.
321      *
322      * Some camera HALs may not support storing meta data in the video buffers,
323      * but all camera HALs should support storing real YUV data in the video
324      * buffers. If the camera HAL does not support storing the meta data in the
325      * video buffers when it is requested to do do, INVALID_OPERATION must be
326      * returned. It is very useful for the camera HAL to pass meta data rather
327      * than the actual frame data directly to the video encoder, since the
328      * amount of the uncompressed frame data can be very large if video size is
329      * large.
330      *
331      * @param enable if true to instruct the camera HAL to store
332      *        meta data in the video buffers; false to instruct
333      *        the camera HAL to store real YUV data in the video
334      *        buffers.
335      *
336      * @return OK on success.
337      */
338     int storeMetaDataInBuffers(int enable);
339 
340     /**
341      * Start record mode. When a record image is available, a
342      * CAMERA_MSG_VIDEO_FRAME message is sent with the corresponding
343      * frame. Every record frame must be released by a camera HAL client via
344      * releaseRecordingFrame() before the client calls
345      * disableMsgType(CAMERA_MSG_VIDEO_FRAME). After the client calls
346      * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is the camera HAL's
347      * responsibility to manage the life-cycle of the video recording frames,
348      * and the client must not modify/access any video recording frames.
349      */
350     int startRecording();
351 
352     /**
353      * Stop a previously started recording.
354      */
355     void stopRecording();
356 
357     /**
358      * Returns true if recording is enabled.
359      */
360     int recordingEnabled();
361 
362     /**
363      * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
364      *
365      * It is camera HAL client's responsibility to release video recording
366      * frames sent out by the camera HAL before the camera HAL receives a call
367      * to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives the call to
368      * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is the camera HAL's
369      * responsibility to manage the life-cycle of the video recording frames.
370      */
371     void releaseRecordingFrame(const void *opaque);
372 
373     /**
374      * Start auto focus, the notification callback routine is called with
375      * CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() will be
376      * called again if another auto focus is needed.
377      */
378     int autoFocus();
379 
380     /**
381      * Cancels auto-focus function. If the auto-focus is still in progress,
382      * this function will cancel it. Whether the auto-focus is in progress or
383      * not, this function will return the focus position to the default.  If
384      * the camera does not support auto-focus, this is a no-op.
385      */
386     int cancelAutoFocus();
387 
388     /**
389      * Take a picture.
390      */
391     int takePicture();
392 
393     /**
394      * Cancel a picture that was started with takePicture. Calling this method
395      * when no picture is being taken is a no-op.
396      */
397     int cancelPicture();
398 
399     /**
400      * Set the camera parameters. This returns BAD_VALUE if any parameter is
401      * invalid or not supported.
402      */
403     int setParameters(const char *parms);
404 
405     //status_t setParameters(const QCameraParameters& params);
406     /** Retrieve the camera parameters.  The buffer returned by the camera HAL
407         must be returned back to it with put_parameters, if put_parameters
408         is not NULL.
409      */
410     int getParameters(char **parms);
411 
412     /** The camera HAL uses its own memory to pass us the parameters when we
413         call get_parameters.  Use this function to return the memory back to
414         the camera HAL, if put_parameters is not NULL.  If put_parameters
415         is NULL, then you have to use free() to release the memory.
416     */
417     void putParameters(char *);
418 
419     /**
420      * Send command to camera driver.
421      */
422     int sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
423 
424     /**
425      * Release the hardware resources owned by this object.  Note that this is
426      * *not* done in the destructor.
427      */
428     void release();
429 
430     /**
431      * Dump state of the camera hardware
432      */
433     int dump(int fd);
434 
435     //virtual sp<IMemoryHeap> getPreviewHeap() const;
436     //virtual sp<IMemoryHeap> getRawHeap() const;
437 
438 
439     status_t    takeLiveSnapshot();
440     status_t    takeFullSizeLiveshot();
441     bool        canTakeFullSizeLiveshot();
442 
443     //virtual status_t          getBufferInfo( sp<IMemory>& Frame,
444     //size_t *alignedSize);
445     void         getPictureSize(int *picture_width, int *picture_height) const;
446     void         getPreviewSize(int *preview_width, int *preview_height) const;
447     cam_format_t getPreviewFormat() const;
448 
449     cam_pad_format_t getPreviewPadding() const;
450 
451     //bool     useOverlay(void);
452     //virtual status_t setOverlay(const sp<Overlay> &overlay);
453     void processEvent(mm_camera_event_t *);
454     int  getJpegQuality() const;
455     int  getNumOfSnapshots(void) const;
456     int  getNumOfSnapshots(const QCameraParameters& params);
457     int  getThumbSizesFromAspectRatio(uint32_t aspect_ratio,
458                                      int *picture_width,
459                                      int *picture_height);
460     bool isRawSnapshot();
461     bool mShutterSoundPlayed;
462     void dumpFrameToFile(struct msm_frame*, HAL_cam_dump_frm_type_t);
463 
464     static QCameraHardwareInterface *createInstance(int, int);
465     status_t setZSLBurstLookBack(const QCameraParameters& params);
466     status_t setZSLBurstInterval(const QCameraParameters& params);
467     int getZSLBurstInterval(void);
468     int getZSLQueueDepth(void) const;
469     int getZSLBackLookCount(void) const;
470 
471     ~QCameraHardwareInterface();
472     int initHeapMem(QCameraHalHeap_t *heap, int num_of_buf, int pmem_type,
473       int frame_len, int cbcr_off, int y_off, mm_cameara_stream_buf_t *StreamBuf,
474       mm_camera_buf_def_t *buf_def, uint8_t num_planes, uint32_t *planes);
475 
476     int releaseHeapMem( QCameraHalHeap_t *heap);
477     status_t sendMappingBuf(int ext_mode, int idx, int fd, uint32_t size,
478       int cameraid, mm_camera_socket_msg_type msg_type);
479     status_t sendUnMappingBuf(int ext_mode, int idx, int cameraid,
480       mm_camera_socket_msg_type msg_type);
481 
482     int allocate_ion_memory(QCameraHalHeap_t *p_camera_memory, int cnt,
483       int ion_type);
484     int deallocate_ion_memory(QCameraHalHeap_t *p_camera_memory, int cnt);
485 
486     int allocate_ion_memory(QCameraStatHeap_t *p_camera_memory, int cnt,
487       int ion_type);
488     int deallocate_ion_memory(QCameraStatHeap_t *p_camera_memory, int cnt);
489 
490     int cache_ops(int ion_fd, struct ion_flush_data *cache_inv_data, int type);
491 
492     void dumpFrameToFile(const void * data, uint32_t size, char* name,
493       char* ext, int index);
494     preview_format_info_t getPreviewFormatInfo( );
495     bool isCameraReady();
496     bool isNoDisplayMode();
497 
498 private:
499     int16_t  zoomRatios[MAX_ZOOM_RATIOS];
500     struct camera_size_type default_preview_sizes[PREVIEW_TBL_MAX_SIZE];
501     struct camera_size_type default_video_sizes[VIDEO_TBL_MAX_SIZE];
502     struct camera_size_type default_hfr_sizes[HFR_TBL_MAX_SIZE];
503     struct camera_size_type default_thumbnail_sizes[THUMB_TBL_MAX_SIZE];
504     unsigned int preview_sizes_count;
505     unsigned int video_sizes_count;
506     unsigned int thumbnail_sizes_count;
507     unsigned int hfr_sizes_count;
508 
509 
510     bool mUseOverlay;
511 
512     void loadTables();
513     void initDefaultParameters();
514     bool getMaxPictureDimension(mm_camera_dimension_t *dim);
515 
516     status_t updateFocusDistances();
517 
518     bool native_set_parms(mm_camera_parm_type_t type, uint16_t length, void *value);
519     bool native_set_parms( mm_camera_parm_type_t type, uint16_t length, void *value, int *result);
520 
521     void hasAutoFocusSupport();
522     void debugShowPreviewFPS() const;
523     //void prepareSnapshotAndWait();
524 
525     bool isPreviewRunning();
526     bool isRecordingRunning();
527     bool isSnapshotRunning();
528 
529     void processChannelEvent(mm_camera_ch_event_t *, app_notify_cb_t *);
530     void processPreviewChannelEvent(mm_camera_ch_event_type_t channelEvent, app_notify_cb_t *);
531     void processRecordChannelEvent(mm_camera_ch_event_type_t channelEvent, app_notify_cb_t *);
532     void processSnapshotChannelEvent(mm_camera_ch_event_type_t channelEvent, app_notify_cb_t *);
533     void processCtrlEvent(mm_camera_ctrl_event_t *, app_notify_cb_t *);
534     void processStatsEvent(mm_camera_stats_event_t *, app_notify_cb_t *);
535     void processInfoEvent(mm_camera_info_event_t *event, app_notify_cb_t *);
536     void processprepareSnapshotEvent(cam_ctrl_status_t *);
537     void roiEvent(fd_roi_t roi, app_notify_cb_t *);
538     void zoomEvent(cam_ctrl_status_t *status, app_notify_cb_t *);
539     void autofocusevent(cam_ctrl_status_t *status, app_notify_cb_t *);
540     void handleZoomEventForPreview(app_notify_cb_t *);
541     void handleZoomEventForSnapshot(void);
542     status_t autoFocusEvent(cam_ctrl_status_t *, app_notify_cb_t *);
543     status_t autoFocusMoveEvent(cam_ctrl_status_t *, app_notify_cb_t *);
544 
545     void filterPictureSizes();
546     bool supportsSceneDetection();
547     bool supportsSelectableZoneAf();
548     bool supportsFaceDetection();
549     bool supportsRedEyeReduction();
550     bool preview_parm_config (cam_ctrl_dimension_t* dim,QCameraParameters& parm);
551 
552     void stopPreviewInternal();
553     void stopRecordingInternal();
554     //void stopPreviewZSL();
555     status_t cancelPictureInternal();
556     //status_t startPreviewZSL();
557     void pausePreviewForSnapshot();
558     void pausePreviewForZSL();
559     void pausePreviewForVideo();
560     void prepareVideoPicture(bool disable);
561     status_t resumePreviewAfterSnapshot();
562 
563     status_t runFaceDetection();
564 
565     status_t           setParameters(const QCameraParameters& params);
566     QCameraParameters&  getParameters() ;
567 
568     bool getFlashCondition(void);
569 
570     status_t setCameraMode(const QCameraParameters& params);
571     status_t setPictureSizeTable(void);
572     status_t setPreviewSizeTable(void);
573     status_t setVideoSizeTable(void);
574     status_t setPreviewSize(const QCameraParameters& params);
575     status_t setJpegThumbnailSize(const QCameraParameters& params);
576     status_t setPreviewFpsRange(const QCameraParameters& params);
577     status_t setPreviewFrameRate(const QCameraParameters& params);
578     status_t setPreviewFrameRateMode(const QCameraParameters& params);
579     status_t setVideoSize(const QCameraParameters& params);
580     status_t setPictureSize(const QCameraParameters& params);
581     status_t setJpegQuality(const QCameraParameters& params);
582     status_t setNumOfSnapshot(const QCameraParameters& params);
583     status_t setJpegRotation(int isZSL);
584     int getJpegRotation(void);
585     int getISOSpeedValue();
586     status_t setAntibanding(const QCameraParameters& params);
587     status_t setEffect(const QCameraParameters& params);
588     status_t setExposureCompensation(const QCameraParameters &params);
589     status_t setAutoExposure(const QCameraParameters& params);
590     status_t setWhiteBalance(const QCameraParameters& params);
591     status_t setFlash(const QCameraParameters& params);
592     status_t setGpsLocation(const QCameraParameters& params);
593     status_t setRotation(const QCameraParameters& params);
594     status_t setZoom(const QCameraParameters& params);
595     status_t setFocusMode(const QCameraParameters& params);
596     status_t setBrightness(const QCameraParameters& params);
597     status_t setSkinToneEnhancement(const QCameraParameters& params);
598     status_t setOrientation(const QCameraParameters& params);
599     status_t setLensshadeValue(const QCameraParameters& params);
600     status_t setMCEValue(const QCameraParameters& params);
601     status_t setISOValue(const QCameraParameters& params);
602     status_t setPictureFormat(const QCameraParameters& params);
603     status_t setSharpness(const QCameraParameters& params);
604     status_t setContrast(const QCameraParameters& params);
605     status_t setSaturation(const QCameraParameters& params);
606     status_t setWaveletDenoise(const QCameraParameters& params);
607     status_t setSceneMode(const QCameraParameters& params);
608     status_t setContinuousAf(const QCameraParameters& params);
609     status_t setFaceDetection(const char *str);
610     status_t setSceneDetect(const QCameraParameters& params);
611     status_t setStrTextures(const QCameraParameters& params);
612     status_t setPreviewFormat(const QCameraParameters& params);
613     status_t setSelectableZoneAf(const QCameraParameters& params);
614     status_t setOverlayFormats(const QCameraParameters& params);
615     status_t setHighFrameRate(const QCameraParameters& params);
616     status_t setRedeyeReduction(const QCameraParameters& params);
617     status_t setAEBracket(const QCameraParameters& params);
618     status_t setFaceDetect(const QCameraParameters& params);
619     status_t setDenoise(const QCameraParameters& params);
620     status_t setAecAwbLock(const QCameraParameters & params);
621     status_t setHistogram(int histogram_en);
622     status_t setRecordingHint(const QCameraParameters& params);
623     status_t setRecordingHintValue(const int32_t value);
624     status_t setFocusAreas(const QCameraParameters& params);
625     status_t setMeteringAreas(const QCameraParameters& params);
626     status_t setFullLiveshot(void);
627     status_t setDISMode(void);
628     status_t setCaptureBurstExp(void);
629     status_t setPowerMode(const QCameraParameters& params);
630     void takePicturePrepareHardware( );
631     status_t setNoDisplayMode(const QCameraParameters& params);
632     status_t setCAFLockCancel(void);
633 
634     isp3a_af_mode_t getAutoFocusMode(const QCameraParameters& params);
635     bool isValidDimension(int w, int h);
636 
637     String8 create_values_str(const str_map *values, int len);
638 
639     void setMyMode(int mode);
640     bool isZSLMode();
641     bool isWDenoiseEnabled();
642     void wdenoiseEvent(cam_ctrl_status_t status, void *cookie);
643     bool isLowPowerCamcorder();
644     void freePictureTable(void);
645     void freeVideoSizeTable(void);
646 
647     int32_t createPreview();
648     int32_t createRecord();
649     int32_t createSnapshot();
650 
651     int getHDRMode();
652     //EXIF
653     void addExifTag(exif_tag_id_t tagid, exif_tag_type_t type,
654                         uint32_t count, uint8_t copy, void *data);
655     void setExifTags();
656     void initExifData();
657     void deinitExifData();
658     void setExifTagsGPS();
getExifData()659     exif_tags_info_t* getExifData(){ return mExifData; }
getExifTableNumEntries()660     int getExifTableNumEntries() { return mExifTableNumEntries; }
661     void parseGPSCoordinate(const char *latlonString, rat_t* coord);
662     bool getHdrInfoAndSetExp( int max_num_frm, int *num_frame, int *exp);
663     void hdrEvent(cam_ctrl_status_t status, void *cookie);
664 
665     int           mCameraId;
666     camera_mode_t myMode;
667     bool mPauseFramedispatch;
668 
669     QCameraParameters    mParameters;
670     //sp<Overlay>         mOverlay;
671     int32_t             mMsgEnabled;
672 
673     camera_notify_callback         mNotifyCb;
674     camera_data_callback           mDataCb;
675     camera_data_timestamp_callback mDataCbTimestamp;
676     camera_request_memory          mGetMemory;
677     void                           *mCallbackCookie;
678 
679     sp<AshmemPool>      mMetaDataHeap;
680 
681     mutable Mutex       mLock;
682     //mutable Mutex       eventLock;
683     Mutex         mCallbackLock;
684     Mutex         mPreviewMemoryLock;
685     Mutex         mRecordingMemoryLock;
686     Mutex         mAutofocusLock;
687     Mutex         mMetaDataWaitLock;
688     Mutex         mRecordFrameLock;
689     Mutex         mRecordLock;
690     Condition     mRecordWait;
691     pthread_mutex_t     mAsyncCmdMutex;
692     pthread_cond_t      mAsyncCmdWait;
693 
694     QCameraStream       *mStreamDisplay;
695     QCameraStream       *mStreamRecord;
696     QCameraStream       *mStreamSnap;
697     QCameraStream       *mStreamLiveSnap;
698 
699     cam_ctrl_dimension_t mDimension;
700     int  mPreviewWidth, mPreviewHeight;
701     int  mVideoWidth, mVideoHeight;
702     int  thumbnailWidth, thumbnailHeight;
703     int  maxSnapshotWidth, maxSnapshotHeight;
704     int  mPreviewFormat;
705     int  mFps;
706     int  mDebugFps;
707     int  mBrightness;
708     int  mContrast;
709     int  mBestShotMode;
710     int  mEffects;
711     int  mSkinToneEnhancement;
712     int  mDenoiseValue;
713     int  mHJR;
714     int  mRotation;
715     int  mJpegQuality;
716     int  mThumbnailQuality;
717     int  mTargetSmoothZoom;
718     int  mSmoothZoomStep;
719     int  mMaxZoom;
720     int  mCurrentZoom;
721     int  mSupportedPictureSizesCount;
722     int  mFaceDetectOn;
723     int  mDumpFrmCnt;
724     int  mDumpSkipCnt;
725     int  mFocusMode;
726 
727     unsigned int mPictureSizeCount;
728     unsigned int mPreviewSizeCount;
729     int mPowerMode;
730     unsigned int mVideoSizeCount;
731 
732     bool mAutoFocusRunning;
733     bool mNeedToUnlockCaf;
734     bool mMultiTouch;
735     bool mHasAutoFocusSupport;
736     bool mInitialized;
737     bool mDisEnabled;
738     bool strTexturesOn;
739     bool mIs3DModeOn;
740     bool mSmoothZoomRunning;
741     bool mPreparingSnapshot;
742     bool mParamStringInitialized;
743     bool mZoomSupported;
744     bool mSendMetaData;
745     bool mFullLiveshotEnabled;
746     bool mRecordingHint;
747     bool mAppRecordingHint;
748     bool mStartRecording;
749     bool mReleasedRecordingFrame;
750     bool mStateLiveshot;
751     int mHdrMode;
752     int mSnapshotFormat;
753     int mZslInterval;
754     bool mRestartPreview;
755     bool isCameraOpen;
756 
757     led_mode_t mLedStatusForZsl;
758     bool mFlashCond;
759 
760 /*for histogram*/
761     int            mStatsOn;
762     int            mCurrentHisto;
763     bool           mSendData;
764     sp<AshmemPool> mStatHeap;
765     camera_memory_t *mStatsMapped[3];
766     QCameraStatHeap_t mHistServer;
767     int32_t        mStatSize;
768 
769     bool mZslLookBackMode;
770     int mZslLookBackValue;
771 	int mHFRLevel;
772     bool mZslEmptyQueueFlag;
773     String8 mEffectValues;
774     String8 mIsoValues;
775     String8 mSceneModeValues;
776     String8 mSceneDetectValues;
777     String8 mFocusModeValues;
778     String8 mSelectableZoneAfValues;
779     String8 mAutoExposureValues;
780     String8 mWhitebalanceValues;
781     String8 mAntibandingValues;
782     String8 mFrameRateModeValues;
783     String8 mTouchAfAecValues;
784     String8 mPreviewSizeValues;
785     String8 mPictureSizeValues;
786     String8 mVideoSizeValues;
787     String8 mFlashValues;
788     String8 mLensShadeValues;
789     String8 mMceValues;
790     String8 mHistogramValues;
791     String8 mSkinToneEnhancementValues;
792     String8 mPictureFormatValues;
793     String8 mDenoiseValues;
794     String8 mZoomRatioValues;
795     String8 mPreviewFrameRateValues;
796     String8 mPreviewFormatValues;
797     String8 mFaceDetectionValues;
798     String8 mHfrValues;
799     String8 mHfrSizeValues;
800     String8 mRedeyeReductionValues;
801     String8 denoise_value;
802     String8 mFpsRangesSupportedValues;
803     String8 mZslValues;
804     String8 mFocusDistance;
805 
806     friend class QCameraStream;
807     friend class QCameraStream_record;
808     friend class QCameraStream_preview;
809     friend class QCameraStream_Snapshot;
810 
811     camera_size_type* mPictureSizes;
812     camera_size_type* mPreviewSizes;
813     camera_size_type* mVideoSizes;
814     const camera_size_type * mPictureSizesPtr;
815     HAL_camera_state_type_t mCameraState;
816     void *libdnr;
817     int (*LINK_morpho_DNR_ProcessFrame)(unsigned char* yuvImage, int width, int height, int y_level, int c_level);
818 
819      /* Temporary - can be removed after Honeycomb*/
820 #ifdef USE_ION
821     sp<IonPool>  mPostPreviewHeap;
822 #else
823     sp<PmemPool> mPostPreviewHeap;
824 #endif
825      mm_cameara_stream_buf_t mPrevForPostviewBuf;
826      int mStoreMetaDataInFrame;
827      preview_stream_ops_t *mPreviewWindow;
828      Mutex                mStateLock;
829      int                  mPreviewState;
830      /*preview memory with display case: memory is allocated and freed via
831      gralloc */
832      QCameraHalMemory_t   mPreviewMemory;
833 
834      /*preview memory without display case: memory is allocated
835       directly by camera */
836      QCameraHalHeap_t     mNoDispPreviewMemory;
837 
838      QCameraHalHeap_t     mSnapshotMemory;
839      QCameraHalHeap_t     mThumbnailMemory;
840      QCameraHalHeap_t     mRecordingMemory;
841      QCameraHalHeap_t     mJpegMemory;
842      QCameraHalHeap_t     mRawMemory;
843      camera_frame_metadata_t mMetadata;
844      camera_face_t           mFace[MAX_ROI];
845      preview_format_info_t  mPreviewFormatInfo;
846      friend void liveshot_callback(mm_camera_ch_data_buf_t *frame,void *user_data);
847 
848      //EXIF
849      exif_tags_info_t       mExifData[MAX_EXIF_TABLE_ENTRIES];  //Exif tags for JPEG encoder
850      exif_values_t          mExifValues;                        //Exif values in usable format
851      int                    mExifTableNumEntries;            //NUmber of entries in mExifData
852      int                 mNoDisplayMode;
853      int                 mIsoValue;
854 
855      /* Used to show the process state of snapshot_jpeg_cb*/
856      Mutex                  mSnapJpegCbLock;
857      Condition              mSnapJpegCbWait;
858      bool                   mSnapJpegCbRunning;
859      bool                   mSnapCbDisabled;
860 };
861 
862 }; // namespace android
863 
864 #endif
865