blob: 128f3812a1fd8a6aa0799c9fc8fca5229019c3f7 [file] [log] [blame]
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001/*
2**
3** Copyright 2008, The Android Open Source Project
4** Copyright 2012, 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 ExynosCameraHWInterface2.h
21 * \brief header file for Android Camera API 2.0 HAL
22 * \author Sungjoong Kang(sj3.kang@samsung.com)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090023 * \date 2012/07/10
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070024 *
25 * <b>Revision History: </b>
26 * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n
27 * Initial Release
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090028 *
29 * - 2012/07/10 : Sungjoong Kang(sj3.kang@samsung.com) \n
30 * 2nd Release
31 *
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070032 */
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090033
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070034#ifndef EXYNOS_CAMERA_HW_INTERFACE_2_H
35#define EXYNOS_CAMERA_HW_INTERFACE_2_H
36
37#include <hardware/camera2.h>
38#include <camera/Camera.h>
39#include <camera/CameraParameters.h>
Sungjoong Kang52f54302012-09-04 21:43:06 +090040#include <utils/List.h>
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070041#include "SignalDrivenThread.h"
42#include "MetadataConverter.h"
43#include "exynos_v4l2.h"
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090044#include "ExynosRect.h"
45#include "ExynosBuffer.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070046#include "videodev2_exynos_camera.h"
47#include "gralloc_priv.h"
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090048#include "ExynosJpegEncoderForCamera.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070049#include <fcntl.h>
50#include "fimc-is-metadata.h"
51#include "ion.h"
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090052#include "ExynosExif.h"
53#include "csc.h"
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -070054#include "ExynosCamera2.h"
Sungjoong Kangeed7ed12012-08-23 16:35:08 -070055#include "cutils/properties.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070056
57namespace android {
58
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -070059//#define EXYNOS_CAMERA_LOG
Jiyoung Shin2adfa422012-09-10 23:14:54 +090060#define ENABLE_FRAME_SYNC
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070061#define NODE_PREFIX "/dev/video"
62
63#define NUM_MAX_STREAM_THREAD (5)
Sungjoong Kang52f54302012-09-04 21:43:06 +090064#define NUM_MAX_REQUEST_MGR_ENTRY (4)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090065#define NUM_MAX_CAMERA_BUFFERS (16)
66#define NUM_BAYER_BUFFERS (8)
Sungjoong Kang52f54302012-09-04 21:43:06 +090067#define NUM_MIN_SENSOR_QBUF (3)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070068
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090069#define PICTURE_GSC_NODE_NUM (2)
Sungjoong Kang15fd8232012-08-23 16:16:44 -070070#define VIDEO_GSC_NODE_NUM (1)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090071
Sungjoong Kang37e122d2012-08-08 11:13:48 -070072#define STREAM_TYPE_DIRECT (0)
73#define STREAM_TYPE_INDIRECT (1)
74
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090075#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<1)
76#define SIGNAL_MAIN_REPROCESS_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<2)
77#define SIGNAL_MAIN_STREAM_OUTPUT_DONE (SIGNAL_THREAD_COMMON_LAST<<3)
78#define SIGNAL_SENSOR_START_REQ_PROCESSING (SIGNAL_THREAD_COMMON_LAST<<4)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070079#define SIGNAL_STREAM_GET_BUFFER (SIGNAL_THREAD_COMMON_LAST<<5)
80#define SIGNAL_STREAM_PUT_BUFFER (SIGNAL_THREAD_COMMON_LAST<<6)
81#define SIGNAL_STREAM_CHANGE_PARAMETER (SIGNAL_THREAD_COMMON_LAST<<7)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090082#define SIGNAL_THREAD_RELEASE (SIGNAL_THREAD_COMMON_LAST<<8)
83#define SIGNAL_ISP_START_BAYER_INPUT (SIGNAL_THREAD_COMMON_LAST<<9)
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090084#define SIGNAL_ISP_START_BAYER_DEQUEUE (SIGNAL_THREAD_COMMON_LAST<<10)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070085
86#define SIGNAL_STREAM_DATA_COMING (SIGNAL_THREAD_COMMON_LAST<<15)
87
Sungjoong Kang0f26b202012-08-17 15:43:12 -070088#define NO_TRANSITION (0)
89#define HAL_AFSTATE_INACTIVE (1)
90#define HAL_AFSTATE_NEEDS_COMMAND (2)
91#define HAL_AFSTATE_STARTED (3)
92#define HAL_AFSTATE_SCANNING (4)
93#define HAL_AFSTATE_LOCKED (5)
94#define HAL_AFSTATE_FAILED (6)
95#define HAL_AFSTATE_NEEDS_DETERMINATION (7)
96#define HAL_AFSTATE_PASSIVE_FOCUSED (8)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090097
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -070098#ifdef EXYNOS_CAMERA_LOG
99#define CAM_LOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
100#define CAM_LOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
101#define CAM_LOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
102#define CAM_LOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
103#else
104#define CAM_LOGV(...) ((void)0)
105#define CAM_LOGD(...) ((void)0)
106#define CAM_LOGW(...) ((void)0)
107#define CAM_LOGE(...) ((void)0)
108#endif
109
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700110enum sensor_name {
111 SENSOR_NAME_S5K3H2 = 1,
112 SENSOR_NAME_S5K6A3 = 2,
113 SENSOR_NAME_S5K4E5 = 3,
114 SENSOR_NAME_S5K3H7 = 4,
115 SENSOR_NAME_CUSTOM = 5,
116 SENSOR_NAME_END
117};
118
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700119enum is_subscenario_id {
120 ISS_SUB_SCENARIO_STILL,
121 ISS_SUB_SCENARIO_VIDEO,
122 ISS_SUB_SCENARIO_SCENE1,
123 ISS_SUB_SCENARIO_SCENE2,
124 ISS_SUB_SCENARIO_SCENE3,
125 ISS_SUB_END
126};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700127
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900128int SUPPORT_THUMBNAIL_REAR_SIZE[][2] =
129{
130 {160, 120},
131 {160, 90},
132 {144, 96}
133};
134
135int SUPPORT_THUMBNAIL_FRONT_SIZE[][2] =
136{
137 {160, 120},
138 {160, 160},
139 {160, 90},
140 {144, 96}
141};
142
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700143enum is_flash_scenario_state {
144 IS_FLASH_ON = 1,
145 IS_FLASH_ON_DONE = 2,
Younghwan Joo9257e292012-09-08 21:11:18 -0700146 IS_FLASH_AE_AWB_LOCK_WAIT = 10,
147 IS_FLASH_AUTO_WAIT = 10,
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700148 IS_FLASH_CAPTURE,
Younghwan Joo9a710a42012-09-05 17:52:08 -0700149 IS_FLASH_CAPTURE_WAIT,
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700150 IS_FLASH_CAPTURE_JPEG,
151 IS_FLASH_CAPTURE_END,
152 IS_FLASH_MAX
153};
154
155enum is_af_flash_scenario_state {
156 IS_FLASH_AF_ON = 1,
157 IS_FLASH_AF_ON_START,
158 IS_FLASH_AF_ON_DONE,
Younghwan Joo9a710a42012-09-05 17:52:08 -0700159 IS_FLASH_AF_AUTO_AE_AWB_LOCK,
Younghwan Joocaea49e2012-09-07 13:34:20 -0700160 IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT,
Younghwan Joo9257e292012-09-08 21:11:18 -0700161 IS_FLASH_AF_AUTO_OFF_WAIT,
Younghwan Joo9a710a42012-09-05 17:52:08 -0700162 IS_FLASH_AF_AUTO_END,
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700163 IF_FLASH_AF_OFF,
164 IS_FLASH_AF_MAX
165};
166
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700167typedef struct node_info {
168 int fd;
169 int width;
170 int height;
171 int format;
172 int planes;
173 int buffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700174 enum v4l2_memory memory;
175 enum v4l2_buf_type type;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700176 ion_client ionClient;
177 ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700178 int status;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700179} node_info_t;
180
181
182typedef struct camera_hw_info {
183 int sensor_id;
184
185 node_info_t sensor;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900186 node_info_t isp;
187 node_info_t capture;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700188
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900189 /*shot*/ // temp
190 struct camera2_shot_ext dummy_shot;
191
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700192} camera_hw_info_t;
193
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900194typedef enum request_entry_status {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700195 EMPTY,
196 REGISTERED,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700197 REQUESTED,
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900198 CAPTURED,
199 METADONE
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700200} request_entry_status_t;
201
202typedef struct request_manager_entry {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900203 request_entry_status_t status;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900204 camera_metadata_t *original_request;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700205 struct camera2_shot_ext internal_shot;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900206 int output_stream_count;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700207} request_manager_entry_t;
208
Younghwan Joo9a710a42012-09-05 17:52:08 -0700209// structure related to a specific function of camera
210typedef struct flash_control_info {
211 // UI flash mode indicator
212 enum aa_aemode i_flashMode;
213 // AF flash
214 bool m_afFlashDoneFlg;
215 bool m_afFlashEnableFlg;
216 int m_afFlashCnt;
217 // Capture flash
218 bool m_flashEnableFlg;
219 bool m_flashCaptured;
220 int m_flashFrameCount;
221 int m_flashCnt;
222 int m_flashTimeOut;
223 int m_flashWaitCnt;
Younghwan Joocaea49e2012-09-07 13:34:20 -0700224 // Flash decision
225 // At flash auto mode only : 1 -> flash is needed, 0 -> normal case
226 bool m_flashDecisionResult;
227 // torch indicator. this will be replaced by flashMode meta
228 bool m_flashTorchMode;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700229} ctl_flash_info_t;
230
231typedef struct request_control_info {
232 ctl_flash_info_t flash;
233
234} ctl_request_info_t;
235
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700236class RequestManager {
237public:
238 RequestManager(SignalDrivenThread* main_thread);
239 ~RequestManager();
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900240 void ResetEntry();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700241 int GetNumEntries();
242 bool IsRequestQueueFull();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900243
244 void RegisterRequest(camera_metadata_t *new_request);
245 void DeregisterRequest(camera_metadata_t **deregistered_request);
246 bool PrepareFrame(size_t *num_entries, size_t *frame_size,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700247 camera_metadata_t **prepared_frame, int afState);
248 int MarkProcessingRequest(ExynosBuffer * buf, int *afMode);
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900249 void NotifyStreamOutput(int frameCnt);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900250 void DumpInfoWithIndex(int index);
Sungjoong Kangad378612012-08-17 12:34:33 -0700251 void ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900252 void CheckCompleted(int index);
Sungjoong Kangef6f83c2012-08-28 22:59:48 +0900253 void UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900254 void RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
255 uint64_t GetTimestamp(int frameCnt);
256 int FindFrameCnt(struct camera2_shot_ext * shot_ext);
257 int FindEntryIndexByFrameCnt(int frameCnt);
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700258 void Dump(void);
259 int GetNextIndex(int index);
260 void SetDefaultParameters(int cropX);
261 void SetInitialSkip(int count);
Sungjoong Kangad378612012-08-17 12:34:33 -0700262 int GetSkipCnt();
263 void SetFrameIndex(int index);
264 int GetFrameIndex();
Sungjoong Kang52f54302012-09-04 21:43:06 +0900265 void pushSensorQ(int index);
266 int popSensorQ();
267 void releaseSensorQ();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700268private:
269
270 MetadataConverter *m_metadataConverter;
271 SignalDrivenThread *m_mainThread;
272 int m_numOfEntries;
273 int m_entryInsertionIndex;
274 int m_entryProcessingIndex;
275 int m_entryFrameOutputIndex;
276 request_manager_entry_t entries[NUM_MAX_REQUEST_MGR_ENTRY];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900277 int m_completedIndex;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700278
279 Mutex m_requestMutex;
280
281 //TODO : alloc dynamically
282 char m_tempFrameMetadataBuf[2000];
283 camera_metadata_t *m_tempFrameMetadata;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900284
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700285 int m_sensorPipelineSkipCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900286 int m_cropX;
Sungjoong Kangad378612012-08-17 12:34:33 -0700287 int m_frameIndex;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700288 int m_lastAeMode;
289 int m_lastAaMode;
290 int m_lastAwbMode;
291 int m_lastAeComp;
Sungjoong Kang52f54302012-09-04 21:43:06 +0900292 List<int> m_sensorQ;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700293};
294
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900295
296typedef struct bayer_buf_entry {
297 int status;
298 int reqFrameCnt;
299 nsecs_t timeStamp;
300} bayer_buf_entry_t;
301
302
303class BayerBufManager {
304public:
305 BayerBufManager();
306 ~BayerBufManager();
307 int GetIndexForSensorEnqueue();
308 int MarkSensorEnqueue(int index);
309 int MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
310 int GetIndexForIspEnqueue(int *reqFrameCnt);
311 int GetIndexForIspDequeue(int *reqFrameCnt);
312 int MarkIspEnqueue(int index);
313 int MarkIspDequeue(int index);
314 int GetNumOnSensor();
315 int GetNumOnHalFilled();
316 int GetNumOnIsp();
317
318private:
319 int GetNextIndex(int index);
320
321 int sensorEnqueueHead;
322 int sensorDequeueHead;
323 int ispEnqueueHead;
324 int ispDequeueHead;
325 int numOnSensor;
326 int numOnIsp;
327 int numOnHalFilled;
328 int numOnHalEmpty;
329
330 bayer_buf_entry_t entries[NUM_BAYER_BUFFERS];
331};
332
333
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900334#define NOT_AVAILABLE (0)
335#define REQUIRES_DQ_FROM_SVC (1)
336#define ON_DRIVER (2)
337#define ON_HAL (3)
338#define ON_SERVICE (4)
339
340#define BAYER_NOT_AVAILABLE (0)
341#define BAYER_ON_SENSOR (1)
342#define BAYER_ON_HAL_FILLED (2)
343#define BAYER_ON_ISP (3)
344#define BAYER_ON_SERVICE (4)
345#define BAYER_ON_HAL_EMPTY (5)
346
347typedef struct stream_parameters {
348 int streamType;
349 uint32_t outputWidth;
350 uint32_t outputHeight;
351 uint32_t nodeWidth;
352 uint32_t nodeHeight;
353 int outputFormat;
354 int nodeFormat;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700355 const camera2_stream_ops_t* streamOps;
356 uint32_t usage;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900357 int numHwBuffers;
358 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700359 int numOwnSvcBuffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700360 int fd;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900361 int svcPlanes;
362 int nodePlanes;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +0900363 int metaPlanes;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900364 enum v4l2_memory memory;
365 enum v4l2_buf_type halBuftype;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700366 int numSvcBufsInHal;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900367 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
368 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangfeb7df42012-08-28 23:35:43 +0900369 ExynosBuffer metaBuffers[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900370 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700371 int svcBufIndex;
372 ion_client ionClient;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900373 node_info_t node;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700374} stream_parameters_t;
375
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900376typedef struct record_parameters {
377 uint32_t outputWidth;
378 uint32_t outputHeight;
379 int outputFormat;
380 const camera2_stream_ops_t* streamOps;
381 uint32_t usage;
382 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700383 int numOwnSvcBuffers;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900384 int svcPlanes;
385 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
386 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
387 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700388 int svcBufIndex;
389 int numSvcBufsInHal;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900390} record_parameters_t;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900391
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700392typedef struct callback_parameters {
393 uint32_t outputWidth;
394 uint32_t outputHeight;
395 int outputFormat;
396 int internalFormat;
397 int internalPlanes;
398 const camera2_stream_ops_t* streamOps;
399 uint32_t usage;
400 int numSvcBuffers;
401 int numOwnSvcBuffers;
402 int svcPlanes;
403 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
404 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
405 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
406 int svcBufIndex;
407 int numSvcBufsInHal;
408} callback_parameters_t;
409
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700410class ExynosCameraHWInterface2 : public virtual RefBase {
411public:
Sungjoong Kang6044e502012-08-27 00:29:28 -0700412 ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700413 virtual ~ExynosCameraHWInterface2();
414
415 virtual void release();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900416
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700417 inline int getCameraId() const;
418
419 virtual int setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
420 virtual int notifyRequestQueueNotEmpty();
421 virtual int setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
422 virtual int getInProgressCount();
423 virtual int flushCapturesInProgress();
424 virtual int constructDefaultRequest(int request_template, camera_metadata_t **request);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900425 virtual int allocateStream(uint32_t width, uint32_t height,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700426 int format, const camera2_stream_ops_t *stream_ops,
427 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
428 virtual int registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
429 virtual int releaseStream(uint32_t stream_id);
430 virtual int allocateReprocessStream(uint32_t width, uint32_t height,
431 uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
432 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
433 virtual int releaseReprocessStream(uint32_t stream_id);
434 virtual int triggerAction(uint32_t trigger_id, int ext1, int ext2);
435 virtual int setNotifyCallback(camera2_notify_callback notify_cb, void *user);
436 virtual int getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
437 virtual int dump(int fd);
438private:
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900439class MainThread : public SignalDrivenThread {
440 ExynosCameraHWInterface2 *mHardware;
441 public:
442 MainThread(ExynosCameraHWInterface2 *hw):
443 SignalDrivenThread(),
444 mHardware(hw) {
445// Start("MainThread", PRIORITY_DEFAULT, 0);
446 }
447 ~MainThread();
448 status_t readyToRunInternal()
449 {
450 return NO_ERROR;
451 }
452 void threadFunctionInternal()
453 {
454 mHardware->m_mainThreadFunc(this);
455 return;
456 }
457 void release(void);
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700458 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900459 };
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900460
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700461 class SensorThread : public SignalDrivenThread {
462 ExynosCameraHWInterface2 *mHardware;
463 public:
464 SensorThread(ExynosCameraHWInterface2 *hw):
465 SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0),
466 mHardware(hw),
467 m_isBayerOutputEnabled(false) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900468 ~SensorThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700469 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900470 mHardware->m_sensorThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700471 return NO_ERROR;
472 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900473 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700474 mHardware->m_sensorThreadFunc(this);
475 return;
476 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900477 void release(void);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700478 //private:
479 bool m_isBayerOutputEnabled;
480 int m_sensorFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700481 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900482 };
483
484 class IspThread : public SignalDrivenThread {
485 ExynosCameraHWInterface2 *mHardware;
486 public:
487 IspThread(ExynosCameraHWInterface2 *hw):
488 SignalDrivenThread("IspThread", PRIORITY_DEFAULT, 0),
489 mHardware(hw) { }
490 ~IspThread();
491 status_t readyToRunInternal() {
492 mHardware->m_ispThreadInitialize(this);
493 return NO_ERROR;
494 }
495 void threadFunctionInternal() {
496 mHardware->m_ispThreadFunc(this);
497 return;
498 }
499 void release(void);
500 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700501 int m_ispFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700502 bool m_releasing;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700503 };
504
505 class StreamThread : public SignalDrivenThread {
506 ExynosCameraHWInterface2 *mHardware;
507 public:
508 StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
509 SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0),
510 mHardware(hw),
511 m_index(new_index) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900512 ~StreamThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700513 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900514 mHardware->m_streamThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700515 return NO_ERROR;
516 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900517 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700518 mHardware->m_streamThreadFunc(this);
519 return;
520 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900521 void setRecordingParameter(record_parameters_t * recordParm);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700522 void setCallbackParameter(callback_parameters_t * callbackParm);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900523 void setParameter(stream_parameters_t * new_parameters);
524 void applyChange(void);
525 void release(void);
526 int findBufferIndex(void * bufAddr);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700527
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900528
529 uint8_t m_index;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900530 bool m_activated;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900531 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700532 stream_parameters_t m_parameters;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900533 stream_parameters_t *m_tempParameters;
534 record_parameters_t m_recordParameters;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700535 callback_parameters_t m_previewCbParameters;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900536 bool m_isBufferInit;
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700537 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900538 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700539
540 sp<MainThread> m_mainThread;
541 sp<SensorThread> m_sensorThread;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900542 sp<IspThread> m_ispThread;
543 sp<StreamThread> m_streamThreads[NUM_MAX_STREAM_THREAD];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700544
545
546
547 RequestManager *m_requestManager;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900548 BayerBufManager *m_BayerManager;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700549 ExynosCamera2 *m_camera2;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700550
551 void m_mainThreadFunc(SignalDrivenThread * self);
552 void m_sensorThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900553 void m_sensorThreadInitialize(SignalDrivenThread * self);
554 void m_ispThreadFunc(SignalDrivenThread * self);
555 void m_ispThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700556 void m_streamThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900557 void m_streamThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700558
Sungjoong Kang86646da2012-08-28 17:29:11 +0900559 void m_streamFunc0(SignalDrivenThread *self);
560 void m_streamFunc1(SignalDrivenThread *self);
561
562 void m_streamBufferInit(SignalDrivenThread *self);
563
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900564 void m_getAlignedYUVSize(int colorFormat, int w, int h,
565 ExynosBuffer *buf);
566 bool m_getRatioSize(int src_w, int src_h,
567 int dst_w, int dst_h,
568 int *crop_x, int *crop_y,
569 int *crop_w, int *crop_h,
570 int zoom);
571 int createIonClient(ion_client ionClient);
572 int deleteIonClient(ion_client ionClient);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900573
574 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
Sungjoong Kang181e4252012-08-29 02:11:07 -0700575 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum, int cacheFlag);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900576 void freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
577 void initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
578
579 void DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900580 bool m_checkThumbnailSize(int w, int h);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900581 bool yuv2Jpeg(ExynosBuffer *yuvBuf,
582 ExynosBuffer *jpegBuf,
583 ExynosRect *rect);
Sungjoong Kang6044e502012-08-27 00:29:28 -0700584 int InitializeISPChain();
Sungjoong Kangad378612012-08-17 12:34:33 -0700585 void StartISP();
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700586 int GetAfState();
587 void SetAfMode(enum aa_afmode afMode);
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700588 void OnAfTriggerStart(int id);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700589 void OnAfTrigger(int id);
590 void OnAfTriggerAutoMacro(int id);
591 void OnAfTriggerCAFPicture(int id);
592 void OnAfTriggerCAFVideo(int id);
593 void OnAfCancel(int id);
594 void OnAfCancelAutoMacro(int id);
595 void OnAfCancelCAFPicture(int id);
596 void OnAfCancelCAFVideo(int id);
597 void OnAfNotification(enum aa_afstate noti);
598 void OnAfNotificationAutoMacro(enum aa_afstate noti);
599 void OnAfNotificationCAFPicture(enum aa_afstate noti);
600 void OnAfNotificationCAFVideo(enum aa_afstate noti);
601 void SetAfStateForService(int newState);
602 int GetAfStateForService();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900603 exif_attribute_t mExifInfo;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700604 void m_setExifFixedAttribute(void);
605 void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
606 camera2_shot *currentEntry);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700607 void flashSetter(struct camera2_shot_ext * shot_ext);
Younghwan Joo9257e292012-09-08 21:11:18 -0700608 void flashListenerSensor(struct camera2_shot_ext * shot_ext);
609 void flashListenerISP(struct camera2_shot_ext * shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900610 void *m_exynosPictureCSC;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900611 void *m_exynosVideoCSC;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900612
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900613 int m_jpegEncodingFrameCnt;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700614
615 camera2_request_queue_src_ops_t *m_requestQueueOps;
616 camera2_frame_queue_dst_ops_t *m_frameQueueOps;
617 camera2_notify_callback m_notifyCb;
618 void *m_callbackCookie;
619
620 int m_numOfRemainingReqInSvc;
621 bool m_isRequestQueuePending;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900622 bool m_isRequestQueueNull;
623 camera2_device_t *m_halDevice;
624 static gralloc_module_t const* m_grallocHal;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700625
626
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900627 camera_hw_info_t m_camera_info;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700628
629 ion_client m_ionCameraClient;
630
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900631 bool m_isSensorThreadOn;
632 bool m_isSensorStarted;
Sungjoong Kangad378612012-08-17 12:34:33 -0700633 bool m_isIspStarted;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900634
Sungjoong Kangad378612012-08-17 12:34:33 -0700635 int m_need_streamoff;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900636
637 bool m_initFlag1;
638 bool m_initFlag2;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900639
640 int indexToQueue[3+1];
641 int m_fd_scp;
642
643 bool m_scp_flushing;
644 bool m_closing;
645 ExynosBuffer m_resizeBuf;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900646 bool m_recordingEnabled;
647 int m_previewOutput;
648 int m_recordOutput;
649 bool m_needsRecordBufferInit;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700650 ExynosBuffer m_previewCbBuf;
651 int m_previewCbEnabled;
652 int m_previewCbOutput;
653 bool m_needsPreviewCbBufferInit;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900654 int lastFrameCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900655 int m_cameraId;
656 bool m_scp_closing;
657 bool m_scp_closed;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700658 bool m_wideAspect;
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700659 bool m_aspectChanged;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700660 uint32_t lastAfRegion[4];
hyeonmyeong Choi308291d2012-08-29 13:55:01 -0700661 float m_zoomRatio;
Sungjoong Kangad378612012-08-17 12:34:33 -0700662
663 mutable Mutex m_qbufLock;
664
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700665 int m_afState;
666 int m_afTriggerId;
667 enum aa_afmode m_afMode;
668 enum aa_afmode m_afMode2;
669 bool m_IsAfModeUpdateRequired;
670 bool m_IsAfTriggerRequired;
671 bool m_IsAfLockRequired;
672 int m_serviceAfState;
Sungjoong Kang36c106c2012-08-23 17:38:20 -0700673 bool m_AfHwStateFailed;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700674 int m_afPendingTriggerId;
675 int m_afModeWaitingCnt;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700676 struct camera2_shot m_jpegMetadata;
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700677 int m_scpOutputSignalCnt;
678 int m_scpOutputImageCnt;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700679 int m_nightCaptureCnt;
680 int m_nightCaptureFrameCnt;
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900681 int m_thumbNailW;
682 int m_thumbNailH;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700683 ctl_request_info_t m_ctlInfo;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700684};
685
686}; // namespace android
687
688#endif