blob: 3eabeeba453a08960116ee5874fbfbe75482f5e7 [file] [log] [blame]
Jiyoung Shin9426c422012-04-02 16:22:36 -07001/*
2**
3** Copyright 2008, The Android Open Source Project
4** Copyright 2010, Samsung Electronics Co. LTD
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19/*!
20 * \file ExynosCameraHWInterface.h
21 * \brief hearder file for Android Camera HAL
22 * \author thun.hwang(thun.hwang@samsung.com)
23 * \date 2010/06/03
24 *
25 * <b>Revision History: </b>
26 * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n
27 * Initial version
28 *
29 * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n
30 * Change file, class name to ExynosXXX.
31 *
32 */
33
34#ifndef EXYNOS_CAMERA_HW_INTERFACE_H
35
36#include <utils/threads.h>
37#include <utils/RefBase.h>
38#include <binder/MemoryBase.h>
39#include <binder/MemoryHeapBase.h>
Jiyoung Shin9426c422012-04-02 16:22:36 -070040#include <hardware/camera.h>
41#include <hardware/gralloc.h>
42#include <camera/Camera.h>
43#include <camera/CameraParameters.h>
Dima Zavinf4979f52012-05-01 21:49:24 -070044#include <media/hardware/MetadataBufferType.h>
Jiyoung Shin9426c422012-04-02 16:22:36 -070045
46#include "gralloc_priv.h"
47
48#include "exynos_format.h"
49#include "csc.h"
50#include "ExynosCamera.h"
51
52#include <fcntl.h>
53#include <sys/mman.h>
54
55#define USE_EGL (1)
56
57#define NUM_OF_PREVIEW_BUF (8)
58#define NUM_OF_VIDEO_BUF (8)
59#define NUM_OF_PICTURE_BUF (6)
60#define NUM_OF_WAITING_PUT_PICTURE_BUF (1)
61
62#define NUM_OF_DETECTED_FACES (32)
63
64namespace android {
65
66class ExynosCameraHWInterface : public virtual RefBase {
67public:
68 ExynosCameraHWInterface(int cameraId, camera_device_t *dev);
69 virtual ~ExynosCameraHWInterface();
70
71 virtual status_t setPreviewWindow(preview_stream_ops *w);
72 virtual void setCallbacks(camera_notify_callback notify_cb,
73 camera_data_callback data_cb,
74 camera_data_timestamp_callback data_cb_timestamp,
75 camera_request_memory get_memory,
76 void *user);
77
78 virtual void enableMsgType(int32_t msgType);
79 virtual void disableMsgType(int32_t msgType);
80 virtual bool msgTypeEnabled(int32_t msgType);
81
82 virtual status_t startPreview();
83 virtual void stopPreview();
84 virtual bool previewEnabled();
85
86 virtual status_t storeMetaDataInBuffers(bool enable);
87
88 virtual status_t startRecording();
89 virtual void stopRecording();
90 virtual bool recordingEnabled();
91 virtual void releaseRecordingFrame(const void *opaque);
92
93 virtual status_t autoFocus();
94 virtual status_t cancelAutoFocus();
95
96 virtual status_t takePicture();
97 virtual status_t cancelPicture();
98
99 virtual status_t setParameters(const CameraParameters& params);
100 virtual CameraParameters getParameters() const;
101 virtual status_t sendCommand(int32_t command, int32_t arg1, int32_t arg2);
102
103 virtual void release();
104
105 virtual status_t dump(int fd) const;
106
107 inline int getCameraId() const;
108
109private:
110 class PreviewThread : public Thread {
111 ExynosCameraHWInterface *mHardware;
112 public:
113 PreviewThread(ExynosCameraHWInterface *hw):
114 Thread(false),
115 mHardware(hw) { }
116 virtual void onFirstRef() {
117 //run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY);
118 run("CameraPreviewThread", PRIORITY_DEFAULT);
119 }
120 virtual bool threadLoop() {
121 mHardware->m_previewThreadFuncWrapper();
122 return false;
123 }
124 };
125
126 class VideoThread : public Thread {
127 ExynosCameraHWInterface *mHardware;
128 public:
129 VideoThread(ExynosCameraHWInterface *hw):
130 Thread(false),
131 mHardware(hw) { }
132 virtual void onFirstRef() {
133 run("CameraVideoThread", PRIORITY_DEFAULT);
134 }
135 virtual bool threadLoop() {
136 mHardware->m_videoThreadFuncWrapper();
137 return false;
138 }
139 };
140
141 class PictureThread : public Thread {
142 ExynosCameraHWInterface *mHardware;
143 public:
144 PictureThread(ExynosCameraHWInterface *hw):
145 Thread(false),
146 mHardware(hw) { }
147 virtual bool threadLoop() {
148 mHardware->m_pictureThreadFunc();
149 return false;
150 }
151 };
152
153 class AutoFocusThread : public Thread {
154 ExynosCameraHWInterface *mHardware;
155 public:
156 AutoFocusThread(ExynosCameraHWInterface *hw): Thread(false), mHardware(hw) { }
157 virtual void onFirstRef() {
158 run("CameraAutoFocusThread", PRIORITY_DEFAULT);
159 }
160 virtual bool threadLoop() {
161 mHardware->m_autoFocusThreadFunc();
162 return true;
163 }
164 };
165
166private:
167 void m_initDefaultParameters(int cameraId);
168
169 bool m_startPreviewInternal(void);
170 void m_stopPreviewInternal(void);
171
172 bool m_previewThreadFuncWrapper(void);
173 bool m_previewThreadFunc(void);
174 bool m_videoThreadFuncWrapper(void);
175 bool m_videoThreadFunc(void);
176 bool m_autoFocusThreadFunc(void);
177
178 bool m_startPictureInternal(void);
179 bool m_stopPictureInternal(void);
180 bool m_pictureThreadFunc(void);
181
182 int m_saveJpeg(unsigned char *real_jpeg, int jpeg_size);
183 void m_savePostView(const char *fname, uint8_t *buf,
184 uint32_t size);
185 int m_decodeInterleaveData(unsigned char *pInterleaveData,
186 int interleaveDataSize,
187 int yuvWidth,
188 int yuvHeight,
189 int *pJpegSize,
190 void *pJpegData,
191 void *pYuvData);
192 bool m_YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight);
193 bool m_scaleDownYuv422(char *srcBuf, uint32_t srcWidth,
194 uint32_t srcHight, char *dstBuf,
195 uint32_t dstWidth, uint32_t dstHight);
196
197 bool m_checkVideoStartMarker(unsigned char *pBuf);
198 bool m_checkEOIMarker(unsigned char *pBuf);
199 bool m_findEOIMarkerInJPEG(unsigned char *pBuf,
200 int dwBufSize, int *pnJPEGsize);
201 bool m_splitFrame(unsigned char *pFrame, int dwSize,
202 int dwJPEGLineLength, int dwVideoLineLength,
203 int dwVideoHeight, void *pJPEG,
204 int *pdwJPEGSize, void *pVideo,
205 int *pdwVideoSize);
206 void m_setSkipFrame(int frame);
207 bool m_isSupportedPreviewSize(const int width, const int height) const;
208
209 void m_getAlignedYUVSize(int colorFormat, int w, int h, ExynosBuffer *buf);
210
211 bool m_getResolutionList(String8 & string8Buf, char * strBuf, int w, int h);
212
213 bool m_getZoomRatioList(String8 & string8Buf, char * strBuf, int maxZoom, int start, int end);
214
215 int m_bracketsStr2Ints(char *str, int num, ExynosRect2 *rect2s, int *weights);
216 bool m_subBracketsStr2Ints(int num, char *str, int *arr);
217 bool m_getRatioSize(int src_w, int src_h,
218 int dst_w, int dst_h,
219 int *crop_x, int *crop_y,
220 int *crop_w, int *crop_h,
221 int zoom);
222 int m_calibratePosition(int w, int new_w, int x);
223#ifdef LOG_NDEBUG
224 bool m_fileDump(char *filename, void *srcBuf, uint32_t size);
225#endif
226
227private:
228 sp<PreviewThread> m_previewThread;
229 sp<VideoThread> m_videoThread;
230 sp<AutoFocusThread> m_autoFocusThread;
231 sp<PictureThread> m_pictureThread;
232
233 /* used by auto focus thread to block until it's told to run */
234 mutable Mutex m_focusLock;
235 mutable Condition m_focusCondition;
236 bool m_exitAutoFocusThread;
237
238 /* used by preview thread to block until it's told to run */
239 mutable Mutex m_previewLock;
240 mutable Condition m_previewCondition;
241 mutable Condition m_previewStoppedCondition;
242 bool m_previewRunning;
243 bool m_exitPreviewThread;
244 bool m_previewStartDeferred;
245
246 mutable Mutex m_videoLock;
247 mutable Condition m_videoCondition;
248 mutable Condition m_videoStoppedCondition;
249 bool m_videoRunning;
250 bool m_videoStart;
251 bool m_exitVideoThread;
252 bool m_recordingHint;
253
254 void *m_grallocVirtAddr[NUM_OF_PREVIEW_BUF];
255 int m_matchedGrallocIndex[NUM_OF_PREVIEW_BUF];
256 ExynosBuffer m_pictureBuf;
257 ExynosBuffer copy_previewBuf;
258
259 struct ExynosBufferQueue {
260 ExynosBuffer buf;
261 ExynosBufferQueue *next;
262 };
263
264 ExynosBufferQueue *m_oldPictureBufQueueHead;
265 ExynosBufferQueue m_oldPictureBufQueue[NUM_OF_PICTURE_BUF];
266 mutable Mutex m_pictureLock;
267 mutable Condition m_pictureCondition;
268 bool m_pictureRunning;
269 bool m_captureInProgress;
270 int m_numOfAvaliblePictureBuf;
271
272 ExynosRect m_orgPreviewRect;
273 ExynosRect m_orgPictureRect;
274 ExynosRect m_orgVideoRect;
275
276 void *m_exynosPreviewCSC;
277 void *m_exynosPictureCSC;
278 void *m_exynosVideoCSC;
279
280 preview_stream_ops *m_previewWindow;
281
282 /* used to guard threading state */
283 mutable Mutex m_stateLock;
284
285 CameraParameters m_params;
286 CameraParameters m_internalParams;
287
288 camera_memory_t *m_previewHeap[NUM_OF_PREVIEW_BUF];
289 buffer_handle_t *m_previewBufHandle[NUM_OF_PREVIEW_BUF];
290 int m_previewStride[NUM_OF_PREVIEW_BUF];
291 bool m_avaliblePreviewBufHandle[NUM_OF_PREVIEW_BUF];
292 bool m_flagGrallocLocked[NUM_OF_PREVIEW_BUF];
293 int m_minUndequeuedBufs;
294 int m_numOfAvailableVideoBuf;
295 int m_cntVideoBuf;
296
297 camera_memory_t *m_videoHeap[NUM_OF_VIDEO_BUF];
298 camera_memory_t *m_resizedVideoHeap[NUM_OF_VIDEO_BUF];
299 camera_memory_t *m_pictureHeap[NUM_OF_PICTURE_BUF];
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700300 int m_pictureFds[NUM_OF_PICTURE_BUF][3];
Jiyoung Shin9426c422012-04-02 16:22:36 -0700301 camera_memory_t *m_rawHeap;
Rebecca Schultz Zavin471812b2012-05-15 16:49:56 -0700302 int m_ion_client;
Jiyoung Shin9426c422012-04-02 16:22:36 -0700303
304 camera_frame_metadata_t m_frameMetadata;
305 camera_face_t m_faces[NUM_OF_DETECTED_FACES];
306 bool m_faceDetected;
307
308 ExynosCamera *m_secCamera;
309
310 mutable Mutex m_skipFrameLock;
311 int m_skipFrame;
312
313 camera_notify_callback m_notifyCb;
314 camera_data_callback m_dataCb;
315 camera_data_timestamp_callback m_dataCbTimestamp;
316 camera_request_memory m_getMemoryCb;
317 void *m_callbackCookie;
318
319 int32_t m_msgEnabled;
320
321 Vector<Size> m_supportedPreviewSizes;
322
323 camera_device_t *m_halDevice;
324 static gralloc_module_t const* m_grallocHal;
325};
326
327}; // namespace android
328
329#endif