blob: 250a34495b64981c9e35d956fede9139ce2565ed [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"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070054
55namespace android {
56
57
58#define NODE_PREFIX "/dev/video"
59
60#define NUM_MAX_STREAM_THREAD (5)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090061#define NUM_MAX_REQUEST_MGR_ENTRY (10)
Sungjoong Kangad378612012-08-17 12:34:33 -070062#define NUM_MAX_DEQUEUED_REQUEST NUM_MAX_REQUEST_MGR_ENTRY
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070063#define MAX_CAMERA_MEMORY_PLANE_NUM (4)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090064#define NUM_MAX_CAMERA_BUFFERS (16)
65#define NUM_BAYER_BUFFERS (8)
Sungjoong Kangb56dcc02012-08-08 13:38:09 -070066#define NUM_SENSOR_QBUF (3)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070067
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090068#define PICTURE_GSC_NODE_NUM (2)
Sungjoong Kang15fd8232012-08-23 16:16:44 -070069#define VIDEO_GSC_NODE_NUM (1)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090070
Sungjoong Kang37e122d2012-08-08 11:13:48 -070071#define STREAM_TYPE_DIRECT (0)
72#define STREAM_TYPE_INDIRECT (1)
73
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090074#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<1)
75#define SIGNAL_MAIN_REPROCESS_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<2)
76#define SIGNAL_MAIN_STREAM_OUTPUT_DONE (SIGNAL_THREAD_COMMON_LAST<<3)
77#define SIGNAL_SENSOR_START_REQ_PROCESSING (SIGNAL_THREAD_COMMON_LAST<<4)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070078#define SIGNAL_STREAM_GET_BUFFER (SIGNAL_THREAD_COMMON_LAST<<5)
79#define SIGNAL_STREAM_PUT_BUFFER (SIGNAL_THREAD_COMMON_LAST<<6)
80#define SIGNAL_STREAM_CHANGE_PARAMETER (SIGNAL_THREAD_COMMON_LAST<<7)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090081#define SIGNAL_THREAD_RELEASE (SIGNAL_THREAD_COMMON_LAST<<8)
82#define SIGNAL_ISP_START_BAYER_INPUT (SIGNAL_THREAD_COMMON_LAST<<9)
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090083#define SIGNAL_ISP_START_BAYER_DEQUEUE (SIGNAL_THREAD_COMMON_LAST<<10)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070084
85#define SIGNAL_STREAM_DATA_COMING (SIGNAL_THREAD_COMMON_LAST<<15)
86
Sungjoong Kang0f26b202012-08-17 15:43:12 -070087#define NO_TRANSITION (0)
88#define HAL_AFSTATE_INACTIVE (1)
89#define HAL_AFSTATE_NEEDS_COMMAND (2)
90#define HAL_AFSTATE_STARTED (3)
91#define HAL_AFSTATE_SCANNING (4)
92#define HAL_AFSTATE_LOCKED (5)
93#define HAL_AFSTATE_FAILED (6)
94#define HAL_AFSTATE_NEEDS_DETERMINATION (7)
95#define HAL_AFSTATE_PASSIVE_FOCUSED (8)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +090096
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070097enum sensor_name {
98 SENSOR_NAME_S5K3H2 = 1,
99 SENSOR_NAME_S5K6A3 = 2,
100 SENSOR_NAME_S5K4E5 = 3,
101 SENSOR_NAME_S5K3H7 = 4,
102 SENSOR_NAME_CUSTOM = 5,
103 SENSOR_NAME_END
104};
105
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700106enum is_subscenario_id {
107 ISS_SUB_SCENARIO_STILL,
108 ISS_SUB_SCENARIO_VIDEO,
109 ISS_SUB_SCENARIO_SCENE1,
110 ISS_SUB_SCENARIO_SCENE2,
111 ISS_SUB_SCENARIO_SCENE3,
112 ISS_SUB_END
113};
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700114
115typedef struct node_info {
116 int fd;
117 int width;
118 int height;
119 int format;
120 int planes;
121 int buffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700122 enum v4l2_memory memory;
123 enum v4l2_buf_type type;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700124 ion_client ionClient;
125 ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700126 int status;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700127} node_info_t;
128
129
130typedef struct camera_hw_info {
131 int sensor_id;
132
133 node_info_t sensor;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900134 node_info_t isp;
135 node_info_t capture;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700136
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900137 /*shot*/ // temp
138 struct camera2_shot_ext dummy_shot;
139
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700140} camera_hw_info_t;
141
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900142typedef enum request_entry_status {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700143 EMPTY,
144 REGISTERED,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700145 REQUESTED,
146 CAPTURED
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700147} request_entry_status_t;
148
149typedef struct request_manager_entry {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900150 request_entry_status_t status;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900151 camera_metadata_t *original_request;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700152 struct camera2_shot_ext internal_shot;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900153 int output_stream_count;
154 bool dynamic_meta_vaild;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700155} request_manager_entry_t;
156
157class RequestManager {
158public:
159 RequestManager(SignalDrivenThread* main_thread);
160 ~RequestManager();
161 int GetNumEntries();
162 bool IsRequestQueueFull();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900163
164 void RegisterRequest(camera_metadata_t *new_request);
165 void DeregisterRequest(camera_metadata_t **deregistered_request);
166 bool PrepareFrame(size_t *num_entries, size_t *frame_size,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700167 camera_metadata_t **prepared_frame, int afState);
168 int MarkProcessingRequest(ExynosBuffer * buf, int *afMode);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900169 void NotifyStreamOutput(int frameCnt, int stream_id);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900170 void DumpInfoWithIndex(int index);
Sungjoong Kangad378612012-08-17 12:34:33 -0700171 void ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900172 void CheckCompleted(int index);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700173 void UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt, bool afTrigger);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900174 void RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
175 uint64_t GetTimestamp(int frameCnt);
176 int FindFrameCnt(struct camera2_shot_ext * shot_ext);
177 int FindEntryIndexByFrameCnt(int frameCnt);
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700178 void Dump(void);
179 int GetNextIndex(int index);
180 void SetDefaultParameters(int cropX);
181 void SetInitialSkip(int count);
Sungjoong Kangad378612012-08-17 12:34:33 -0700182 int GetSkipCnt();
183 void SetFrameIndex(int index);
184 int GetFrameIndex();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700185private:
186
187 MetadataConverter *m_metadataConverter;
188 SignalDrivenThread *m_mainThread;
189 int m_numOfEntries;
190 int m_entryInsertionIndex;
191 int m_entryProcessingIndex;
192 int m_entryFrameOutputIndex;
193 request_manager_entry_t entries[NUM_MAX_REQUEST_MGR_ENTRY];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900194 int m_completedIndex;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700195
196 Mutex m_requestMutex;
197
198 //TODO : alloc dynamically
199 char m_tempFrameMetadataBuf[2000];
200 camera_metadata_t *m_tempFrameMetadata;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900201
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700202 int m_sensorPipelineSkipCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900203 int m_cropX;
Sungjoong Kangad378612012-08-17 12:34:33 -0700204 int m_frameIndex;
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700205 int m_lastAeMode;
206 int m_lastAaMode;
207 int m_lastAwbMode;
208 int m_lastAeComp;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700209};
210
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900211
212typedef struct bayer_buf_entry {
213 int status;
214 int reqFrameCnt;
215 nsecs_t timeStamp;
216} bayer_buf_entry_t;
217
218
219class BayerBufManager {
220public:
221 BayerBufManager();
222 ~BayerBufManager();
223 int GetIndexForSensorEnqueue();
224 int MarkSensorEnqueue(int index);
225 int MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
226 int GetIndexForIspEnqueue(int *reqFrameCnt);
227 int GetIndexForIspDequeue(int *reqFrameCnt);
228 int MarkIspEnqueue(int index);
229 int MarkIspDequeue(int index);
230 int GetNumOnSensor();
231 int GetNumOnHalFilled();
232 int GetNumOnIsp();
233
234private:
235 int GetNextIndex(int index);
236
237 int sensorEnqueueHead;
238 int sensorDequeueHead;
239 int ispEnqueueHead;
240 int ispDequeueHead;
241 int numOnSensor;
242 int numOnIsp;
243 int numOnHalFilled;
244 int numOnHalEmpty;
245
246 bayer_buf_entry_t entries[NUM_BAYER_BUFFERS];
247};
248
249
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900250#define NOT_AVAILABLE (0)
251#define REQUIRES_DQ_FROM_SVC (1)
252#define ON_DRIVER (2)
253#define ON_HAL (3)
254#define ON_SERVICE (4)
255
256#define BAYER_NOT_AVAILABLE (0)
257#define BAYER_ON_SENSOR (1)
258#define BAYER_ON_HAL_FILLED (2)
259#define BAYER_ON_ISP (3)
260#define BAYER_ON_SERVICE (4)
261#define BAYER_ON_HAL_EMPTY (5)
262
263typedef struct stream_parameters {
264 int streamType;
265 uint32_t outputWidth;
266 uint32_t outputHeight;
267 uint32_t nodeWidth;
268 uint32_t nodeHeight;
269 int outputFormat;
270 int nodeFormat;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700271 const camera2_stream_ops_t* streamOps;
272 uint32_t usage;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900273 int numHwBuffers;
274 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700275 int numOwnSvcBuffers;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700276 int fd;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900277 int svcPlanes;
278 int nodePlanes;
279 enum v4l2_memory memory;
280 enum v4l2_buf_type halBuftype;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700281 int numSvcBufsInHal;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900282 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
283 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
284 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700285 int svcBufIndex;
286 ion_client ionClient;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900287 node_info_t node;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700288} stream_parameters_t;
289
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900290typedef struct record_parameters {
291 uint32_t outputWidth;
292 uint32_t outputHeight;
293 int outputFormat;
294 const camera2_stream_ops_t* streamOps;
295 uint32_t usage;
296 int numSvcBuffers;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700297 int numOwnSvcBuffers;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900298 int svcPlanes;
299 buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
300 ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS];
301 int svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700302 int svcBufIndex;
303 int numSvcBufsInHal;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900304} record_parameters_t;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900305
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700306class ExynosCameraHWInterface2 : public virtual RefBase {
307public:
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700308 ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700309 virtual ~ExynosCameraHWInterface2();
310
311 virtual void release();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900312
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700313 inline int getCameraId() const;
314
315 virtual int setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
316 virtual int notifyRequestQueueNotEmpty();
317 virtual int setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
318 virtual int getInProgressCount();
319 virtual int flushCapturesInProgress();
320 virtual int constructDefaultRequest(int request_template, camera_metadata_t **request);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900321 virtual int allocateStream(uint32_t width, uint32_t height,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700322 int format, const camera2_stream_ops_t *stream_ops,
323 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
324 virtual int registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
325 virtual int releaseStream(uint32_t stream_id);
326 virtual int allocateReprocessStream(uint32_t width, uint32_t height,
327 uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
328 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
329 virtual int releaseReprocessStream(uint32_t stream_id);
330 virtual int triggerAction(uint32_t trigger_id, int ext1, int ext2);
331 virtual int setNotifyCallback(camera2_notify_callback notify_cb, void *user);
332 virtual int getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
333 virtual int dump(int fd);
334private:
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900335class MainThread : public SignalDrivenThread {
336 ExynosCameraHWInterface2 *mHardware;
337 public:
338 MainThread(ExynosCameraHWInterface2 *hw):
339 SignalDrivenThread(),
340 mHardware(hw) {
341// Start("MainThread", PRIORITY_DEFAULT, 0);
342 }
343 ~MainThread();
344 status_t readyToRunInternal()
345 {
346 return NO_ERROR;
347 }
348 void threadFunctionInternal()
349 {
350 mHardware->m_mainThreadFunc(this);
351 return;
352 }
353 void release(void);
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700354 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900355 };
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900356
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700357 class SensorThread : public SignalDrivenThread {
358 ExynosCameraHWInterface2 *mHardware;
359 public:
360 SensorThread(ExynosCameraHWInterface2 *hw):
361 SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0),
362 mHardware(hw),
363 m_isBayerOutputEnabled(false) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900364 ~SensorThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700365 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900366 mHardware->m_sensorThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700367 return NO_ERROR;
368 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900369 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700370 mHardware->m_sensorThreadFunc(this);
371 return;
372 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900373 void release(void);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700374 //private:
375 bool m_isBayerOutputEnabled;
376 int m_sensorFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700377 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900378 };
379
380 class IspThread : public SignalDrivenThread {
381 ExynosCameraHWInterface2 *mHardware;
382 public:
383 IspThread(ExynosCameraHWInterface2 *hw):
384 SignalDrivenThread("IspThread", PRIORITY_DEFAULT, 0),
385 mHardware(hw) { }
386 ~IspThread();
387 status_t readyToRunInternal() {
388 mHardware->m_ispThreadInitialize(this);
389 return NO_ERROR;
390 }
391 void threadFunctionInternal() {
392 mHardware->m_ispThreadFunc(this);
393 return;
394 }
395 void release(void);
396 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700397 int m_ispFd;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700398 bool m_releasing;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700399 };
400
401 class StreamThread : public SignalDrivenThread {
402 ExynosCameraHWInterface2 *mHardware;
403 public:
404 StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
405 SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0),
406 mHardware(hw),
407 m_index(new_index) { }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900408 ~StreamThread();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700409 status_t readyToRunInternal() {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900410 mHardware->m_streamThreadInitialize(this);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700411 return NO_ERROR;
412 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900413 void threadFunctionInternal() {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700414 mHardware->m_streamThreadFunc(this);
415 return;
416 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900417 void setRecordingParameter(record_parameters_t * recordParm);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900418 void setParameter(stream_parameters_t * new_parameters);
419 void applyChange(void);
420 void release(void);
421 int findBufferIndex(void * bufAddr);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700422
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900423
424 uint8_t m_index;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900425 bool m_activated;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900426 //private:
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700427 stream_parameters_t m_parameters;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900428 stream_parameters_t *m_tempParameters;
429 record_parameters_t m_recordParameters;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900430 bool m_isBufferInit;
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700431 bool m_releasing;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900432 };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700433
434 sp<MainThread> m_mainThread;
435 sp<SensorThread> m_sensorThread;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900436 sp<IspThread> m_ispThread;
437 sp<StreamThread> m_streamThreads[NUM_MAX_STREAM_THREAD];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700438
439
440
441 RequestManager *m_requestManager;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900442 BayerBufManager *m_BayerManager;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700443 ExynosCamera2 *m_camera2;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700444
445 void m_mainThreadFunc(SignalDrivenThread * self);
446 void m_sensorThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900447 void m_sensorThreadInitialize(SignalDrivenThread * self);
448 void m_ispThreadFunc(SignalDrivenThread * self);
449 void m_ispThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700450 void m_streamThreadFunc(SignalDrivenThread * self);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900451 void m_streamThreadInitialize(SignalDrivenThread * self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700452
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900453 void m_getAlignedYUVSize(int colorFormat, int w, int h,
454 ExynosBuffer *buf);
455 bool m_getRatioSize(int src_w, int src_h,
456 int dst_w, int dst_h,
457 int *crop_x, int *crop_y,
458 int *crop_w, int *crop_h,
459 int zoom);
460 int createIonClient(ion_client ionClient);
461 int deleteIonClient(ion_client ionClient);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900462
463 int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
464 void freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
465 void initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
466
467 void DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
468 bool yuv2Jpeg(ExynosBuffer *yuvBuf,
469 ExynosBuffer *jpegBuf,
470 ExynosRect *rect);
Sungjoong Kangad378612012-08-17 12:34:33 -0700471 void InitializeISPChain();
472 void StartISP();
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700473 int GetAfState();
474 void SetAfMode(enum aa_afmode afMode);
475 void OnAfTrigger(int id);
476 void OnAfTriggerAutoMacro(int id);
477 void OnAfTriggerCAFPicture(int id);
478 void OnAfTriggerCAFVideo(int id);
479 void OnAfCancel(int id);
480 void OnAfCancelAutoMacro(int id);
481 void OnAfCancelCAFPicture(int id);
482 void OnAfCancelCAFVideo(int id);
483 void OnAfNotification(enum aa_afstate noti);
484 void OnAfNotificationAutoMacro(enum aa_afstate noti);
485 void OnAfNotificationCAFPicture(enum aa_afstate noti);
486 void OnAfNotificationCAFVideo(enum aa_afstate noti);
487 void SetAfStateForService(int newState);
488 int GetAfStateForService();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900489 exif_attribute_t mExifInfo;
490 void *m_exynosPictureCSC;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900491 void *m_exynosVideoCSC;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900492
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900493 int m_jpegEncodingFrameCnt;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700494
495 camera2_request_queue_src_ops_t *m_requestQueueOps;
496 camera2_frame_queue_dst_ops_t *m_frameQueueOps;
497 camera2_notify_callback m_notifyCb;
498 void *m_callbackCookie;
499
500 int m_numOfRemainingReqInSvc;
501 bool m_isRequestQueuePending;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900502 bool m_isRequestQueueNull;
503 camera2_device_t *m_halDevice;
504 static gralloc_module_t const* m_grallocHal;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700505
506
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900507 camera_hw_info_t m_camera_info;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700508
509 ion_client m_ionCameraClient;
510
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900511 bool m_isSensorThreadOn;
512 bool m_isSensorStarted;
Sungjoong Kangad378612012-08-17 12:34:33 -0700513 bool m_isIspStarted;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900514
Sungjoong Kangad378612012-08-17 12:34:33 -0700515 int m_need_streamoff;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900516
517 bool m_initFlag1;
518 bool m_initFlag2;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900519
520 int indexToQueue[3+1];
521 int m_fd_scp;
522
523 bool m_scp_flushing;
524 bool m_closing;
525 ExynosBuffer m_resizeBuf;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900526 bool m_recordingEnabled;
527 int m_previewOutput;
528 int m_recordOutput;
529 bool m_needsRecordBufferInit;
530 int lastFrameCnt;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900531 int m_cameraId;
532 bool m_scp_closing;
533 bool m_scp_closed;
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700534 bool m_wideAspect;
Sungjoong Kangad378612012-08-17 12:34:33 -0700535
536 mutable Mutex m_qbufLock;
537
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700538 int m_afState;
539 int m_afTriggerId;
540 enum aa_afmode m_afMode;
541 enum aa_afmode m_afMode2;
542 bool m_IsAfModeUpdateRequired;
543 bool m_IsAfTriggerRequired;
544 bool m_IsAfLockRequired;
545 int m_serviceAfState;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700546};
547
548}; // namespace android
549
550#endif