blob: 76ae6d4e36f71829611b4e3e2ddfb7ae798a6eeb [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
58
59#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
116typedef struct node_info {
117 int fd;
118 int width;
119 int height;
120 int format;
121 int planes;
122 int buffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700123 enum v4l2_memory memory;
124 enum v4l2_buf_type type;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700125 ion_client ionClient;
126 ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700127 int status;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700128} node_info_t;
129
130
131typedef struct camera_hw_info {
132 int sensor_id;
133
134 node_info_t sensor;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900135 node_info_t isp;
136 node_info_t capture;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700137
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900138 /*shot*/ // temp
139 struct camera2_shot_ext dummy_shot;
140
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700141} camera_hw_info_t;
142
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900143typedef enum request_entry_status {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700144 EMPTY,
145 REGISTERED,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700146 REQUESTED,
147 CAPTURED
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700148} request_entry_status_t;
149
150typedef struct request_manager_entry {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900151 request_entry_status_t status;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900152 camera_metadata_t *original_request;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700153 struct camera2_shot_ext internal_shot;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900154 int output_stream_count;
155 bool dynamic_meta_vaild;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700156} request_manager_entry_t;
157
158class RequestManager {
159public:
160 RequestManager(SignalDrivenThread* main_thread);
161 ~RequestManager();
162 int GetNumEntries();
163 bool IsRequestQueueFull();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900164
165 void RegisterRequest(camera_metadata_t *new_request);
166 void DeregisterRequest(camera_metadata_t **deregistered_request);
167 bool PrepareFrame(size_t *num_entries, size_t *frame_size,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700168 camera_metadata_t **prepared_frame, int afState);
169 int MarkProcessingRequest(ExynosBuffer * buf, int *afMode);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900170 void NotifyStreamOutput(int frameCnt, int stream_id);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900171 void DumpInfoWithIndex(int index);
Sungjoong Kangad378612012-08-17 12:34:33 -0700172 void ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900173 void CheckCompleted(int index);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700174 void UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt, bool afTrigger);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900175 void RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
176 uint64_t GetTimestamp(int frameCnt);
177 int FindFrameCnt(struct camera2_shot_ext * shot_ext);
178 int FindEntryIndexByFrameCnt(int frameCnt);
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700179 void Dump(void);
180 int GetNextIndex(int index);
181 void SetDefaultParameters(int cropX);
182 void SetInitialSkip(int count);
Sungjoong Kangad378612012-08-17 12:34:33 -0700183 int GetSkipCnt();
184 void SetFrameIndex(int index);
185 int GetFrameIndex();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700186private:
187
188 MetadataConverter *m_metadataConverter;
189 SignalDrivenThread *m_mainThread;
190 int m_numOfEntries;
191 int m_entryInsertionIndex;
192 int m_entryProcessingIndex;
193 int m_entryFrameOutputIndex;
194 request_manager_entry_t entries[NUM_MAX_REQUEST_MGR_ENTRY];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900195 int m_completedIndex;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700196
197 Mutex m_requestMutex;
198
199 //TODO : alloc dynamically
200 char m_tempFrameMetadataBuf[2000];
201 camera_metadata_t *m_tempFrameMetadata;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900202
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700203 int m_sensorPipelineSkipCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900204 int m_cropX;
Sungjoong Kangad378612012-08-17 12:34:33 -0700205 int m_frameIndex;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700206 int m_lastAeMode;
207 int m_lastAaMode;
208 int m_lastAwbMode;
209 int m_lastAeComp;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700210};
211
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900212
213typedef struct bayer_buf_entry {
214 int status;
215 int reqFrameCnt;
216 nsecs_t timeStamp;
217} bayer_buf_entry_t;
218
219
220class BayerBufManager {
221public:
222 BayerBufManager();
223 ~BayerBufManager();
224 int GetIndexForSensorEnqueue();
225 int MarkSensorEnqueue(int index);
226 int MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
227 int GetIndexForIspEnqueue(int *reqFrameCnt);
228 int GetIndexForIspDequeue(int *reqFrameCnt);
229 int MarkIspEnqueue(int index);
230 int MarkIspDequeue(int index);
231 int GetNumOnSensor();
232 int GetNumOnHalFilled();
233 int GetNumOnIsp();
234
235private:
236 int GetNextIndex(int index);
237
238 int sensorEnqueueHead;
239 int sensorDequeueHead;
240 int ispEnqueueHead;
241 int ispDequeueHead;
242 int numOnSensor;
243 int numOnIsp;
244 int numOnHalFilled;
245 int numOnHalEmpty;
246
247 bayer_buf_entry_t entries[NUM_BAYER_BUFFERS];
248};
249
250
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900251#define NOT_AVAILABLE (0)
252#define REQUIRES_DQ_FROM_SVC (1)
253#define ON_DRIVER (2)
254#define ON_HAL (3)
255#define ON_SERVICE (4)
256
257#define BAYER_NOT_AVAILABLE (0)
258#define BAYER_ON_SENSOR (1)
259#define BAYER_ON_HAL_FILLED (2)
260#define BAYER_ON_ISP (3)
261#define BAYER_ON_SERVICE (4)
262#define BAYER_ON_HAL_EMPTY (5)
263
264typedef struct stream_parameters {
265 int streamType;
266 uint32_t outputWidth;
267 uint32_t outputHeight;
268 uint32_t nodeWidth;
269 uint32_t nodeHeight;
270 int outputFormat;
271 int nodeFormat;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700272 const camera2_stream_ops_t* streamOps;
273 uint32_t usage;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900274 int numHwBuffers;
275 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700276 int numOwnSvcBuffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700277 int fd;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900278 int svcPlanes;
279 int nodePlanes;
280 enum v4l2_memory memory;
281 enum v4l2_buf_type halBuftype;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700282 int numSvcBufsInHal;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900283 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
284 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
285 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700286 int svcBufIndex;
287 ion_client ionClient;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900288 node_info_t node;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700289} stream_parameters_t;
290
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900291typedef struct record_parameters {
292 uint32_t outputWidth;
293 uint32_t outputHeight;
294 int outputFormat;
295 const camera2_stream_ops_t* streamOps;
296 uint32_t usage;
297 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700298 int numOwnSvcBuffers;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900299 int svcPlanes;
300 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
301 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
302 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700303 int svcBufIndex;
304 int numSvcBufsInHal;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900305} record_parameters_t;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900306
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700307class ExynosCameraHWInterface2 : public virtual RefBase {
308public:
Sungjoong Kang6044e502012-08-27 00:29:28 -0700309 ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700310 virtual ~ExynosCameraHWInterface2();
311
312 virtual void release();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900313
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700314 inline int getCameraId() const;
315
316 virtual int setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
317 virtual int notifyRequestQueueNotEmpty();
318 virtual int setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
319 virtual int getInProgressCount();
320 virtual int flushCapturesInProgress();
321 virtual int constructDefaultRequest(int request_template, camera_metadata_t **request);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900322 virtual int allocateStream(uint32_t width, uint32_t height,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700323 int format, const camera2_stream_ops_t *stream_ops,
324 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
325 virtual int registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
326 virtual int releaseStream(uint32_t stream_id);
327 virtual int allocateReprocessStream(uint32_t width, uint32_t height,
328 uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
329 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
330 virtual int releaseReprocessStream(uint32_t stream_id);
331 virtual int triggerAction(uint32_t trigger_id, int ext1, int ext2);
332 virtual int setNotifyCallback(camera2_notify_callback notify_cb, void *user);
333 virtual int getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
334 virtual int dump(int fd);
335private:
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900336class MainThread : public SignalDrivenThread {
337 ExynosCameraHWInterface2 *mHardware;
338 public:
339 MainThread(ExynosCameraHWInterface2 *hw):
340 SignalDrivenThread(),
341 mHardware(hw) {
342// Start("MainThread", PRIORITY_DEFAULT, 0);
343 }
344 ~MainThread();
345 status_t readyToRunInternal()
346 {
347 return NO_ERROR;
348 }
349 void threadFunctionInternal()
350 {
351 mHardware->m_mainThreadFunc(this);
352 return;
353 }
354 void release(void);
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700355 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900356 };
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900357
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700358 class SensorThread : public SignalDrivenThread {
359 ExynosCameraHWInterface2 *mHardware;
360 public:
361 SensorThread(ExynosCameraHWInterface2 *hw):
362 SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0),
363 mHardware(hw),
364 m_isBayerOutputEnabled(false) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900365 ~SensorThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700366 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900367 mHardware->m_sensorThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700368 return NO_ERROR;
369 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900370 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700371 mHardware->m_sensorThreadFunc(this);
372 return;
373 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900374 void release(void);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700375 //private:
376 bool m_isBayerOutputEnabled;
377 int m_sensorFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700378 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900379 };
380
381 class IspThread : public SignalDrivenThread {
382 ExynosCameraHWInterface2 *mHardware;
383 public:
384 IspThread(ExynosCameraHWInterface2 *hw):
385 SignalDrivenThread("IspThread", PRIORITY_DEFAULT, 0),
386 mHardware(hw) { }
387 ~IspThread();
388 status_t readyToRunInternal() {
389 mHardware->m_ispThreadInitialize(this);
390 return NO_ERROR;
391 }
392 void threadFunctionInternal() {
393 mHardware->m_ispThreadFunc(this);
394 return;
395 }
396 void release(void);
397 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700398 int m_ispFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700399 bool m_releasing;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700400 };
401
402 class StreamThread : public SignalDrivenThread {
403 ExynosCameraHWInterface2 *mHardware;
404 public:
405 StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
406 SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0),
407 mHardware(hw),
408 m_index(new_index) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900409 ~StreamThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700410 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900411 mHardware->m_streamThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700412 return NO_ERROR;
413 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900414 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700415 mHardware->m_streamThreadFunc(this);
416 return;
417 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900418 void setRecordingParameter(record_parameters_t * recordParm);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900419 void setParameter(stream_parameters_t * new_parameters);
420 void applyChange(void);
421 void release(void);
422 int findBufferIndex(void * bufAddr);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700423
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900424
425 uint8_t m_index;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900426 bool m_activated;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900427 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700428 stream_parameters_t m_parameters;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900429 stream_parameters_t *m_tempParameters;
430 record_parameters_t m_recordParameters;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900431 bool m_isBufferInit;
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700432 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900433 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700434
435 sp<MainThread> m_mainThread;
436 sp<SensorThread> m_sensorThread;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900437 sp<IspThread> m_ispThread;
438 sp<StreamThread> m_streamThreads[NUM_MAX_STREAM_THREAD];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700439
440
441
442 RequestManager *m_requestManager;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900443 BayerBufManager *m_BayerManager;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700444 ExynosCamera2 *m_camera2;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700445
446 void m_mainThreadFunc(SignalDrivenThread * self);
447 void m_sensorThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900448 void m_sensorThreadInitialize(SignalDrivenThread * self);
449 void m_ispThreadFunc(SignalDrivenThread * self);
450 void m_ispThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700451 void m_streamThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900452 void m_streamThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700453
Sungjoong Kang86646da2012-08-28 17:29:11 +0900454 void m_streamFunc0(SignalDrivenThread *self);
455 void m_streamFunc1(SignalDrivenThread *self);
456
457 void m_streamBufferInit(SignalDrivenThread *self);
458
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900459 void m_getAlignedYUVSize(int colorFormat, int w, int h,
460 ExynosBuffer *buf);
461 bool m_getRatioSize(int src_w, int src_h,
462 int dst_w, int dst_h,
463 int *crop_x, int *crop_y,
464 int *crop_w, int *crop_h,
465 int zoom);
466 int createIonClient(ion_client ionClient);
467 int deleteIonClient(ion_client ionClient);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900468
469 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
470 void freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
471 void initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
472
473 void DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
474 bool yuv2Jpeg(ExynosBuffer *yuvBuf,
475 ExynosBuffer *jpegBuf,
476 ExynosRect *rect);
Sungjoong Kang6044e502012-08-27 00:29:28 -0700477 int InitializeISPChain();
Sungjoong Kangad378612012-08-17 12:34:33 -0700478 void StartISP();
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700479 int GetAfState();
480 void SetAfMode(enum aa_afmode afMode);
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700481 void OnAfTriggerStart(int id);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700482 void OnAfTrigger(int id);
483 void OnAfTriggerAutoMacro(int id);
484 void OnAfTriggerCAFPicture(int id);
485 void OnAfTriggerCAFVideo(int id);
486 void OnAfCancel(int id);
487 void OnAfCancelAutoMacro(int id);
488 void OnAfCancelCAFPicture(int id);
489 void OnAfCancelCAFVideo(int id);
490 void OnAfNotification(enum aa_afstate noti);
491 void OnAfNotificationAutoMacro(enum aa_afstate noti);
492 void OnAfNotificationCAFPicture(enum aa_afstate noti);
493 void OnAfNotificationCAFVideo(enum aa_afstate noti);
494 void SetAfStateForService(int newState);
495 int GetAfStateForService();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900496 exif_attribute_t mExifInfo;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700497 void m_setExifFixedAttribute(void);
498 void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
499 camera2_shot *currentEntry);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900500 void *m_exynosPictureCSC;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900501 void *m_exynosVideoCSC;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900502
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900503 int m_jpegEncodingFrameCnt;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700504
505 camera2_request_queue_src_ops_t *m_requestQueueOps;
506 camera2_frame_queue_dst_ops_t *m_frameQueueOps;
507 camera2_notify_callback m_notifyCb;
508 void *m_callbackCookie;
509
510 int m_numOfRemainingReqInSvc;
511 bool m_isRequestQueuePending;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900512 bool m_isRequestQueueNull;
513 camera2_device_t *m_halDevice;
514 static gralloc_module_t const* m_grallocHal;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700515
516
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900517 camera_hw_info_t m_camera_info;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700518
519 ion_client m_ionCameraClient;
520
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900521 bool m_isSensorThreadOn;
522 bool m_isSensorStarted;
Sungjoong Kangad378612012-08-17 12:34:33 -0700523 bool m_isIspStarted;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900524
Sungjoong Kangad378612012-08-17 12:34:33 -0700525 int m_need_streamoff;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900526
527 bool m_initFlag1;
528 bool m_initFlag2;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900529
530 int indexToQueue[3+1];
531 int m_fd_scp;
532
533 bool m_scp_flushing;
534 bool m_closing;
535 ExynosBuffer m_resizeBuf;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900536 bool m_recordingEnabled;
537 int m_previewOutput;
538 int m_recordOutput;
539 bool m_needsRecordBufferInit;
540 int lastFrameCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900541 int m_cameraId;
542 bool m_scp_closing;
543 bool m_scp_closed;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700544 bool m_wideAspect;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700545 uint32_t lastAfRegion[4];
Sungjoong Kangad378612012-08-17 12:34:33 -0700546
547 mutable Mutex m_qbufLock;
548
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700549 int m_afState;
550 int m_afTriggerId;
551 enum aa_afmode m_afMode;
552 enum aa_afmode m_afMode2;
553 bool m_IsAfModeUpdateRequired;
554 bool m_IsAfTriggerRequired;
555 bool m_IsAfLockRequired;
556 int m_serviceAfState;
Sungjoong Kang36c106c2012-08-23 17:38:20 -0700557 bool m_AfHwStateFailed;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700558 int m_afPendingTriggerId;
559 int m_afModeWaitingCnt;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700560 struct camera2_shot m_jpegMetadata;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700561};
562
563}; // namespace android
564
565#endif