blob: 097ecfeadc9eb4ae22f7e4a6ade24d5d035e6da4 [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>
40#include "SignalDrivenThread.h"
41#include "MetadataConverter.h"
42#include "exynos_v4l2.h"
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090043#include "ExynosRect.h"
44#include "ExynosBuffer.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070045#include "videodev2_exynos_camera.h"
46#include "gralloc_priv.h"
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090047#include "ExynosJpegEncoderForCamera.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070048#include <fcntl.h>
49#include "fimc-is-metadata.h"
50#include "ion.h"
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090051#include "ExynosExif.h"
52#include "csc.h"
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -070053#include "ExynosCamera2.h"
Sungjoong Kangeed7ed12012-08-23 16:35:08 -070054#include "cutils/properties.h"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070055
56namespace android {
57
Sungjoong Kangfeb7df42012-08-28 23:35:43 +090058//#define ENABLE_FRAME_SYNC
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070059#define NODE_PREFIX "/dev/video"
60
61#define NUM_MAX_STREAM_THREAD (5)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090062#define NUM_MAX_REQUEST_MGR_ENTRY (10)
Sungjoong Kangad378612012-08-17 12:34:33 -070063#define NUM_MAX_DEQUEUED_REQUEST NUM_MAX_REQUEST_MGR_ENTRY
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070064#define MAX_CAMERA_MEMORY_PLANE_NUM (4)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090065#define NUM_MAX_CAMERA_BUFFERS (16)
66#define NUM_BAYER_BUFFERS (8)
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070067#define NUM_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
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070098enum sensor_name {
99 SENSOR_NAME_S5K3H2 = 1,
100 SENSOR_NAME_S5K6A3 = 2,
101 SENSOR_NAME_S5K4E5 = 3,
102 SENSOR_NAME_S5K3H7 = 4,
103 SENSOR_NAME_CUSTOM = 5,
104 SENSOR_NAME_END
105};
106
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700107enum is_subscenario_id {
108 ISS_SUB_SCENARIO_STILL,
109 ISS_SUB_SCENARIO_VIDEO,
110 ISS_SUB_SCENARIO_SCENE1,
111 ISS_SUB_SCENARIO_SCENE2,
112 ISS_SUB_SCENARIO_SCENE3,
113 ISS_SUB_END
114};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700115
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900116int SUPPORT_THUMBNAIL_REAR_SIZE[][2] =
117{
118 {160, 120},
119 {160, 90},
120 {144, 96}
121};
122
123int SUPPORT_THUMBNAIL_FRONT_SIZE[][2] =
124{
125 {160, 120},
126 {160, 160},
127 {160, 90},
128 {144, 96}
129};
130
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700131enum is_flash_scenario_state {
132 IS_FLASH_ON = 1,
133 IS_FLASH_ON_DONE = 2,
134 IS_FLASH_AUTO_AE_AWB_LOCK = 10,
135 IS_FLASH_AUTO_END,
136 IS_FLASH_AUTO_AE_AWB_LOCKED_AUTO_END,
137 IS_FLASH_CAPTURE,
138 IS_FLASH_CAPTURE_JPEG,
139 IS_FLASH_CAPTURE_END,
140 IS_FLASH_MAX
141};
142
143enum is_af_flash_scenario_state {
144 IS_FLASH_AF_ON = 1,
145 IS_FLASH_AF_ON_START,
146 IS_FLASH_AF_ON_DONE,
147 IF_FLASH_AF_OFF,
148 IS_FLASH_AF_MAX
149};
150
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700151typedef struct node_info {
152 int fd;
153 int width;
154 int height;
155 int format;
156 int planes;
157 int buffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700158 enum v4l2_memory memory;
159 enum v4l2_buf_type type;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700160 ion_client ionClient;
161 ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700162 int status;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700163} node_info_t;
164
165
166typedef struct camera_hw_info {
167 int sensor_id;
168
169 node_info_t sensor;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900170 node_info_t isp;
171 node_info_t capture;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700172
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900173 /*shot*/ // temp
174 struct camera2_shot_ext dummy_shot;
175
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700176} camera_hw_info_t;
177
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900178typedef enum request_entry_status {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700179 EMPTY,
180 REGISTERED,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700181 REQUESTED,
182 CAPTURED
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700183} request_entry_status_t;
184
185typedef struct request_manager_entry {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900186 request_entry_status_t status;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900187 camera_metadata_t *original_request;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700188 struct camera2_shot_ext internal_shot;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900189 int output_stream_count;
190 bool dynamic_meta_vaild;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700191} request_manager_entry_t;
192
193class RequestManager {
194public:
195 RequestManager(SignalDrivenThread* main_thread);
196 ~RequestManager();
197 int GetNumEntries();
198 bool IsRequestQueueFull();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900199
200 void RegisterRequest(camera_metadata_t *new_request);
201 void DeregisterRequest(camera_metadata_t **deregistered_request);
202 bool PrepareFrame(size_t *num_entries, size_t *frame_size,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700203 camera_metadata_t **prepared_frame, int afState);
204 int MarkProcessingRequest(ExynosBuffer * buf, int *afMode);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900205 void NotifyStreamOutput(int frameCnt, int stream_id);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900206 void DumpInfoWithIndex(int index);
Sungjoong Kangad378612012-08-17 12:34:33 -0700207 void ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900208 void CheckCompleted(int index);
Sungjoong Kangef6f83c2012-08-28 22:59:48 +0900209 void UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900210 void RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
211 uint64_t GetTimestamp(int frameCnt);
212 int FindFrameCnt(struct camera2_shot_ext * shot_ext);
213 int FindEntryIndexByFrameCnt(int frameCnt);
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700214 void Dump(void);
215 int GetNextIndex(int index);
216 void SetDefaultParameters(int cropX);
217 void SetInitialSkip(int count);
Sungjoong Kangad378612012-08-17 12:34:33 -0700218 int GetSkipCnt();
219 void SetFrameIndex(int index);
220 int GetFrameIndex();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700221private:
222
223 MetadataConverter *m_metadataConverter;
224 SignalDrivenThread *m_mainThread;
225 int m_numOfEntries;
226 int m_entryInsertionIndex;
227 int m_entryProcessingIndex;
228 int m_entryFrameOutputIndex;
229 request_manager_entry_t entries[NUM_MAX_REQUEST_MGR_ENTRY];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900230 int m_completedIndex;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700231
232 Mutex m_requestMutex;
233
234 //TODO : alloc dynamically
235 char m_tempFrameMetadataBuf[2000];
236 camera_metadata_t *m_tempFrameMetadata;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900237
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700238 int m_sensorPipelineSkipCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900239 int m_cropX;
Sungjoong Kangad378612012-08-17 12:34:33 -0700240 int m_frameIndex;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700241 int m_lastAeMode;
242 int m_lastAaMode;
243 int m_lastAwbMode;
244 int m_lastAeComp;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700245};
246
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900247
248typedef struct bayer_buf_entry {
249 int status;
250 int reqFrameCnt;
251 nsecs_t timeStamp;
252} bayer_buf_entry_t;
253
254
255class BayerBufManager {
256public:
257 BayerBufManager();
258 ~BayerBufManager();
259 int GetIndexForSensorEnqueue();
260 int MarkSensorEnqueue(int index);
261 int MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
262 int GetIndexForIspEnqueue(int *reqFrameCnt);
263 int GetIndexForIspDequeue(int *reqFrameCnt);
264 int MarkIspEnqueue(int index);
265 int MarkIspDequeue(int index);
266 int GetNumOnSensor();
267 int GetNumOnHalFilled();
268 int GetNumOnIsp();
269
270private:
271 int GetNextIndex(int index);
272
273 int sensorEnqueueHead;
274 int sensorDequeueHead;
275 int ispEnqueueHead;
276 int ispDequeueHead;
277 int numOnSensor;
278 int numOnIsp;
279 int numOnHalFilled;
280 int numOnHalEmpty;
281
282 bayer_buf_entry_t entries[NUM_BAYER_BUFFERS];
283};
284
285
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900286#define NOT_AVAILABLE (0)
287#define REQUIRES_DQ_FROM_SVC (1)
288#define ON_DRIVER (2)
289#define ON_HAL (3)
290#define ON_SERVICE (4)
291
292#define BAYER_NOT_AVAILABLE (0)
293#define BAYER_ON_SENSOR (1)
294#define BAYER_ON_HAL_FILLED (2)
295#define BAYER_ON_ISP (3)
296#define BAYER_ON_SERVICE (4)
297#define BAYER_ON_HAL_EMPTY (5)
298
299typedef struct stream_parameters {
300 int streamType;
301 uint32_t outputWidth;
302 uint32_t outputHeight;
303 uint32_t nodeWidth;
304 uint32_t nodeHeight;
305 int outputFormat;
306 int nodeFormat;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700307 const camera2_stream_ops_t* streamOps;
308 uint32_t usage;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900309 int numHwBuffers;
310 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700311 int numOwnSvcBuffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700312 int fd;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900313 int svcPlanes;
314 int nodePlanes;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +0900315 int metaPlanes;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900316 enum v4l2_memory memory;
317 enum v4l2_buf_type halBuftype;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700318 int numSvcBufsInHal;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900319 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
320 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangfeb7df42012-08-28 23:35:43 +0900321 ExynosBuffer metaBuffers[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900322 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700323 int svcBufIndex;
324 ion_client ionClient;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900325 node_info_t node;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700326} stream_parameters_t;
327
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900328typedef struct record_parameters {
329 uint32_t outputWidth;
330 uint32_t outputHeight;
331 int outputFormat;
332 const camera2_stream_ops_t* streamOps;
333 uint32_t usage;
334 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700335 int numOwnSvcBuffers;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900336 int svcPlanes;
337 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
338 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
339 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700340 int svcBufIndex;
341 int numSvcBufsInHal;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900342} record_parameters_t;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900343
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700344typedef struct callback_parameters {
345 uint32_t outputWidth;
346 uint32_t outputHeight;
347 int outputFormat;
348 int internalFormat;
349 int internalPlanes;
350 const camera2_stream_ops_t* streamOps;
351 uint32_t usage;
352 int numSvcBuffers;
353 int numOwnSvcBuffers;
354 int svcPlanes;
355 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
356 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
357 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
358 int svcBufIndex;
359 int numSvcBufsInHal;
360} callback_parameters_t;
361
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700362class ExynosCameraHWInterface2 : public virtual RefBase {
363public:
Sungjoong Kang6044e502012-08-27 00:29:28 -0700364 ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700365 virtual ~ExynosCameraHWInterface2();
366
367 virtual void release();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900368
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700369 inline int getCameraId() const;
370
371 virtual int setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
372 virtual int notifyRequestQueueNotEmpty();
373 virtual int setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
374 virtual int getInProgressCount();
375 virtual int flushCapturesInProgress();
376 virtual int constructDefaultRequest(int request_template, camera_metadata_t **request);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900377 virtual int allocateStream(uint32_t width, uint32_t height,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700378 int format, const camera2_stream_ops_t *stream_ops,
379 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
380 virtual int registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
381 virtual int releaseStream(uint32_t stream_id);
382 virtual int allocateReprocessStream(uint32_t width, uint32_t height,
383 uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
384 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
385 virtual int releaseReprocessStream(uint32_t stream_id);
386 virtual int triggerAction(uint32_t trigger_id, int ext1, int ext2);
387 virtual int setNotifyCallback(camera2_notify_callback notify_cb, void *user);
388 virtual int getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
389 virtual int dump(int fd);
390private:
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900391class MainThread : public SignalDrivenThread {
392 ExynosCameraHWInterface2 *mHardware;
393 public:
394 MainThread(ExynosCameraHWInterface2 *hw):
395 SignalDrivenThread(),
396 mHardware(hw) {
397// Start("MainThread", PRIORITY_DEFAULT, 0);
398 }
399 ~MainThread();
400 status_t readyToRunInternal()
401 {
402 return NO_ERROR;
403 }
404 void threadFunctionInternal()
405 {
406 mHardware->m_mainThreadFunc(this);
407 return;
408 }
409 void release(void);
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700410 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900411 };
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900412
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700413 class SensorThread : public SignalDrivenThread {
414 ExynosCameraHWInterface2 *mHardware;
415 public:
416 SensorThread(ExynosCameraHWInterface2 *hw):
417 SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0),
418 mHardware(hw),
419 m_isBayerOutputEnabled(false) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900420 ~SensorThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700421 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900422 mHardware->m_sensorThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700423 return NO_ERROR;
424 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900425 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700426 mHardware->m_sensorThreadFunc(this);
427 return;
428 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900429 void release(void);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700430 //private:
431 bool m_isBayerOutputEnabled;
432 int m_sensorFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700433 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900434 };
435
436 class IspThread : public SignalDrivenThread {
437 ExynosCameraHWInterface2 *mHardware;
438 public:
439 IspThread(ExynosCameraHWInterface2 *hw):
440 SignalDrivenThread("IspThread", PRIORITY_DEFAULT, 0),
441 mHardware(hw) { }
442 ~IspThread();
443 status_t readyToRunInternal() {
444 mHardware->m_ispThreadInitialize(this);
445 return NO_ERROR;
446 }
447 void threadFunctionInternal() {
448 mHardware->m_ispThreadFunc(this);
449 return;
450 }
451 void release(void);
452 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700453 int m_ispFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700454 bool m_releasing;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700455 };
456
457 class StreamThread : public SignalDrivenThread {
458 ExynosCameraHWInterface2 *mHardware;
459 public:
460 StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
461 SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0),
462 mHardware(hw),
463 m_index(new_index) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900464 ~StreamThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700465 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900466 mHardware->m_streamThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700467 return NO_ERROR;
468 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900469 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700470 mHardware->m_streamThreadFunc(this);
471 return;
472 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900473 void setRecordingParameter(record_parameters_t * recordParm);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700474 void setCallbackParameter(callback_parameters_t * callbackParm);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900475 void setParameter(stream_parameters_t * new_parameters);
476 void applyChange(void);
477 void release(void);
478 int findBufferIndex(void * bufAddr);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700479
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900480
481 uint8_t m_index;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900482 bool m_activated;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900483 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700484 stream_parameters_t m_parameters;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900485 stream_parameters_t *m_tempParameters;
486 record_parameters_t m_recordParameters;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700487 callback_parameters_t m_previewCbParameters;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900488 bool m_isBufferInit;
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700489 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900490 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700491
492 sp<MainThread> m_mainThread;
493 sp<SensorThread> m_sensorThread;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900494 sp<IspThread> m_ispThread;
495 sp<StreamThread> m_streamThreads[NUM_MAX_STREAM_THREAD];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700496
497
498
499 RequestManager *m_requestManager;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900500 BayerBufManager *m_BayerManager;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700501 ExynosCamera2 *m_camera2;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700502
503 void m_mainThreadFunc(SignalDrivenThread * self);
504 void m_sensorThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900505 void m_sensorThreadInitialize(SignalDrivenThread * self);
506 void m_ispThreadFunc(SignalDrivenThread * self);
507 void m_ispThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700508 void m_streamThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900509 void m_streamThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700510
Sungjoong Kang86646da2012-08-28 17:29:11 +0900511 void m_streamFunc0(SignalDrivenThread *self);
512 void m_streamFunc1(SignalDrivenThread *self);
513
514 void m_streamBufferInit(SignalDrivenThread *self);
515
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900516 void m_getAlignedYUVSize(int colorFormat, int w, int h,
517 ExynosBuffer *buf);
518 bool m_getRatioSize(int src_w, int src_h,
519 int dst_w, int dst_h,
520 int *crop_x, int *crop_y,
521 int *crop_w, int *crop_h,
522 int zoom);
523 int createIonClient(ion_client ionClient);
524 int deleteIonClient(ion_client ionClient);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900525
526 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
Sungjoong Kang181e4252012-08-29 02:11:07 -0700527 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum, int cacheFlag);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900528 void freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
529 void initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
530
531 void DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900532 bool m_checkThumbnailSize(int w, int h);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900533 bool yuv2Jpeg(ExynosBuffer *yuvBuf,
534 ExynosBuffer *jpegBuf,
535 ExynosRect *rect);
Sungjoong Kang6044e502012-08-27 00:29:28 -0700536 int InitializeISPChain();
Sungjoong Kangad378612012-08-17 12:34:33 -0700537 void StartISP();
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700538 int GetAfState();
539 void SetAfMode(enum aa_afmode afMode);
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700540 void OnAfTriggerStart(int id);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700541 void OnAfTrigger(int id);
542 void OnAfTriggerAutoMacro(int id);
543 void OnAfTriggerCAFPicture(int id);
544 void OnAfTriggerCAFVideo(int id);
545 void OnAfCancel(int id);
546 void OnAfCancelAutoMacro(int id);
547 void OnAfCancelCAFPicture(int id);
548 void OnAfCancelCAFVideo(int id);
549 void OnAfNotification(enum aa_afstate noti);
550 void OnAfNotificationAutoMacro(enum aa_afstate noti);
551 void OnAfNotificationCAFPicture(enum aa_afstate noti);
552 void OnAfNotificationCAFVideo(enum aa_afstate noti);
553 void SetAfStateForService(int newState);
554 int GetAfStateForService();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900555 exif_attribute_t mExifInfo;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700556 void m_setExifFixedAttribute(void);
557 void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
558 camera2_shot *currentEntry);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700559 void flashSetter(struct camera2_shot_ext * shot_ext);
560 void flashListener(struct camera2_shot_ext * shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900561 void *m_exynosPictureCSC;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900562 void *m_exynosVideoCSC;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900563
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900564 int m_jpegEncodingFrameCnt;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700565
566 camera2_request_queue_src_ops_t *m_requestQueueOps;
567 camera2_frame_queue_dst_ops_t *m_frameQueueOps;
568 camera2_notify_callback m_notifyCb;
569 void *m_callbackCookie;
570
571 int m_numOfRemainingReqInSvc;
572 bool m_isRequestQueuePending;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900573 bool m_isRequestQueueNull;
574 camera2_device_t *m_halDevice;
575 static gralloc_module_t const* m_grallocHal;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700576
577
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900578 camera_hw_info_t m_camera_info;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700579
580 ion_client m_ionCameraClient;
581
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900582 bool m_isSensorThreadOn;
583 bool m_isSensorStarted;
Sungjoong Kangad378612012-08-17 12:34:33 -0700584 bool m_isIspStarted;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900585
Sungjoong Kangad378612012-08-17 12:34:33 -0700586 int m_need_streamoff;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900587
588 bool m_initFlag1;
589 bool m_initFlag2;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900590
591 int indexToQueue[3+1];
592 int m_fd_scp;
593
594 bool m_scp_flushing;
595 bool m_closing;
596 ExynosBuffer m_resizeBuf;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900597 bool m_recordingEnabled;
598 int m_previewOutput;
599 int m_recordOutput;
600 bool m_needsRecordBufferInit;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -0700601 ExynosBuffer m_previewCbBuf;
602 int m_previewCbEnabled;
603 int m_previewCbOutput;
604 bool m_needsPreviewCbBufferInit;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900605 int lastFrameCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900606 int m_cameraId;
607 bool m_scp_closing;
608 bool m_scp_closed;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700609 bool m_wideAspect;
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700610 bool m_aspectChanged;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700611 uint32_t lastAfRegion[4];
hyeonmyeong Choi308291d2012-08-29 13:55:01 -0700612 float m_zoomRatio;
Sungjoong Kangad378612012-08-17 12:34:33 -0700613
614 mutable Mutex m_qbufLock;
615
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700616 int m_afState;
617 int m_afTriggerId;
618 enum aa_afmode m_afMode;
619 enum aa_afmode m_afMode2;
620 bool m_IsAfModeUpdateRequired;
621 bool m_IsAfTriggerRequired;
622 bool m_IsAfLockRequired;
623 int m_serviceAfState;
Sungjoong Kang36c106c2012-08-23 17:38:20 -0700624 bool m_AfHwStateFailed;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700625 int m_afPendingTriggerId;
626 int m_afModeWaitingCnt;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700627 struct camera2_shot m_jpegMetadata;
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700628 int m_scpOutputSignalCnt;
629 int m_scpOutputImageCnt;
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700630 int m_nightCaptureCnt;
631 int m_nightCaptureFrameCnt;
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900632 int m_thumbNailW;
633 int m_thumbNailH;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -0700634 bool m_afFlashEnableFlg;
635 int m_afFlashCnt;
636 bool m_flashEnableFlg;
637 bool m_flashCaptured;
638 int m_flashFrameCount;
639 int m_flashCnt;
640 int m_flashTimeOut;
641
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700642};
643
644}; // namespace android
645
646#endif