blob: c105e3faf363e4fdbec3c1e7acd4d8221bf2602a [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 Kang1c5e6922012-09-22 00:47:33 -070064#define NUM_MAX_REQUEST_MGR_ENTRY (5)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090065#define NUM_MAX_CAMERA_BUFFERS (16)
66#define NUM_BAYER_BUFFERS (8)
Sungjoong Kangac8c2062012-09-14 02:46:47 -070067#define NUM_SCC_BUFFERS (8)
68#define NUM_SCP_BUFFERS (8)
Sungjoong Kang52f54302012-09-04 21:43:06 +090069#define NUM_MIN_SENSOR_QBUF (3)
Sungjoong Kang5506ceb2012-09-11 20:41:10 -070070#define NUM_MAX_SUBSTREAM (4)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070071
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090072#define PICTURE_GSC_NODE_NUM (2)
Sungjoong Kang15fd8232012-08-23 16:16:44 -070073#define VIDEO_GSC_NODE_NUM (1)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090074
Sungjoong Kang37e122d2012-08-08 11:13:48 -070075#define STREAM_TYPE_DIRECT (0)
76#define STREAM_TYPE_INDIRECT (1)
77
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090078#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<1)
Sungjoong Kang5506ceb2012-09-11 20:41:10 -070079
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090080#define SIGNAL_MAIN_STREAM_OUTPUT_DONE (SIGNAL_THREAD_COMMON_LAST<<3)
81#define SIGNAL_SENSOR_START_REQ_PROCESSING (SIGNAL_THREAD_COMMON_LAST<<4)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070082
Sungjoong Kang5506ceb2012-09-11 20:41:10 -070083#define SIGNAL_THREAD_RELEASE (SIGNAL_THREAD_COMMON_LAST<<8)
84
85#define SIGNAL_STREAM_REPROCESSING_START (SIGNAL_THREAD_COMMON_LAST<<14)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070086#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
Sungjoong Kang5506ceb2012-09-11 20:41:10 -070098#define STREAM_ID_PREVIEW (0)
99#define STREAM_MASK_PREVIEW (1<<STREAM_ID_PREVIEW)
100#define STREAM_ID_RECORD (1)
101#define STREAM_MASK_RECORD (1<<STREAM_ID_RECORD)
102#define STREAM_ID_PRVCB (2)
103#define STREAM_MASK_PRVCB (1<<STREAM_ID_PRVCB)
104#define STREAM_ID_JPEG (4)
105#define STREAM_MASK_JPEG (1<<STREAM_ID_JPEG)
106#define STREAM_ID_ZSL (5)
107#define STREAM_MASK_ZSL (1<<STREAM_ID_ZSL)
108
109#define STREAM_ID_JPEG_REPROCESS (8)
110#define STREAM_ID_LAST STREAM_ID_JPEG_REPROCESS
111
112#define MASK_OUTPUT_SCP (STREAM_MASK_PREVIEW|STREAM_MASK_RECORD|STREAM_MASK_PRVCB)
113#define MASK_OUTPUT_SCC (STREAM_MASK_JPEG|STREAM_MASK_ZSL)
114
115#define SUBSTREAM_TYPE_NONE (0)
116#define SUBSTREAM_TYPE_JPEG (1)
117#define SUBSTREAM_TYPE_RECORD (2)
118#define SUBSTREAM_TYPE_PRVCB (3)
119#define FLASH_STABLE_WAIT_TIMEOUT (10)
120
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -0700121#ifdef EXYNOS_CAMERA_LOG
122#define CAM_LOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
123#define CAM_LOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
124#define CAM_LOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
125#define CAM_LOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
126#else
127#define CAM_LOGV(...) ((void)0)
128#define CAM_LOGD(...) ((void)0)
129#define CAM_LOGW(...) ((void)0)
130#define CAM_LOGE(...) ((void)0)
131#endif
132
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700133enum sensor_name {
134 SENSOR_NAME_S5K3H2 = 1,
135 SENSOR_NAME_S5K6A3 = 2,
136 SENSOR_NAME_S5K4E5 = 3,
137 SENSOR_NAME_S5K3H7 = 4,
138 SENSOR_NAME_CUSTOM = 5,
139 SENSOR_NAME_END
140};
141
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700142enum is_subscenario_id {
143 ISS_SUB_SCENARIO_STILL,
144 ISS_SUB_SCENARIO_VIDEO,
145 ISS_SUB_SCENARIO_SCENE1,
146 ISS_SUB_SCENARIO_SCENE2,
147 ISS_SUB_SCENARIO_SCENE3,
148 ISS_SUB_END
149};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700150
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900151int SUPPORT_THUMBNAIL_REAR_SIZE[][2] =
152{
153 {160, 120},
154 {160, 90},
155 {144, 96}
156};
157
158int SUPPORT_THUMBNAIL_FRONT_SIZE[][2] =
159{
160 {160, 120},
161 {160, 160},
162 {160, 90},
163 {144, 96}
164};
165
Younghwan Jooe117f752012-09-12 22:21:55 -0700166enum is_set_flash_command_state {
167 IS_FLASH_STATE_NONE = 0,
168 IS_FLASH_STATE_ON = 1,
169 IS_FLASH_STATE_ON_WAIT,
170 IS_FLASH_STATE_ON_DONE,
171 IS_FLASH_STATE_AUTO_AE_AWB_LOCK,
172 IS_FLASH_STATE_AE_AWB_LOCK_WAIT,
173 IS_FLASH_STATE_AUTO_WAIT,
174 IS_FLASH_STATE_AUTO_DONE,
175 IS_FLASH_STATE_AUTO_OFF,
176 IS_FLASH_STATE_CAPTURE,
177 IS_FLASH_STATE_CAPTURE_WAIT,
178 IS_FLASH_STATE_CAPTURE_JPEG,
179 IS_FLASH_STATE_CAPTURE_END,
180 IS_FALSH_STATE_MAX
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700181};
182
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700183enum is_set_command_state {
184 IS_COMMAND_NONE = 0,
185 IS_COMMAND_EXECUTION,
186 IS_COMMAND_CLEAR,
187 IS_COMMAND_MAX
188};
189
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700190typedef struct node_info {
191 int fd;
192 int width;
193 int height;
194 int format;
195 int planes;
196 int buffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700197 enum v4l2_memory memory;
198 enum v4l2_buf_type type;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700199 ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700200 int status;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700201} node_info_t;
202
203
204typedef struct camera_hw_info {
205 int sensor_id;
206
207 node_info_t sensor;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900208 node_info_t isp;
209 node_info_t capture;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700210 node_info_t scp;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700211
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900212 /*shot*/ // temp
213 struct camera2_shot_ext dummy_shot;
214
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700215} camera_hw_info_t;
216
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900217typedef enum request_entry_status {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700218 EMPTY,
219 REGISTERED,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700220 REQUESTED,
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900221 CAPTURED,
222 METADONE
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700223} request_entry_status_t;
224
225typedef struct request_manager_entry {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900226 request_entry_status_t status;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900227 camera_metadata_t *original_request;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700228 struct camera2_shot_ext internal_shot;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900229 int output_stream_count;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700230} request_manager_entry_t;
231
Younghwan Joo9a710a42012-09-05 17:52:08 -0700232// structure related to a specific function of camera
Younghwan Joo4a9565a2012-09-19 18:41:35 -0700233typedef struct af_control_info {
234 int m_afTriggerTimeOut;
235} ctl_af_info_t;
236
Younghwan Joo9a710a42012-09-05 17:52:08 -0700237typedef struct flash_control_info {
238 // UI flash mode indicator
239 enum aa_aemode i_flashMode;
240 // AF flash
241 bool m_afFlashDoneFlg;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700242 // Capture flash
243 bool m_flashEnableFlg;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700244 int m_flashFrameCount;
245 int m_flashCnt;
246 int m_flashTimeOut;
Younghwan Joocaea49e2012-09-07 13:34:20 -0700247 // Flash decision
248 // At flash auto mode only : 1 -> flash is needed, 0 -> normal case
249 bool m_flashDecisionResult;
250 // torch indicator. this will be replaced by flashMode meta
251 bool m_flashTorchMode;
Younghwan Jooe117f752012-09-12 22:21:55 -0700252 // for precapture metering
253 int m_precaptureState;
254 int m_precaptureTriggerId;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700255} ctl_flash_info_t;
256
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700257typedef struct awb_control_info {
258 // UI awb mode indicator
259 enum aa_awbmode i_awbMode;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700260} ctl_awb_info_t;
261
Younghwan Joo73f5ad62012-09-16 21:05:30 -0700262typedef struct ae_control_info {
263 // pre-capture notification state
264 enum ae_state aeStateNoti;
265} ctl_ae_info_t;
266
Younghwan Joo275c9742012-09-25 21:12:30 +0900267typedef struct scene_control_info {
268 // pre-capture notification state
269 enum aa_scene_mode prevSceneMode;
270} ctl_scene_info_t;
271
Younghwan Joo9a710a42012-09-05 17:52:08 -0700272typedef struct request_control_info {
273 ctl_flash_info_t flash;
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700274 ctl_awb_info_t awb;
Younghwan Joo73f5ad62012-09-16 21:05:30 -0700275 ctl_ae_info_t ae;
Younghwan Joo4a9565a2012-09-19 18:41:35 -0700276 ctl_af_info_t af;
Younghwan Joo275c9742012-09-25 21:12:30 +0900277 ctl_scene_info_t scene;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700278} ctl_request_info_t;
279
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700280class RequestManager {
281public:
282 RequestManager(SignalDrivenThread* main_thread);
283 ~RequestManager();
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900284 void ResetEntry();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700285 int GetNumEntries();
286 bool IsRequestQueueFull();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900287
288 void RegisterRequest(camera_metadata_t *new_request);
289 void DeregisterRequest(camera_metadata_t **deregistered_request);
290 bool PrepareFrame(size_t *num_entries, size_t *frame_size,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700291 camera_metadata_t **prepared_frame, int afState);
292 int MarkProcessingRequest(ExynosBuffer * buf, int *afMode);
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900293 void NotifyStreamOutput(int frameCnt);
Sungjoong Kangad378612012-08-17 12:34:33 -0700294 void ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900295 void CheckCompleted(int index);
Younghwan Joo53f62ad2012-09-12 11:50:04 -0700296 void UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt, ctl_request_info_t *ctl_info);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900297 void RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700298 nsecs_t GetTimestampByFrameCnt(int frameCnt);
299 nsecs_t GetTimestamp(int index);
Sungjoong Kang2f4d1752012-09-17 16:50:07 -0700300 uint8_t GetOutputStreamByFrameCnt(int frameCnt);
301 uint8_t GetOutputStream(int index);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900302 int FindFrameCnt(struct camera2_shot_ext * shot_ext);
hyeonmyeong Choi5c88d1f2012-09-13 02:05:37 -0700303 bool IsVdisEnable(void);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900304 int FindEntryIndexByFrameCnt(int frameCnt);
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700305 void Dump(void);
306 int GetNextIndex(int index);
307 void SetDefaultParameters(int cropX);
308 void SetInitialSkip(int count);
Sungjoong Kangad378612012-08-17 12:34:33 -0700309 int GetSkipCnt();
310 void SetFrameIndex(int index);
311 int GetFrameIndex();
Sungjoong Kang52f54302012-09-04 21:43:06 +0900312 void pushSensorQ(int index);
313 int popSensorQ();
314 void releaseSensorQ();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700315private:
316
317 MetadataConverter *m_metadataConverter;
318 SignalDrivenThread *m_mainThread;
319 int m_numOfEntries;
320 int m_entryInsertionIndex;
321 int m_entryProcessingIndex;
322 int m_entryFrameOutputIndex;
323 request_manager_entry_t entries[NUM_MAX_REQUEST_MGR_ENTRY];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900324 int m_completedIndex;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700325
326 Mutex m_requestMutex;
327
328 //TODO : alloc dynamically
329 char m_tempFrameMetadataBuf[2000];
330 camera_metadata_t *m_tempFrameMetadata;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900331
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700332 int m_sensorPipelineSkipCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900333 int m_cropX;
Sungjoong Kangad378612012-08-17 12:34:33 -0700334 int m_frameIndex;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700335 int m_lastAeMode;
336 int m_lastAaMode;
337 int m_lastAwbMode;
338 int m_lastAeComp;
hyeonmyeong Choi5c88d1f2012-09-13 02:05:37 -0700339 bool m_vdisBubbleEn;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700340 nsecs_t m_lastTimeStamp;
Sungjoong Kang52f54302012-09-04 21:43:06 +0900341 List<int> m_sensorQ;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700342};
343
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900344
345typedef struct bayer_buf_entry {
346 int status;
347 int reqFrameCnt;
348 nsecs_t timeStamp;
349} bayer_buf_entry_t;
350
351
352class BayerBufManager {
353public:
354 BayerBufManager();
355 ~BayerBufManager();
356 int GetIndexForSensorEnqueue();
357 int MarkSensorEnqueue(int index);
358 int MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
359 int GetIndexForIspEnqueue(int *reqFrameCnt);
360 int GetIndexForIspDequeue(int *reqFrameCnt);
361 int MarkIspEnqueue(int index);
362 int MarkIspDequeue(int index);
363 int GetNumOnSensor();
364 int GetNumOnHalFilled();
365 int GetNumOnIsp();
366
367private:
368 int GetNextIndex(int index);
369
370 int sensorEnqueueHead;
371 int sensorDequeueHead;
372 int ispEnqueueHead;
373 int ispDequeueHead;
374 int numOnSensor;
375 int numOnIsp;
376 int numOnHalFilled;
377 int numOnHalEmpty;
378
379 bayer_buf_entry_t entries[NUM_BAYER_BUFFERS];
380};
381
382
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900383#define NOT_AVAILABLE (0)
384#define REQUIRES_DQ_FROM_SVC (1)
385#define ON_DRIVER (2)
386#define ON_HAL (3)
387#define ON_SERVICE (4)
388
389#define BAYER_NOT_AVAILABLE (0)
390#define BAYER_ON_SENSOR (1)
391#define BAYER_ON_HAL_FILLED (2)
392#define BAYER_ON_ISP (3)
393#define BAYER_ON_SERVICE (4)
394#define BAYER_ON_HAL_EMPTY (5)
395
396typedef struct stream_parameters {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700397 uint32_t width;
398 uint32_t height;
399 int format;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700400 const camera2_stream_ops_t* streamOps;
401 uint32_t usage;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900402 int numHwBuffers;
403 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700404 int numOwnSvcBuffers;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700405 int planes;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +0900406 int metaPlanes;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700407 int numSvcBufsInHal;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900408 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
409 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700410 ExynosBuffer metaBuffers[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900411 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700412 int bufIndex;
413 node_info_t *node;
414 int minUndequedBuffer;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700415} stream_parameters_t;
416
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700417typedef struct substream_parameters {
418 int type;
419 uint32_t width;
420 uint32_t height;
421 int format;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900422 const camera2_stream_ops_t* streamOps;
423 uint32_t usage;
424 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700425 int numOwnSvcBuffers;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700426 int internalFormat;
427 int internalPlanes;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700428 int svcPlanes;
429 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
430 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
431 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
432 int svcBufIndex;
433 int numSvcBufsInHal;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700434 bool needBufferInit;
435 int minUndequedBuffer;
436} substream_parameters_t;
437
438typedef struct substream_entry {
439 int priority;
440 int streamId;
441} substream_entry_t;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700442
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700443class ExynosCameraHWInterface2 : public virtual RefBase {
444public:
Sungjoong Kang6044e502012-08-27 00:29:28 -0700445 ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700446 virtual ~ExynosCameraHWInterface2();
447
448 virtual void release();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900449
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700450 inline int getCameraId() const;
451
452 virtual int setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
453 virtual int notifyRequestQueueNotEmpty();
454 virtual int setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
455 virtual int getInProgressCount();
456 virtual int flushCapturesInProgress();
457 virtual int constructDefaultRequest(int request_template, camera_metadata_t **request);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900458 virtual int allocateStream(uint32_t width, uint32_t height,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700459 int format, const camera2_stream_ops_t *stream_ops,
460 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
461 virtual int registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
462 virtual int releaseStream(uint32_t stream_id);
463 virtual int allocateReprocessStream(uint32_t width, uint32_t height,
464 uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
465 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700466 virtual int allocateReprocessStreamFromStream(uint32_t output_stream_id,
467 const camera2_stream_in_ops_t *reprocess_stream_ops, uint32_t *stream_id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700468 virtual int releaseReprocessStream(uint32_t stream_id);
469 virtual int triggerAction(uint32_t trigger_id, int ext1, int ext2);
470 virtual int setNotifyCallback(camera2_notify_callback notify_cb, void *user);
471 virtual int getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
472 virtual int dump(int fd);
473private:
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900474class MainThread : public SignalDrivenThread {
475 ExynosCameraHWInterface2 *mHardware;
476 public:
477 MainThread(ExynosCameraHWInterface2 *hw):
478 SignalDrivenThread(),
Sungjoong Kang053d38c2012-09-17 17:46:52 -0700479 mHardware(hw) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900480 ~MainThread();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900481 void threadFunctionInternal()
Sungjoong Kang053d38c2012-09-17 17:46:52 -0700482 {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900483 mHardware->m_mainThreadFunc(this);
484 return;
485 }
486 void release(void);
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700487 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900488 };
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900489
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700490 class SensorThread : public SignalDrivenThread {
491 ExynosCameraHWInterface2 *mHardware;
492 public:
493 SensorThread(ExynosCameraHWInterface2 *hw):
Sungjoong Kang053d38c2012-09-17 17:46:52 -0700494 SignalDrivenThread(),
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700495 mHardware(hw) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900496 ~SensorThread();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900497 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700498 mHardware->m_sensorThreadFunc(this);
499 return;
500 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900501 void release(void);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700502 //private:
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700503 bool m_releasing;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700504 };
505
506 class StreamThread : public SignalDrivenThread {
507 ExynosCameraHWInterface2 *mHardware;
508 public:
509 StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
Sungjoong Kang053d38c2012-09-17 17:46:52 -0700510 SignalDrivenThread(),
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700511 mHardware(hw),
512 m_index(new_index) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900513 ~StreamThread();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900514 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700515 mHardware->m_streamThreadFunc(this);
516 return;
517 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900518 void setParameter(stream_parameters_t * new_parameters);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700519 status_t attachSubStream(int stream_id, int priority);
520 status_t detachSubStream(int stream_id);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900521 void release(void);
522 int findBufferIndex(void * bufAddr);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700523 int findBufferIndex(buffer_handle_t * bufHandle);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900524
525 uint8_t m_index;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900526 bool m_activated;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900527 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700528 stream_parameters_t m_parameters;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900529 stream_parameters_t *m_tempParameters;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700530 substream_entry_t m_attachedSubStreams[NUM_MAX_SUBSTREAM];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900531 bool m_isBufferInit;
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700532 bool m_releasing;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700533 int streamType;
534 int m_numRegisteredStream;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900535 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700536
537 sp<MainThread> m_mainThread;
538 sp<SensorThread> m_sensorThread;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900539 sp<StreamThread> m_streamThreads[NUM_MAX_STREAM_THREAD];
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700540 substream_parameters_t m_subStreams[STREAM_ID_LAST+1];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700541
542
543
544 RequestManager *m_requestManager;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900545 BayerBufManager *m_BayerManager;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700546 ExynosCamera2 *m_camera2;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700547
548 void m_mainThreadFunc(SignalDrivenThread * self);
549 void m_sensorThreadFunc(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700550 void m_streamThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900551 void m_streamThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700552
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700553 void m_streamFunc_direct(SignalDrivenThread *self);
554 void m_streamFunc_indirect(SignalDrivenThread *self);
Sungjoong Kang86646da2012-08-28 17:29:11 +0900555
556 void m_streamBufferInit(SignalDrivenThread *self);
557
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700558 int m_runSubStreamFunc(StreamThread *selfThread, ExynosBuffer *srcImageBuf,
559 int stream_id, nsecs_t frameTimeStamp);
560 int m_jpegCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp);
561 int m_recordCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp);
562 int m_prvcbCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900563 void m_getAlignedYUVSize(int colorFormat, int w, int h,
564 ExynosBuffer *buf);
565 bool m_getRatioSize(int src_w, int src_h,
566 int dst_w, int dst_h,
567 int *crop_x, int *crop_y,
568 int *crop_w, int *crop_h,
569 int zoom);
570 int createIonClient(ion_client ionClient);
571 int deleteIonClient(ion_client ionClient);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900572
573 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
Sungjoong Kang181e4252012-08-29 02:11:07 -0700574 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum, int cacheFlag);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900575 void freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
576 void initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
577
578 void DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900579 bool m_checkThumbnailSize(int w, int h);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900580 bool yuv2Jpeg(ExynosBuffer *yuvBuf,
581 ExynosBuffer *jpegBuf,
582 ExynosRect *rect);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700583 int InitializeISPChain();
Sungjoong Kangad378612012-08-17 12:34:33 -0700584 void StartISP();
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700585 void StartSCCThread(bool threadExists);
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);
Younghwan Jooe117f752012-09-12 22:21:55 -0700593 void OnPrecaptureMeteringTriggerStart(int id);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700594 void OnAfCancel(int id);
595 void OnAfCancelAutoMacro(int id);
596 void OnAfCancelCAFPicture(int id);
597 void OnAfCancelCAFVideo(int id);
Younghwan Joo73f5ad62012-09-16 21:05:30 -0700598 void OnPrecaptureMeteringNotificationISP();
599 void OnPrecaptureMeteringNotificationSensor();
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700600 void OnAfNotification(enum aa_afstate noti);
601 void OnAfNotificationAutoMacro(enum aa_afstate noti);
602 void OnAfNotificationCAFPicture(enum aa_afstate noti);
603 void OnAfNotificationCAFVideo(enum aa_afstate noti);
604 void SetAfStateForService(int newState);
605 int GetAfStateForService();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900606 exif_attribute_t mExifInfo;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700607 void m_setExifFixedAttribute(void);
608 void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
609 camera2_shot *currentEntry);
Younghwan Jooe117f752012-09-12 22:21:55 -0700610 void m_preCaptureSetter(struct camera2_shot_ext * shot_ext);
611 void m_preCaptureListenerSensor(struct camera2_shot_ext * shot_ext);
612 void m_preCaptureListenerISP(struct camera2_shot_ext * shot_ext);
Younghwan Joo4a9565a2012-09-19 18:41:35 -0700613 void m_updateAfRegion(struct camera2_shot_ext * shot_ext);
614 void m_afTrigger(struct camera2_shot_ext * shot_ext);
Younghwan Joo275c9742012-09-25 21:12:30 +0900615 void m_sceneModeFaceSetter(struct camera2_shot_ext * shot_ext, int mode);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900616 void *m_exynosPictureCSC;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900617 void *m_exynosVideoCSC;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900618
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700619
620 camera2_request_queue_src_ops_t *m_requestQueueOps;
621 camera2_frame_queue_dst_ops_t *m_frameQueueOps;
622 camera2_notify_callback m_notifyCb;
623 void *m_callbackCookie;
624
625 int m_numOfRemainingReqInSvc;
626 bool m_isRequestQueuePending;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900627 bool m_isRequestQueueNull;
628 camera2_device_t *m_halDevice;
629 static gralloc_module_t const* m_grallocHal;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700630
631
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900632 camera_hw_info_t m_camera_info;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700633
634 ion_client m_ionCameraClient;
635
Sungjoong Kangad378612012-08-17 12:34:33 -0700636 bool m_isIspStarted;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900637
Sungjoong Kangad378612012-08-17 12:34:33 -0700638 int m_need_streamoff;
Sungjoong Kang90e439c2012-09-20 02:26:22 -0700639 ExynosBuffer m_sccLocalBuffer[NUM_MAX_CAMERA_BUFFERS];
640 bool m_sccLocalBufferValid;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900641
642 int indexToQueue[3+1];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900643
644 bool m_scp_flushing;
645 bool m_closing;
646 ExynosBuffer m_resizeBuf;
Sungjoong Kang2f4d1752012-09-17 16:50:07 -0700647#ifndef ENABLE_FRAME_SYNC
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700648 int m_currentOutputStreams;
Sungjoong Kang2f4d1752012-09-17 16:50:07 -0700649#endif
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700650 int m_currentReprocessOutStreams;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700651 ExynosBuffer m_previewCbBuf;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900652 int m_cameraId;
653 bool m_scp_closing;
654 bool m_scp_closed;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700655 bool m_wideAspect;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700656 uint32_t lastAfRegion[4];
hyeonmyeong Choi308291d2012-08-29 13:55:01 -0700657 float m_zoomRatio;
Sungjoong Kangad378612012-08-17 12:34:33 -0700658
hyeonmyeong Choi5c88d1f2012-09-13 02:05:37 -0700659 int m_vdisBubbleCnt;
660 int m_vdisDupFrame;
hyeonmyeong Choi5c88d1f2012-09-13 02:05:37 -0700661
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700662 mutable Mutex m_qbufLock;
Sungjoong Kangad378612012-08-17 12:34:33 -0700663
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700664 int m_afState;
665 int m_afTriggerId;
666 enum aa_afmode m_afMode;
667 enum aa_afmode m_afMode2;
668 bool m_IsAfModeUpdateRequired;
669 bool m_IsAfTriggerRequired;
670 bool m_IsAfLockRequired;
671 int m_serviceAfState;
Sungjoong Kang36c106c2012-08-23 17:38:20 -0700672 bool m_AfHwStateFailed;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700673 int m_afPendingTriggerId;
674 int m_afModeWaitingCnt;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700675 struct camera2_shot m_jpegMetadata;
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700676 int m_scpOutputSignalCnt;
677 int m_scpOutputImageCnt;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700678 int m_nightCaptureCnt;
679 int m_nightCaptureFrameCnt;
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900680 int m_thumbNailW;
681 int m_thumbNailH;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700682 int m_reprocessStreamId;
683 const camera2_stream_in_ops_t * m_reprocessOps;
684 int m_reprocessOutputStreamId;
685 int m_reprocessingFrameCnt;
Younghwan Joo9a710a42012-09-05 17:52:08 -0700686 ctl_request_info_t m_ctlInfo;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700687};
688
689}; // namespace android
690
691#endif