blob: cbde87016aa48316e095668eeb883b7230f9fc44 [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.cpp
21 * \brief source 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 */
33
34//#define LOG_NDEBUG 0
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090035#define LOG_TAG "ExynosCameraHAL2"
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070036#include <utils/Log.h>
37
38#include "ExynosCameraHWInterface2.h"
39#include "exynos_format.h"
40
41
42
43namespace android {
44
45
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090046void m_savePostView(const char *fname, uint8_t *buf, uint32_t size)
47{
48 int nw;
49 int cnt = 0;
50 uint32_t written = 0;
51
Sungjoong Kangad378612012-08-17 12:34:33 -070052 ALOGV("opening file [%s], address[%x], size(%d)", fname, (unsigned int)buf, size);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090053 int fd = open(fname, O_RDWR | O_CREAT, 0644);
54 if (fd < 0) {
55 ALOGE("failed to create file [%s]: %s", fname, strerror(errno));
56 return;
57 }
58
Sungjoong Kangad378612012-08-17 12:34:33 -070059 ALOGV("writing %d bytes to file [%s]", size, fname);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090060 while (written < size) {
61 nw = ::write(fd, buf + written, size - written);
62 if (nw < 0) {
63 ALOGE("failed to write to file %d [%s]: %s",written,fname, strerror(errno));
64 break;
65 }
66 written += nw;
67 cnt++;
68 }
Sungjoong Kangad378612012-08-17 12:34:33 -070069 ALOGV("done writing %d bytes to file [%s] in %d passes",size, fname, cnt);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +090070 ::close(fd);
71}
72
Jiyoung Shinc15a6b02012-06-05 01:08:14 -070073int get_pixel_depth(uint32_t fmt)
74{
75 int depth = 0;
76
77 switch (fmt) {
78 case V4L2_PIX_FMT_JPEG:
79 depth = 8;
80 break;
81
82 case V4L2_PIX_FMT_NV12:
83 case V4L2_PIX_FMT_NV21:
84 case V4L2_PIX_FMT_YUV420:
85 case V4L2_PIX_FMT_YVU420M:
86 case V4L2_PIX_FMT_NV12M:
87 case V4L2_PIX_FMT_NV12MT:
88 depth = 12;
89 break;
90
91 case V4L2_PIX_FMT_RGB565:
92 case V4L2_PIX_FMT_YUYV:
93 case V4L2_PIX_FMT_YVYU:
94 case V4L2_PIX_FMT_UYVY:
95 case V4L2_PIX_FMT_VYUY:
96 case V4L2_PIX_FMT_NV16:
97 case V4L2_PIX_FMT_NV61:
98 case V4L2_PIX_FMT_YUV422P:
99 case V4L2_PIX_FMT_SBGGR10:
100 case V4L2_PIX_FMT_SBGGR12:
101 case V4L2_PIX_FMT_SBGGR16:
102 depth = 16;
103 break;
104
105 case V4L2_PIX_FMT_RGB32:
106 depth = 32;
107 break;
108 default:
109 ALOGE("Get depth failed(format : %d)", fmt);
110 break;
111 }
112
113 return depth;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900114}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700115
116int cam_int_s_fmt(node_info_t *node)
117{
118 struct v4l2_format v4l2_fmt;
119 unsigned int framesize;
120 int ret;
121
122 memset(&v4l2_fmt, 0, sizeof(struct v4l2_format));
123
124 v4l2_fmt.type = node->type;
125 framesize = (node->width * node->height * get_pixel_depth(node->format)) / 8;
126
127 if (node->planes >= 1) {
128 v4l2_fmt.fmt.pix_mp.width = node->width;
129 v4l2_fmt.fmt.pix_mp.height = node->height;
130 v4l2_fmt.fmt.pix_mp.pixelformat = node->format;
131 v4l2_fmt.fmt.pix_mp.field = V4L2_FIELD_ANY;
132 } else {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900133 ALOGE("%s:S_FMT, Out of bound : Number of element plane",__FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700134 }
135
136 /* Set up for capture */
137 ret = exynos_v4l2_s_fmt(node->fd, &v4l2_fmt);
138
139 if (ret < 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900140 ALOGE("%s: exynos_v4l2_s_fmt fail (%d)",__FUNCTION__, ret);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700141
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700142
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700143 return ret;
144}
145
146int cam_int_reqbufs(node_info_t *node)
147{
148 struct v4l2_requestbuffers req;
149 int ret;
150
151 req.count = node->buffers;
152 req.type = node->type;
153 req.memory = node->memory;
154
155 ret = exynos_v4l2_reqbufs(node->fd, &req);
156
157 if (ret < 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900158 ALOGE("%s: VIDIOC_REQBUFS (fd:%d) failed (%d)",__FUNCTION__,node->fd, ret);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700159
160 return req.count;
161}
162
163int cam_int_qbuf(node_info_t *node, int index)
164{
165 struct v4l2_buffer v4l2_buf;
166 struct v4l2_plane planes[VIDEO_MAX_PLANES];
167 int i;
168 int ret = 0;
169
170 v4l2_buf.m.planes = planes;
171 v4l2_buf.type = node->type;
172 v4l2_buf.memory = node->memory;
173 v4l2_buf.index = index;
174 v4l2_buf.length = node->planes;
175
176 for(i = 0; i < node->planes; i++){
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900177 v4l2_buf.m.planes[i].m.fd = (int)(node->buffer[index].fd.extFd[i]);
178 v4l2_buf.m.planes[i].length = (unsigned long)(node->buffer[index].size.extS[i]);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700179 }
180
181 ret = exynos_v4l2_qbuf(node->fd, &v4l2_buf);
182
183 if (ret < 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900184 ALOGE("%s: cam_int_qbuf failed (index:%d)(ret:%d)",__FUNCTION__, index, ret);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700185
186 return ret;
187}
188
189int cam_int_streamon(node_info_t *node)
190{
191 enum v4l2_buf_type type = node->type;
192 int ret;
193
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700194
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700195 ret = exynos_v4l2_streamon(node->fd, type);
196
197 if (ret < 0)
Sungjoong Kangad378612012-08-17 12:34:33 -0700198 ALOGE("%s: VIDIOC_STREAMON failed [%d] (%d)",__FUNCTION__, node->fd,ret);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700199
200 ALOGV("On streaming I/O... ... fd(%d)", node->fd);
201
202 return ret;
203}
204
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900205int cam_int_streamoff(node_info_t *node)
206{
Sungjoong Kangad378612012-08-17 12:34:33 -0700207 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
208 int ret;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900209
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700210
Sungjoong Kangad378612012-08-17 12:34:33 -0700211 ALOGV("Off streaming I/O... fd(%d)", node->fd);
212 ret = exynos_v4l2_streamoff(node->fd, type);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900213
214 if (ret < 0)
215 ALOGE("%s: VIDIOC_STREAMOFF failed (%d)",__FUNCTION__, ret);
216
Sungjoong Kangad378612012-08-17 12:34:33 -0700217 return ret;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900218}
219
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900220int isp_int_streamoff(node_info_t *node)
221{
Sungjoong Kangad378612012-08-17 12:34:33 -0700222 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
223 int ret;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900224
Sungjoong Kangad378612012-08-17 12:34:33 -0700225 ALOGV("Off streaming I/O... fd(%d)", node->fd);
226 ret = exynos_v4l2_streamoff(node->fd, type);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900227
228 if (ret < 0)
229 ALOGE("%s: VIDIOC_STREAMOFF failed (%d)",__FUNCTION__, ret);
230
Sungjoong Kangad378612012-08-17 12:34:33 -0700231 return ret;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900232}
233
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700234int cam_int_dqbuf(node_info_t *node)
235{
236 struct v4l2_buffer v4l2_buf;
237 struct v4l2_plane planes[VIDEO_MAX_PLANES];
238 int ret;
239
240 v4l2_buf.type = node->type;
241 v4l2_buf.memory = node->memory;
242 v4l2_buf.m.planes = planes;
243 v4l2_buf.length = node->planes;
244
245 ret = exynos_v4l2_dqbuf(node->fd, &v4l2_buf);
246 if (ret < 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900247 ALOGE("%s: VIDIOC_DQBUF failed (%d)",__FUNCTION__, ret);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700248
249 return v4l2_buf.index;
250}
251
Sungjoong Kangfeb7df42012-08-28 23:35:43 +0900252int cam_int_dqbuf(node_info_t *node, int num_plane)
253{
254 struct v4l2_buffer v4l2_buf;
255 struct v4l2_plane planes[VIDEO_MAX_PLANES];
256 int ret;
257
258 v4l2_buf.type = node->type;
259 v4l2_buf.memory = node->memory;
260 v4l2_buf.m.planes = planes;
261 v4l2_buf.length = num_plane;
262
263 ret = exynos_v4l2_dqbuf(node->fd, &v4l2_buf);
264 if (ret < 0)
265 ALOGE("%s: VIDIOC_DQBUF failed (%d)",__FUNCTION__, ret);
266
267 return v4l2_buf.index;
268}
269
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700270int cam_int_s_input(node_info_t *node, int index)
271{
272 int ret;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900273
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700274 ret = exynos_v4l2_s_input(node->fd, index);
275 if (ret < 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900276 ALOGE("%s: VIDIOC_S_INPUT failed (%d)",__FUNCTION__, ret);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700277
278 return ret;
279}
280
281
282gralloc_module_t const* ExynosCameraHWInterface2::m_grallocHal;
283
284RequestManager::RequestManager(SignalDrivenThread* main_thread):
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700285 m_lastAeMode(0),
286 m_lastAaMode(0),
287 m_lastAwbMode(0),
288 m_lastAeComp(0),
Sungjoong Kangad378612012-08-17 12:34:33 -0700289 m_frameIndex(-1)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700290{
291 m_metadataConverter = new MetadataConverter;
292 m_mainThread = main_thread;
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900293 ResetEntry();
Sungjoong Kangad378612012-08-17 12:34:33 -0700294 m_sensorPipelineSkipCnt = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700295 return;
296}
297
298RequestManager::~RequestManager()
299{
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700300 ALOGV("%s", __FUNCTION__);
301 if (m_metadataConverter != NULL) {
302 delete m_metadataConverter;
303 m_metadataConverter = NULL;
304 }
305
Sungjoong Kang52f54302012-09-04 21:43:06 +0900306 releaseSensorQ();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700307 return;
308}
309
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900310void RequestManager::ResetEntry()
311{
312 Mutex::Autolock lock(m_requestMutex);
313 for (int i=0 ; i<NUM_MAX_REQUEST_MGR_ENTRY; i++) {
314 memset(&(entries[i]), 0x00, sizeof(request_manager_entry_t));
315 entries[i].internal_shot.shot.ctl.request.frameCount = -1;
316 }
317 m_numOfEntries = 0;
318 m_entryInsertionIndex = -1;
319 m_entryProcessingIndex = -1;
320 m_entryFrameOutputIndex = -1;
321}
322
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700323int RequestManager::GetNumEntries()
324{
325 return m_numOfEntries;
326}
327
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900328void RequestManager::SetDefaultParameters(int cropX)
329{
330 m_cropX = cropX;
331}
332
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700333bool RequestManager::IsRequestQueueFull()
334{
335 Mutex::Autolock lock(m_requestMutex);
336 if (m_numOfEntries>=NUM_MAX_REQUEST_MGR_ENTRY)
337 return true;
338 else
339 return false;
340}
341
342void RequestManager::RegisterRequest(camera_metadata_t * new_request)
343{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900344 ALOGV("DEBUG(%s):", __FUNCTION__);
345
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700346 Mutex::Autolock lock(m_requestMutex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900347
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700348 request_manager_entry * newEntry = NULL;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900349 int newInsertionIndex = GetNextIndex(m_entryInsertionIndex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900350 ALOGV("DEBUG(%s): got lock, new insertIndex(%d), cnt before reg(%d)", __FUNCTION__,newInsertionIndex,m_numOfEntries );
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700351
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900352
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700353 newEntry = &(entries[newInsertionIndex]);
354
355 if (newEntry->status!=EMPTY) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900356 ALOGV("DEBUG(%s): Circular buffer abnormal ", __FUNCTION__);
357 return;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700358 }
359 newEntry->status = REGISTERED;
360 newEntry->original_request = new_request;
Sungjoong Kangad378612012-08-17 12:34:33 -0700361 memset(&(newEntry->internal_shot), 0, sizeof(struct camera2_shot_ext));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900362 m_metadataConverter->ToInternalShot(new_request, &(newEntry->internal_shot));
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700363 newEntry->output_stream_count = newEntry->internal_shot.shot.ctl.request.outputStreams[15];
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700364
365 m_numOfEntries++;
366 m_entryInsertionIndex = newInsertionIndex;
367
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900368
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700369 ALOGV("## RegisterReq DONE num(%d), insert(%d), processing(%d), frame(%d), (frameCnt(%d))",
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700370 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex, newEntry->internal_shot.shot.ctl.request.frameCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700371}
372
373void RequestManager::DeregisterRequest(camera_metadata_t ** deregistered_request)
374{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900375 ALOGV("DEBUG(%s):", __FUNCTION__);
Sungjoong Kangad378612012-08-17 12:34:33 -0700376 int frame_index;
377 request_manager_entry * currentEntry;
378
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700379 Mutex::Autolock lock(m_requestMutex);
380
Sungjoong Kangad378612012-08-17 12:34:33 -0700381 frame_index = GetFrameIndex();
382 currentEntry = &(entries[frame_index]);
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900383 if (currentEntry->status != METADONE) {
Sungjoong Kangad378612012-08-17 12:34:33 -0700384 ALOGV("DBG(%s): Circular buffer abnormal. processing(%d), frame(%d), status(%d) ", __FUNCTION__
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700385 , m_entryProcessingIndex, m_entryFrameOutputIndex,(int)(currentEntry->status));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900386 return;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700387 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900388 if (deregistered_request) *deregistered_request = currentEntry->original_request;
389
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700390 currentEntry->status = EMPTY;
391 currentEntry->original_request = NULL;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700392 memset(&(currentEntry->internal_shot), 0, sizeof(struct camera2_shot_ext));
393 currentEntry->internal_shot.shot.ctl.request.frameCount = -1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700394 currentEntry->output_stream_count = 0;
395 m_numOfEntries--;
396 ALOGV("## DeRegistReq DONE num(%d), insert(%d), processing(%d), frame(%d)",
397 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900398
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700399 return;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700400}
401
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900402bool RequestManager::PrepareFrame(size_t* num_entries, size_t* frame_size,
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700403 camera_metadata_t ** prepared_frame, int afState)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700404{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900405 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700406 Mutex::Autolock lock(m_requestMutex);
407 status_t res = NO_ERROR;
Sungjoong Kangad378612012-08-17 12:34:33 -0700408 int tempFrameOutputIndex = GetFrameIndex();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900409 request_manager_entry * currentEntry = &(entries[tempFrameOutputIndex]);
410 ALOGV("DEBUG(%s): processing(%d), frameOut(%d), insert(%d) recentlycompleted(%d)", __FUNCTION__,
411 m_entryProcessingIndex, m_entryFrameOutputIndex, m_entryInsertionIndex, m_completedIndex);
412
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900413 if (currentEntry->status != METADONE) {
Sungjoong Kangad378612012-08-17 12:34:33 -0700414 ALOGV("DBG(%s): Circular buffer abnormal status(%d)", __FUNCTION__, (int)(currentEntry->status));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900415
416 return false;
417 }
418 m_entryFrameOutputIndex = tempFrameOutputIndex;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -0700419 m_tempFrameMetadata = place_camera_metadata(m_tempFrameMetadataBuf, 2000, 20, 500); //estimated
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700420 add_camera_metadata_entry(m_tempFrameMetadata, ANDROID_CONTROL_AF_STATE, &afState, 1);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900421 res = m_metadataConverter->ToDynamicMetadata(&(currentEntry->internal_shot),
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700422 m_tempFrameMetadata);
423 if (res!=NO_ERROR) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900424 ALOGE("ERROR(%s): ToDynamicMetadata (%d) ", __FUNCTION__, res);
425 return false;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700426 }
427 *num_entries = get_camera_metadata_entry_count(m_tempFrameMetadata);
428 *frame_size = get_camera_metadata_size(m_tempFrameMetadata);
429 *prepared_frame = m_tempFrameMetadata;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700430 ALOGV("## PrepareFrame DONE: frameOut(%d) frameCnt-req(%d) timestamp(%lld)", m_entryFrameOutputIndex,
431 currentEntry->internal_shot.shot.ctl.request.frameCount, currentEntry->internal_shot.shot.dm.sensor.timeStamp);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900432 // Dump();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900433 return true;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700434}
435
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700436int RequestManager::MarkProcessingRequest(ExynosBuffer* buf, int *afMode)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700437{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900438 struct camera2_shot_ext * shot_ext;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700439 struct camera2_shot_ext * request_shot;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900440 int targetStreamIndex = 0;
Sungjoong Kangad378612012-08-17 12:34:33 -0700441 request_manager_entry * newEntry = NULL;
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700442 static int count = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900443
Sungjoong Kang52f54302012-09-04 21:43:06 +0900444 Mutex::Autolock lock(m_requestMutex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900445 if (m_numOfEntries == 0) {
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -0700446 CAM_LOGD("DEBUG(%s): Request Manager Empty ", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900447 return -1;
448 }
449
450 if ((m_entryProcessingIndex == m_entryInsertionIndex)
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700451 && (entries[m_entryProcessingIndex].status == REQUESTED || entries[m_entryProcessingIndex].status == CAPTURED)) {
Younghwan Jooda7ca692012-09-03 20:47:21 -0700452 ALOGV("## MarkProcReq skipping(request underrun) - num(%d), insert(%d), processing(%d), frame(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900453 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex);
454 return -1;
455 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700456
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900457 int newProcessingIndex = GetNextIndex(m_entryProcessingIndex);
Sungjoong Kangad378612012-08-17 12:34:33 -0700458 ALOGV("DEBUG(%s): index(%d)", __FUNCTION__, newProcessingIndex);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700459
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700460 newEntry = &(entries[newProcessingIndex]);
Sungjoong Kangad378612012-08-17 12:34:33 -0700461 request_shot = &(newEntry->internal_shot);
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700462 *afMode = (int)(newEntry->internal_shot.shot.ctl.aa.afMode);
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700463 if (newEntry->status != REGISTERED) {
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -0700464 CAM_LOGD("DEBUG(%s)(%d): Circular buffer abnormal ", __FUNCTION__, newProcessingIndex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900465 return -1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700466 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700467
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700468 newEntry->status = REQUESTED;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700469
Sungjoong Kangad378612012-08-17 12:34:33 -0700470 shot_ext = (struct camera2_shot_ext *)buf->virt.extP[1];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900471
Sungjoong Kangad378612012-08-17 12:34:33 -0700472 memset(shot_ext, 0x00, sizeof(struct camera2_shot_ext));
473 shot_ext->shot.ctl.request.frameCount = request_shot->shot.ctl.request.frameCount;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900474 shot_ext->request_sensor = 1;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900475 shot_ext->dis_bypass = 1;
476 shot_ext->dnr_bypass = 1;
Sungjoong Kangad378612012-08-17 12:34:33 -0700477 shot_ext->fd_bypass = 1;
478 shot_ext->setfile = 0;
479
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700480 targetStreamIndex = newEntry->internal_shot.shot.ctl.request.outputStreams[0];
481 shot_ext->shot.ctl.request.outputStreams[0] = targetStreamIndex;
482 if (targetStreamIndex & MASK_OUTPUT_SCP)
483 shot_ext->request_scp = 1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900484
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700485 if (targetStreamIndex & MASK_OUTPUT_SCC)
486 shot_ext->request_scc = 1;
487
488 if (shot_ext->shot.ctl.stats.faceDetectMode != FACEDETECT_MODE_OFF)
489 shot_ext->fd_bypass = 0;
Sungjoong Kangad378612012-08-17 12:34:33 -0700490
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700491 if (count == 0){
492 shot_ext->shot.ctl.aa.mode = AA_CONTROL_AUTO;
493 } else
494 shot_ext->shot.ctl.aa.mode = AA_CONTROL_NONE;
495
496 count++;
Sungjoong Kangad378612012-08-17 12:34:33 -0700497 shot_ext->shot.ctl.request.metadataMode = METADATA_MODE_FULL;
498 shot_ext->shot.ctl.stats.faceDetectMode = FACEDETECT_MODE_FULL;
499 shot_ext->shot.magicNumber = 0x23456789;
500 shot_ext->shot.ctl.sensor.exposureTime = 0;
501 shot_ext->shot.ctl.sensor.frameDuration = 33*1000*1000;
502 shot_ext->shot.ctl.sensor.sensitivity = 0;
503
Sungjoong Kange4657e32012-08-28 15:02:19 -0700504
505 shot_ext->shot.ctl.scaler.cropRegion[0] = newEntry->internal_shot.shot.ctl.scaler.cropRegion[0];
506 shot_ext->shot.ctl.scaler.cropRegion[1] = newEntry->internal_shot.shot.ctl.scaler.cropRegion[1];
507 shot_ext->shot.ctl.scaler.cropRegion[2] = newEntry->internal_shot.shot.ctl.scaler.cropRegion[2];
Sungjoong Kangad378612012-08-17 12:34:33 -0700508
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900509 m_entryProcessingIndex = newProcessingIndex;
Sungjoong Kangad378612012-08-17 12:34:33 -0700510 return newProcessingIndex;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700511}
512
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900513void RequestManager::NotifyStreamOutput(int frameCnt)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700514{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900515 int index;
516
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900517 Mutex::Autolock lock(m_requestMutex);
518 ALOGV("DEBUG(%s): frameCnt(%d)", __FUNCTION__, frameCnt);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900519
520 index = FindEntryIndexByFrameCnt(frameCnt);
521 if (index == -1) {
522 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
523 return;
524 }
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900525 ALOGV("DEBUG(%s): frameCnt(%d), last cnt (%d)", __FUNCTION__, frameCnt, entries[index].output_stream_count);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900526
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700527 entries[index].output_stream_count--; //TODO : match stream id also
528 CheckCompleted(index);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700529}
530
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900531void RequestManager::CheckCompleted(int index)
532{
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900533 if((entries[index].status == METADONE) && (entries[index].output_stream_count <= 0)){
534 ALOGV("send SIGNAL_MAIN_STREAM_OUTPUT_DONE(index:%d)(frameCnt:%d)",
535 index, entries[index].internal_shot.shot.ctl.request.frameCount );
536 SetFrameIndex(index);
537 m_mainThread->SetSignal(SIGNAL_MAIN_STREAM_OUTPUT_DONE);
538 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900539}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900540
Sungjoong Kangad378612012-08-17 12:34:33 -0700541void RequestManager::SetFrameIndex(int index)
542{
Sungjoong Kangad378612012-08-17 12:34:33 -0700543 m_frameIndex = index;
544}
545
546int RequestManager::GetFrameIndex()
547{
548 return m_frameIndex;
549}
550
Sungjoong Kang52f54302012-09-04 21:43:06 +0900551void RequestManager::pushSensorQ(int index)
552{
553 Mutex::Autolock lock(m_requestMutex);
554 m_sensorQ.push_back(index);
555}
556
557int RequestManager::popSensorQ()
558{
559 List<int>::iterator sensor_token;
560 int index;
561
562 Mutex::Autolock lock(m_requestMutex);
563
564 if(m_sensorQ.size() == 0)
565 return -1;
566
567 sensor_token = m_sensorQ.begin()++;
568 index = *sensor_token;
569 m_sensorQ.erase(sensor_token);
570
571 return (index);
572}
573
574void RequestManager::releaseSensorQ()
575{
576 List<int>::iterator r;
577
578 Mutex::Autolock lock(m_requestMutex);
579 ALOGV("(%d)m_sensorQ.size : %d", __FUNCTION__, m_sensorQ.size());
580
581 while(m_sensorQ.size() > 0){
582 r = m_sensorQ.begin()++;
583 m_sensorQ.erase(r);
584 }
585 return;
586}
587
Sungjoong Kangad378612012-08-17 12:34:33 -0700588void RequestManager::ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900589{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900590 int index;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700591 struct camera2_shot_ext * request_shot;
592 nsecs_t timeStamp;
Sungjoong Kangad378612012-08-17 12:34:33 -0700593 int i;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900594
Sungjoong Kang52f54302012-09-04 21:43:06 +0900595 Mutex::Autolock lock(m_requestMutex);
Sungjoong Kangad378612012-08-17 12:34:33 -0700596 ALOGV("DEBUG(%s): frameCnt(%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900597
Sungjoong Kangad378612012-08-17 12:34:33 -0700598 for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
599 if((entries[i].internal_shot.shot.ctl.request.frameCount == shot_ext->shot.ctl.request.frameCount)
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900600 && (entries[i].status == CAPTURED)){
601 entries[i].status =METADONE;
Sungjoong Kangad378612012-08-17 12:34:33 -0700602 break;
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900603 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700604 }
605
606 if (i == NUM_MAX_REQUEST_MGR_ENTRY){
607 ALOGE("[%s] no entry found(framecount:%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900608 return;
609 }
610
Sungjoong Kangad378612012-08-17 12:34:33 -0700611 request_manager_entry * newEntry = &(entries[i]);
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700612 request_shot = &(newEntry->internal_shot);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900613
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700614 timeStamp = request_shot->shot.dm.sensor.timeStamp;
Sungjoong Kangad378612012-08-17 12:34:33 -0700615 memcpy(&(request_shot->shot.dm), &(shot_ext->shot.dm), sizeof(struct camera2_dm));
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700616 request_shot->shot.dm.sensor.timeStamp = timeStamp;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700617 m_lastTimeStamp = timeStamp;
Sungjoong Kangad378612012-08-17 12:34:33 -0700618 CheckCompleted(i);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900619}
620
Sungjoong Kangef6f83c2012-08-28 22:59:48 +0900621void RequestManager::UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900622{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900623 int index, targetStreamIndex;
Sungjoong Kangb56dcc02012-08-08 13:38:09 -0700624 struct camera2_shot_ext * request_shot;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900625
626 ALOGV("DEBUG(%s): updating info with frameCnt(%d)", __FUNCTION__, frameCnt);
627 if (frameCnt < 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900628 return;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900629
630 index = FindEntryIndexByFrameCnt(frameCnt);
631 if (index == -1) {
632 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
633 return;
634 }
635
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900636 request_manager_entry * newEntry = &(entries[index]);
Sungjoong Kangad378612012-08-17 12:34:33 -0700637 request_shot = &(newEntry->internal_shot);
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700638 memcpy(&(shot_ext->shot.ctl), &(request_shot->shot.ctl), sizeof(struct camera2_ctl));
Jiyoung Shin2adfa422012-09-10 23:14:54 +0900639 shot_ext->shot.ctl.request.frameCount = frameCnt;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900640 shot_ext->request_sensor = 1;
Sungjoong Kangad378612012-08-17 12:34:33 -0700641 shot_ext->dis_bypass = 1;
642 shot_ext->dnr_bypass = 1;
643 shot_ext->fd_bypass = 1;
644 shot_ext->setfile = 0;
645
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900646 shot_ext->request_scc = 0;
647 shot_ext->request_scp = 0;
Sungjoong Kangad378612012-08-17 12:34:33 -0700648
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700649 shot_ext->isReprocessing = request_shot->isReprocessing;
650 shot_ext->reprocessInput = request_shot->reprocessInput;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900651 shot_ext->shot.ctl.request.outputStreams[0] = 0;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900652
Sungjoong Kange4657e32012-08-28 15:02:19 -0700653 shot_ext->shot.ctl.scaler.cropRegion[0] = request_shot->shot.ctl.scaler.cropRegion[0];
654 shot_ext->shot.ctl.scaler.cropRegion[1] = request_shot->shot.ctl.scaler.cropRegion[1];
655 shot_ext->shot.ctl.scaler.cropRegion[2] = request_shot->shot.ctl.scaler.cropRegion[2];
656
Sungjoong Kang2bdec062012-08-17 15:47:56 -0700657 if (m_lastAaMode == request_shot->shot.ctl.aa.mode) {
658 shot_ext->shot.ctl.aa.mode = (enum aa_mode)(0);
659 }
660 else {
661 shot_ext->shot.ctl.aa.mode = request_shot->shot.ctl.aa.mode;
662 m_lastAaMode = (int)(shot_ext->shot.ctl.aa.mode);
663 }
664 if (m_lastAeMode == request_shot->shot.ctl.aa.aeMode) {
665 shot_ext->shot.ctl.aa.aeMode = (enum aa_aemode)(0);
666 }
667 else {
668 shot_ext->shot.ctl.aa.aeMode = request_shot->shot.ctl.aa.aeMode;
669 m_lastAeMode = (int)(shot_ext->shot.ctl.aa.aeMode);
670 }
671 if (m_lastAwbMode == request_shot->shot.ctl.aa.awbMode) {
672 shot_ext->shot.ctl.aa.awbMode = (enum aa_awbmode)(0);
673 }
674 else {
675 shot_ext->shot.ctl.aa.awbMode = request_shot->shot.ctl.aa.awbMode;
676 m_lastAwbMode = (int)(shot_ext->shot.ctl.aa.awbMode);
677 }
678 if (m_lastAeComp == request_shot->shot.ctl.aa.aeExpCompensation) {
679 shot_ext->shot.ctl.aa.aeExpCompensation = 0;
680 }
681 else {
682 shot_ext->shot.ctl.aa.aeExpCompensation = request_shot->shot.ctl.aa.aeExpCompensation;
683 m_lastAeComp = (int)(shot_ext->shot.ctl.aa.aeExpCompensation);
684 }
Sungjoong Kangef6f83c2012-08-28 22:59:48 +0900685
686 shot_ext->shot.ctl.aa.afTrigger = 0;
687
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700688 targetStreamIndex = newEntry->internal_shot.shot.ctl.request.outputStreams[0];
689 shot_ext->shot.ctl.request.outputStreams[0] = targetStreamIndex;
690 if (targetStreamIndex & MASK_OUTPUT_SCP)
691 shot_ext->request_scp = 1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900692
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700693 if (targetStreamIndex & MASK_OUTPUT_SCC)
694 shot_ext->request_scc = 1;
695
696 if (shot_ext->shot.ctl.stats.faceDetectMode != FACEDETECT_MODE_OFF)
697 shot_ext->fd_bypass = 0;
698
699 if (targetStreamIndex & STREAM_MASK_RECORD) {
700 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 30;
701 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900702 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700703
704 ALOGV("(%s): applied aa(%d) aemode(%d) expComp(%d), awb(%d) afmode(%d), ", __FUNCTION__,
705 (int)(shot_ext->shot.ctl.aa.mode), (int)(shot_ext->shot.ctl.aa.aeMode),
706 (int)(shot_ext->shot.ctl.aa.aeExpCompensation), (int)(shot_ext->shot.ctl.aa.awbMode),
707 (int)(shot_ext->shot.ctl.aa.afMode));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900708}
709
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900710int RequestManager::FindEntryIndexByFrameCnt(int frameCnt)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900711{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900712 for (int i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700713 if (entries[i].internal_shot.shot.ctl.request.frameCount == frameCnt)
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900714 return i;
715 }
716 return -1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900717}
718
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900719void RequestManager::RegisterTimestamp(int frameCnt, nsecs_t * frameTime)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900720{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900721 int index = FindEntryIndexByFrameCnt(frameCnt);
722 if (index == -1) {
723 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
724 return;
725 }
726
727 request_manager_entry * currentEntry = &(entries[index]);
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700728 currentEntry->internal_shot.shot.dm.sensor.timeStamp = *((uint64_t*)frameTime);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900729 ALOGV("DEBUG(%s): applied timestamp for reqIndex(%d) frameCnt(%d) (%lld)", __FUNCTION__,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700730 index, frameCnt, currentEntry->internal_shot.shot.dm.sensor.timeStamp);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900731}
732
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700733
734nsecs_t RequestManager::GetTimestampByFrameCnt(int frameCnt)
735{
736 int index = FindEntryIndexByFrameCnt(frameCnt);
737 if (index == -1) {
738 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d) returning saved time(%lld)", __FUNCTION__, frameCnt, m_lastTimeStamp);
739 return m_lastTimeStamp;
740 }
741 else
742 return GetTimestamp(index);
743}
744
745nsecs_t RequestManager::GetTimestamp(int index)
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900746{
Sungjoong Kangeed7ed12012-08-23 16:35:08 -0700747 if (index < 0 || index >= NUM_MAX_REQUEST_MGR_ENTRY) {
748 ALOGE("ERR(%s): Request entry outside of bounds (%d)", __FUNCTION__, index);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900749 return 0;
750 }
751
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900752 request_manager_entry * currentEntry = &(entries[index]);
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700753 uint64_t frameTime = currentEntry->internal_shot.shot.dm.sensor.timeStamp;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700754 if (frameTime == 0) {
755 ALOGV("DEBUG(%s): timestamp null, returning saved value", __FUNCTION__);
756 frameTime = m_lastTimeStamp;
757 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900758 ALOGV("DEBUG(%s): Returning timestamp for reqIndex(%d) (%lld)", __FUNCTION__, index, frameTime);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900759 return frameTime;
760}
761
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900762int RequestManager::FindFrameCnt(struct camera2_shot_ext * shot_ext)
763{
Sungjoong Kangad378612012-08-17 12:34:33 -0700764 int i;
765
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700766 if (m_numOfEntries == 0) {
Sungjoong Kangad378612012-08-17 12:34:33 -0700767 ALOGV("(%s): No Entry found", __FUNCTION__);
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700768 return -1;
769 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700770
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700771 for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
Sungjoong Kangad378612012-08-17 12:34:33 -0700772 if(entries[i].internal_shot.shot.ctl.request.frameCount != shot_ext->shot.ctl.request.frameCount)
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700773 continue;
Sungjoong Kangad378612012-08-17 12:34:33 -0700774
775 if (entries[i].status == REQUESTED) {
776 entries[i].status = CAPTURED;
777 return entries[i].internal_shot.shot.ctl.request.frameCount;
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700778 }
Sungjoong Kangad378612012-08-17 12:34:33 -0700779
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700780 }
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -0700781 CAM_LOGD("(%s): No Entry found", __FUNCTION__);
Sungjoong Kangad378612012-08-17 12:34:33 -0700782
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700783 return -1;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900784}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900785
Sungjoong Kangb5237e62012-07-27 07:39:05 -0700786void RequestManager::SetInitialSkip(int count)
787{
788 ALOGV("(%s): Pipeline Restarting. setting cnt(%d) - current(%d)", __FUNCTION__, count, m_sensorPipelineSkipCnt);
789 if (count > m_sensorPipelineSkipCnt)
790 m_sensorPipelineSkipCnt = count;
791}
792
Sungjoong Kangad378612012-08-17 12:34:33 -0700793int RequestManager::GetSkipCnt()
794{
795 ALOGV("(%s): skip cnt(%d)", __FUNCTION__, m_sensorPipelineSkipCnt);
796 if (m_sensorPipelineSkipCnt == 0)
797 return m_sensorPipelineSkipCnt;
798 else
799 return --m_sensorPipelineSkipCnt;
800}
801
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900802void RequestManager::Dump(void)
803{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900804 int i = 0;
805 request_manager_entry * currentEntry;
Sungjoong Kangad378612012-08-17 12:34:33 -0700806 ALOGD("## Dump totalentry(%d), insert(%d), processing(%d), frame(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900807 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex);
808
809 for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
810 currentEntry = &(entries[i]);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700811 ALOGD("[%2d] status[%d] frameCnt[%3d] numOutput[%d] outstream[0]-%x ", i,
Sungjoong Kangbe494d12012-08-04 15:36:56 -0700812 currentEntry->status, currentEntry->internal_shot.shot.ctl.request.frameCount,
Sungjoong Kangad378612012-08-17 12:34:33 -0700813 currentEntry->output_stream_count,
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700814 currentEntry->internal_shot.shot.ctl.request.outputStreams[0]);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900815 }
816}
817
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900818int RequestManager::GetNextIndex(int index)
819{
820 index++;
821 if (index >= NUM_MAX_REQUEST_MGR_ENTRY)
822 index = 0;
823
824 return index;
825}
826
Sungjoong Kang6044e502012-08-27 00:29:28 -0700827ExynosCameraHWInterface2::ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid):
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700828 m_requestQueueOps(NULL),
829 m_frameQueueOps(NULL),
830 m_callbackCookie(NULL),
831 m_numOfRemainingReqInSvc(0),
832 m_isRequestQueuePending(false),
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900833 m_isRequestQueueNull(true),
Sungjoong Kangad378612012-08-17 12:34:33 -0700834 m_isIspStarted(false),
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900835 m_ionCameraClient(0),
hyeonmyeong Choi308291d2012-08-29 13:55:01 -0700836 m_zoomRatio(1),
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900837 m_scp_closing(false),
838 m_scp_closed(false),
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700839 m_afState(HAL_AFSTATE_INACTIVE),
840 m_afMode(NO_CHANGE),
841 m_afMode2(NO_CHANGE),
842 m_IsAfModeUpdateRequired(false),
843 m_IsAfTriggerRequired(false),
844 m_IsAfLockRequired(false),
Sungjoong Kang15fd8232012-08-23 16:16:44 -0700845 m_wideAspect(false),
Sungjoong Kangb55ed662012-08-31 21:31:34 -0700846 m_scpOutputSignalCnt(0),
847 m_scpOutputImageCnt(0),
Sungjoong Kang0f26b202012-08-17 15:43:12 -0700848 m_afTriggerId(0),
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -0700849 m_afPendingTriggerId(0),
850 m_afModeWaitingCnt(0),
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900851 m_halDevice(dev),
Sungjoong Kanga15b4e32012-08-28 12:55:39 -0700852 m_nightCaptureCnt(0),
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +0900853 m_cameraId(cameraId),
854 m_thumbNailW(160),
855 m_thumbNailH(120)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700856{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900857 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700858 int ret = 0;
Sungjoong Kang6044e502012-08-27 00:29:28 -0700859 int res = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700860
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900861 m_exynosPictureCSC = NULL;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900862 m_exynosVideoCSC = NULL;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900863
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700864 if (!m_grallocHal) {
865 ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (const hw_module_t **)&m_grallocHal);
866 if (ret)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900867 ALOGE("ERR(%s):Fail on loading gralloc HAL", __FUNCTION__);
868 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700869
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -0700870 m_camera2 = camera;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700871 m_ionCameraClient = createIonClient(m_ionCameraClient);
872 if(m_ionCameraClient == 0)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900873 ALOGE("ERR(%s):Fail on ion_client_create", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700874
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900875
876 m_BayerManager = new BayerBufManager();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700877 m_mainThread = new MainThread(this);
Sungjoong Kang52f54302012-09-04 21:43:06 +0900878 m_requestManager = new RequestManager((SignalDrivenThread*)(m_mainThread.get()));
Sungjoong Kang6044e502012-08-27 00:29:28 -0700879 *openInvalid = InitializeISPChain();
880 if (*openInvalid < 0) {
881 // clean process
882 // 1. close video nodes
883 // SCP
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700884 res = exynos_v4l2_close(m_camera_info.scp.fd);
Sungjoong Kang6044e502012-08-27 00:29:28 -0700885 if (res != NO_ERROR ) {
886 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
887 }
888 // SCC
889 res = exynos_v4l2_close(m_camera_info.capture.fd);
890 if (res != NO_ERROR ) {
891 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
892 }
893 // Sensor
894 res = exynos_v4l2_close(m_camera_info.sensor.fd);
895 if (res != NO_ERROR ) {
896 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
897 }
898 // ISP
899 res = exynos_v4l2_close(m_camera_info.isp.fd);
900 if (res != NO_ERROR ) {
901 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
902 }
903 } else {
904 m_sensorThread = new SensorThread(this);
905 m_mainThread->Start("MainThread", PRIORITY_DEFAULT, 0);
906 ALOGV("DEBUG(%s): created sensorthread ################", __FUNCTION__);
Sungjoong Kang52f54302012-09-04 21:43:06 +0900907
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700908 for (int i = 0 ; i < STREAM_ID_LAST+1 ; i++)
909 m_subStreams[i].type = SUBSTREAM_TYPE_NONE;
Sungjoong Kang6044e502012-08-27 00:29:28 -0700910 CSC_METHOD cscMethod = CSC_METHOD_HW;
911 m_exynosPictureCSC = csc_init(cscMethod);
912 if (m_exynosPictureCSC == NULL)
913 ALOGE("ERR(%s): csc_init() fail", __FUNCTION__);
914 csc_set_hw_property(m_exynosPictureCSC, CSC_HW_PROPERTY_FIXED_NODE, PICTURE_GSC_NODE_NUM);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700915
Sungjoong Kang6044e502012-08-27 00:29:28 -0700916 m_exynosVideoCSC = csc_init(cscMethod);
917 if (m_exynosVideoCSC == NULL)
918 ALOGE("ERR(%s): csc_init() fail", __FUNCTION__);
919 csc_set_hw_property(m_exynosVideoCSC, CSC_HW_PROPERTY_FIXED_NODE, VIDEO_GSC_NODE_NUM);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900920
Sungjoong Kang6044e502012-08-27 00:29:28 -0700921 m_setExifFixedAttribute();
Younghwan Joo9a710a42012-09-05 17:52:08 -0700922
923 // contol information clear
924 // flash
925 m_ctlInfo.flash.i_flashMode = AA_AEMODE_ON;
926 m_ctlInfo.flash.m_afFlashDoneFlg= false;
927 m_ctlInfo.flash.m_afFlashEnableFlg = false;
928 m_ctlInfo.flash.m_afFlashCnt = 0;
929 m_ctlInfo.flash.m_flashEnableFlg = false;
930 m_ctlInfo.flash.m_flashCaptured = false;
931 m_ctlInfo.flash.m_flashFrameCount = 0;
932 m_ctlInfo.flash.m_flashCnt = 0;
933 m_ctlInfo.flash.m_flashTimeOut = 0;
934 m_ctlInfo.flash.m_flashWaitCnt = 0;
Younghwan Joocaea49e2012-09-07 13:34:20 -0700935 m_ctlInfo.flash.m_flashDecisionResult = false;
936 m_ctlInfo.flash.m_flashTorchMode = false;
Sungjoong Kang6044e502012-08-27 00:29:28 -0700937 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700938}
939
940ExynosCameraHWInterface2::~ExynosCameraHWInterface2()
941{
Sungjoong Kangad378612012-08-17 12:34:33 -0700942 ALOGV("%s: ENTER", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700943 this->release();
Sungjoong Kangad378612012-08-17 12:34:33 -0700944 ALOGV("%s: EXIT", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700945}
946
947void ExynosCameraHWInterface2::release()
948{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900949 int i, res;
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -0700950 CAM_LOGD("%s: ENTER", __func__);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900951
Sungjoong Kangad378612012-08-17 12:34:33 -0700952 if (m_streamThreads[1] != NULL) {
953 m_streamThreads[1]->release();
954 m_streamThreads[1]->SetSignal(SIGNAL_THREAD_TERMINATE);
955 }
956
957 if (m_streamThreads[0] != NULL) {
958 m_streamThreads[0]->release();
959 m_streamThreads[0]->SetSignal(SIGNAL_THREAD_TERMINATE);
960 }
961
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900962 if (m_sensorThread != NULL) {
963 m_sensorThread->release();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900964 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700965
966 if (m_mainThread != NULL) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900967 m_mainThread->release();
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700968 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -0700969
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +0900970 if (m_exynosPictureCSC)
971 csc_deinit(m_exynosPictureCSC);
972 m_exynosPictureCSC = NULL;
973
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900974 if (m_exynosVideoCSC)
975 csc_deinit(m_exynosVideoCSC);
976 m_exynosVideoCSC = NULL;
977
Sungjoong Kangad378612012-08-17 12:34:33 -0700978 if (m_streamThreads[1] != NULL) {
979 while (!m_streamThreads[1]->IsTerminated())
980 {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700981 CAM_LOGD("Waiting for stream thread 1 is tetminated");
Sungjoong Kangad378612012-08-17 12:34:33 -0700982 usleep(100000);
983 }
984 m_streamThreads[1] = NULL;
985 }
986
987 if (m_streamThreads[0] != NULL) {
988 while (!m_streamThreads[0]->IsTerminated())
989 {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -0700990 CAM_LOGD("Waiting for stream thread 0 is tetminated");
Sungjoong Kangad378612012-08-17 12:34:33 -0700991 usleep(100000);
992 }
993 m_streamThreads[0] = NULL;
994 }
995
Sungjoong Kang9dd63e12012-07-24 00:25:51 +0900996 if (m_sensorThread != NULL) {
997 while (!m_sensorThread->IsTerminated())
Sungjoong Kangad378612012-08-17 12:34:33 -0700998 {
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -0700999 CAM_LOGD("Waiting for sensor thread is tetminated");
Sungjoong Kangad378612012-08-17 12:34:33 -07001000 usleep(100000);
1001 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001002 m_sensorThread = NULL;
1003 }
1004
Sungjoong Kangad378612012-08-17 12:34:33 -07001005 if (m_mainThread != NULL) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001006 while (!m_mainThread->IsTerminated())
Sungjoong Kangad378612012-08-17 12:34:33 -07001007 {
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -07001008 CAM_LOGD("Waiting for main thread is tetminated");
Sungjoong Kangad378612012-08-17 12:34:33 -07001009 usleep(100000);
1010 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001011 m_mainThread = NULL;
1012 }
1013
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001014 if (m_requestManager != NULL) {
1015 delete m_requestManager;
1016 m_requestManager = NULL;
1017 }
1018
1019 if (m_BayerManager != NULL) {
1020 delete m_BayerManager;
1021 m_BayerManager = NULL;
1022 }
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001023 for (i = 0; i < NUM_BAYER_BUFFERS; i++)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001024 freeCameraMemory(&m_camera_info.sensor.buffer[i], m_camera_info.sensor.planes);
1025
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001026 for(i = 0; i < m_camera_info.capture.buffers; i++)
1027 freeCameraMemory(&m_camera_info.capture.buffer[i], m_camera_info.capture.planes);
1028
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001029 ALOGV("DEBUG(%s): calling exynos_v4l2_close - sensor", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001030 res = exynos_v4l2_close(m_camera_info.sensor.fd);
1031 if (res != NO_ERROR ) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001032 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001033 }
1034
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001035 ALOGV("DEBUG(%s): calling exynos_v4l2_close - isp", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001036 res = exynos_v4l2_close(m_camera_info.isp.fd);
1037 if (res != NO_ERROR ) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001038 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001039 }
1040
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001041 ALOGV("DEBUG(%s): calling exynos_v4l2_close - capture", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001042 res = exynos_v4l2_close(m_camera_info.capture.fd);
1043 if (res != NO_ERROR ) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001044 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001045 }
1046
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001047 ALOGV("DEBUG(%s): calling exynos_v4l2_close - scp", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001048 res = exynos_v4l2_close(m_camera_info.scp.fd);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001049 if (res != NO_ERROR ) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001050 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001051 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001052 ALOGV("DEBUG(%s): calling deleteIonClient", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001053 deleteIonClient(m_ionCameraClient);
Sungjoong Kangad378612012-08-17 12:34:33 -07001054
1055 ALOGV("%s: EXIT", __func__);
1056}
1057
Sungjoong Kang6044e502012-08-27 00:29:28 -07001058int ExynosCameraHWInterface2::InitializeISPChain()
Sungjoong Kangad378612012-08-17 12:34:33 -07001059{
1060 char node_name[30];
1061 int fd = 0;
1062 int i;
Sungjoong Kang6044e502012-08-27 00:29:28 -07001063 int ret = 0;
Sungjoong Kangad378612012-08-17 12:34:33 -07001064
1065 /* Open Sensor */
1066 memset(&node_name, 0x00, sizeof(char[30]));
1067 sprintf(node_name, "%s%d", NODE_PREFIX, 40);
1068 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1069
1070 if (fd < 0) {
1071 ALOGE("ERR(%s): failed to open sensor video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1072 }
1073 else {
1074 ALOGV("DEBUG(%s): sensor video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1075 }
1076 m_camera_info.sensor.fd = fd;
1077
1078 /* Open ISP */
1079 memset(&node_name, 0x00, sizeof(char[30]));
1080 sprintf(node_name, "%s%d", NODE_PREFIX, 41);
1081 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1082
1083 if (fd < 0) {
1084 ALOGE("ERR(%s): failed to open isp video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1085 }
1086 else {
1087 ALOGV("DEBUG(%s): isp video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1088 }
1089 m_camera_info.isp.fd = fd;
1090
1091 /* Open ScalerC */
1092 memset(&node_name, 0x00, sizeof(char[30]));
1093 sprintf(node_name, "%s%d", NODE_PREFIX, 42);
1094 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1095
1096 if (fd < 0) {
1097 ALOGE("ERR(%s): failed to open capture video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1098 }
1099 else {
1100 ALOGV("DEBUG(%s): capture video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1101 }
1102 m_camera_info.capture.fd = fd;
1103
1104 /* Open ScalerP */
1105 memset(&node_name, 0x00, sizeof(char[30]));
1106 sprintf(node_name, "%s%d", NODE_PREFIX, 44);
1107 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1108 if (fd < 0) {
1109 ALOGE("DEBUG(%s): failed to open preview video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1110 }
1111 else {
1112 ALOGV("DEBUG(%s): preview video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1113 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001114 m_camera_info.scp.fd = fd;
Sungjoong Kangad378612012-08-17 12:34:33 -07001115
1116 if(m_cameraId == 0)
1117 m_camera_info.sensor_id = SENSOR_NAME_S5K4E5;
1118 else
1119 m_camera_info.sensor_id = SENSOR_NAME_S5K6A3;
1120
1121 memset(&m_camera_info.dummy_shot, 0x00, sizeof(struct camera2_shot_ext));
1122 m_camera_info.dummy_shot.shot.ctl.request.metadataMode = METADATA_MODE_FULL;
1123 m_camera_info.dummy_shot.shot.magicNumber = 0x23456789;
1124
1125 m_camera_info.dummy_shot.dis_bypass = 1;
1126 m_camera_info.dummy_shot.dnr_bypass = 1;
1127 m_camera_info.dummy_shot.fd_bypass = 1;
1128
1129 /*sensor setting*/
1130 m_camera_info.dummy_shot.shot.ctl.sensor.exposureTime = 0;
1131 m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 0;
1132 m_camera_info.dummy_shot.shot.ctl.sensor.sensitivity = 0;
1133
1134 m_camera_info.dummy_shot.shot.ctl.scaler.cropRegion[0] = 0;
1135 m_camera_info.dummy_shot.shot.ctl.scaler.cropRegion[1] = 0;
1136
1137 /*request setting*/
1138 m_camera_info.dummy_shot.request_sensor = 1;
1139 m_camera_info.dummy_shot.request_scc = 0;
1140 m_camera_info.dummy_shot.request_scp = 0;
1141 m_camera_info.dummy_shot.shot.ctl.request.outputStreams[0] = 0;
Sungjoong Kangad378612012-08-17 12:34:33 -07001142
1143 m_camera_info.sensor.width = m_camera2->getSensorRawW();
1144 m_camera_info.sensor.height = m_camera2->getSensorRawH();
1145
1146 m_camera_info.sensor.format = V4L2_PIX_FMT_SBGGR16;
1147 m_camera_info.sensor.planes = 2;
1148 m_camera_info.sensor.buffers = NUM_BAYER_BUFFERS;
1149 m_camera_info.sensor.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1150 m_camera_info.sensor.memory = V4L2_MEMORY_DMABUF;
Sungjoong Kangad378612012-08-17 12:34:33 -07001151
1152 for(i = 0; i < m_camera_info.sensor.buffers; i++){
1153 initCameraMemory(&m_camera_info.sensor.buffer[i], m_camera_info.sensor.planes);
1154 m_camera_info.sensor.buffer[i].size.extS[0] = m_camera_info.sensor.width*m_camera_info.sensor.height*2;
1155 m_camera_info.sensor.buffer[i].size.extS[1] = 8*1024; // HACK, driver use 8*1024, should be use predefined value
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001156 allocCameraMemory(m_ionCameraClient, &m_camera_info.sensor.buffer[i], m_camera_info.sensor.planes, 1<<1);
Sungjoong Kangad378612012-08-17 12:34:33 -07001157 }
1158
1159 m_camera_info.isp.width = m_camera_info.sensor.width;
1160 m_camera_info.isp.height = m_camera_info.sensor.height;
1161 m_camera_info.isp.format = m_camera_info.sensor.format;
1162 m_camera_info.isp.planes = m_camera_info.sensor.planes;
1163 m_camera_info.isp.buffers = m_camera_info.sensor.buffers;
1164 m_camera_info.isp.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1165 m_camera_info.isp.memory = V4L2_MEMORY_DMABUF;
Sungjoong Kangad378612012-08-17 12:34:33 -07001166
1167 for(i = 0; i < m_camera_info.isp.buffers; i++){
1168 initCameraMemory(&m_camera_info.isp.buffer[i], m_camera_info.isp.planes);
1169 m_camera_info.isp.buffer[i].size.extS[0] = m_camera_info.sensor.buffer[i].size.extS[0];
1170 m_camera_info.isp.buffer[i].size.extS[1] = m_camera_info.sensor.buffer[i].size.extS[1];
1171 m_camera_info.isp.buffer[i].fd.extFd[0] = m_camera_info.sensor.buffer[i].fd.extFd[0];
1172 m_camera_info.isp.buffer[i].fd.extFd[1] = m_camera_info.sensor.buffer[i].fd.extFd[1];
1173 m_camera_info.isp.buffer[i].virt.extP[0] = m_camera_info.sensor.buffer[i].virt.extP[0];
1174 m_camera_info.isp.buffer[i].virt.extP[1] = m_camera_info.sensor.buffer[i].virt.extP[1];
1175 };
1176
1177 /* init ISP */
Sungjoong Kang6044e502012-08-27 00:29:28 -07001178 ret = cam_int_s_input(&(m_camera_info.isp), m_camera_info.sensor_id);
1179 if (ret < 0) {
1180 ALOGE("ERR(%s): cam_int_s_input(%d) failed!!!! ", __FUNCTION__, m_camera_info.sensor_id);
1181 return false;
1182 }
Sungjoong Kangad378612012-08-17 12:34:33 -07001183 cam_int_s_fmt(&(m_camera_info.isp));
1184 ALOGV("DEBUG(%s): isp calling reqbuf", __FUNCTION__);
1185 cam_int_reqbufs(&(m_camera_info.isp));
1186 ALOGV("DEBUG(%s): isp calling querybuf", __FUNCTION__);
1187 ALOGV("DEBUG(%s): isp mem alloc done", __FUNCTION__);
1188
1189 /* init Sensor */
1190 cam_int_s_input(&(m_camera_info.sensor), m_camera_info.sensor_id);
1191 ALOGV("DEBUG(%s): sensor s_input done", __FUNCTION__);
1192 if (cam_int_s_fmt(&(m_camera_info.sensor))< 0) {
1193 ALOGE("ERR(%s): sensor s_fmt fail", __FUNCTION__);
1194 }
1195 ALOGV("DEBUG(%s): sensor s_fmt done", __FUNCTION__);
1196 cam_int_reqbufs(&(m_camera_info.sensor));
1197 ALOGV("DEBUG(%s): sensor reqbuf done", __FUNCTION__);
1198 for (i = 0; i < m_camera_info.sensor.buffers; i++) {
1199 ALOGV("DEBUG(%s): sensor initial QBUF [%d]", __FUNCTION__, i);
Sungjoong Kangad378612012-08-17 12:34:33 -07001200 m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 33*1000*1000; // apply from frame #1
1201 m_camera_info.dummy_shot.shot.ctl.request.frameCount = -1;
Sungjoong Kang52f54302012-09-04 21:43:06 +09001202 memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
1203 sizeof(struct camera2_shot_ext));
Sungjoong Kangad378612012-08-17 12:34:33 -07001204 }
Sungjoong Kang52f54302012-09-04 21:43:06 +09001205
1206 for (i = 0; i < NUM_MIN_SENSOR_QBUF; i++)
1207 cam_int_qbuf(&(m_camera_info.sensor), i);
1208
1209 for (i = NUM_MIN_SENSOR_QBUF; i < m_camera_info.sensor.buffers; i++)
1210 m_requestManager->pushSensorQ(i);
1211
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001212 ALOGV("== stream_on :: sensor");
Sungjoong Kangad378612012-08-17 12:34:33 -07001213 cam_int_streamon(&(m_camera_info.sensor));
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001214 m_camera_info.sensor.status = true;
Sungjoong Kangad378612012-08-17 12:34:33 -07001215
1216 /* init Capture */
1217 m_camera_info.capture.width = m_camera2->getSensorW();
1218 m_camera_info.capture.height = m_camera2->getSensorH();
1219 m_camera_info.capture.format = V4L2_PIX_FMT_YUYV;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001220#ifdef ENABLE_FRAME_SYNC
1221 m_camera_info.capture.planes = 2;
1222#else
Sungjoong Kangad378612012-08-17 12:34:33 -07001223 m_camera_info.capture.planes = 1;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001224#endif
Sungjoong Kangad378612012-08-17 12:34:33 -07001225 m_camera_info.capture.buffers = 8;
1226 m_camera_info.capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1227 m_camera_info.capture.memory = V4L2_MEMORY_DMABUF;
Sungjoong Kangad378612012-08-17 12:34:33 -07001228
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001229 m_camera_info.capture.status = false;
1230
1231 return true;
1232}
1233
1234void ExynosCameraHWInterface2::StartSCCThread(bool threadExists)
1235{
1236 ALOGV("(%s)", __FUNCTION__);
1237 StreamThread *AllocatedStream;
1238 stream_parameters_t newParameters;
1239 uint32_t format_actual;
1240 int numRegisteredStream = 0;
1241
1242
1243 if (!threadExists) {
1244 m_streamThreads[1] = new StreamThread(this, 1);
Sungjoong Kangad378612012-08-17 12:34:33 -07001245 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001246 AllocatedStream = (StreamThread*)(m_streamThreads[1].get());
1247 if (!threadExists)
1248 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
1249 AllocatedStream->m_index = 1;
Sungjoong Kangad378612012-08-17 12:34:33 -07001250
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001251 format_actual = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
1252
1253 newParameters.width = m_camera2->getSensorW();
1254 newParameters.height = m_camera2->getSensorH();
1255 newParameters.format = format_actual;
1256 newParameters.streamOps = NULL;
1257 newParameters.numHwBuffers = 8;
1258#ifdef ENABLE_FRAME_SYNC
1259 newParameters.planes = 2;
1260#else
1261 newParameters.planes = 1;
1262#endif
1263
1264 newParameters.numSvcBufsInHal = 0;
1265
1266 newParameters.node = &m_camera_info.capture;
1267
1268 AllocatedStream->streamType = STREAM_TYPE_INDIRECT;
1269 AllocatedStream->m_numRegisteredStream = numRegisteredStream;
1270 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
1271
1272 for (int i = 0; i < m_camera_info.capture.buffers; i++){
1273 if (!threadExists) {
1274 initCameraMemory(&m_camera_info.capture.buffer[i], newParameters.node->planes);
1275 m_camera_info.capture.buffer[i].size.extS[0] = m_camera_info.capture.width*m_camera_info.capture.height*2;
1276#ifdef ENABLE_FRAME_SYNC
1277 m_camera_info.capture.buffer[i].size.extS[1] = 4*1024; // HACK, driver use 4*1024, should be use predefined value
1278 allocCameraMemory(m_ionCameraClient, &m_camera_info.capture.buffer[i], m_camera_info.capture.planes, 1<<1);
1279#else
1280 allocCameraMemory(m_ionCameraClient, &m_camera_info.capture.buffer[i], m_camera_info.capture.planes);
1281#endif
1282 }
1283 }
1284 cam_int_s_input(newParameters.node, m_camera_info.sensor_id);
1285 m_camera_info.capture.buffers = 8;
1286 cam_int_s_fmt(newParameters.node);
Sungjoong Kangad378612012-08-17 12:34:33 -07001287 ALOGV("DEBUG(%s): capture calling reqbuf", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001288 cam_int_reqbufs(newParameters.node);
Sungjoong Kangad378612012-08-17 12:34:33 -07001289 ALOGV("DEBUG(%s): capture calling querybuf", __FUNCTION__);
1290
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001291 for (int i = 0; i < newParameters.node->buffers; i++) {
Sungjoong Kangad378612012-08-17 12:34:33 -07001292 ALOGV("DEBUG(%s): capture initial QBUF [%d]", __FUNCTION__, i);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001293 cam_int_qbuf(newParameters.node, i);
1294 newParameters.svcBufStatus[i] = ON_DRIVER;
Sungjoong Kangad378612012-08-17 12:34:33 -07001295 }
1296
1297 ALOGV("== stream_on :: capture");
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001298 if (cam_int_streamon(newParameters.node) < 0) {
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001299 ALOGE("ERR(%s): capture stream on fail", __FUNCTION__);
1300 } else {
1301 m_camera_info.capture.status = true;
1302 }
Sungjoong Kang6044e502012-08-27 00:29:28 -07001303
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001304 AllocatedStream->setParameter(&newParameters);
1305 AllocatedStream->m_activated = true;
1306 AllocatedStream->m_isBufferInit = true;
Sungjoong Kangad378612012-08-17 12:34:33 -07001307}
1308
1309void ExynosCameraHWInterface2::StartISP()
1310{
Sungjoong Kangad378612012-08-17 12:34:33 -07001311 ALOGV("== stream_on :: isp");
1312 cam_int_streamon(&(m_camera_info.isp));
Sungjoong Kangad378612012-08-17 12:34:33 -07001313 exynos_v4l2_s_ctrl(m_camera_info.sensor.fd, V4L2_CID_IS_S_STREAM, IS_ENABLE_STREAM);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001314}
1315
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001316int ExynosCameraHWInterface2::getCameraId() const
1317{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001318 return m_cameraId;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001319}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001320
1321int ExynosCameraHWInterface2::setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops)
1322{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001323 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001324 if ((NULL != request_src_ops) && (NULL != request_src_ops->dequeue_request)
1325 && (NULL != request_src_ops->free_request) && (NULL != request_src_ops->request_count)) {
1326 m_requestQueueOps = (camera2_request_queue_src_ops_t*)request_src_ops;
1327 return 0;
1328 }
1329 else {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001330 ALOGE("DEBUG(%s):setRequestQueueSrcOps : NULL arguments", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001331 return 1;
1332 }
1333}
1334
1335int ExynosCameraHWInterface2::notifyRequestQueueNotEmpty()
1336{
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001337 int i = 0;
1338
Sungjoong Kangb5237e62012-07-27 07:39:05 -07001339 ALOGV("DEBUG(%s):setting [SIGNAL_MAIN_REQ_Q_NOT_EMPTY] current(%d)", __FUNCTION__, m_requestManager->GetNumEntries());
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001340 if ((NULL==m_frameQueueOps)|| (NULL==m_requestQueueOps)) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001341 ALOGE("DEBUG(%s):queue ops NULL. ignoring request", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001342 return 0;
1343 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001344 m_isRequestQueueNull = false;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07001345 if (m_requestManager->GetNumEntries() == 0)
1346 m_requestManager->SetInitialSkip(5);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001347
1348 if (m_isIspStarted == false) {
1349 /* isp */
1350 m_camera_info.sensor.buffers = NUM_BAYER_BUFFERS;
1351 m_camera_info.isp.buffers = m_camera_info.sensor.buffers;
1352 cam_int_s_fmt(&(m_camera_info.isp));
1353 cam_int_reqbufs(&(m_camera_info.isp));
1354
1355 /* sensor */
1356 if (m_camera_info.sensor.status == false) {
1357 cam_int_s_fmt(&(m_camera_info.sensor));
1358 cam_int_reqbufs(&(m_camera_info.sensor));
1359
1360 for (i = 0; i < m_camera_info.sensor.buffers; i++) {
1361 ALOGV("DEBUG(%s): sensor initial QBUF [%d]", __FUNCTION__, i);
1362 m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 33*1000*1000; // apply from frame #1
1363 m_camera_info.dummy_shot.shot.ctl.request.frameCount = -1;
1364 memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
1365 sizeof(struct camera2_shot_ext));
1366 }
1367 for (i = 0; i < NUM_MIN_SENSOR_QBUF; i++)
1368 cam_int_qbuf(&(m_camera_info.sensor), i);
1369
1370 for (i = NUM_MIN_SENSOR_QBUF; i < m_camera_info.sensor.buffers; i++)
1371 m_requestManager->pushSensorQ(i);
1372 ALOGV("DEBUG(%s): calling sensor streamon", __FUNCTION__);
1373 cam_int_streamon(&(m_camera_info.sensor));
1374 m_camera_info.sensor.status = true;
1375 }
1376 }
1377 if (!(m_streamThreads[1].get())) {
1378 ALOGV("DEBUG(%s): stream thread 1 not exist. starting without stream", __FUNCTION__);
1379 StartSCCThread(false);
1380 } else {
1381 if (m_streamThreads[1]->m_activated == false) {
1382 ALOGV("DEBUG(%s): stream thread 1 suspended. restarting", __FUNCTION__);
1383 StartSCCThread(true);
1384 } else {
1385 if (m_camera_info.capture.status == false) {
1386 m_camera_info.capture.buffers = 8;
1387 cam_int_s_fmt(&(m_camera_info.capture));
1388 ALOGV("DEBUG(%s): capture calling reqbuf", __FUNCTION__);
1389 cam_int_reqbufs(&(m_camera_info.capture));
1390 ALOGV("DEBUG(%s): capture calling querybuf", __FUNCTION__);
1391
1392 for (int i = 0; i < m_camera_info.capture.buffers; i++) {
1393 ALOGV("DEBUG(%s): capture initial QBUF [%d]", __FUNCTION__, i);
1394 cam_int_qbuf(&(m_camera_info.capture), i);
1395 }
1396 ALOGV("== stream_on :: capture");
1397 if (cam_int_streamon(&(m_camera_info.capture)) < 0) {
1398 ALOGE("ERR(%s): capture stream on fail", __FUNCTION__);
1399 } else {
1400 m_camera_info.capture.status = true;
1401 }
1402 }
1403 }
1404 }
1405 if (m_isIspStarted == false) {
1406 StartISP();
1407 ALOGV("DEBUG(%s):starting sensor thread", __FUNCTION__);
1408 m_requestManager->SetInitialSkip(5);
1409 m_sensorThread->Start("SensorThread", PRIORITY_DEFAULT, 0);
1410 m_isIspStarted = true;
1411 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001412 m_mainThread->SetSignal(SIGNAL_MAIN_REQ_Q_NOT_EMPTY);
1413 return 0;
1414}
1415
1416int ExynosCameraHWInterface2::setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops)
1417{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001418 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001419 if ((NULL != frame_dst_ops) && (NULL != frame_dst_ops->dequeue_frame)
1420 && (NULL != frame_dst_ops->cancel_frame) && (NULL !=frame_dst_ops->enqueue_frame)) {
1421 m_frameQueueOps = (camera2_frame_queue_dst_ops_t *)frame_dst_ops;
1422 return 0;
1423 }
1424 else {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001425 ALOGE("DEBUG(%s):setFrameQueueDstOps : NULL arguments", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001426 return 1;
1427 }
1428}
1429
1430int ExynosCameraHWInterface2::getInProgressCount()
1431{
1432 int inProgressCount = m_requestManager->GetNumEntries();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001433 ALOGV("DEBUG(%s): # of dequeued req (%d)", __FUNCTION__, inProgressCount);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001434 return inProgressCount;
1435}
1436
1437int ExynosCameraHWInterface2::flushCapturesInProgress()
1438{
1439 return 0;
1440}
1441
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001442int ExynosCameraHWInterface2::constructDefaultRequest(int request_template, camera_metadata_t **request)
1443{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001444 ALOGV("DEBUG(%s): making template (%d) ", __FUNCTION__, request_template);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001445
1446 if (request == NULL) return BAD_VALUE;
1447 if (request_template < 0 || request_template >= CAMERA2_TEMPLATE_COUNT) {
1448 return BAD_VALUE;
1449 }
1450 status_t res;
1451 // Pass 1, calculate size and allocate
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07001452 res = m_camera2->constructDefaultRequest(request_template,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001453 request,
1454 true);
1455 if (res != OK) {
1456 return res;
1457 }
1458 // Pass 2, build request
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07001459 res = m_camera2->constructDefaultRequest(request_template,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001460 request,
1461 false);
1462 if (res != OK) {
1463 ALOGE("Unable to populate new request for template %d",
1464 request_template);
1465 }
1466
1467 return res;
1468}
1469
1470int ExynosCameraHWInterface2::allocateStream(uint32_t width, uint32_t height, int format, const camera2_stream_ops_t *stream_ops,
1471 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers)
1472{
Sungjoong Kangad378612012-08-17 12:34:33 -07001473 ALOGV("DEBUG(%s): allocate stream width(%d) height(%d) format(%x)", __FUNCTION__, width, height, format);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001474 bool useDirectOutput = false;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001475 StreamThread *AllocatedStream;
1476 stream_parameters_t newParameters;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001477 substream_parameters_t *subParameters;
1478 StreamThread *parentStream;
1479 status_t res;
1480 int allocCase = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001481
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001482 if ((format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED || format == CAMERA2_HAL_PIXEL_FORMAT_OPAQUE) &&
1483 m_camera2->isSupportedResolution(width, height)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001484 if (!(m_streamThreads[0].get())) {
1485 ALOGV("DEBUG(%s): stream 0 not exist", __FUNCTION__);
1486 allocCase = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001487 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001488 else {
Alex Ray6bbb5932012-07-27 17:19:48 -07001489 if ((m_streamThreads[0].get())->m_activated == true) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001490 ALOGV("DEBUG(%s): stream 0 exists and activated.", __FUNCTION__);
1491 allocCase = 1;
1492 }
1493 else {
1494 ALOGV("DEBUG(%s): stream 0 exists and deactivated.", __FUNCTION__);
1495 allocCase = 2;
1496 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001497 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001498
1499 // TODO : instead of that, use calculate aspect ratio and selection with calculated ratio.
1500 if ((width == 1920 && height == 1080) || (width == 1280 && height == 720)
1501 || (width == 720 && height == 480) || (width == 1440 && height == 960)
1502 || (width == 1344 && height == 896)) {
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001503 m_wideAspect = true;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001504 } else {
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001505 m_wideAspect = false;
1506 }
1507 ALOGV("DEBUG(%s): m_wideAspect (%d)", __FUNCTION__, m_wideAspect);
1508
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001509 if (allocCase == 0 || allocCase == 2) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001510 *stream_id = STREAM_ID_PREVIEW;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001511
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001512 m_streamThreads[0] = new StreamThread(this, *stream_id);
1513
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001514 AllocatedStream = (StreamThread*)(m_streamThreads[0].get());
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001515 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001516
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001517 *format_actual = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1518 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
1519 *max_buffers = 6;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001520
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001521 newParameters.width = width;
1522 newParameters.height = height;
1523 newParameters.format = *format_actual;
1524 newParameters.streamOps = stream_ops;
1525 newParameters.usage = *usage;
1526 newParameters.numHwBuffers = 8;
1527 newParameters.numOwnSvcBuffers = *max_buffers;
1528 newParameters.planes = NUM_PLANES(*format_actual);
1529 newParameters.metaPlanes = 1;
1530 newParameters.numSvcBufsInHal = 0;
1531 newParameters.minUndequedBuffer = 4;
1532
1533 newParameters.node = &m_camera_info.scp;
1534 newParameters.node->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1535 newParameters.node->memory = V4L2_MEMORY_DMABUF;
1536
1537 AllocatedStream->streamType = STREAM_TYPE_DIRECT;
1538 AllocatedStream->m_index = 0;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001539 AllocatedStream->setParameter(&newParameters);
1540 AllocatedStream->m_activated = true;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001541 AllocatedStream->m_numRegisteredStream = 1;
1542 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
Sungjoong Kangad378612012-08-17 12:34:33 -07001543 m_requestManager->SetDefaultParameters(m_camera2->getSensorW());
1544 m_camera_info.dummy_shot.shot.ctl.scaler.cropRegion[2] = m_camera2->getSensorW();
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001545 if (m_subStreams[STREAM_ID_RECORD].type != SUBSTREAM_TYPE_NONE)
1546 AllocatedStream->attachSubStream(STREAM_ID_RECORD, 10);
1547 if (m_subStreams[STREAM_ID_PRVCB].type != SUBSTREAM_TYPE_NONE)
1548 AllocatedStream->attachSubStream(STREAM_ID_PRVCB, 70);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001549 return 0;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001550 } else if (allocCase == 1) {
1551 *stream_id = STREAM_ID_RECORD;
1552
1553 subParameters = &m_subStreams[STREAM_ID_RECORD];
1554 memset(subParameters, 0, sizeof(substream_parameters_t));
1555
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001556 parentStream = (StreamThread*)(m_streamThreads[0].get());
1557 if (!parentStream) {
1558 return 1;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001559 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001560
Sungjoong Kang804236a2012-08-05 10:36:19 -07001561 *format_actual = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M
Alex Ray6bbb5932012-07-27 17:19:48 -07001562 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
James Dong26306792012-08-24 14:42:26 -07001563 *max_buffers = 6;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001564
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001565 subParameters->type = SUBSTREAM_TYPE_RECORD;
1566 subParameters->width = width;
1567 subParameters->height = height;
1568 subParameters->format = *format_actual;
1569 subParameters->svcPlanes = NUM_PLANES(*format_actual);
1570 subParameters->streamOps = stream_ops;
1571 subParameters->usage = *usage;
1572 subParameters->numOwnSvcBuffers = *max_buffers;
1573 subParameters->numSvcBufsInHal = 0;
1574 subParameters->needBufferInit = false;
1575 subParameters->minUndequedBuffer = 2;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001576
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001577 res = parentStream->attachSubStream(STREAM_ID_RECORD, 20);
1578 if (res != NO_ERROR) {
1579 ALOGE("(%s): substream attach failed. res(%d)", __FUNCTION__, res);
1580 return 1;
1581 }
1582 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, parentStream->m_numRegisteredStream);
1583 ALOGV("(%s): Enabling Record", __FUNCTION__);
1584 return 0;
1585 }
1586 }
1587 else if ((format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED|| format == CAMERA2_HAL_PIXEL_FORMAT_OPAQUE)
1588 && (width == m_camera2->getSensorW()) && (height == m_camera2->getSensorH())) {
1589
1590 if (!(m_streamThreads[1].get())) {
1591 ALOGV("DEBUG(%s): stream thread 1 not exist", __FUNCTION__);
1592 useDirectOutput = true;
1593// createThread = true;
1594 }
1595 else {
1596 ALOGV("DEBUG(%s): stream thread 1 exists and deactivated.", __FUNCTION__);
1597// useDirectOutput = true;
1598// createThread = false;
1599 }
1600 if (useDirectOutput) {
1601 *stream_id = STREAM_ID_ZSL;
1602
1603 /*if (createThread)*/ {
1604 m_streamThreads[1] = new StreamThread(this, *stream_id);
1605 }
1606 AllocatedStream = (StreamThread*)(m_streamThreads[1].get());
1607 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
1608
1609 *format_actual = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1610 *max_buffers = 6;
1611
1612 *format_actual = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
1613 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
1614 *max_buffers = 6;
1615
1616 newParameters.width = width;
1617 newParameters.height = height;
1618 newParameters.format = *format_actual;
1619 newParameters.streamOps = stream_ops;
1620 newParameters.usage = *usage;
1621 newParameters.numHwBuffers = 8;
1622 newParameters.numOwnSvcBuffers = *max_buffers;
1623 newParameters.planes = NUM_PLANES(*format_actual);
1624 newParameters.metaPlanes = 1;
1625
1626 newParameters.numSvcBufsInHal = 0;
1627 newParameters.minUndequedBuffer = 4;
1628
1629 newParameters.node = &m_camera_info.capture;
1630 newParameters.node->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1631 newParameters.node->memory = V4L2_MEMORY_DMABUF;
1632
1633 AllocatedStream->streamType = STREAM_TYPE_DIRECT;
1634 AllocatedStream->m_index = 1;
1635 AllocatedStream->setParameter(&newParameters);
1636 AllocatedStream->m_activated = true;
1637 AllocatedStream->m_numRegisteredStream++;
1638 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001639 return 0;
1640 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001641 }
Sungjoong Kangad378612012-08-17 12:34:33 -07001642 else if (format == HAL_PIXEL_FORMAT_BLOB
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07001643 && m_camera2->isSupportedJpegResolution(width, height)) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001644 *stream_id = STREAM_ID_JPEG;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001645
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001646 subParameters = &m_subStreams[*stream_id];
1647 memset(subParameters, 0, sizeof(substream_parameters_t));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001648
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001649 if (!(m_streamThreads[1].get())) {
1650 ALOGV("DEBUG(%s): stream thread 1 not exist", __FUNCTION__);
1651 StartSCCThread(false);
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001652 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001653 else if (m_streamThreads[1]->m_activated == false) {
1654 ALOGV("DEBUG(%s): stream thread 1 suspended. restarting", __FUNCTION__);
1655 StartSCCThread(true);
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001656 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001657 parentStream = (StreamThread*)(m_streamThreads[1].get());
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001658
1659 *format_actual = HAL_PIXEL_FORMAT_BLOB;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001660 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
Sungjoong Kang37e122d2012-08-08 11:13:48 -07001661 *max_buffers = 4;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001662
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001663 subParameters->type = SUBSTREAM_TYPE_JPEG;
1664 subParameters->width = width;
1665 subParameters->height = height;
1666 subParameters->format = *format_actual;
1667 subParameters->svcPlanes = 1;
1668 subParameters->streamOps = stream_ops;
1669 subParameters->usage = *usage;
1670 subParameters->numOwnSvcBuffers = *max_buffers;
1671 subParameters->numSvcBufsInHal = 0;
1672 subParameters->needBufferInit = false;
1673 subParameters->minUndequedBuffer = 2;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001674
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001675 res = parentStream->attachSubStream(STREAM_ID_JPEG, 10);
1676 if (res != NO_ERROR) {
1677 ALOGE("(%s): substream attach failed. res(%d)", __FUNCTION__, res);
1678 return 1;
1679 }
1680 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, parentStream->m_numRegisteredStream);
1681 ALOGV("(%s): Enabling Jpeg", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001682 return 0;
1683 }
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001684 else if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP || format == HAL_PIXEL_FORMAT_YV12) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001685 *stream_id = STREAM_ID_PRVCB;
1686
1687 subParameters = &m_subStreams[STREAM_ID_PRVCB];
1688 memset(subParameters, 0, sizeof(substream_parameters_t));
1689
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001690 parentStream = (StreamThread*)(m_streamThreads[0].get());
1691 if (!parentStream) {
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001692 return 1;
1693 }
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001694
1695 *format_actual = format;
1696 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001697 *max_buffers = 6;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001698
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001699 subParameters->type = SUBSTREAM_TYPE_PRVCB;
1700 subParameters->width = width;
1701 subParameters->height = height;
1702 subParameters->format = *format_actual;
1703 subParameters->svcPlanes = NUM_PLANES(*format_actual);
1704 subParameters->streamOps = stream_ops;
1705 subParameters->usage = *usage;
1706 subParameters->numOwnSvcBuffers = *max_buffers;
1707 subParameters->numSvcBufsInHal = 0;
1708 subParameters->needBufferInit = false;
1709 subParameters->minUndequedBuffer = 2;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001710
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001711 if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
1712 subParameters->internalFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP;
1713 subParameters->internalPlanes = NUM_PLANES(HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001714 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001715 else {
1716 subParameters->internalFormat = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1717 subParameters->internalPlanes = NUM_PLANES(HAL_PIXEL_FORMAT_EXYNOS_YV12);
1718 }
1719
1720 res = parentStream->attachSubStream(STREAM_ID_PRVCB, 20);
1721 if (res != NO_ERROR) {
1722 ALOGE("(%s): substream attach failed. res(%d)", __FUNCTION__, res);
1723 return 1;
1724 }
1725 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, parentStream->m_numRegisteredStream);
1726 ALOGV("(%s): Enabling previewcb", __FUNCTION__);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001727 return 0;
1728 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001729 ALOGE("DEBUG(%s): Unsupported Pixel Format", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001730 return 1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001731}
1732
1733int ExynosCameraHWInterface2::registerStreamBuffers(uint32_t stream_id,
1734 int num_buffers, buffer_handle_t *registeringBuffers)
1735{
1736 int i,j;
1737 void *virtAddr[3];
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001738 int plane_index = 0;
1739 StreamThread * targetStream;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001740 stream_parameters_t *targetStreamParms;
1741 node_info_t *currentNode;
1742
1743 struct v4l2_buffer v4l2_buf;
1744 struct v4l2_plane planes[VIDEO_MAX_PLANES];
1745
1746 ALOGV("DEBUG(%s): streamID (%d), num_buff(%d), handle(%x) ", __FUNCTION__,
1747 stream_id, num_buffers, (uint32_t)registeringBuffers);
1748
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001749 if (stream_id == STREAM_ID_PREVIEW && m_streamThreads[0].get()) {
1750 targetStream = m_streamThreads[0].get();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001751 targetStreamParms = &(m_streamThreads[0]->m_parameters);
1752 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001753 else if (stream_id == STREAM_ID_JPEG || stream_id == STREAM_ID_RECORD || stream_id == STREAM_ID_PRVCB) {
1754 substream_parameters_t *targetParms;
1755 targetParms = &m_subStreams[stream_id];
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001756
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001757 targetParms->numSvcBuffers = num_buffers;
Sungjoong Kang15fd8232012-08-23 16:16:44 -07001758
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001759 for (i = 0 ; i < targetParms->numSvcBuffers ; i++) {
1760 ALOGV("(%s): registering substream(%d) Buffers[%d] (%x) ", __FUNCTION__,
1761 i, stream_id, (uint32_t)(registeringBuffers[i]));
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001762 if (m_grallocHal) {
1763 if (m_grallocHal->lock(m_grallocHal, registeringBuffers[i],
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001764 targetParms->usage, 0, 0,
1765 targetParms->width, targetParms->height, virtAddr) != 0) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001766 ALOGE("ERR(%s): could not obtain gralloc buffer", __FUNCTION__);
1767 }
1768 else {
1769 ExynosBuffer currentBuf;
1770 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(registeringBuffers[i]);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001771 if (targetParms->svcPlanes == 1) {
1772 currentBuf.fd.extFd[0] = priv_handle->fd;
1773 currentBuf.size.extS[0] = priv_handle->size;
1774 currentBuf.size.extS[1] = 0;
1775 currentBuf.size.extS[2] = 0;
1776 } else if (targetParms->svcPlanes == 2) {
1777 currentBuf.fd.extFd[0] = priv_handle->fd;
1778 currentBuf.fd.extFd[1] = priv_handle->fd1;
1779
1780 } else if (targetParms->svcPlanes == 3) {
1781 currentBuf.fd.extFd[0] = priv_handle->fd;
1782 currentBuf.fd.extFd[1] = priv_handle->fd1;
1783 currentBuf.fd.extFd[2] = priv_handle->fd2;
1784 }
1785 for (plane_index = 0 ; plane_index < targetParms->svcPlanes ; plane_index++) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001786 currentBuf.virt.extP[plane_index] = (char *)virtAddr[plane_index];
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001787 ALOGV("DEBUG(%s): plane(%d): fd(%d) addr(%x) size(%d)",
Sungjoong Kang804236a2012-08-05 10:36:19 -07001788 __FUNCTION__, plane_index, currentBuf.fd.extFd[plane_index],
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001789 (unsigned int)currentBuf.virt.extP[plane_index], currentBuf.size.extS[plane_index]);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001790 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001791 targetParms->svcBufStatus[i] = ON_SERVICE;
1792 targetParms->svcBuffers[i] = currentBuf;
1793 targetParms->svcBufHandle[i] = registeringBuffers[i];
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001794 }
1795 }
1796 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001797 targetParms->needBufferInit = true;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09001798 return 0;
1799 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001800 else if (stream_id == STREAM_ID_ZSL && m_streamThreads[1].get()) {
1801 targetStream = m_streamThreads[1].get();
1802 targetStreamParms = &(m_streamThreads[1]->m_parameters);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001803 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001804 else {
1805 ALOGE("ERR(%s) unregisterd stream id (%d)", __FUNCTION__, stream_id);
Sungjoong Kangbe494d12012-08-04 15:36:56 -07001806 return 1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001807 }
1808
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001809 if (targetStream->streamType == STREAM_TYPE_DIRECT) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001810 if (num_buffers < targetStreamParms->numHwBuffers) {
1811 ALOGE("ERR(%s) registering insufficient num of buffers (%d) < (%d)",
1812 __FUNCTION__, num_buffers, targetStreamParms->numHwBuffers);
Sungjoong Kangbe494d12012-08-04 15:36:56 -07001813 return 1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001814 }
1815 }
1816 ALOGV("DEBUG(%s): format(%x) width(%d), height(%d) svcPlanes(%d)",
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001817 __FUNCTION__, targetStreamParms->format, targetStreamParms->width,
1818 targetStreamParms->height, targetStreamParms->planes);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001819 targetStreamParms->numSvcBuffers = num_buffers;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001820 currentNode = targetStreamParms->node;
1821 currentNode->width = targetStreamParms->width;
1822 currentNode->height = targetStreamParms->height;
1823 currentNode->format = HAL_PIXEL_FORMAT_2_V4L2_PIX(targetStreamParms->format);
1824 currentNode->planes = targetStreamParms->planes;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001825 currentNode->buffers = targetStreamParms->numHwBuffers;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001826 cam_int_s_input(currentNode, m_camera_info.sensor_id);
1827 cam_int_s_fmt(currentNode);
1828 cam_int_reqbufs(currentNode);
1829 for (i = 0 ; i < targetStreamParms->numSvcBuffers ; i++) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001830 ALOGV("DEBUG(%s): registering Stream Buffers[%d] (%x) ", __FUNCTION__,
1831 i, (uint32_t)(registeringBuffers[i]));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001832 v4l2_buf.m.planes = planes;
1833 v4l2_buf.type = currentNode->type;
1834 v4l2_buf.memory = currentNode->memory;
1835 v4l2_buf.index = i;
1836 v4l2_buf.length = currentNode->planes;
1837
1838 ExynosBuffer currentBuf;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001839 ExynosBuffer metaBuf;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001840 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(registeringBuffers[i]);
1841
1842 m_getAlignedYUVSize(currentNode->format,
1843 currentNode->width, currentNode->height, &currentBuf);
Alex Ray24231222012-06-27 15:18:15 -07001844
Sungjoong Kang37e122d2012-08-08 11:13:48 -07001845 ALOGV("DEBUG(%s): ion_size(%d), stride(%d), ", __FUNCTION__, priv_handle->size, priv_handle->stride);
1846 if (currentNode->planes == 1) {
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001847 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
1848 currentBuf.fd.extFd[0] = priv_handle->fd;
Sungjoong Kang37e122d2012-08-08 11:13:48 -07001849 currentBuf.size.extS[0] = priv_handle->size;
1850 currentBuf.size.extS[1] = 0;
1851 currentBuf.size.extS[2] = 0;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07001852 } else if (currentNode->planes == 2) {
1853 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
1854 v4l2_buf.m.planes[1].m.fd = priv_handle->fd1;
1855 currentBuf.fd.extFd[0] = priv_handle->fd;
1856 currentBuf.fd.extFd[1] = priv_handle->fd1;
1857
1858 } else if (currentNode->planes == 3) {
1859 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
1860 v4l2_buf.m.planes[2].m.fd = priv_handle->fd1;
1861 v4l2_buf.m.planes[1].m.fd = priv_handle->fd2;
1862 currentBuf.fd.extFd[0] = priv_handle->fd;
1863 currentBuf.fd.extFd[2] = priv_handle->fd1;
1864 currentBuf.fd.extFd[1] = priv_handle->fd2;
Sungjoong Kang37e122d2012-08-08 11:13:48 -07001865 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001866 for (plane_index = 0 ; plane_index < (int)v4l2_buf.length ; plane_index++) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001867 v4l2_buf.m.planes[plane_index].length = currentBuf.size.extS[plane_index];
1868 ALOGV("DEBUG(%s): plane(%d): fd(%d) addr(%x), length(%d)",
1869 __FUNCTION__, plane_index, v4l2_buf.m.planes[plane_index].m.fd,
1870 (unsigned int)currentBuf.virt.extP[plane_index],
1871 v4l2_buf.m.planes[plane_index].length);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001872 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001873
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001874 if (i < currentNode->buffers) {
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001875
1876
1877#ifdef ENABLE_FRAME_SYNC
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001878 /* add plane for metadata*/
1879 metaBuf.size.extS[0] = 4*1024;
1880 allocCameraMemory(m_ionCameraClient , &metaBuf, 1, 1<<0);
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001881
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001882 v4l2_buf.length += targetStreamParms->metaPlanes;
1883 v4l2_buf.m.planes[v4l2_buf.length-1].m.fd = metaBuf.fd.extFd[0];
1884 v4l2_buf.m.planes[v4l2_buf.length-1].length = metaBuf.size.extS[0];
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001885
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001886 ALOGV("Qbuf metaBuf: fd(%d), length(%d) plane(%d)", metaBuf.fd.extFd[0], metaBuf.size.extS[0], v4l2_buf.length);
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001887#endif
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001888 if (exynos_v4l2_qbuf(currentNode->fd, &v4l2_buf) < 0) {
1889 ALOGE("ERR(%s): stream id(%d) exynos_v4l2_qbuf() fail fd(%d)",
1890 __FUNCTION__, stream_id, currentNode->fd);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001891 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001892 ALOGV("DEBUG(%s): stream id(%d) exynos_v4l2_qbuf() success fd(%d)",
1893 __FUNCTION__, stream_id, currentNode->fd);
1894 targetStreamParms->svcBufStatus[i] = REQUIRES_DQ_FROM_SVC;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001895 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001896 else {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001897 targetStreamParms->svcBufStatus[i] = ON_SERVICE;
1898 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001899
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001900 targetStreamParms->svcBuffers[i] = currentBuf;
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09001901 targetStreamParms->metaBuffers[i] = metaBuf;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001902 targetStreamParms->svcBufHandle[i] = registeringBuffers[i];
1903 }
Sungjoong Kangad378612012-08-17 12:34:33 -07001904
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001905 ALOGV("DEBUG(%s): calling streamon stream id = %d", __FUNCTION__, stream_id);
1906 cam_int_streamon(targetStreamParms->node);
Sungjoong Kangad378612012-08-17 12:34:33 -07001907 ALOGV("DEBUG(%s): calling streamon END", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001908 currentNode->status = true;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001909 ALOGV("DEBUG(%s): END registerStreamBuffers", __FUNCTION__);
Sungjoong Kangad378612012-08-17 12:34:33 -07001910
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07001911 return 0;
1912}
1913
1914int ExynosCameraHWInterface2::releaseStream(uint32_t stream_id)
1915{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001916 StreamThread *targetStream;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001917 status_t res = NO_ERROR;
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07001918 ALOGV("DEBUG(%s):stream id %d", __FUNCTION__, stream_id);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001919 bool releasingScpMain = false;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001920
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001921 if (stream_id == STREAM_ID_PREVIEW) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001922 targetStream = (StreamThread*)(m_streamThreads[0].get());
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001923 targetStream->m_numRegisteredStream--;
1924 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, targetStream->m_numRegisteredStream);
1925 releasingScpMain = true;
1926 } else if (stream_id == STREAM_ID_JPEG) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001927 targetStream = (StreamThread*)(m_streamThreads[1].get());
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001928 memset(&m_subStreams[stream_id], 0, sizeof(substream_parameters_t));
1929 if (m_resizeBuf.size.s != 0) {
1930 freeCameraMemory(&m_resizeBuf, 1);
1931 }
1932 if (targetStream)
1933 res = targetStream->detachSubStream(stream_id);
1934 if (res != NO_ERROR) {
1935 ALOGE("(%s): substream detach failed. res(%d)", __FUNCTION__, res);
1936 return 1;
1937 }
1938 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, targetStream->m_numRegisteredStream);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07001939 return 0;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001940 } else if (stream_id == STREAM_ID_RECORD) {
1941 targetStream = (StreamThread*)(m_streamThreads[0].get());
1942 memset(&m_subStreams[stream_id], 0, sizeof(substream_parameters_t));
1943 if (targetStream)
1944 res = targetStream->detachSubStream(stream_id);
1945 else
1946 return 0;
1947 } else if (stream_id == STREAM_ID_PRVCB) {
1948 targetStream = (StreamThread*)(m_streamThreads[0].get());
1949 if (m_resizeBuf.size.s != 0) {
1950 freeCameraMemory(&m_previewCbBuf, m_subStreams[stream_id].internalPlanes);
1951 }
1952 memset(&m_subStreams[stream_id], 0, sizeof(substream_parameters_t));
1953 if (targetStream)
1954 res = targetStream->detachSubStream(stream_id);
1955 else
1956 return 0;
1957 } else if (stream_id == STREAM_ID_ZSL) {
1958 targetStream = (StreamThread*)(m_streamThreads[1].get());
1959 targetStream->m_numRegisteredStream--;
1960 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, targetStream->m_numRegisteredStream);
1961 } else {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001962 ALOGE("ERR:(%s): wrong stream id (%d)", __FUNCTION__, stream_id);
Sungjoong Kangbe494d12012-08-04 15:36:56 -07001963 return 1;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09001964 }
1965
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07001966 if (m_streamThreads[1]->m_numRegisteredStream == 0 && m_streamThreads[1]->m_activated) {
1967 ALOGV("(%s): deactivating stream thread 1 ", __FUNCTION__);
1968 targetStream = (StreamThread*)(m_streamThreads[1].get());
1969 targetStream->m_releasing = true;
1970 do {
1971 CAM_LOGD("stream thread release %d", __LINE__);
1972 targetStream->release();
1973 usleep(33000);
1974 } while (targetStream->m_releasing);
1975 }
1976
1977 if (releasingScpMain || (m_streamThreads[0]->m_numRegisteredStream == 0 && m_streamThreads[0]->m_activated)) {
1978 ALOGV("(%s): deactivating stream thread 0", __FUNCTION__);
1979 targetStream = (StreamThread*)(m_streamThreads[0].get());
1980 targetStream->m_releasing = true;
1981 do {
1982 ALOGD("stream thread release %d", __LINE__);
1983 targetStream->release();
1984 usleep(33000);
1985 } while (targetStream->m_releasing);
1986 targetStream->SetSignal(SIGNAL_THREAD_TERMINATE);
1987
1988 if (targetStream != NULL) {
1989 while (targetStream->IsTerminated())
1990 {
1991 ALOGD("Waiting for stream thread is tetminated");
1992 usleep(10000);
1993 }
1994 m_streamThreads[0] = NULL;
1995 }
1996
1997 if (m_sensorThread != NULL) {
1998 m_sensorThread->release();
1999 while (!m_sensorThread->IsTerminated()){
2000 ALOGD("Waiting for sensor thread is tetminated");
2001 usleep(10000);
2002 }
2003 }
2004 else {
2005 ALOGE("+++++++ sensor thread is NULL %d", __LINE__);
2006 }
2007
2008 if (m_camera_info.capture.status == true) {
2009 if (cam_int_streamoff(&(m_camera_info.capture)) < 0) {
2010 ALOGE("ERR(%s): capture stream off fail", __FUNCTION__);
2011 } else {
2012 m_camera_info.capture.status = false;
2013 }
2014 ALOGV("(%s): calling capture streamoff done", __FUNCTION__);
2015 if (m_streamThreads[1]->streamType == STREAM_TYPE_INDIRECT) {
2016 m_camera_info.capture.buffers = 0;
2017 ALOGV("DEBUG(%s): capture calling reqbuf 0 ", __FUNCTION__);
2018 cam_int_reqbufs(&(m_camera_info.capture));
2019 ALOGV("DEBUG(%s): capture calling reqbuf 0 done", __FUNCTION__);
2020 }
2021 }
2022 m_isIspStarted = false;
2023 }
2024 ALOGV("(%s): END", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002025 return 0;
2026}
2027
2028int ExynosCameraHWInterface2::allocateReprocessStream(
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002029 uint32_t width, uint32_t height, uint32_t format,
2030 const camera2_stream_in_ops_t *reprocess_stream_ops,
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002031 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers)
2032{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002033 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002034 return 0;
2035}
2036
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002037int ExynosCameraHWInterface2::allocateReprocessStreamFromStream(
2038 uint32_t output_stream_id,
2039 const camera2_stream_in_ops_t *reprocess_stream_ops,
2040 // outputs
2041 uint32_t *stream_id)
2042{
2043 ALOGV("DEBUG(%s): output_stream_id(%d)", __FUNCTION__, output_stream_id);
2044 *stream_id = STREAM_ID_JPEG_REPROCESS;
2045
2046 m_reprocessStreamId = *stream_id;
2047 m_reprocessOps = reprocess_stream_ops;
2048 m_reprocessOutputStreamId = output_stream_id;
2049 return 0;
2050}
2051
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002052int ExynosCameraHWInterface2::releaseReprocessStream(uint32_t stream_id)
2053{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002054 ALOGV("DEBUG(%s):", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002055 if (stream_id == STREAM_ID_JPEG_REPROCESS) {
2056 m_reprocessStreamId = 0;
2057 m_reprocessOps = NULL;
2058 m_reprocessOutputStreamId = 0;
2059 return 0;
2060 }
2061 return 1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002062}
2063
2064int ExynosCameraHWInterface2::triggerAction(uint32_t trigger_id, int ext1, int ext2)
2065{
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002066 ALOGV("DEBUG(%s): id(%x), %d, %d", __FUNCTION__, trigger_id, ext1, ext2);
2067
2068 switch (trigger_id) {
2069 case CAMERA2_TRIGGER_AUTOFOCUS:
2070 ALOGV("DEBUG(%s):TRIGGER_AUTOFOCUS id(%d)", __FUNCTION__, ext1);
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002071 OnAfTriggerStart(ext1);
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002072 break;
2073
2074 case CAMERA2_TRIGGER_CANCEL_AUTOFOCUS:
2075 ALOGV("DEBUG(%s):CANCEL_AUTOFOCUS id(%d)", __FUNCTION__, ext1);
2076 OnAfCancel(ext1);
2077 break;
2078 default:
2079 break;
2080 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002081 return 0;
2082}
2083
2084int ExynosCameraHWInterface2::setNotifyCallback(camera2_notify_callback notify_cb, void *user)
2085{
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002086 ALOGV("DEBUG(%s): cb_addr(%x)", __FUNCTION__, (unsigned int)notify_cb);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002087 m_notifyCb = notify_cb;
2088 m_callbackCookie = user;
2089 return 0;
2090}
2091
2092int ExynosCameraHWInterface2::getMetadataVendorTagOps(vendor_tag_query_ops_t **ops)
2093{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002094 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002095 return 0;
2096}
2097
2098int ExynosCameraHWInterface2::dump(int fd)
2099{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002100 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002101 return 0;
2102}
2103
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002104void ExynosCameraHWInterface2::m_getAlignedYUVSize(int colorFormat, int w, int h, ExynosBuffer *buf)
2105{
2106 switch (colorFormat) {
2107 // 1p
2108 case V4L2_PIX_FMT_RGB565 :
2109 case V4L2_PIX_FMT_YUYV :
2110 case V4L2_PIX_FMT_UYVY :
2111 case V4L2_PIX_FMT_VYUY :
2112 case V4L2_PIX_FMT_YVYU :
2113 buf->size.extS[0] = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(colorFormat), w, h);
2114 buf->size.extS[1] = 0;
2115 buf->size.extS[2] = 0;
2116 break;
2117 // 2p
2118 case V4L2_PIX_FMT_NV12 :
2119 case V4L2_PIX_FMT_NV12T :
2120 case V4L2_PIX_FMT_NV21 :
2121 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
2122 buf->size.extS[1] = ALIGN(w/2, 16) * ALIGN(h/2, 16);
2123 buf->size.extS[2] = 0;
2124 break;
2125 case V4L2_PIX_FMT_NV12M :
2126 case V4L2_PIX_FMT_NV12MT_16X16 :
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002127 case V4L2_PIX_FMT_NV21M:
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002128 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
2129 buf->size.extS[1] = ALIGN(buf->size.extS[0] / 2, 256);
2130 buf->size.extS[2] = 0;
2131 break;
2132 case V4L2_PIX_FMT_NV16 :
2133 case V4L2_PIX_FMT_NV61 :
2134 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
2135 buf->size.extS[1] = ALIGN(w, 16) * ALIGN(h, 16);
2136 buf->size.extS[2] = 0;
2137 break;
2138 // 3p
2139 case V4L2_PIX_FMT_YUV420 :
2140 case V4L2_PIX_FMT_YVU420 :
2141 buf->size.extS[0] = (w * h);
2142 buf->size.extS[1] = (w * h) >> 2;
2143 buf->size.extS[2] = (w * h) >> 2;
2144 break;
2145 case V4L2_PIX_FMT_YUV420M:
2146 case V4L2_PIX_FMT_YVU420M :
2147 case V4L2_PIX_FMT_YUV422P :
2148 buf->size.extS[0] = ALIGN(w, 32) * ALIGN(h, 16);
2149 buf->size.extS[1] = ALIGN(w/2, 16) * ALIGN(h/2, 8);
2150 buf->size.extS[2] = ALIGN(w/2, 16) * ALIGN(h/2, 8);
2151 break;
2152 default:
2153 ALOGE("ERR(%s):unmatched colorFormat(%d)", __FUNCTION__, colorFormat);
2154 return;
2155 break;
2156 }
2157}
2158
2159bool ExynosCameraHWInterface2::m_getRatioSize(int src_w, int src_h,
2160 int dst_w, int dst_h,
2161 int *crop_x, int *crop_y,
2162 int *crop_w, int *crop_h,
2163 int zoom)
2164{
2165 *crop_w = src_w;
2166 *crop_h = src_h;
2167
2168 if ( src_w != dst_w
2169 || src_h != dst_h) {
2170 float src_ratio = 1.0f;
2171 float dst_ratio = 1.0f;
2172
2173 // ex : 1024 / 768
2174 src_ratio = (float)src_w / (float)src_h;
2175
2176 // ex : 352 / 288
2177 dst_ratio = (float)dst_w / (float)dst_h;
2178
2179 if (dst_w * dst_h < src_w * src_h) {
2180 if (dst_ratio <= src_ratio) {
2181 // shrink w
2182 *crop_w = src_h * dst_ratio;
2183 *crop_h = src_h;
2184 } else {
2185 // shrink h
2186 *crop_w = src_w;
2187 *crop_h = src_w / dst_ratio;
2188 }
2189 } else {
2190 if (dst_ratio <= src_ratio) {
2191 // shrink w
2192 *crop_w = src_h * dst_ratio;
2193 *crop_h = src_h;
2194 } else {
2195 // shrink h
2196 *crop_w = src_w;
2197 *crop_h = src_w / dst_ratio;
2198 }
2199 }
2200 }
2201
2202 if (zoom != 0) {
2203 float zoomLevel = ((float)zoom + 10.0) / 10.0;
2204 *crop_w = (int)((float)*crop_w / zoomLevel);
2205 *crop_h = (int)((float)*crop_h / zoomLevel);
2206 }
2207
2208 #define CAMERA_CROP_WIDTH_RESTRAIN_NUM (0x2)
2209 unsigned int w_align = (*crop_w & (CAMERA_CROP_WIDTH_RESTRAIN_NUM - 1));
2210 if (w_align != 0) {
2211 if ( (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1) <= w_align
2212 && *crop_w + (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align) <= dst_w) {
2213 *crop_w += (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align);
2214 }
2215 else
2216 *crop_w -= w_align;
2217 }
2218
2219 #define CAMERA_CROP_HEIGHT_RESTRAIN_NUM (0x2)
2220 unsigned int h_align = (*crop_h & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - 1));
2221 if (h_align != 0) {
2222 if ( (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1) <= h_align
2223 && *crop_h + (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align) <= dst_h) {
2224 *crop_h += (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align);
2225 }
2226 else
2227 *crop_h -= h_align;
2228 }
2229
2230 *crop_x = (src_w - *crop_w) >> 1;
2231 *crop_y = (src_h - *crop_h) >> 1;
2232
2233 if (*crop_x & (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1))
2234 *crop_x -= 1;
2235
2236 if (*crop_y & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1))
2237 *crop_y -= 1;
2238
2239 return true;
2240}
2241
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002242BayerBufManager::BayerBufManager()
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002243{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002244 ALOGV("DEBUG(%s): ", __FUNCTION__);
2245 for (int i = 0; i < NUM_BAYER_BUFFERS ; i++) {
2246 entries[i].status = BAYER_ON_HAL_EMPTY;
2247 entries[i].reqFrameCnt = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002248 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002249 sensorEnqueueHead = 0;
2250 sensorDequeueHead = 0;
2251 ispEnqueueHead = 0;
2252 ispDequeueHead = 0;
2253 numOnSensor = 0;
2254 numOnIsp = 0;
2255 numOnHalFilled = 0;
2256 numOnHalEmpty = NUM_BAYER_BUFFERS;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002257}
2258
Sungjoong Kang15fd8232012-08-23 16:16:44 -07002259BayerBufManager::~BayerBufManager()
2260{
2261 ALOGV("%s", __FUNCTION__);
2262}
2263
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002264int BayerBufManager::GetIndexForSensorEnqueue()
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002265{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002266 int ret = 0;
2267 if (numOnHalEmpty == 0)
2268 ret = -1;
2269 else
2270 ret = sensorEnqueueHead;
2271 ALOGV("DEBUG(%s): returning (%d)", __FUNCTION__, ret);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002272 return ret;
2273}
2274
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002275int BayerBufManager::MarkSensorEnqueue(int index)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002276{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002277 ALOGV("DEBUG(%s) : BayerIndex[%d] ", __FUNCTION__, index);
2278
2279 // sanity check
2280 if (index != sensorEnqueueHead) {
2281 ALOGV("DEBUG(%s) : Abnormal BayerIndex[%d] - expected[%d]", __FUNCTION__, index, sensorEnqueueHead);
2282 return -1;
2283 }
2284 if (entries[index].status != BAYER_ON_HAL_EMPTY) {
2285 ALOGV("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
2286 index, entries[index].status, BAYER_ON_HAL_EMPTY);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002287 return -1;
2288 }
2289
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002290 entries[index].status = BAYER_ON_SENSOR;
2291 entries[index].reqFrameCnt = 0;
2292 numOnHalEmpty--;
2293 numOnSensor++;
2294 sensorEnqueueHead = GetNextIndex(index);
2295 ALOGV("DEBUG(%s) END: HAL-e(%d) HAL-f(%d) Sensor(%d) ISP(%d) ",
2296 __FUNCTION__, numOnHalEmpty, numOnHalFilled, numOnSensor, numOnIsp);
2297 return 0;
2298}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002299
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002300int BayerBufManager::MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp)
2301{
2302 ALOGV("DEBUG(%s) : BayerIndex[%d] reqFrameCnt(%d)", __FUNCTION__, index, reqFrameCnt);
2303
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002304 if (entries[index].status != BAYER_ON_SENSOR) {
Sungjoong Kangad378612012-08-17 12:34:33 -07002305 ALOGE("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002306 index, entries[index].status, BAYER_ON_SENSOR);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002307 return -1;
2308 }
2309
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002310 entries[index].status = BAYER_ON_HAL_FILLED;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002311 numOnHalFilled++;
2312 numOnSensor--;
Sungjoong Kangad378612012-08-17 12:34:33 -07002313
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002314 return 0;
2315}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002316
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002317int BayerBufManager::GetIndexForIspEnqueue(int *reqFrameCnt)
2318{
2319 int ret = 0;
2320 if (numOnHalFilled == 0)
2321 ret = -1;
2322 else {
2323 *reqFrameCnt = entries[ispEnqueueHead].reqFrameCnt;
2324 ret = ispEnqueueHead;
2325 }
2326 ALOGV("DEBUG(%s): returning BayerIndex[%d]", __FUNCTION__, ret);
2327 return ret;
2328}
2329
2330int BayerBufManager::GetIndexForIspDequeue(int *reqFrameCnt)
2331{
2332 int ret = 0;
2333 if (numOnIsp == 0)
2334 ret = -1;
2335 else {
2336 *reqFrameCnt = entries[ispDequeueHead].reqFrameCnt;
2337 ret = ispDequeueHead;
2338 }
2339 ALOGV("DEBUG(%s): returning BayerIndex[%d]", __FUNCTION__, ret);
2340 return ret;
2341}
2342
2343int BayerBufManager::MarkIspEnqueue(int index)
2344{
2345 ALOGV("DEBUG(%s) : BayerIndex[%d] ", __FUNCTION__, index);
2346
2347 // sanity check
2348 if (index != ispEnqueueHead) {
2349 ALOGV("DEBUG(%s) : Abnormal BayerIndex[%d] - expected[%d]", __FUNCTION__, index, ispEnqueueHead);
2350 return -1;
2351 }
2352 if (entries[index].status != BAYER_ON_HAL_FILLED) {
2353 ALOGV("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
2354 index, entries[index].status, BAYER_ON_HAL_FILLED);
2355 return -1;
2356 }
2357
2358 entries[index].status = BAYER_ON_ISP;
2359 numOnHalFilled--;
2360 numOnIsp++;
2361 ispEnqueueHead = GetNextIndex(index);
2362 ALOGV("DEBUG(%s) END: HAL-e(%d) HAL-f(%d) Sensor(%d) ISP(%d) ",
2363 __FUNCTION__, numOnHalEmpty, numOnHalFilled, numOnSensor, numOnIsp);
2364 return 0;
2365}
2366
2367int BayerBufManager::MarkIspDequeue(int index)
2368{
2369 ALOGV("DEBUG(%s) : BayerIndex[%d]", __FUNCTION__, index);
2370
2371 // sanity check
2372 if (index != ispDequeueHead) {
2373 ALOGV("DEBUG(%s) : Abnormal BayerIndex[%d] - expected[%d]", __FUNCTION__, index, ispDequeueHead);
2374 return -1;
2375 }
2376 if (entries[index].status != BAYER_ON_ISP) {
2377 ALOGV("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
2378 index, entries[index].status, BAYER_ON_ISP);
2379 return -1;
2380 }
2381
2382 entries[index].status = BAYER_ON_HAL_EMPTY;
2383 entries[index].reqFrameCnt = 0;
2384 numOnHalEmpty++;
2385 numOnIsp--;
2386 ispDequeueHead = GetNextIndex(index);
2387 ALOGV("DEBUG(%s) END: HAL-e(%d) HAL-f(%d) Sensor(%d) ISP(%d) ",
2388 __FUNCTION__, numOnHalEmpty, numOnHalFilled, numOnSensor, numOnIsp);
2389 return 0;
2390}
2391
2392int BayerBufManager::GetNumOnSensor()
2393{
2394 return numOnSensor;
2395}
2396
2397int BayerBufManager::GetNumOnHalFilled()
2398{
2399 return numOnHalFilled;
2400}
2401
2402int BayerBufManager::GetNumOnIsp()
2403{
2404 return numOnIsp;
2405}
2406
2407int BayerBufManager::GetNextIndex(int index)
2408{
2409 index++;
2410 if (index >= NUM_BAYER_BUFFERS)
2411 index = 0;
2412
2413 return index;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002414}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002415
2416void ExynosCameraHWInterface2::m_mainThreadFunc(SignalDrivenThread * self)
2417{
2418 camera_metadata_t *currentRequest = NULL;
2419 camera_metadata_t *currentFrame = NULL;
2420 size_t numEntries = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002421 size_t frameSize = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002422 camera_metadata_t * preparedFrame = NULL;
2423 camera_metadata_t *deregisteredRequest = NULL;
2424 uint32_t currentSignal = self->GetProcessingSignal();
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002425 MainThread * selfThread = ((MainThread*)self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002426 int res = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002427
Sungjoong Kangad378612012-08-17 12:34:33 -07002428 int ret;
2429
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002430 ALOGV("DEBUG(%s): m_mainThreadFunc (%x)", __FUNCTION__, currentSignal);
2431
2432 if (currentSignal & SIGNAL_THREAD_RELEASE) {
2433 ALOGV("DEBUG(%s): processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
2434
2435 ALOGV("DEBUG(%s): processing SIGNAL_THREAD_RELEASE DONE", __FUNCTION__);
2436 selfThread->SetSignal(SIGNAL_THREAD_TERMINATE);
2437 return;
2438 }
2439
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002440 if (currentSignal & SIGNAL_MAIN_REQ_Q_NOT_EMPTY) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002441 ALOGV("DEBUG(%s): MainThread processing SIGNAL_MAIN_REQ_Q_NOT_EMPTY", __FUNCTION__);
Sungjoong Kangad378612012-08-17 12:34:33 -07002442 if (m_requestManager->IsRequestQueueFull()==false) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002443 m_requestQueueOps->dequeue_request(m_requestQueueOps, &currentRequest);
2444 if (NULL == currentRequest) {
Sungjoong Kangad378612012-08-17 12:34:33 -07002445 ALOGE("DEBUG(%s)(0x%x): dequeue_request returned NULL ", __FUNCTION__, currentSignal);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002446 m_isRequestQueueNull = true;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002447 }
2448 else {
2449 m_requestManager->RegisterRequest(currentRequest);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002450
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002451 m_numOfRemainingReqInSvc = m_requestQueueOps->request_count(m_requestQueueOps);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002452 ALOGV("DEBUG(%s): remaining req cnt (%d)", __FUNCTION__, m_numOfRemainingReqInSvc);
Sungjoong Kangad378612012-08-17 12:34:33 -07002453 if (m_requestManager->IsRequestQueueFull()==false)
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002454 selfThread->SetSignal(SIGNAL_MAIN_REQ_Q_NOT_EMPTY); // dequeue repeatedly
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002455
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002456 m_sensorThread->SetSignal(SIGNAL_SENSOR_START_REQ_PROCESSING);
2457 }
2458 }
2459 else {
2460 m_isRequestQueuePending = true;
2461 }
2462 }
2463
2464 if (currentSignal & SIGNAL_MAIN_STREAM_OUTPUT_DONE) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002465 ALOGV("DEBUG(%s): MainThread processing SIGNAL_MAIN_STREAM_OUTPUT_DONE", __FUNCTION__);
2466 /*while (1)*/ {
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002467 ret = m_requestManager->PrepareFrame(&numEntries, &frameSize, &preparedFrame, GetAfStateForService());
Sungjoong Kangad378612012-08-17 12:34:33 -07002468 if (ret == false)
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -07002469 CAM_LOGD("++++++ PrepareFrame ret = %d", ret);
Sungjoong Kangad378612012-08-17 12:34:33 -07002470
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002471 m_requestManager->DeregisterRequest(&deregisteredRequest);
Sungjoong Kangad378612012-08-17 12:34:33 -07002472
2473 ret = m_requestQueueOps->free_request(m_requestQueueOps, deregisteredRequest);
2474 if (ret < 0)
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -07002475 CAM_LOGD("++++++ free_request ret = %d", ret);
Sungjoong Kangad378612012-08-17 12:34:33 -07002476
2477 ret = m_frameQueueOps->dequeue_frame(m_frameQueueOps, numEntries, frameSize, &currentFrame);
2478 if (ret < 0)
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -07002479 CAM_LOGD("++++++ dequeue_frame ret = %d", ret);
Sungjoong Kangad378612012-08-17 12:34:33 -07002480
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002481 if (currentFrame==NULL) {
Sungjoong Kangad378612012-08-17 12:34:33 -07002482 ALOGV("DBG(%s): frame dequeue returned NULL",__FUNCTION__ );
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002483 }
2484 else {
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07002485 ALOGV("DEBUG(%s): frame dequeue done. numEntries(%d) frameSize(%d)",__FUNCTION__ , numEntries, frameSize);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002486 }
2487 res = append_camera_metadata(currentFrame, preparedFrame);
2488 if (res==0) {
2489 ALOGV("DEBUG(%s): frame metadata append success",__FUNCTION__);
2490 m_frameQueueOps->enqueue_frame(m_frameQueueOps, currentFrame);
2491 }
2492 else {
2493 ALOGE("ERR(%s): frame metadata append fail (%d)",__FUNCTION__, res);
2494 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002495 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002496 if (!m_isRequestQueueNull) {
2497 selfThread->SetSignal(SIGNAL_MAIN_REQ_Q_NOT_EMPTY);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002498 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002499
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002500 if (getInProgressCount()>0) {
2501 ALOGV("DEBUG(%s): STREAM_OUTPUT_DONE and signalling REQ_PROCESSING",__FUNCTION__);
2502 m_sensorThread->SetSignal(SIGNAL_SENSOR_START_REQ_PROCESSING);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002503 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002504 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002505 ALOGV("DEBUG(%s): MainThread Exit", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002506 return;
2507}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002508
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07002509void ExynosCameraHWInterface2::m_sensorThreadInitialize(SignalDrivenThread * self)
2510{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002511 ALOGV("DEBUG(%s): ", __FUNCTION__ );
Sungjoong Kangad378612012-08-17 12:34:33 -07002512 /* will add */
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002513 return;
2514}
2515
2516
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002517void ExynosCameraHWInterface2::DumpInfoWithShot(struct camera2_shot_ext * shot_ext)
2518{
Sungjoong Kangad378612012-08-17 12:34:33 -07002519 ALOGD("#### common Section");
2520 ALOGD("#### magic(%x) ",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002521 shot_ext->shot.magicNumber);
Sungjoong Kangad378612012-08-17 12:34:33 -07002522 ALOGD("#### ctl Section");
2523 ALOGD("#### meta(%d) aper(%f) exp(%lld) duration(%lld) ISO(%d) AWB(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002524 shot_ext->shot.ctl.request.metadataMode,
Sungjoong Kangb56dcc02012-08-08 13:38:09 -07002525 shot_ext->shot.ctl.lens.aperture,
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002526 shot_ext->shot.ctl.sensor.exposureTime,
2527 shot_ext->shot.ctl.sensor.frameDuration,
Sungjoong Kangb56dcc02012-08-08 13:38:09 -07002528 shot_ext->shot.ctl.sensor.sensitivity,
2529 shot_ext->shot.ctl.aa.awbMode);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002530
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002531 ALOGD("#### OutputStream Sensor(%d) SCP(%d) SCC(%d) streams(%x)",
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002532 shot_ext->request_sensor, shot_ext->request_scp, shot_ext->request_scc,
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002533 shot_ext->shot.ctl.request.outputStreams[0]);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002534
Sungjoong Kangad378612012-08-17 12:34:33 -07002535 ALOGD("#### DM Section");
2536 ALOGD("#### meta(%d) aper(%f) exp(%lld) duration(%lld) ISO(%d) timestamp(%lld) AWB(%d) cnt(%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002537 shot_ext->shot.dm.request.metadataMode,
Sungjoong Kangb56dcc02012-08-08 13:38:09 -07002538 shot_ext->shot.dm.lens.aperture,
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002539 shot_ext->shot.dm.sensor.exposureTime,
2540 shot_ext->shot.dm.sensor.frameDuration,
2541 shot_ext->shot.dm.sensor.sensitivity,
Sungjoong Kangb56dcc02012-08-08 13:38:09 -07002542 shot_ext->shot.dm.sensor.timeStamp,
2543 shot_ext->shot.dm.aa.awbMode,
2544 shot_ext->shot.dm.request.frameCount );
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002545}
2546
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002547void ExynosCameraHWInterface2::flashSetter(struct camera2_shot_ext * shot_ext)
2548{
2549 // 1. AF Flash
Younghwan Joo9a710a42012-09-05 17:52:08 -07002550 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
2551 switch (m_ctlInfo.flash.m_afFlashCnt) {
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002552 case IS_FLASH_AF_ON:
Younghwan Joo9257e292012-09-08 21:11:18 -07002553 ALOGV("(%s): [AF Flash] IS_FLASH_ON", __FUNCTION__);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002554 if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
2555 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON_ALWAYS;
2556 m_ctlInfo.flash.m_flashWaitCnt = 0;
2557 } else
2558 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON;
2559 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_START;
2560 break;
2561 case IS_FLASH_AF_AUTO_AE_AWB_LOCK:
Younghwan Joo9257e292012-09-08 21:11:18 -07002562 ALOGV("(%s): [AF Flash] IS_FLASH_AF_AUTO_AE_AWB_LOCK", __FUNCTION__);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002563 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_AUTO;
2564 shot_ext->shot.ctl.aa.awbMode = AA_AWBMODE_LOCKED;
2565 //shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_LOCKED;
Younghwan Joocaea49e2012-09-07 13:34:20 -07002566 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002567 break;
2568 case IF_FLASH_AF_OFF:
Younghwan Joo9257e292012-09-08 21:11:18 -07002569 ALOGV("(%s): [AF Flash] IS_FLASH_OFF and status clear", __FUNCTION__);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002570 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002571 m_ctlInfo.flash.m_afFlashEnableFlg = false;
Younghwan Joo9257e292012-09-08 21:11:18 -07002572 m_ctlInfo.flash.m_afFlashDoneFlg = true;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002573 m_ctlInfo.flash.m_afFlashCnt = 0;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002574 break;
2575 }
2576 }
2577
2578 // 2. Flash
Younghwan Joo9a710a42012-09-05 17:52:08 -07002579 if (m_ctlInfo.flash.m_flashEnableFlg) {
2580 switch (m_ctlInfo.flash.m_flashCnt) {
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002581 case IS_FLASH_ON:
Younghwan Joo9257e292012-09-08 21:11:18 -07002582 ALOGV("(%s): [Flash] Flash ON for Capture", __FUNCTION__);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002583 if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
2584 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON_ALWAYS;
2585 m_ctlInfo.flash.m_flashWaitCnt = 0;
2586 } else
2587 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002588 shot_ext->request_scc = 0;
2589 shot_ext->request_scp = 0;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002590 break;
2591 case IS_FLASH_ON_DONE:
Younghwan Joo9a710a42012-09-05 17:52:08 -07002592 //shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_LOCKED;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002593 shot_ext->shot.ctl.aa.awbMode = AA_AWBMODE_LOCKED;
2594 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_AUTO;
Younghwan Joo9257e292012-09-08 21:11:18 -07002595 m_ctlInfo.flash.m_flashCnt = IS_FLASH_AE_AWB_LOCK_WAIT; // auto transition
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002596 shot_ext->request_scc = 0;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002597 shot_ext->request_scp = 0;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002598 break;
Younghwan Joo9257e292012-09-08 21:11:18 -07002599 case IS_FLASH_AE_AWB_LOCK_WAIT:
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002600 shot_ext->request_scc = 0;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002601 shot_ext->request_scp = 0;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002602 break;
2603 case IS_FLASH_CAPTURE:
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002604 m_ctlInfo.flash.m_flashTimeOut = FLASH_STABLE_WAIT_TIMEOUT;
2605 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE_WAIT; // auto transition
Younghwan Joo9a710a42012-09-05 17:52:08 -07002606 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_CAPTURE;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002607 shot_ext->request_scc = 0;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002608 shot_ext->request_scp = 0;
Younghwan Joo9257e292012-09-08 21:11:18 -07002609 ALOGV("(%s): [Flash] IS_FLASH_CAPTURE - %d", __FUNCTION__, shot_ext->shot.ctl.aa.aeflashMode);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002610 break;
2611 case IS_FLASH_CAPTURE_WAIT:
2612 shot_ext->request_scc = 0;
2613 shot_ext->request_scp = 0;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002614 break;
2615 case IS_FLASH_CAPTURE_JPEG:
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002616 ALOGD("(%s): [Flash] Flash Capture (%d)!!!!!", __FUNCTION__, (FLASH_STABLE_WAIT_TIMEOUT -m_ctlInfo.flash.m_flashTimeOut));
Younghwan Joo9a710a42012-09-05 17:52:08 -07002617 shot_ext->request_scc = 1;
2618 shot_ext->request_scp = 1;
2619 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE_END;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002620 break;
2621 case IS_FLASH_CAPTURE_END:
Younghwan Joo9257e292012-09-08 21:11:18 -07002622 ALOGV("(%s): [Flash] Flash Capture END", __FUNCTION__);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002623 shot_ext->request_scc = 0;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002624 shot_ext->request_scp = 0;
2625 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002626 m_ctlInfo.flash.m_flashEnableFlg = false;
2627 m_ctlInfo.flash.m_flashCnt = 0;
2628 m_ctlInfo.flash.m_afFlashDoneFlg= false;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002629 break;
2630 }
2631 }
2632}
2633
Younghwan Joo9257e292012-09-08 21:11:18 -07002634void ExynosCameraHWInterface2::flashListenerSensor(struct camera2_shot_ext * shot_ext)
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002635{
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002636 // 1. AF Flash
Younghwan Joo9a710a42012-09-05 17:52:08 -07002637 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002638 switch (m_ctlInfo.flash.m_afFlashCnt) {
Younghwan Joo9257e292012-09-08 21:11:18 -07002639 case IS_FLASH_AF_AUTO_OFF_WAIT:
2640 if (m_ctlInfo.flash.m_flashDecisionResult) {
2641 if (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF) {
2642 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_END;
2643 ALOGV("(%s): [AF Flash] Lis : AUTO -> OFF (%d)", __FUNCTION__, shot_ext->shot.dm.flash.flashMode);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002644 } else {
Younghwan Joo9257e292012-09-08 21:11:18 -07002645 ALOGV("(%s): [AF Flash] Waiting : AUTO -> OFF", __FUNCTION__);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002646 }
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002647 } else {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002648 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_END;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002649 }
2650 break;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002651 }
2652 }
2653
2654 // 2. Flash
Younghwan Joo9a710a42012-09-05 17:52:08 -07002655 if (m_ctlInfo.flash.m_flashEnableFlg) {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002656 switch (m_ctlInfo.flash.m_flashCnt) {
Younghwan Joo9257e292012-09-08 21:11:18 -07002657 case IS_FLASH_AUTO_WAIT:
2658 if (m_ctlInfo.flash.m_flashDecisionResult) {
2659 if (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF) {
2660 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE;
Younghwan Joo9257e292012-09-08 21:11:18 -07002661 ALOGV("(%s): [Flash] Lis : AUTO -> OFF (%d)", __FUNCTION__, shot_ext->shot.dm.flash.flashMode);
2662 } else {
2663 ALOGV("(%s): [Flash] Waiting : AUTO -> OFF", __FUNCTION__);
2664 }
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002665 } else {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002666 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE;
Younghwan Joo9257e292012-09-08 21:11:18 -07002667 ALOGV("(%s): [Flash] Skip : FLASH_AUTO -> FLASH_MODE_OFF", __FUNCTION__);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002668 }
2669 break;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002670 }
2671 }
2672
2673}
2674
Younghwan Joo9257e292012-09-08 21:11:18 -07002675void ExynosCameraHWInterface2::flashListenerISP(struct camera2_shot_ext * shot_ext)
Younghwan Joo9a710a42012-09-05 17:52:08 -07002676{
Younghwan Joo9257e292012-09-08 21:11:18 -07002677 // 1. AF Flash
2678 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
2679 switch (m_ctlInfo.flash.m_afFlashCnt) {
2680 case IS_FLASH_AF_ON_START:
2681 if (shot_ext->shot.dm.flash.decision > 0) {
2682 // store decision result to skip capture sequenece
2683 if (shot_ext->shot.dm.flash.decision == 2)
2684 m_ctlInfo.flash.m_flashDecisionResult = false;
2685 else
2686 m_ctlInfo.flash.m_flashDecisionResult = true;
2687 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
2688 ALOGV("(%s): [AF Flash] IS_FLASH_ON, decision - %d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
2689 m_IsAfTriggerRequired = true;
2690 } else {
2691 if (m_ctlInfo.flash.m_flashTimeOut == 0) {
2692 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON_DONE;
2693 ALOGE("(%s): [AF Flash] Timeout IS_FLASH_ON, decision is false setting", __FUNCTION__);
2694 m_ctlInfo.flash.m_flashDecisionResult = false;
2695 m_IsAfTriggerRequired = true;
2696 } else {
2697 m_ctlInfo.flash.m_flashTimeOut--;
2698 }
2699 }
2700 break;
2701 case IS_FLASH_AF_AUTO_AE_AWB_LOCK_WAIT:
2702 if (shot_ext->shot.dm.aa.awbMode == AA_AWBMODE_LOCKED) {
2703 ALOGV("(%s): [AF Flash] AUTO_AE_AWB_LOCK_WAIT - %d", __FUNCTION__, shot_ext->shot.dm.aa.awbMode);
2704 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_OFF_WAIT;
2705 } else {
2706 ALOGV("(%s): [Flash] Waiting : AA_AWBMODE_LOCKED", __FUNCTION__);
2707 }
2708 break;
2709 }
2710 }
2711
2712 // 2. Flash
Younghwan Joo9a710a42012-09-05 17:52:08 -07002713 // firing stable field is valid at ISP meta output only.
2714 if (m_ctlInfo.flash.m_flashEnableFlg) {
2715 switch (m_ctlInfo.flash.m_flashCnt) {
Younghwan Joo9257e292012-09-08 21:11:18 -07002716 case IS_FLASH_ON:
2717 if (shot_ext->shot.dm.flash.decision > 0) {
2718 // store decision result to skip capture sequenece
2719 if (shot_ext->shot.dm.flash.decision == 2)
2720 m_ctlInfo.flash.m_flashDecisionResult = false;
2721 else
2722 m_ctlInfo.flash.m_flashDecisionResult = true;
2723 m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON_DONE;
2724 ALOGV("(%s): [Flash] IS_FLASH_ON, decision - %d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
2725 } else {
2726 if (m_ctlInfo.flash.m_flashTimeOut == 0) {
2727 m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON_DONE;
2728 m_ctlInfo.flash.m_flashDecisionResult = false;
2729 ALOGE("(%s): [Flash] Timeout IS_FLASH_ON, decision is false setting", __FUNCTION__);
2730 } else {
2731 m_ctlInfo.flash.m_flashTimeOut--;
2732 }
2733 }
2734 break;
2735 case IS_FLASH_AE_AWB_LOCK_WAIT:
2736 if (shot_ext->shot.dm.aa.awbMode == AA_AWBMODE_LOCKED) {
2737 ALOGV("(%s): [Flash] FLASH_AUTO_AE_AWB_LOCK_WAIT - %d", __FUNCTION__, shot_ext->shot.dm.aa.awbMode);
2738 m_ctlInfo.flash.m_flashCnt = IS_FLASH_AUTO_WAIT;
2739 } else {
2740 ALOGV("(%s): [Flash] Waiting : AA_AWBMODE_LOCKED", __FUNCTION__);
2741 }
2742 break;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002743 case IS_FLASH_CAPTURE_WAIT:
Younghwan Joocaea49e2012-09-07 13:34:20 -07002744 if (m_ctlInfo.flash.m_flashDecisionResult) {
2745 if (shot_ext->shot.dm.flash.firingStable) {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002746 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE_JPEG;
2747 } else {
Younghwan Joocaea49e2012-09-07 13:34:20 -07002748 if (m_ctlInfo.flash.m_flashTimeOut == 0) {
2749 ALOGE("(%s): [Flash] Wait firingStable time-out!!", __FUNCTION__);
2750 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE_JPEG;
2751 } else {
2752 m_ctlInfo.flash.m_flashTimeOut--;
2753 }
Younghwan Joo9a710a42012-09-05 17:52:08 -07002754 }
Younghwan Joocaea49e2012-09-07 13:34:20 -07002755 } else {
2756 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE_JPEG;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002757 }
2758 break;
2759 }
2760 }
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002761}
2762
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002763void ExynosCameraHWInterface2::m_sensorThreadFunc(SignalDrivenThread * self)
2764{
2765 uint32_t currentSignal = self->GetProcessingSignal();
2766 SensorThread * selfThread = ((SensorThread*)self);
2767 int index;
Sungjoong Kangad378612012-08-17 12:34:33 -07002768 int index_isp;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002769 status_t res;
2770 nsecs_t frameTime;
2771 int bayersOnSensor = 0, bayersOnIsp = 0;
Sungjoong Kangad378612012-08-17 12:34:33 -07002772 int j = 0;
2773 bool isCapture = false;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002774 ALOGV("DEBUG(%s): m_sensorThreadFunc (%x)", __FUNCTION__, currentSignal);
2775
2776 if (currentSignal & SIGNAL_THREAD_RELEASE) {
hyeonmyeong Choi2c872802012-09-08 15:39:58 -07002777 CAM_LOGD("(%s): ENTER processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002778
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002779 ALOGV("(%s): calling sensor streamoff", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002780 cam_int_streamoff(&(m_camera_info.sensor));
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002781 ALOGV("(%s): calling sensor streamoff done", __FUNCTION__);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07002782
2783 m_camera_info.sensor.buffers = 0;
2784 ALOGV("DEBUG(%s): sensor calling reqbuf 0 ", __FUNCTION__);
2785 cam_int_reqbufs(&(m_camera_info.sensor));
2786 ALOGV("DEBUG(%s): sensor calling reqbuf 0 done", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002787 m_camera_info.sensor.status = false;
Sungjoong Kangad378612012-08-17 12:34:33 -07002788
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002789 ALOGV("(%s): calling ISP streamoff", __FUNCTION__);
2790 isp_int_streamoff(&(m_camera_info.isp));
2791 ALOGV("(%s): calling ISP streamoff done", __FUNCTION__);
Sungjoong Kangad378612012-08-17 12:34:33 -07002792
Sungjoong Kangb5237e62012-07-27 07:39:05 -07002793 m_camera_info.isp.buffers = 0;
2794 ALOGV("DEBUG(%s): isp calling reqbuf 0 ", __FUNCTION__);
2795 cam_int_reqbufs(&(m_camera_info.isp));
2796 ALOGV("DEBUG(%s): isp calling reqbuf 0 done", __FUNCTION__);
2797
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002798 exynos_v4l2_s_ctrl(m_camera_info.sensor.fd, V4L2_CID_IS_S_STREAM, IS_DISABLE_STREAM);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002799
Sungjoong Kang52f54302012-09-04 21:43:06 +09002800 m_requestManager->releaseSensorQ();
Jiyoung Shin2adfa422012-09-10 23:14:54 +09002801 m_requestManager->ResetEntry();
Sungjoong Kangad378612012-08-17 12:34:33 -07002802 ALOGV("(%s): EXIT processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002803 selfThread->SetSignal(SIGNAL_THREAD_TERMINATE);
2804 return;
2805 }
2806
2807 if (currentSignal & SIGNAL_SENSOR_START_REQ_PROCESSING)
2808 {
2809 ALOGV("DEBUG(%s): SensorThread processing SIGNAL_SENSOR_START_REQ_PROCESSING", __FUNCTION__);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002810 int targetStreamIndex = 0, i=0;
Sungjoong Kangad378612012-08-17 12:34:33 -07002811 int matchedFrameCnt = -1, processingReqIndex;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002812 struct camera2_shot_ext *shot_ext;
Sungjoong Kangad378612012-08-17 12:34:33 -07002813 struct camera2_shot_ext *shot_ext_capture;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002814 bool triggered = false;
2815 int afMode;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002816
Sungjoong Kangad378612012-08-17 12:34:33 -07002817 /* dqbuf from sensor */
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002818 ALOGV("Sensor DQbuf start");
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09002819 index = cam_int_dqbuf(&(m_camera_info.sensor));
Sungjoong Kang52f54302012-09-04 21:43:06 +09002820 m_requestManager->pushSensorQ(index);
2821 ALOGV("Sensor DQbuf done(%d)", index);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09002822 shot_ext = (struct camera2_shot_ext *)(m_camera_info.sensor.buffer[index].virt.extP[1]);
Sungjoong Kangad378612012-08-17 12:34:33 -07002823
Sungjoong Kanga15b4e32012-08-28 12:55:39 -07002824 if (m_nightCaptureCnt != 0) {
2825 matchedFrameCnt = m_nightCaptureFrameCnt;
Younghwan Joo9a710a42012-09-05 17:52:08 -07002826 } else if (m_ctlInfo.flash.m_flashCnt != 0) {
2827 matchedFrameCnt = m_ctlInfo.flash.m_flashFrameCount;
Younghwan Joocaea49e2012-09-07 13:34:20 -07002828 ALOGV("Skip frame, request is fixed at %d", matchedFrameCnt);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002829 } else {
Sungjoong Kanga15b4e32012-08-28 12:55:39 -07002830 matchedFrameCnt = m_requestManager->FindFrameCnt(shot_ext);
2831 }
Sungjoong Kangad378612012-08-17 12:34:33 -07002832
Sungjoong Kanga07cbd92012-07-27 12:03:29 -07002833 if (matchedFrameCnt != -1) {
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09002834 frameTime = systemTime();
2835 m_requestManager->RegisterTimestamp(matchedFrameCnt, &frameTime);
2836 m_requestManager->UpdateIspParameters(shot_ext, matchedFrameCnt);
Younghwan Joo9a710a42012-09-05 17:52:08 -07002837
Younghwan Joocaea49e2012-09-07 13:34:20 -07002838 // Mapping Flash UI mode from aeMode
2839 if (shot_ext->shot.ctl.aa.aeMode >= AA_AEMODE_ON) {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002840 m_ctlInfo.flash.i_flashMode = shot_ext->shot.ctl.aa.aeMode;
Younghwan Joocaea49e2012-09-07 13:34:20 -07002841 shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_ON;
2842 }
Younghwan Joo9a710a42012-09-05 17:52:08 -07002843
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002844 if (m_afModeWaitingCnt != 0) {
2845 ALOGV("### Af Trigger pulled, waiting for mode change cnt(%d) ", m_afModeWaitingCnt);
2846 m_afModeWaitingCnt --;
2847 if (m_afModeWaitingCnt == 1) {
Sungjoong Kangcd13bb72012-08-28 13:05:01 -07002848 m_afModeWaitingCnt = 0;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002849 OnAfTrigger(m_afPendingTriggerId);
2850 }
2851 }
hyeonmyeong Choi308291d2012-08-29 13:55:01 -07002852 m_zoomRatio = (float)m_camera2->getSensorW() / (float)shot_ext->shot.ctl.scaler.cropRegion[2];
Sungjoong Kange4657e32012-08-28 15:02:19 -07002853 float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2854 int crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0;
2855
2856 m_getRatioSize(m_camera2->getSensorW(), m_camera2->getSensorH(),
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002857 m_streamThreads[0]->m_parameters.width, m_streamThreads[0]->m_parameters.height,
Sungjoong Kange4657e32012-08-28 15:02:19 -07002858 &crop_x, &crop_y,
2859 &crop_w, &crop_h,
2860 0);
2861
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002862 if (m_streamThreads[0]->m_parameters.width >= m_streamThreads[0]->m_parameters.height) {
hyeonmyeong Choi308291d2012-08-29 13:55:01 -07002863 zoomWidth = m_camera2->getSensorW() / m_zoomRatio;
Sungjoong Kange4657e32012-08-28 15:02:19 -07002864 zoomHeight = zoomWidth *
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002865 m_streamThreads[0]->m_parameters.height / m_streamThreads[0]->m_parameters.width;
Sungjoong Kange4657e32012-08-28 15:02:19 -07002866 } else {
hyeonmyeong Choi308291d2012-08-29 13:55:01 -07002867 zoomHeight = m_camera2->getSensorH() / m_zoomRatio;
Sungjoong Kange4657e32012-08-28 15:02:19 -07002868 zoomWidth = zoomHeight *
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002869 m_streamThreads[0]->m_parameters.width / m_streamThreads[0]->m_parameters.height;
Sungjoong Kange4657e32012-08-28 15:02:19 -07002870 }
2871 zoomLeft = (crop_w - zoomWidth) / 2;
2872 zoomTop = (crop_h - zoomHeight) / 2;
2873
2874 int32_t new_cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2875
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002876 if (new_cropRegion[0] * 2 + new_cropRegion[2] > (int32_t)m_camera2->getSensorW())
hyeonmyeong Choi308291d2012-08-29 13:55:01 -07002877 new_cropRegion[2]--;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002878 else if (new_cropRegion[0] * 2 + new_cropRegion[2] < (int32_t)m_camera2->getSensorW())
hyeonmyeong Choi308291d2012-08-29 13:55:01 -07002879 new_cropRegion[2]++;
2880
Sungjoong Kange4657e32012-08-28 15:02:19 -07002881 shot_ext->shot.ctl.scaler.cropRegion[0] = new_cropRegion[0];
2882 shot_ext->shot.ctl.scaler.cropRegion[1] = new_cropRegion[1];
2883 shot_ext->shot.ctl.scaler.cropRegion[2] = new_cropRegion[2];
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002884 if (m_IsAfModeUpdateRequired) {
2885 ALOGE("### AF Mode change(Mode %d) ", m_afMode);
2886 shot_ext->shot.ctl.aa.afMode = m_afMode;
2887 if (m_afMode == AA_AFMODE_CONTINUOUS_VIDEO || m_afMode == AA_AFMODE_CONTINUOUS_PICTURE) {
2888 ALOGE("### With Automatic triger for continuous modes");
2889 m_afState = HAL_AFSTATE_STARTED;
2890 shot_ext->shot.ctl.aa.afTrigger = 1;
2891 triggered = true;
2892 }
2893 m_IsAfModeUpdateRequired = false;
2894 if (m_afMode2 != NO_CHANGE) {
2895 enum aa_afmode tempAfMode = m_afMode2;
2896 m_afMode2 = NO_CHANGE;
2897 SetAfMode(tempAfMode);
2898 }
2899 }
2900 else {
2901 shot_ext->shot.ctl.aa.afMode = NO_CHANGE;
2902 }
2903 if (m_IsAfTriggerRequired) {
Younghwan Joo9a710a42012-09-05 17:52:08 -07002904 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
2905 if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_ON_DONE) {
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002906 // Flash is enabled and start AF
2907 if (m_afState == HAL_AFSTATE_SCANNING) {
2908 ALOGE("(%s): restarting trigger ", __FUNCTION__);
2909 } else {
2910 if (m_afState != HAL_AFSTATE_NEEDS_COMMAND)
2911 ALOGE("(%s): wrong trigger state %d", __FUNCTION__, m_afState);
2912 else
2913 m_afState = HAL_AFSTATE_STARTED;
2914 }
Younghwan Joocaea49e2012-09-07 13:34:20 -07002915 ALOGE("### AF Triggering with mode (%d)", m_afMode);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002916 shot_ext->shot.ctl.aa.afTrigger = 1;
2917 shot_ext->shot.ctl.aa.afMode = m_afMode;
2918 m_IsAfTriggerRequired = false;
2919 }
2920 } else {
Younghwan Joocaea49e2012-09-07 13:34:20 -07002921 ALOGE("### AF Triggering with mode (%d)", m_afMode);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07002922 if (m_afState == HAL_AFSTATE_SCANNING) {
2923 ALOGE("(%s): restarting trigger ", __FUNCTION__);
2924 } else {
2925 if (m_afState != HAL_AFSTATE_NEEDS_COMMAND)
2926 ALOGE("(%s): wrong trigger state %d", __FUNCTION__, m_afState);
2927 else
2928 m_afState = HAL_AFSTATE_STARTED;
2929 }
2930 shot_ext->shot.ctl.aa.afTrigger = 1;
2931 shot_ext->shot.ctl.aa.afMode = m_afMode;
2932 m_IsAfTriggerRequired = false;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07002933 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002934 }
2935 else {
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002936 shot_ext->shot.ctl.aa.afTrigger = 0;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002937 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002938
2939 if (m_wideAspect) {
2940 shot_ext->setfile = ISS_SUB_SCENARIO_VIDEO;
2941 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 30;
Sungjoong Kang15fd8232012-08-23 16:16:44 -07002942 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002943 } else {
2944 shot_ext->setfile = ISS_SUB_SCENARIO_STILL;
Sungjoong Kang15fd8232012-08-23 16:16:44 -07002945 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07002946 if (triggered)
2947 shot_ext->shot.ctl.aa.afTrigger = 1;
2948
2949 // TODO : check collision with AFMode Update
2950 if (m_IsAfLockRequired) {
2951 shot_ext->shot.ctl.aa.afMode = AA_AFMODE_OFF;
2952 m_IsAfLockRequired = false;
2953 }
Rebecca Schultz Zavin4ed2f102012-08-22 00:55:29 -07002954 ALOGV("### Isp Qbuf start(%d) count (%d), SCP(%d) SCC(%d) DIS(%d) shot_size(%d)",
Sungjoong Kangad378612012-08-17 12:34:33 -07002955 index,
2956 shot_ext->shot.ctl.request.frameCount,
2957 shot_ext->request_scp,
2958 shot_ext->request_scc,
2959 shot_ext->dis_bypass, sizeof(camera2_shot));
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002960 if (0 == shot_ext->shot.ctl.aa.afRegions[0] && 0 == shot_ext->shot.ctl.aa.afRegions[1]
2961 && 0 == shot_ext->shot.ctl.aa.afRegions[2] && 0 == shot_ext->shot.ctl.aa.afRegions[3]) {
2962 ALOGV("(%s): AF region resetting", __FUNCTION__);
2963 lastAfRegion[0] = 0;
2964 lastAfRegion[1] = 0;
2965 lastAfRegion[2] = 0;
2966 lastAfRegion[3] = 0;
2967 }
2968 else {
2969 if (!(lastAfRegion[0] == shot_ext->shot.ctl.aa.afRegions[0] && lastAfRegion[1] == shot_ext->shot.ctl.aa.afRegions[1]
2970 && lastAfRegion[2] == shot_ext->shot.ctl.aa.afRegions[2] && lastAfRegion[3] == shot_ext->shot.ctl.aa.afRegions[3])) {
Younghwan Joocaea49e2012-09-07 13:34:20 -07002971 ALOGE("(%s): AF region changed : triggering", __FUNCTION__);
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002972 shot_ext->shot.ctl.aa.afTrigger = 1;
2973 shot_ext->shot.ctl.aa.afMode = m_afMode;
2974 m_afState = HAL_AFSTATE_STARTED;
2975 lastAfRegion[0] = shot_ext->shot.ctl.aa.afRegions[0];
2976 lastAfRegion[1] = shot_ext->shot.ctl.aa.afRegions[1];
2977 lastAfRegion[2] = shot_ext->shot.ctl.aa.afRegions[2];
2978 lastAfRegion[3] = shot_ext->shot.ctl.aa.afRegions[3];
2979 }
Younghwan Jooda7ca692012-09-03 20:47:21 -07002980 // clear region infos in case of CAF mode
2981 if (m_afMode == AA_AFMODE_CONTINUOUS_VIDEO || m_afMode == AA_AFMODE_CONTINUOUS_PICTURE) {
2982 shot_ext->shot.ctl.aa.afRegions[0] = lastAfRegion[0] = 0;
2983 shot_ext->shot.ctl.aa.afRegions[1] = lastAfRegion[1] = 0;
2984 shot_ext->shot.ctl.aa.afRegions[2] = lastAfRegion[2] = 0;
2985 shot_ext->shot.ctl.aa.afRegions[3] = lastAfRegion[3] = 0;
2986 }
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07002987 }
Sungjoong Kanga15b4e32012-08-28 12:55:39 -07002988 if (m_nightCaptureCnt == 0) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07002989 if (shot_ext->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_STILL_CAPTURE
Sungjoong Kanga15b4e32012-08-28 12:55:39 -07002990 && shot_ext->shot.ctl.aa.sceneMode == AA_SCENE_MODE_NIGHT) {
2991 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
2992 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 2;
2993 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
2994 m_nightCaptureCnt = 4;
2995 m_nightCaptureFrameCnt = matchedFrameCnt;
2996 shot_ext->request_scc = 0;
2997 }
2998 }
2999 else if (m_nightCaptureCnt == 1) {
3000 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
3001 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 2;
3002 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
3003 m_nightCaptureCnt--;
3004 shot_ext->request_scc = 1;
3005 }
3006 else if (m_nightCaptureCnt == 2 || m_nightCaptureCnt == 3 || m_nightCaptureCnt == 4) {
3007 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
3008 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 2;
3009 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
3010 m_nightCaptureCnt--;
3011 shot_ext->request_scc = 0;
3012 }
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07003013
3014 // Flash mode
3015 // Keep and Skip request_scc = 1 at flash enable mode to operate flash sequence
Younghwan Joo9a710a42012-09-05 17:52:08 -07003016 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH) && (m_ctlInfo.flash.m_flashEnableFlg == false)
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07003017 && (m_cameraId == 0)) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003018 if (shot_ext->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_STILL_CAPTURE) {
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07003019 ALOGE("(%s): [Flash] Flash capture start : skip request scc 1#####", __FUNCTION__);
3020 shot_ext->request_scc = 0;
Younghwan Joo9a710a42012-09-05 17:52:08 -07003021 m_ctlInfo.flash.m_flashFrameCount = matchedFrameCnt;
3022 m_ctlInfo.flash.m_flashEnableFlg = true;
3023 m_ctlInfo.flash.m_flashCaptured = false;
3024 if(m_ctlInfo.flash.m_afFlashDoneFlg) {
3025 ALOGD("(%s): [Flash] Flash capture start", __FUNCTION__);
3026 m_ctlInfo.flash.m_flashCnt = IS_FLASH_CAPTURE;
3027 } else {
3028 ALOGD("(%s): [Flash] Flash ON start", __FUNCTION__);
3029 m_ctlInfo.flash.m_flashCnt = IS_FLASH_ON;
3030 }
3031 m_ctlInfo.flash.m_flashTimeOut = 3;
Younghwan Joocaea49e2012-09-07 13:34:20 -07003032 }
3033 }
3034
3035 // TODO : set torch mode for video recording. need to find proper position.
3036 // m_wideAspect is will be changed to recording hint
3037 if ((shot_ext->shot.ctl.flash.flashMode == CAM2_FLASH_MODE_SINGLE) && m_wideAspect) {
3038 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_TORCH;
3039 shot_ext->shot.ctl.flash.firingPower = 10;
3040 m_ctlInfo.flash.m_flashTorchMode = true;
3041 } else if (m_wideAspect){
3042 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_OFF;
3043 shot_ext->shot.ctl.flash.firingPower = 0;
3044 m_ctlInfo.flash.m_flashTorchMode = false;
3045 } else {
3046 if (m_ctlInfo.flash.m_flashTorchMode) {
3047 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_OFF;
3048 shot_ext->shot.ctl.flash.firingPower = 0;
3049 m_ctlInfo.flash.m_flashTorchMode = false;
3050 } else {
3051 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_NOP;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07003052 }
3053 }
3054
Younghwan Joo9257e292012-09-08 21:11:18 -07003055 flashListenerSensor(shot_ext);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07003056 flashSetter(shot_ext);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003057 if (shot_ext->isReprocessing) {
3058 ALOGE("(%s): Reprocess request ", __FUNCTION__);
3059 m_currentReprocessOutStreams = shot_ext->shot.ctl.request.outputStreams[0];
3060 shot_ext->request_scp = 0;
3061 shot_ext->request_scc = 0;
3062 m_reprocessingFrameCnt = shot_ext->shot.ctl.request.frameCount;
3063 memcpy(&m_jpegMetadata, &shot_ext->shot, sizeof(struct camera2_shot));
3064 m_streamThreads[1]->SetSignal(SIGNAL_STREAM_REPROCESSING_START);
3065 }
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07003066 ALOGV("(%s): queued aa(%d) aemode(%d) awb(%d) afmode(%d) trigger(%d)", __FUNCTION__,
3067 (int)(shot_ext->shot.ctl.aa.mode), (int)(shot_ext->shot.ctl.aa.aeMode),
3068 (int)(shot_ext->shot.ctl.aa.awbMode), (int)(shot_ext->shot.ctl.aa.afMode),
3069 (int)(shot_ext->shot.ctl.aa.afTrigger));
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003070
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003071 uint32_t current_scp = shot_ext->request_scp;
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003072
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003073 if (shot_ext->shot.dm.request.frameCount == 0) {
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -07003074 CAM_LOGE("ERR(%s): dm.request.frameCount = %d", __FUNCTION__, shot_ext->shot.dm.request.frameCount);
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003075 }
3076
Sungjoong Kangad378612012-08-17 12:34:33 -07003077 cam_int_qbuf(&(m_camera_info.isp), index);
Sungjoong Kangad378612012-08-17 12:34:33 -07003078
3079 usleep(10000);
Sungjoong Kangad378612012-08-17 12:34:33 -07003080
3081 ALOGV("### isp DQBUF start");
3082 index_isp = cam_int_dqbuf(&(m_camera_info.isp));
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003083
Sungjoong Kangad378612012-08-17 12:34:33 -07003084 shot_ext = (struct camera2_shot_ext *)(m_camera_info.isp.buffer[index_isp].virt.extP[1]);
3085
Younghwan Joo9257e292012-09-08 21:11:18 -07003086 flashListenerISP(shot_ext);
Younghwan Joo9a710a42012-09-05 17:52:08 -07003087
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003088 ALOGV("### Isp DQbuf done(%d) count (%d), SCP(%d) SCC(%d) dis_bypass(%d) shot_size(%d)",
Sungjoong Kangad378612012-08-17 12:34:33 -07003089 index,
3090 shot_ext->shot.ctl.request.frameCount,
3091 shot_ext->request_scp,
3092 shot_ext->request_scc,
3093 shot_ext->dis_bypass, sizeof(camera2_shot));
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003094 ALOGV("(%s): DM aa(%d) aemode(%d) awb(%d) afmode(%d)", __FUNCTION__,
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07003095 (int)(shot_ext->shot.dm.aa.mode), (int)(shot_ext->shot.dm.aa.aeMode),
3096 (int)(shot_ext->shot.dm.aa.awbMode),
3097 (int)(shot_ext->shot.dm.aa.afMode));
Sungjoong Kangad378612012-08-17 12:34:33 -07003098
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003099 m_currentOutputStreams = shot_ext->shot.ctl.request.outputStreams[0];
Jiyoung Shin2adfa422012-09-10 23:14:54 +09003100
3101 if (current_scp) {
3102 ALOGV("send SIGNAL_STREAM_DATA_COMING(return scp : %d)", shot_ext->request_scp);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003103 m_scpOutputSignalCnt++;
Sungjoong Kangad378612012-08-17 12:34:33 -07003104 m_streamThreads[0]->SetSignal(SIGNAL_STREAM_DATA_COMING);
3105 }
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003106
3107 if (current_scp != shot_ext->request_scp) {
hyeonmyeong Choi4aa4d732012-09-10 11:53:49 -07003108 CAM_LOGW("WARN(%s): scp frame drop1 request_scp(%d to %d)",
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003109 __FUNCTION__, current_scp, shot_ext->request_scp);
3110 }
Sungjoong Kang15fd8232012-08-23 16:16:44 -07003111 if (shot_ext->request_scc) {
Sungjoong Kanga15b4e32012-08-28 12:55:39 -07003112 memcpy(&m_jpegMetadata, &shot_ext->shot, sizeof(struct camera2_shot));
Sungjoong Kang15fd8232012-08-23 16:16:44 -07003113 m_streamThreads[1]->SetSignal(SIGNAL_STREAM_DATA_COMING);
3114 }
Sungjoong Kangad378612012-08-17 12:34:33 -07003115
3116 ALOGV("(%s): SCP_CLOSING check sensor(%d) scc(%d) scp(%d) ", __FUNCTION__,
3117 shot_ext->request_sensor, shot_ext->request_scc, shot_ext->request_scp);
3118 if (shot_ext->request_scc + shot_ext->request_scp + shot_ext->request_sensor == 0) {
3119 ALOGV("(%s): SCP_CLOSING check OK ", __FUNCTION__);
3120 m_scp_closed = true;
3121 }
3122 else
3123 m_scp_closed = false;
3124
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -07003125 if (!shot_ext->fd_bypass) {
3126 /* FD orientation axis transformation */
3127 for (int i=0; i < CAMERA2_MAX_FACES; i++) {
3128 if (shot_ext->shot.dm.stats.faceRectangles[i][0] > 0)
3129 shot_ext->shot.dm.stats.faceRectangles[i][0] = (m_camera2->m_curCameraInfo->sensorW
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003130 * shot_ext->shot.dm.stats.faceRectangles[i][0])
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003131 / m_streamThreads[0].get()->m_parameters.width;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -07003132 if (shot_ext->shot.dm.stats.faceRectangles[i][1] > 0)
3133 shot_ext->shot.dm.stats.faceRectangles[i][1] = (m_camera2->m_curCameraInfo->sensorH
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003134 * shot_ext->shot.dm.stats.faceRectangles[i][1])
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003135 / m_streamThreads[0].get()->m_parameters.height;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -07003136 if (shot_ext->shot.dm.stats.faceRectangles[i][2] > 0)
3137 shot_ext->shot.dm.stats.faceRectangles[i][2] = (m_camera2->m_curCameraInfo->sensorW
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003138 * shot_ext->shot.dm.stats.faceRectangles[i][2])
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003139 / m_streamThreads[0].get()->m_parameters.width;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -07003140 if (shot_ext->shot.dm.stats.faceRectangles[i][3] > 0)
3141 shot_ext->shot.dm.stats.faceRectangles[i][3] = (m_camera2->m_curCameraInfo->sensorH
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003142 * shot_ext->shot.dm.stats.faceRectangles[i][3])
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003143 / m_streamThreads[0].get()->m_parameters.height;
Sungjoong Kangfd2d78a2012-08-26 17:44:25 -07003144 }
3145 }
Younghwan Joo9a710a42012-09-05 17:52:08 -07003146 if (m_nightCaptureCnt == 0 && m_ctlInfo.flash.m_flashCnt == 0) {
Sungjoong Kanga15b4e32012-08-28 12:55:39 -07003147 m_requestManager->ApplyDynamicMetadata(shot_ext);
3148 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07003149 OnAfNotification(shot_ext->shot.dm.aa.afState);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003150 }
Sungjoong Kangad378612012-08-17 12:34:33 -07003151
Sungjoong Kang52f54302012-09-04 21:43:06 +09003152 index = m_requestManager->popSensorQ();
3153 if(index < 0){
3154 ALOGE("sensorQ is empty");
3155 return;
3156 }
3157
Sungjoong Kang0f26b202012-08-17 15:43:12 -07003158 processingReqIndex = m_requestManager->MarkProcessingRequest(&(m_camera_info.sensor.buffer[index]), &afMode);
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003159 if (processingReqIndex != -1)
Sungjoong Kang0f26b202012-08-17 15:43:12 -07003160 SetAfMode((enum aa_afmode)afMode);
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003161
Sungjoong Kangad378612012-08-17 12:34:33 -07003162
3163 shot_ext = (struct camera2_shot_ext *)(m_camera_info.sensor.buffer[index].virt.extP[1]);
3164 if (m_scp_closing || m_scp_closed) {
3165 ALOGD("(%s): SCP_CLOSING(%d) SCP_CLOSED(%d)", __FUNCTION__, m_scp_closing, m_scp_closed);
3166 shot_ext->request_scc = 0;
3167 shot_ext->request_scp = 0;
3168 shot_ext->request_sensor = 0;
3169 }
Sungjoong Kangad378612012-08-17 12:34:33 -07003170 cam_int_qbuf(&(m_camera_info.sensor), index);
Sungjoong Kang52f54302012-09-04 21:43:06 +09003171 ALOGV("Sensor Qbuf done(%d)", index);
Sungjoong Kangad378612012-08-17 12:34:33 -07003172
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003173 if (!m_scp_closing
3174 && ((matchedFrameCnt == -1) || (processingReqIndex == -1))){
Younghwan Jooda7ca692012-09-03 20:47:21 -07003175 ALOGV("make bubble shot: matchedFramcnt(%d) processingReqIndex(%d)",
Sungjoong Kangef6f83c2012-08-28 22:59:48 +09003176 matchedFrameCnt, processingReqIndex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003177 selfThread->SetSignal(SIGNAL_SENSOR_START_REQ_PROCESSING);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003178 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09003179 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003180 return;
3181}
3182
Sungjoong Kang86646da2012-08-28 17:29:11 +09003183void ExynosCameraHWInterface2::m_streamBufferInit(SignalDrivenThread *self)
3184{
3185 uint32_t currentSignal = self->GetProcessingSignal();
3186 StreamThread * selfThread = ((StreamThread*)self);
3187 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003188 node_info_t *currentNode = selfStreamParms->node;
3189 substream_parameters_t *subParms;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003190 buffer_handle_t * buf = NULL;
3191 status_t res;
3192 void *virtAddr[3];
3193 int i, j;
3194 int index;
3195 nsecs_t timestamp;
3196
3197 if (!(selfThread->m_isBufferInit))
3198 {
3199 for ( i=0 ; i < selfStreamParms->numSvcBuffers; i++) {
3200 res = selfStreamParms->streamOps->dequeue_buffer(selfStreamParms->streamOps, &buf);
3201 if (res != NO_ERROR || buf == NULL) {
3202 ALOGE("ERR(%s): Init: unable to dequeue buffer : %d",__FUNCTION__ , res);
3203 return;
3204 }
3205 ALOGV("DEBUG(%s): got buf(%x) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
3206 ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
3207
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003208 index = selfThread->findBufferIndex(buf);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003209 if (index == -1) {
3210 ALOGE("ERR(%s): could not find buffer index", __FUNCTION__);
3211 }
3212 else {
3213 ALOGV("DEBUG(%s): found buffer index[%d] - status(%d)",
3214 __FUNCTION__, index, selfStreamParms->svcBufStatus[index]);
3215 if (selfStreamParms->svcBufStatus[index]== REQUIRES_DQ_FROM_SVC)
3216 selfStreamParms->svcBufStatus[index] = ON_DRIVER;
3217 else if (selfStreamParms->svcBufStatus[index]== ON_SERVICE)
3218 selfStreamParms->svcBufStatus[index] = ON_HAL;
3219 else {
3220 ALOGV("DBG(%s): buffer status abnormal (%d) "
3221 , __FUNCTION__, selfStreamParms->svcBufStatus[index]);
3222 }
3223 selfStreamParms->numSvcBufsInHal++;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003224 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003225 selfStreamParms->bufIndex = 0;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003226 }
3227 selfThread->m_isBufferInit = true;
3228 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003229 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3230 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3231 continue;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003232
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003233 subParms = &m_subStreams[selfThread->m_attachedSubStreams[i].streamId];
3234 if (subParms->type && subParms->needBufferInit) {
3235 ALOGV("(%s): [subStream] (id:%d) Buffer Initialization numsvcbuf(%d)",
3236 __FUNCTION__, selfThread->m_attachedSubStreams[i].streamId, subParms->numSvcBuffers);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003237 int checkingIndex = 0;
3238 bool found = false;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003239 for ( i = 0 ; i < subParms->numSvcBuffers; i++) {
3240 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003241 if (res != NO_ERROR || buf == NULL) {
3242 ALOGE("ERR(%s): Init: unable to dequeue buffer : %d",__FUNCTION__ , res);
3243 return;
3244 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003245 subParms->numSvcBufsInHal++;
3246 ALOGV("DEBUG(%s): [subStream] got buf(%x) bufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
3247 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003248
3249 if (m_grallocHal->lock(m_grallocHal, *buf,
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003250 subParms->usage, 0, 0,
3251 subParms->width, subParms->height, virtAddr) != 0) {
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003252 ALOGE("ERR(%s): could not obtain gralloc buffer", __FUNCTION__);
3253 }
3254 else {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003255 ALOGV("DEBUG(%s): [subStream] locked img buf plane0(%x) plane1(%x) plane2(%x)",
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003256 __FUNCTION__, (unsigned int)virtAddr[0], (unsigned int)virtAddr[1], (unsigned int)virtAddr[2]);
3257 }
3258 found = false;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003259 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
3260 if (subParms->svcBufHandle[checkingIndex] == *buf ) {
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003261 found = true;
3262 break;
3263 }
3264 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003265 ALOGV("DEBUG(%s): [subStream] found(%d) - index[%d]", __FUNCTION__, found, checkingIndex);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003266 if (!found) break;
3267
3268 index = checkingIndex;
3269
3270 if (index == -1) {
3271 ALOGV("ERR(%s): could not find buffer index", __FUNCTION__);
3272 }
3273 else {
3274 ALOGV("DEBUG(%s): found buffer index[%d] - status(%d)",
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003275 __FUNCTION__, index, subParms->svcBufStatus[index]);
3276 if (subParms->svcBufStatus[index]== ON_SERVICE)
3277 subParms->svcBufStatus[index] = ON_HAL;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003278 else {
3279 ALOGV("DBG(%s): buffer status abnormal (%d) "
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003280 , __FUNCTION__, subParms->svcBufStatus[index]);
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003281 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003282 if (*buf != subParms->svcBufHandle[index])
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003283 ALOGV("DBG(%s): different buf_handle index ", __FUNCTION__);
3284 else
3285 ALOGV("DEBUG(%s): same buf_handle index", __FUNCTION__);
3286 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003287 subParms->svcBufIndex = 0;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003288 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003289 if (subParms->type == SUBSTREAM_TYPE_JPEG) {
3290 m_resizeBuf.size.extS[0] = ALIGN(subParms->width, 16) * ALIGN(subParms->height, 16) * 2;
3291 m_resizeBuf.size.extS[1] = 0;
3292 m_resizeBuf.size.extS[2] = 0;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003293
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003294 if (allocCameraMemory(m_ionCameraClient, &m_resizeBuf, 1) == -1) {
3295 ALOGE("ERR(%s): Failed to allocate resize buf", __FUNCTION__);
3296 }
3297 }
3298 if (subParms->type == SUBSTREAM_TYPE_PRVCB) {
3299 m_getAlignedYUVSize(HAL_PIXEL_FORMAT_2_V4L2_PIX(subParms->internalFormat), subParms->width,
3300 subParms->height, &m_previewCbBuf);
3301
3302 if (allocCameraMemory(m_ionCameraClient, &m_previewCbBuf, subParms->internalPlanes) == -1) {
3303 ALOGE("ERR(%s): Failed to allocate prvcb buf", __FUNCTION__);
3304 }
3305 }
3306 subParms->needBufferInit= false;
3307 }
3308 }
Sungjoong Kang86646da2012-08-28 17:29:11 +09003309}
3310
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003311void ExynosCameraHWInterface2::m_streamThreadInitialize(SignalDrivenThread * self)
3312{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003313 StreamThread * selfThread = ((StreamThread*)self);
3314 ALOGV("DEBUG(%s): ", __FUNCTION__ );
3315 memset(&(selfThread->m_parameters), 0, sizeof(stream_parameters_t));
3316 selfThread->m_isBufferInit = false;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003317 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3318 selfThread->m_attachedSubStreams[i].streamId = -1;
3319 selfThread->m_attachedSubStreams[i].priority = 0;
3320 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003321 return;
3322}
3323
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003324int ExynosCameraHWInterface2::m_runSubStreamFunc(StreamThread *selfThread, ExynosBuffer *srcImageBuf,
3325 int stream_id, nsecs_t frameTimeStamp)
3326{
3327 substream_parameters_t *subParms = &m_subStreams[stream_id];
3328
3329 switch (stream_id) {
3330
3331 case STREAM_ID_JPEG:
3332 return m_jpegCreator(selfThread, srcImageBuf, frameTimeStamp);
3333
3334 case STREAM_ID_RECORD:
3335 return m_recordCreator(selfThread, srcImageBuf, frameTimeStamp);
3336
3337 case STREAM_ID_PRVCB:
3338 return m_prvcbCreator(selfThread, srcImageBuf, frameTimeStamp);
3339
3340 default:
3341 return 0;
3342 }
3343}
3344void ExynosCameraHWInterface2::m_streamFunc_direct(SignalDrivenThread *self)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003345{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003346 uint32_t currentSignal = self->GetProcessingSignal();
3347 StreamThread * selfThread = ((StreamThread*)self);
3348 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003349 node_info_t *currentNode = selfStreamParms->node;
3350 int i = 0;
3351 nsecs_t frameTimeStamp;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003352
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003353 if (currentSignal & SIGNAL_THREAD_RELEASE) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003354 CAM_LOGD("(%s): [%d] START SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003355
3356 if (selfThread->m_isBufferInit) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003357 ALOGV("(%s): [%d] calling streamoff (fd:%d)", __FUNCTION__,
3358 selfThread->m_index, currentNode->fd);
3359 if (cam_int_streamoff(currentNode) < 0 ) {
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003360 ALOGE("ERR(%s): stream off fail", __FUNCTION__);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003361 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003362 ALOGV("(%s): [%d] streamoff done and calling reqbuf 0 (fd:%d)", __FUNCTION__,
3363 selfThread->m_index, currentNode->fd);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003364 currentNode->buffers = 0;
3365 cam_int_reqbufs(currentNode);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003366 ALOGV("(%s): [%d] reqbuf 0 DONE (fd:%d)", __FUNCTION__,
3367 selfThread->m_index, currentNode->fd);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003368 }
3369#ifdef ENABLE_FRAME_SYNC
3370 // free metabuffers
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003371 for (i = 0; i < NUM_MAX_CAMERA_BUFFERS; i++)
3372 if (selfStreamParms->metaBuffers[i].fd.extFd[0] != 0) {
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003373 freeCameraMemory(&(selfStreamParms->metaBuffers[i]), 1);
3374 selfStreamParms->metaBuffers[i].fd.extFd[0] = 0;
3375 selfStreamParms->metaBuffers[i].size.extS[0] = 0;
3376 }
3377#endif
3378 selfThread->m_isBufferInit = false;
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003379 selfThread->m_releasing = false;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003380 selfThread->m_activated = false;
3381 ALOGV("(%s): [%d] END SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
3382 return;
3383 }
3384 if (currentSignal & SIGNAL_STREAM_REPROCESSING_START) {
3385 status_t res;
3386 buffer_handle_t * buf = NULL;
3387 bool found = false;
3388 ALOGV("(%s): streamthread[%d] START SIGNAL_STREAM_REPROCESSING_START",
3389 __FUNCTION__, selfThread->m_index);
3390 res = m_reprocessOps->acquire_buffer(m_reprocessOps, &buf);
3391 if (res != NO_ERROR || buf == NULL) {
3392 ALOGE("ERR(%s): [reprocess] unable to acquire_buffer : %d",__FUNCTION__ , res);
3393 return;
3394 }
3395 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
3396 int checkingIndex = 0;
3397 for (checkingIndex = 0; checkingIndex < selfStreamParms->numSvcBuffers ; checkingIndex++) {
3398 if (priv_handle->fd == selfStreamParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
3399 found = true;
3400 break;
3401 }
3402 }
3403 ALOGV("DEBUG(%s): dequeued buf %x => found(%d) index(%d) ",
3404 __FUNCTION__, (unsigned int)buf, found, checkingIndex);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003405
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003406 if (!found) return;
3407
3408 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3409 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3410 continue;
3411
3412#ifdef ENABLE_FRAME_SYNC
3413 // TODO: check real timestamp
3414 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex());
3415 m_requestManager->NotifyStreamOutput(m_reprocessingFrameCnt);
3416#else
3417 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex());
3418#endif
3419 if (m_currentReprocessOutStreams & (1<<selfThread->m_attachedSubStreams[i].streamId))
3420 m_runSubStreamFunc(selfThread, &(selfStreamParms->svcBuffers[checkingIndex]),
3421 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
3422 }
3423
3424 res = m_reprocessOps->release_buffer(m_reprocessOps, buf);
3425 if (res != NO_ERROR) {
3426 ALOGE("ERR(%s): [reprocess] unable to release_buffer : %d",__FUNCTION__ , res);
3427 return;
3428 }
3429 ALOGV("(%s): streamthread[%d] END SIGNAL_STREAM_REPROCESSING_START",
3430 __FUNCTION__,selfThread->m_index);
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003431
3432 return;
3433 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003434 if (currentSignal & SIGNAL_STREAM_DATA_COMING) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003435 buffer_handle_t * buf = NULL;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003436 status_t res = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003437 int i, j;
3438 int index;
Sungjoong Kangad378612012-08-17 12:34:33 -07003439 nsecs_t timestamp;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003440#ifdef ENABLE_FRAME_SYNC
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003441 camera2_stream *frame;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003442#endif
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003443 int numOfUndqbuf = 0;
3444 bool again = false;
3445
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003446 ALOGV("(%s): streamthread[%d] START SIGNAL_STREAM_DATA_COMING", __FUNCTION__,selfThread->m_index);
Sungjoong Kangad378612012-08-17 12:34:33 -07003447
Sungjoong Kang86646da2012-08-28 17:29:11 +09003448 m_streamBufferInit(self);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003449
Sungjoong Kangb5237e62012-07-27 07:39:05 -07003450 do {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003451 ALOGV("DEBUG(%s): streamthread[%d] type(%d) DQBUF START ",__FUNCTION__,
3452 selfThread->m_index, selfThread->streamType);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003453
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003454#ifdef ENABLE_FRAME_SYNC
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003455 selfStreamParms->bufIndex = cam_int_dqbuf(currentNode, selfStreamParms->planes + selfStreamParms->metaPlanes);
3456 frame = (struct camera2_stream *)(selfStreamParms->metaBuffers[selfStreamParms->bufIndex].virt.extP[0]);
3457 ALOGV("frame count streamthread[%d] : %d", selfThread->m_index, frame->rcount);
3458 frameTimeStamp = m_requestManager->GetTimestampByFrameCnt(frame->rcount);
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003459#else
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003460 selfStreamParms->bufIndex = cam_int_dqbuf(currentNode);
3461 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex())
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003462#endif
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003463 ALOGV("DEBUG(%s): streamthread[%d] DQBUF done index(%d) sigcnt(%d)",__FUNCTION__,
3464 selfThread->m_index, selfStreamParms->bufIndex, m_scpOutputSignalCnt);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003465
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003466 if (selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] != ON_DRIVER)
Sungjoong Kang86646da2012-08-28 17:29:11 +09003467 ALOGV("DBG(%s): DQed buffer status abnormal (%d) ",
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003468 __FUNCTION__, selfStreamParms->svcBufStatus[selfStreamParms->bufIndex]);
3469 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_HAL;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003470
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003471 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3472 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3473 continue;
3474 if (m_currentOutputStreams & (1<<selfThread->m_attachedSubStreams[i].streamId)) {
3475#ifdef ENABLE_FRAME_SYNC
3476 m_requestManager->NotifyStreamOutput(frame->rcount);
3477#endif
3478 m_runSubStreamFunc(selfThread, &(selfStreamParms->svcBuffers[selfStreamParms->bufIndex]),
3479 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07003480 }
Sungjoong Kangb5237e62012-07-27 07:39:05 -07003481 }
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003482
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003483#ifdef ENABLE_FRAME_SYNC
3484 m_requestManager->NotifyStreamOutput(frame->rcount);
3485#endif
3486 if (m_requestManager->GetSkipCnt() <= 0) {
3487 if ((m_currentOutputStreams & STREAM_MASK_PREVIEW) && selfThread->m_index == 0) {
3488#ifdef ENABLE_FRAME_SYNC
3489 ALOGV("** Display Preview(frameCnt:%d)", frame->rcount);
3490#else
3491 ALOGV("** Display Preview(frameCnt:%d)", m_requestManager->GetFrameIndex());
3492#endif
3493 res = selfStreamParms->streamOps->enqueue_buffer(selfStreamParms->streamOps,
3494 frameTimeStamp,
3495 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003496 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003497 else if ((m_currentOutputStreams & STREAM_MASK_ZSL) && selfThread->m_index == 1) {
3498#ifdef ENABLE_FRAME_SYNC
3499 ALOGV("** SCC output (frameCnt:%d), last(%d)", frame->rcount);
3500#else
3501 ALOGV("** SCC output (frameCnt:%d), last(%d)", m_requestManager->GetFrameIndex());
3502#endif
3503 res = selfStreamParms->streamOps->enqueue_buffer(selfStreamParms->streamOps,
3504 frameTimeStamp,
3505 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07003506 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003507 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer to svc done res(%d)", __FUNCTION__, selfThread->m_index, res);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003508 }
3509 else {
3510 res = selfStreamParms->streamOps->cancel_buffer(selfStreamParms->streamOps,
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003511 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
3512 ALOGV("DEBUG(%s): streamthread[%d] cancel_buffer to svc done res(%d)", __FUNCTION__, selfThread->m_index, res);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003513 }
3514 if (res == 0) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003515 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_SERVICE;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003516 selfStreamParms->numSvcBufsInHal--;
3517 }
3518 else {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003519 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_HAL;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003520 }
3521
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003522 // HACK
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003523// if (again == false && !(m_recordOutput && m_recordingEnabled)) {
3524 if (again == false) {
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003525 if (exynos_v4l2_g_ctrl(currentNode->fd, V4L2_CID_IS_G_COMPLETES, &numOfUndqbuf)) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003526 CAM_LOGW("WARN(%s): Fail to get Scaler completes, val = %d, fd=%d", __FUNCTION__, numOfUndqbuf, currentNode->fd);
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003527 } else {
3528 again = (numOfUndqbuf > 0)?true:false;
3529 if (again)
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003530 CAM_LOGW("WARN(%s): Drain Scaler buf, num of undqbuf = %d", __FUNCTION__, numOfUndqbuf);
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003531 }
3532 } else {
3533 again = false;
3534 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003535 }
hyeonmyeong Choic0b6e172012-09-05 00:51:31 -07003536 while(again);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07003537
Sungjoong Kangb55ed662012-08-31 21:31:34 -07003538 while (selfStreamParms->numSvcBufsInHal < selfStreamParms->numOwnSvcBuffers - 1) {
Sungjoong Kang86646da2012-08-28 17:29:11 +09003539 res = selfStreamParms->streamOps->dequeue_buffer(selfStreamParms->streamOps, &buf);
3540 if (res != NO_ERROR || buf == NULL) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003541 ALOGV("DEBUG(%s): streamthread[%d] dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003542 break;
3543 }
3544 selfStreamParms->numSvcBufsInHal++;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003545 ALOGV("DEBUG(%s): streamthread[%d] got buf(%x) numInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__,
Sungjoong Kang86646da2012-08-28 17:29:11 +09003546 selfThread->m_index, (uint32_t)(*buf), selfStreamParms->numSvcBufsInHal,
3547 ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
3548 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
3549
3550 bool found = false;
3551 int checkingIndex = 0;
3552 for (checkingIndex = 0; checkingIndex < selfStreamParms->numSvcBuffers ; checkingIndex++) {
3553 if (priv_handle->fd == selfStreamParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
3554 found = true;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09003555 break;
3556 }
Sungjoong Kang86646da2012-08-28 17:29:11 +09003557 }
Sungjoong Kang86646da2012-08-28 17:29:11 +09003558 if (!found) break;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003559 selfStreamParms->bufIndex = checkingIndex;
3560 if (selfStreamParms->bufIndex < selfStreamParms->numHwBuffers) {
Sungjoong Kang86646da2012-08-28 17:29:11 +09003561 uint32_t plane_index = 0;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003562 ExynosBuffer* currentBuf = &(selfStreamParms->svcBuffers[selfStreamParms->bufIndex]);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003563 struct v4l2_buffer v4l2_buf;
3564 struct v4l2_plane planes[VIDEO_MAX_PLANES];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003565
Sungjoong Kang86646da2012-08-28 17:29:11 +09003566 v4l2_buf.m.planes = planes;
3567 v4l2_buf.type = currentNode->type;
3568 v4l2_buf.memory = currentNode->memory;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003569 v4l2_buf.index = selfStreamParms->bufIndex;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003570 v4l2_buf.length = currentNode->planes;
3571
3572 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
3573 v4l2_buf.m.planes[2].m.fd = priv_handle->fd1;
3574 v4l2_buf.m.planes[1].m.fd = priv_handle->fd2;
3575 for (plane_index=0 ; plane_index < v4l2_buf.length ; plane_index++) {
3576 v4l2_buf.m.planes[plane_index].length = currentBuf->size.extS[plane_index];
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09003577 }
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003578#ifdef ENABLE_FRAME_SYNC
3579 /* add plane for metadata*/
3580 v4l2_buf.length += selfStreamParms->metaPlanes;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003581 v4l2_buf.m.planes[v4l2_buf.length-1].m.fd = selfStreamParms->metaBuffers[selfStreamParms->bufIndex].fd.extFd[0];
3582 v4l2_buf.m.planes[v4l2_buf.length-1].length = selfStreamParms->metaBuffers[selfStreamParms->bufIndex].size.extS[0];
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003583#endif
Sungjoong Kang86646da2012-08-28 17:29:11 +09003584 if (exynos_v4l2_qbuf(currentNode->fd, &v4l2_buf) < 0) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003585 ALOGE("ERR(%s): streamthread[%d] exynos_v4l2_qbuf() fail",
Sungjoong Kang86646da2012-08-28 17:29:11 +09003586 __FUNCTION__, selfThread->m_index);
3587 return;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09003588 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003589 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_DRIVER;
3590 ALOGV("DEBUG(%s): streamthread[%d] QBUF done index(%d)",
3591 __FUNCTION__, selfThread->m_index, selfStreamParms->bufIndex);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09003592 }
3593 }
Sungjoong Kangbe494d12012-08-04 15:36:56 -07003594
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003595 ALOGV("(%s): streamthread[%d] END SIGNAL_STREAM_DATA_COMING", __FUNCTION__,selfThread->m_index);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003596 }
Sungjoong Kang86646da2012-08-28 17:29:11 +09003597 return;
3598}
3599
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003600void ExynosCameraHWInterface2::m_streamFunc_indirect(SignalDrivenThread *self)
Sungjoong Kang86646da2012-08-28 17:29:11 +09003601{
3602 uint32_t currentSignal = self->GetProcessingSignal();
3603 StreamThread * selfThread = ((StreamThread*)self);
3604 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003605 node_info_t *currentNode = selfStreamParms->node;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003606
Sungjoong Kang86646da2012-08-28 17:29:11 +09003607
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003608 if (currentSignal & SIGNAL_THREAD_RELEASE) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003609 CAM_LOGV("(%s): [%d] START SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003610
3611 if (selfThread->m_isBufferInit) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003612 if (currentNode->fd == m_camera_info.capture.fd) {
3613 if (m_camera_info.capture.status == true) {
3614 ALOGV("DEBUG(%s): calling streamthread[%d] streamoff (fd:%d)", __FUNCTION__,
3615 selfThread->m_index, currentNode->fd);
3616 if (cam_int_streamoff(currentNode) < 0 ){
3617 ALOGE("ERR(%s): stream off fail", __FUNCTION__);
3618 } else {
3619 m_camera_info.capture.status = false;
3620 }
3621 }
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003622 } else {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003623 ALOGV("DEBUG(%s): calling streamthread[%d] streamoff (fd:%d)", __FUNCTION__,
3624 selfThread->m_index, currentNode->fd);
3625 if (cam_int_streamoff(currentNode) < 0 ){
3626 ALOGE("ERR(%s): stream off fail", __FUNCTION__);
3627 }
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003628 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003629 ALOGV("DEBUG(%s): calling streamthread[%d] streamoff done", __FUNCTION__, selfThread->m_index);
3630 ALOGV("DEBUG(%s): calling streamthread[%d] reqbuf 0 (fd:%d)", __FUNCTION__,
3631 selfThread->m_index, currentNode->fd);
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003632 currentNode->buffers = 0;
3633 cam_int_reqbufs(currentNode);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003634 ALOGV("DEBUG(%s): calling streamthread[%d] reqbuf 0 DONE(fd:%d)", __FUNCTION__,
3635 selfThread->m_index, currentNode->fd);
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003636 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003637
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003638 selfThread->m_isBufferInit = false;
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003639 selfThread->m_releasing = false;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003640 selfThread->m_activated = false;
3641 ALOGV("(%s): [%d] END SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07003642 return;
3643 }
3644
Sungjoong Kang86646da2012-08-28 17:29:11 +09003645 if (currentSignal & SIGNAL_STREAM_DATA_COMING) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003646#ifdef ENABLE_FRAME_SYNC
Jiyoung Shin2adfa422012-09-10 23:14:54 +09003647 camera2_stream *frame;
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003648#endif
3649 nsecs_t frameTimeStamp;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003650
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003651 ALOGV("DEBUG(%s): streamthread[%d] processing SIGNAL_STREAM_DATA_COMING",
Sungjoong Kang86646da2012-08-28 17:29:11 +09003652 __FUNCTION__,selfThread->m_index);
3653
3654 m_streamBufferInit(self);
3655
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003656 ALOGD("DEBUG(%s): streamthread[%d] DQBUF START", __FUNCTION__, selfThread->m_index);
3657 selfStreamParms->bufIndex = cam_int_dqbuf(currentNode);
3658 ALOGD("DEBUG(%s): streamthread[%d] DQBUF done index(%d)",__FUNCTION__,
3659 selfThread->m_index, selfStreamParms->bufIndex);
Jiyoung Shin2adfa422012-09-10 23:14:54 +09003660
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003661#ifdef ENABLE_FRAME_SYNC
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003662 frame = (struct camera2_stream *)(currentNode->buffer[selfStreamParms->bufIndex].virt.extP[selfStreamParms->planes -1]);
3663 ALOGV("frame count(SCC) : %d", frame->rcount);
3664 frameTimeStamp = m_requestManager->GetTimestampByFrameCnt(frame->rcount);
3665#else
3666 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex());
Sungjoong Kangfeb7df42012-08-28 23:35:43 +09003667#endif
Sungjoong Kang86646da2012-08-28 17:29:11 +09003668
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003669 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3670 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3671 continue;
3672 if (m_currentOutputStreams & (1<<selfThread->m_attachedSubStreams[i].streamId)) {
3673#ifdef ENABLE_FRAME_SYNC
3674 m_requestManager->NotifyStreamOutput(frame->rcount);
3675#endif
3676 m_runSubStreamFunc(selfThread, &(currentNode->buffer[selfStreamParms->bufIndex]),
3677 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003678 }
3679 }
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003680 cam_int_qbuf(currentNode, selfStreamParms->bufIndex);
3681 ALOGV("DEBUG(%s): streamthread[%d] QBUF DONE", __FUNCTION__, selfThread->m_index);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003682
Sungjoong Kang86646da2012-08-28 17:29:11 +09003683
Sungjoong Kang86646da2012-08-28 17:29:11 +09003684
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003685 ALOGV("DEBUG(%s): streamthread[%d] processing SIGNAL_STREAM_DATA_COMING DONE",
3686 __FUNCTION__, selfThread->m_index);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003687 }
3688
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003689
Sungjoong Kang86646da2012-08-28 17:29:11 +09003690 return;
3691}
3692
Sungjoong Kang86646da2012-08-28 17:29:11 +09003693void ExynosCameraHWInterface2::m_streamThreadFunc(SignalDrivenThread * self)
3694{
3695 uint32_t currentSignal = self->GetProcessingSignal();
3696 StreamThread * selfThread = ((StreamThread*)self);
3697 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003698 node_info_t *currentNode = selfStreamParms->node;
Sungjoong Kang86646da2012-08-28 17:29:11 +09003699
3700 ALOGV("DEBUG(%s): m_streamThreadFunc[%d] (%x)", __FUNCTION__, selfThread->m_index, currentSignal);
3701
Sungjoong Kang86646da2012-08-28 17:29:11 +09003702 // Do something in Child thread handler
3703 // Should change function to class that inherited StreamThread class to support dynamic stream allocation
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003704 if (selfThread->streamType == STREAM_TYPE_DIRECT) {
3705 m_streamFunc_direct(self);
3706 } else if (selfThread->streamType == STREAM_TYPE_INDIRECT) {
3707 m_streamFunc_indirect(self);
Sungjoong Kang86646da2012-08-28 17:29:11 +09003708 }
3709
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07003710 return;
3711}
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07003712int ExynosCameraHWInterface2::m_jpegCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp)
3713{
3714 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
3715 substream_parameters_t *subParms = &m_subStreams[STREAM_ID_JPEG];
3716 status_t res;
3717 ExynosRect jpegRect;
3718 bool found = false;
3719 int pictureW, pictureH, pictureFramesize = 0;
3720 int pictureFormat;
3721 int cropX, cropY, cropW, cropH = 0;
3722 ExynosBuffer resizeBufInfo;
3723 ExynosRect m_jpegPictureRect;
3724 buffer_handle_t * buf = NULL;
3725
3726 ALOGV("DEBUG(%s): index(%d)",__FUNCTION__, subParms->svcBufIndex);
3727 for (int i = 0 ; subParms->numSvcBuffers ; i++) {
3728 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_HAL) {
3729 found = true;
3730 break;
3731 }
3732 subParms->svcBufIndex++;
3733 if (subParms->svcBufIndex >= subParms->numSvcBuffers)
3734 subParms->svcBufIndex = 0;
3735 }
3736 if (!found) {
3737 ALOGE("(%s): cannot find free svc buffer", __FUNCTION__);
3738 subParms->svcBufIndex++;
3739 return 1;
3740 }
3741
3742 m_jpegPictureRect.w = subParms->width;
3743 m_jpegPictureRect.h = subParms->height;
3744
3745 ALOGV("DEBUG(%s):w = %d, h = %d, w = %d, h = %d",
3746 __FUNCTION__, selfStreamParms->width, selfStreamParms->height,
3747 m_jpegPictureRect.w, m_jpegPictureRect.h);
3748
3749 m_getRatioSize(selfStreamParms->width, selfStreamParms->height,
3750 m_jpegPictureRect.w, m_jpegPictureRect.h,
3751 &cropX, &cropY,
3752 &pictureW, &pictureH,
3753 0);
3754 pictureFormat = V4L2_PIX_FMT_YUYV;
3755 pictureFramesize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat), pictureW, pictureH);
3756
3757 if (m_exynosPictureCSC) {
3758 float zoom_w = 0, zoom_h = 0;
3759 if (m_zoomRatio == 0)
3760 m_zoomRatio = 1;
3761
3762 if (m_jpegPictureRect.w >= m_jpegPictureRect.h) {
3763 zoom_w = pictureW / m_zoomRatio;
3764 zoom_h = zoom_w * m_jpegPictureRect.h / m_jpegPictureRect.w;
3765 } else {
3766 zoom_h = pictureH / m_zoomRatio;
3767 zoom_w = zoom_h * m_jpegPictureRect.w / m_jpegPictureRect.h;
3768 }
3769 cropX = (pictureW - zoom_w) / 2;
3770 cropY = (pictureH - zoom_h) / 2;
3771 cropW = zoom_w;
3772 cropH = zoom_h;
3773
3774 ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d",
3775 __FUNCTION__, cropX, cropY, cropW, cropH);
3776
3777 csc_set_src_format(m_exynosPictureCSC,
3778 ALIGN(pictureW, 16), ALIGN(pictureH, 16),
3779 cropX, cropY, cropW, cropH,
3780 V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat),
3781 0);
3782
3783 csc_set_dst_format(m_exynosPictureCSC,
3784 m_jpegPictureRect.w, m_jpegPictureRect.h,
3785 0, 0, m_jpegPictureRect.w, m_jpegPictureRect.h,
3786 V4L2_PIX_2_HAL_PIXEL_FORMAT(V4L2_PIX_FMT_NV16),
3787 0);
3788 for (int i = 0 ; i < 3 ; i++)
3789 ALOGV("DEBUG(%s): m_pictureBuf.fd.extFd[%d]=%d ",
3790 __FUNCTION__, i, srcImageBuf->fd.extFd[i]);
3791 csc_set_src_buffer(m_exynosPictureCSC,
3792 (void **)&srcImageBuf->fd.fd);
3793
3794 csc_set_dst_buffer(m_exynosPictureCSC,
3795 (void **)&m_resizeBuf.fd.fd);
3796 for (int i = 0 ; i < 3 ; i++)
3797 ALOGV("DEBUG(%s): m_resizeBuf.virt.extP[%d]=%d m_resizeBuf.size.extS[%d]=%d",
3798 __FUNCTION__, i, m_resizeBuf.fd.extFd[i], i, m_resizeBuf.size.extS[i]);
3799
3800 if (csc_convert(m_exynosPictureCSC) != 0)
3801 ALOGE("ERR(%s): csc_convert() fail", __FUNCTION__);
3802
3803 }
3804 else {
3805 ALOGE("ERR(%s): m_exynosPictureCSC == NULL", __FUNCTION__);
3806 }
3807
3808 resizeBufInfo = m_resizeBuf;
3809
3810 m_getAlignedYUVSize(V4L2_PIX_FMT_NV16, m_jpegPictureRect.w, m_jpegPictureRect.h, &m_resizeBuf);
3811
3812 for (int i = 1; i < 3; i++) {
3813 if (m_resizeBuf.size.extS[i] != 0)
3814 m_resizeBuf.fd.extFd[i] = m_resizeBuf.fd.extFd[i-1] + m_resizeBuf.size.extS[i-1];
3815
3816 ALOGV("(%s): m_resizeBuf.size.extS[%d] = %d", __FUNCTION__, i, m_resizeBuf.size.extS[i]);
3817 }
3818
3819 jpegRect.w = m_jpegPictureRect.w;
3820 jpegRect.h = m_jpegPictureRect.h;
3821 jpegRect.colorFormat = V4L2_PIX_FMT_NV16;
3822
3823 for (int j = 0 ; j < 3 ; j++)
3824 ALOGV("DEBUG(%s): dest buf node fd.extFd[%d]=%d size=%d virt=%x ",
3825 __FUNCTION__, j, subParms->svcBuffers[subParms->svcBufIndex].fd.extFd[j],
3826 (unsigned int)subParms->svcBuffers[subParms->svcBufIndex].size.extS[j],
3827 (unsigned int)subParms->svcBuffers[subParms->svcBufIndex].virt.extP[j]);
3828
3829 if (yuv2Jpeg(&m_resizeBuf, &subParms->svcBuffers[subParms->svcBufIndex], &jpegRect) == false)
3830 ALOGE("ERR(%s):yuv2Jpeg() fail", __FUNCTION__);
3831
3832 m_resizeBuf = resizeBufInfo;
3833
3834 res = subParms->streamOps->enqueue_buffer(subParms->streamOps, frameTimeStamp, &(subParms->svcBufHandle[subParms->svcBufIndex]));
3835
3836 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer index(%d) to svc done res(%d)",
3837 __FUNCTION__, selfThread->m_index, subParms->svcBufIndex, res);
3838 if (res == 0) {
3839 subParms->svcBufStatus[subParms->svcBufIndex] = ON_SERVICE;
3840 subParms->numSvcBufsInHal--;
3841 }
3842 else {
3843 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
3844 }
3845
3846 while (subParms->numSvcBufsInHal <= subParms->minUndequedBuffer)
3847 {
3848 bool found = false;
3849 int checkingIndex = 0;
3850
3851 ALOGV("DEBUG(%s): jpeg currentBuf#(%d)", __FUNCTION__ , subParms->numSvcBufsInHal);
3852
3853 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
3854 if (res != NO_ERROR || buf == NULL) {
3855 ALOGV("DEBUG(%s): jpeg stream(%d) dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
3856 break;
3857 }
3858 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
3859 subParms->numSvcBufsInHal ++;
3860 ALOGV("DEBUG(%s): jpeg got buf(%x) numBufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
3861 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
3862
3863
3864 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
3865 if (priv_handle->fd == subParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
3866 found = true;
3867 break;
3868 }
3869 }
3870 ALOGV("DEBUG(%s): jpeg dequeueed_buffer found index(%d)", __FUNCTION__, found);
3871
3872 if (!found) {
3873 break;
3874 }
3875
3876 subParms->svcBufIndex = checkingIndex;
3877 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_SERVICE) {
3878 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
3879 }
3880 else {
3881 ALOGV("DEBUG(%s): jpeg bufstatus abnormal [%d] status = %d", __FUNCTION__,
3882 subParms->svcBufIndex, subParms->svcBufStatus[subParms->svcBufIndex]);
3883 }
3884 }
3885 return 0;
3886}
3887
3888int ExynosCameraHWInterface2::m_recordCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp)
3889{
3890 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
3891 substream_parameters_t *subParms = &m_subStreams[STREAM_ID_RECORD];
3892 status_t res;
3893 ExynosRect jpegRect;
3894 bool found = false;
3895 int cropX, cropY, cropW, cropH = 0;
3896 buffer_handle_t * buf = NULL;
3897
3898 ALOGV("DEBUG(%s): index(%d)",__FUNCTION__, subParms->svcBufIndex);
3899 for (int i = 0 ; subParms->numSvcBuffers ; i++) {
3900 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_HAL) {
3901 found = true;
3902 break;
3903 }
3904 subParms->svcBufIndex++;
3905 if (subParms->svcBufIndex >= subParms->numSvcBuffers)
3906 subParms->svcBufIndex = 0;
3907 }
3908 if (!found) {
3909 ALOGE("(%s): cannot find free svc buffer", __FUNCTION__);
3910 subParms->svcBufIndex++;
3911 return 1;
3912 }
3913
3914 if (m_exynosVideoCSC) {
3915 int videoW = subParms->width, videoH = subParms->height;
3916 int cropX, cropY, cropW, cropH = 0;
3917 int previewW = selfStreamParms->width, previewH = selfStreamParms->height;
3918 m_getRatioSize(previewW, previewH,
3919 videoW, videoH,
3920 &cropX, &cropY,
3921 &cropW, &cropH,
3922 0);
3923
3924 ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d",
3925 __FUNCTION__, cropX, cropY, cropW, cropH);
3926
3927 csc_set_src_format(m_exynosVideoCSC,
3928 previewW, previewH,
3929 cropX, cropY, cropW, cropH,
3930 selfStreamParms->format,
3931 0);
3932
3933 csc_set_dst_format(m_exynosVideoCSC,
3934 videoW, videoH,
3935 0, 0, videoW, videoH,
3936 subParms->format,
3937 1);
3938
3939 csc_set_src_buffer(m_exynosVideoCSC,
3940 (void **)&srcImageBuf->fd.fd);
3941
3942 csc_set_dst_buffer(m_exynosVideoCSC,
3943 (void **)(&(subParms->svcBuffers[subParms->svcBufIndex].fd.fd)));
3944
3945 if (csc_convert(m_exynosVideoCSC) != 0) {
3946 ALOGE("ERR(%s):csc_convert() fail", __FUNCTION__);
3947 }
3948 else {
3949 ALOGV("(%s):csc_convert() SUCCESS", __FUNCTION__);
3950 }
3951 }
3952 else {
3953 ALOGE("ERR(%s):m_exynosVideoCSC == NULL", __FUNCTION__);
3954 }
3955
3956 res = subParms->streamOps->enqueue_buffer(subParms->streamOps, frameTimeStamp, &(subParms->svcBufHandle[subParms->svcBufIndex]));
3957
3958 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer index(%d) to svc done res(%d)",
3959 __FUNCTION__, selfThread->m_index, subParms->svcBufIndex, res);
3960 if (res == 0) {
3961 subParms->svcBufStatus[subParms->svcBufIndex] = ON_SERVICE;
3962 subParms->numSvcBufsInHal--;
3963 }
3964 else {
3965 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
3966 }
3967
3968 while (subParms->numSvcBufsInHal <= subParms->minUndequedBuffer)
3969 {
3970 bool found = false;
3971 int checkingIndex = 0;
3972
3973 ALOGV("DEBUG(%s): record currentBuf#(%d)", __FUNCTION__ , subParms->numSvcBufsInHal);
3974
3975 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
3976 if (res != NO_ERROR || buf == NULL) {
3977 ALOGV("DEBUG(%s): record stream(%d) dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
3978 break;
3979 }
3980 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
3981 subParms->numSvcBufsInHal ++;
3982 ALOGV("DEBUG(%s): record got buf(%x) numBufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
3983 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
3984
3985 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
3986 if (priv_handle->fd == subParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
3987 found = true;
3988 break;
3989 }
3990 }
3991 ALOGV("DEBUG(%s): record dequeueed_buffer found(%d) index = %d", __FUNCTION__, found, checkingIndex);
3992
3993 if (!found) {
3994 break;
3995 }
3996
3997 subParms->svcBufIndex = checkingIndex;
3998 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_SERVICE) {
3999 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4000 }
4001 else {
4002 ALOGV("DEBUG(%s): record bufstatus abnormal [%d] status = %d", __FUNCTION__,
4003 subParms->svcBufIndex, subParms->svcBufStatus[subParms->svcBufIndex]);
4004 }
4005 }
4006 return 0;
4007}
4008
4009int ExynosCameraHWInterface2::m_prvcbCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp)
4010{
4011 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
4012 substream_parameters_t *subParms = &m_subStreams[STREAM_ID_PRVCB];
4013 status_t res;
4014 bool found = false;
4015 int cropX, cropY, cropW, cropH = 0;
4016 buffer_handle_t * buf = NULL;
4017
4018 ALOGV("DEBUG(%s): index(%d)",__FUNCTION__, subParms->svcBufIndex);
4019 for (int i = 0 ; subParms->numSvcBuffers ; i++) {
4020 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_HAL) {
4021 found = true;
4022 break;
4023 }
4024 subParms->svcBufIndex++;
4025 if (subParms->svcBufIndex >= subParms->numSvcBuffers)
4026 subParms->svcBufIndex = 0;
4027 }
4028 if (!found) {
4029 ALOGE("(%s): cannot find free svc buffer", __FUNCTION__);
4030 subParms->svcBufIndex++;
4031 return 1;
4032 }
4033
4034 if (subParms->format == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
4035 if (m_exynosVideoCSC) {
4036 int previewCbW = subParms->width, previewCbH = subParms->height;
4037 int cropX, cropY, cropW, cropH = 0;
4038 int previewW = selfStreamParms->width, previewH = selfStreamParms->height;
4039 m_getRatioSize(previewW, previewH,
4040 previewCbW, previewCbH,
4041 &cropX, &cropY,
4042 &cropW, &cropH,
4043 0);
4044
4045 ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d",
4046 __FUNCTION__, cropX, cropY, cropW, cropH);
4047 csc_set_src_format(m_exynosVideoCSC,
4048 previewW, previewH,
4049 cropX, cropY, cropW, cropH,
4050 selfStreamParms->format,
4051 0);
4052
4053 csc_set_dst_format(m_exynosVideoCSC,
4054 previewCbW, previewCbH,
4055 0, 0, previewCbW, previewCbH,
4056 subParms->internalFormat,
4057 1);
4058
4059 csc_set_src_buffer(m_exynosVideoCSC,
4060 (void **)&srcImageBuf->fd.fd);
4061
4062 csc_set_dst_buffer(m_exynosVideoCSC,
4063 (void **)(&(m_previewCbBuf.fd.fd)));
4064
4065 if (csc_convert(m_exynosVideoCSC) != 0) {
4066 ALOGE("ERR(%s):previewcb csc_convert() fail", __FUNCTION__);
4067 }
4068 else {
4069 ALOGV("(%s):previewcb csc_convert() SUCCESS", __FUNCTION__);
4070 }
4071 if (previewCbW == ALIGN(previewCbW, 16)) {
4072 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0],
4073 m_previewCbBuf.virt.extP[0], previewCbW * previewCbH);
4074 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0] + previewCbW * previewCbH,
4075 m_previewCbBuf.virt.extP[1], previewCbW * previewCbH / 2 );
4076 }
4077 else {
4078 // TODO : copy line by line ?
4079 }
4080 }
4081 else {
4082 ALOGE("ERR(%s):m_exynosVideoCSC == NULL", __FUNCTION__);
4083 }
4084 }
4085 else if (subParms->format == HAL_PIXEL_FORMAT_YV12) {
4086 int previewCbW = subParms->width, previewCbH = subParms->height;
4087 int stride = ALIGN(previewCbW, 16);
4088 int c_stride = ALIGN(stride, 16);
4089 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0],
4090 srcImageBuf->virt.extP[0], stride * previewCbH);
4091 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0] + stride * previewCbH,
4092 srcImageBuf->virt.extP[1], c_stride * previewCbH / 2 );
4093 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0] + (stride * previewCbH) + (c_stride * previewCbH / 2),
4094 srcImageBuf->virt.extP[2], c_stride * previewCbH / 2 );
4095 }
4096 res = subParms->streamOps->enqueue_buffer(subParms->streamOps, frameTimeStamp, &(subParms->svcBufHandle[subParms->svcBufIndex]));
4097
4098 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer index(%d) to svc done res(%d)",
4099 __FUNCTION__, selfThread->m_index, subParms->svcBufIndex, res);
4100 if (res == 0) {
4101 subParms->svcBufStatus[subParms->svcBufIndex] = ON_SERVICE;
4102 subParms->numSvcBufsInHal--;
4103 }
4104 else {
4105 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4106 }
4107
4108 while (subParms->numSvcBufsInHal <= subParms->minUndequedBuffer)
4109 {
4110 bool found = false;
4111 int checkingIndex = 0;
4112
4113 ALOGV("DEBUG(%s): prvcb currentBuf#(%d)", __FUNCTION__ , subParms->numSvcBufsInHal);
4114
4115 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
4116 if (res != NO_ERROR || buf == NULL) {
4117 ALOGV("DEBUG(%s): prvcb stream(%d) dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
4118 break;
4119 }
4120 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
4121 subParms->numSvcBufsInHal ++;
4122 ALOGV("DEBUG(%s): prvcb got buf(%x) numBufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
4123 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
4124
4125
4126 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
4127 if (priv_handle->fd == subParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
4128 found = true;
4129 break;
4130 }
4131 }
4132 ALOGV("DEBUG(%s): prvcb dequeueed_buffer found(%d) index = %d", __FUNCTION__, found, checkingIndex);
4133
4134 if (!found) {
4135 break;
4136 }
4137
4138 subParms->svcBufIndex = checkingIndex;
4139 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_SERVICE) {
4140 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4141 }
4142 else {
4143 ALOGV("DEBUG(%s): prvcb bufstatus abnormal [%d] status = %d", __FUNCTION__,
4144 subParms->svcBufIndex, subParms->svcBufStatus[subParms->svcBufIndex]);
4145 }
4146 }
4147 return 0;
4148}
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07004149
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +09004150bool ExynosCameraHWInterface2::m_checkThumbnailSize(int w, int h)
4151{
4152 int sizeOfSupportList;
4153
4154 //REAR Camera
4155 if(this->getCameraId() == 0) {
4156 sizeOfSupportList = sizeof(SUPPORT_THUMBNAIL_REAR_SIZE) / (sizeof(int)*2);
4157
4158 for(int i = 0; i < sizeOfSupportList; i++) {
4159 if((SUPPORT_THUMBNAIL_REAR_SIZE[i][0] == w) &&(SUPPORT_THUMBNAIL_REAR_SIZE[i][1] == h))
4160 return true;
4161 }
4162
4163 }
4164 else {
4165 sizeOfSupportList = sizeof(SUPPORT_THUMBNAIL_FRONT_SIZE) / (sizeof(int)*2);
4166
4167 for(int i = 0; i < sizeOfSupportList; i++) {
4168 if((SUPPORT_THUMBNAIL_FRONT_SIZE[i][0] == w) &&(SUPPORT_THUMBNAIL_FRONT_SIZE[i][1] == h))
4169 return true;
4170 }
4171 }
4172
4173 return false;
4174}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004175bool ExynosCameraHWInterface2::yuv2Jpeg(ExynosBuffer *yuvBuf,
4176 ExynosBuffer *jpegBuf,
4177 ExynosRect *rect)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07004178{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004179 unsigned char *addr;
4180
4181 ExynosJpegEncoderForCamera jpegEnc;
4182 bool ret = false;
4183 int res = 0;
4184
4185 unsigned int *yuvSize = yuvBuf->size.extS;
4186
4187 if (jpegEnc.create()) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004188 ALOGE("ERR(%s):jpegEnc.create() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004189 goto jpeg_encode_done;
4190 }
4191
4192 if (jpegEnc.setQuality(100)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004193 ALOGE("ERR(%s):jpegEnc.setQuality() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004194 goto jpeg_encode_done;
4195 }
4196
4197 if (jpegEnc.setSize(rect->w, rect->h)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004198 ALOGE("ERR(%s):jpegEnc.setSize() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004199 goto jpeg_encode_done;
4200 }
4201 ALOGV("%s : width = %d , height = %d\n", __FUNCTION__, rect->w, rect->h);
4202
4203 if (jpegEnc.setColorFormat(rect->colorFormat)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004204 ALOGE("ERR(%s):jpegEnc.setColorFormat() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004205 goto jpeg_encode_done;
4206 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004207
4208 if (jpegEnc.setJpegFormat(V4L2_PIX_FMT_JPEG_422)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004209 ALOGE("ERR(%s):jpegEnc.setJpegFormat() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004210 goto jpeg_encode_done;
4211 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004212
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +09004213 if((m_jpegMetadata.ctl.jpeg.thumbnailSize[0] != 0) && (m_jpegMetadata.ctl.jpeg.thumbnailSize[1] != 0)) {
4214 mExifInfo.enableThumb = true;
4215 if(!m_checkThumbnailSize(m_jpegMetadata.ctl.jpeg.thumbnailSize[0], m_jpegMetadata.ctl.jpeg.thumbnailSize[1])) {
4216 //default value
4217 m_thumbNailW = SUPPORT_THUMBNAIL_REAR_SIZE[0][0];
4218 m_thumbNailH = SUPPORT_THUMBNAIL_REAR_SIZE[0][1];
4219 } else {
4220 m_thumbNailW = m_jpegMetadata.ctl.jpeg.thumbnailSize[0];
4221 m_thumbNailH = m_jpegMetadata.ctl.jpeg.thumbnailSize[1];
4222 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004223
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +09004224 ALOGV("(%s) m_thumbNailW = %d, m_thumbNailH = %d", __FUNCTION__, m_thumbNailW, m_thumbNailH);
4225
4226 } else {
4227 mExifInfo.enableThumb = false;
4228 }
4229
4230 if (jpegEnc.setThumbnailSize(m_thumbNailW, m_thumbNailH)) {
4231 ALOGE("ERR(%s):jpegEnc.setThumbnailSize(%d, %d) fail", __FUNCTION__, m_thumbNailH, m_thumbNailH);
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07004232 goto jpeg_encode_done;
4233 }
4234
Sungjoong Kang2d5e6ec2012-08-30 15:14:17 +09004235 ALOGV("(%s):jpegEnc.setThumbnailSize(%d, %d) ", __FUNCTION__, m_thumbNailW, m_thumbNailW);
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07004236 if (jpegEnc.setThumbnailQuality(50)) {
4237 ALOGE("ERR(%s):jpegEnc.setThumbnailQuality fail", __FUNCTION__);
4238 goto jpeg_encode_done;
4239 }
4240
4241 m_setExifChangedAttribute(&mExifInfo, rect, &m_jpegMetadata);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004242 ALOGV("DEBUG(%s):calling jpegEnc.setInBuf() yuvSize(%d)", __FUNCTION__, *yuvSize);
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07004243 if (jpegEnc.setInBuf((int *)&(yuvBuf->fd.fd), &(yuvBuf->virt.p), (int *)yuvSize)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004244 ALOGE("ERR(%s):jpegEnc.setInBuf() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004245 goto jpeg_encode_done;
4246 }
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07004247 if (jpegEnc.setOutBuf(jpegBuf->fd.fd, jpegBuf->virt.p, jpegBuf->size.extS[0] + jpegBuf->size.extS[1] + jpegBuf->size.extS[2])) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004248 ALOGE("ERR(%s):jpegEnc.setOutBuf() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004249 goto jpeg_encode_done;
4250 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004251
4252 if (jpegEnc.updateConfig()) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004253 ALOGE("ERR(%s):jpegEnc.updateConfig() fail", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004254 goto jpeg_encode_done;
4255 }
4256
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07004257 if (res = jpegEnc.encode((int *)&jpegBuf->size.s, &mExifInfo)) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09004258 ALOGE("ERR(%s):jpegEnc.encode() fail ret(%d)", __FUNCTION__, res);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004259 goto jpeg_encode_done;
4260 }
4261
4262 ret = true;
4263
4264jpeg_encode_done:
4265
4266 if (jpegEnc.flagCreate() == true)
4267 jpegEnc.destroy();
4268
4269 return ret;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07004270}
4271
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004272void ExynosCameraHWInterface2::OnAfTriggerStart(int id)
4273{
4274 m_afPendingTriggerId = id;
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07004275 m_afModeWaitingCnt = 6;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004276}
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09004277
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004278void ExynosCameraHWInterface2::OnAfTrigger(int id)
4279{
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004280 m_afTriggerId = id;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07004281
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004282 switch (m_afMode) {
4283 case AA_AFMODE_AUTO:
4284 case AA_AFMODE_MACRO:
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004285 case AA_AFMODE_OFF:
Younghwan Joocaea49e2012-09-07 13:34:20 -07004286 ALOGE("[AF] OnAfTrigger - AUTO,MACRO,OFF (Mode %d) ", m_afMode);
4287 // If flash is enable, Flash operation is executed before triggering AF
4288 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH)
4289 && (m_ctlInfo.flash.m_afFlashEnableFlg == false)
4290 && (m_cameraId == 0)) {
4291 ALOGE("[AF Flash] AF Flash start with Mode (%d)", m_afMode);
4292 m_ctlInfo.flash.m_afFlashEnableFlg = true;
4293 m_ctlInfo.flash.m_flashTimeOut = 3;
4294 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004295 m_ctlInfo.flash.m_flashDecisionResult = false;
4296 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004297 OnAfTriggerAutoMacro(id);
4298 break;
4299 case AA_AFMODE_CONTINUOUS_VIDEO:
Younghwan Joocaea49e2012-09-07 13:34:20 -07004300 ALOGE("[AF] OnAfTrigger - AA_AFMODE_CONTINUOUS_VIDEO (Mode %d) ", m_afMode);
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004301 OnAfTriggerCAFVideo(id);
4302 break;
4303 case AA_AFMODE_CONTINUOUS_PICTURE:
Younghwan Joocaea49e2012-09-07 13:34:20 -07004304 ALOGE("[AF] OnAfTrigger - AA_AFMODE_CONTINUOUS_PICTURE (Mode %d) ", m_afMode);
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004305 OnAfTriggerCAFPicture(id);
4306 break;
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004307
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004308 default:
4309 break;
4310 }
4311}
4312
4313void ExynosCameraHWInterface2::OnAfTriggerAutoMacro(int id)
4314{
4315 int nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004316
4317 switch (m_afState) {
4318 case HAL_AFSTATE_INACTIVE:
4319 nextState = HAL_AFSTATE_NEEDS_COMMAND;
4320 m_IsAfTriggerRequired = true;
4321 break;
4322 case HAL_AFSTATE_NEEDS_COMMAND:
4323 nextState = NO_TRANSITION;
4324 break;
4325 case HAL_AFSTATE_STARTED:
4326 nextState = NO_TRANSITION;
4327 break;
4328 case HAL_AFSTATE_SCANNING:
4329 nextState = NO_TRANSITION;
4330 break;
4331 case HAL_AFSTATE_LOCKED:
4332 nextState = HAL_AFSTATE_NEEDS_COMMAND;
4333 m_IsAfTriggerRequired = true;
4334 break;
4335 case HAL_AFSTATE_FAILED:
4336 nextState = HAL_AFSTATE_NEEDS_COMMAND;
4337 m_IsAfTriggerRequired = true;
4338 break;
4339 default:
4340 break;
4341 }
4342 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
4343 if (nextState != NO_TRANSITION)
4344 m_afState = nextState;
4345}
4346
4347void ExynosCameraHWInterface2::OnAfTriggerCAFPicture(int id)
4348{
4349 int nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004350
4351 switch (m_afState) {
4352 case HAL_AFSTATE_INACTIVE:
4353 nextState = HAL_AFSTATE_FAILED;
4354 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4355 break;
4356 case HAL_AFSTATE_NEEDS_COMMAND:
4357 // not used
4358 break;
4359 case HAL_AFSTATE_STARTED:
4360 nextState = HAL_AFSTATE_NEEDS_DETERMINATION;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004361 m_AfHwStateFailed = false;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004362 // If flash is enable, Flash operation is executed before triggering AF
4363 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH)
4364 && (m_ctlInfo.flash.m_afFlashEnableFlg == false)
4365 && (m_cameraId == 0)) {
4366 ALOGE("[AF Flash] AF Flash start with Mode (%d) state (%d) id (%d)", m_afMode, m_afState, id);
4367 m_ctlInfo.flash.m_afFlashEnableFlg = true;
4368 m_ctlInfo.flash.m_flashTimeOut = 3;
4369 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004370 m_ctlInfo.flash.m_flashDecisionResult = false;
4371 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004372 break;
4373 case HAL_AFSTATE_SCANNING:
4374 nextState = HAL_AFSTATE_NEEDS_DETERMINATION;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004375 m_AfHwStateFailed = false;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004376 // If flash is enable, Flash operation is executed before triggering AF
4377 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH)
4378 && (m_ctlInfo.flash.m_afFlashEnableFlg == false)
4379 && (m_cameraId == 0)) {
4380 ALOGE("[AF Flash] AF Flash start with Mode (%d) state (%d) id (%d)", m_afMode, m_afState, id);
4381 m_ctlInfo.flash.m_afFlashEnableFlg = true;
4382 m_ctlInfo.flash.m_flashTimeOut = 3;
4383 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_ON;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004384 m_ctlInfo.flash.m_flashDecisionResult = false;
4385 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004386 break;
4387 case HAL_AFSTATE_NEEDS_DETERMINATION:
4388 nextState = NO_TRANSITION;
4389 break;
4390 case HAL_AFSTATE_PASSIVE_FOCUSED:
4391 m_IsAfLockRequired = true;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004392 if (m_AfHwStateFailed) {
Younghwan Joocaea49e2012-09-07 13:34:20 -07004393 ALOGE("(%s): [CAF] LAST : fail", __FUNCTION__);
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004394 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4395 nextState = HAL_AFSTATE_FAILED;
4396 }
4397 else {
Younghwan Joocaea49e2012-09-07 13:34:20 -07004398 ALOGV("(%s): [CAF] LAST : success", __FUNCTION__);
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004399 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4400 nextState = HAL_AFSTATE_LOCKED;
4401 }
4402 m_AfHwStateFailed = false;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004403 break;
4404 case HAL_AFSTATE_LOCKED:
4405 nextState = NO_TRANSITION;
4406 break;
4407 case HAL_AFSTATE_FAILED:
4408 nextState = NO_TRANSITION;
4409 break;
4410 default:
4411 break;
4412 }
4413 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
4414 if (nextState != NO_TRANSITION)
4415 m_afState = nextState;
4416}
4417
4418
4419void ExynosCameraHWInterface2::OnAfTriggerCAFVideo(int id)
4420{
4421 int nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004422
4423 switch (m_afState) {
4424 case HAL_AFSTATE_INACTIVE:
4425 nextState = HAL_AFSTATE_FAILED;
4426 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4427 break;
4428 case HAL_AFSTATE_NEEDS_COMMAND:
4429 // not used
4430 break;
4431 case HAL_AFSTATE_STARTED:
4432 m_IsAfLockRequired = true;
4433 nextState = HAL_AFSTATE_FAILED;
4434 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4435 break;
4436 case HAL_AFSTATE_SCANNING:
4437 m_IsAfLockRequired = true;
4438 nextState = HAL_AFSTATE_FAILED;
4439 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4440 break;
4441 case HAL_AFSTATE_NEEDS_DETERMINATION:
4442 // not used
4443 break;
4444 case HAL_AFSTATE_PASSIVE_FOCUSED:
4445 m_IsAfLockRequired = true;
4446 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4447 nextState = HAL_AFSTATE_LOCKED;
4448 break;
4449 case HAL_AFSTATE_LOCKED:
4450 nextState = NO_TRANSITION;
4451 break;
4452 case HAL_AFSTATE_FAILED:
4453 nextState = NO_TRANSITION;
4454 break;
4455 default:
4456 break;
4457 }
4458 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
4459 if (nextState != NO_TRANSITION)
4460 m_afState = nextState;
4461}
4462
4463void ExynosCameraHWInterface2::OnAfNotification(enum aa_afstate noti)
4464{
4465 switch (m_afMode) {
4466 case AA_AFMODE_AUTO:
4467 case AA_AFMODE_MACRO:
4468 OnAfNotificationAutoMacro(noti);
4469 break;
4470 case AA_AFMODE_CONTINUOUS_VIDEO:
4471 OnAfNotificationCAFVideo(noti);
4472 break;
4473 case AA_AFMODE_CONTINUOUS_PICTURE:
4474 OnAfNotificationCAFPicture(noti);
4475 break;
4476 case AA_AFMODE_OFF:
4477 default:
4478 break;
4479 }
4480}
4481
4482void ExynosCameraHWInterface2::OnAfNotificationAutoMacro(enum aa_afstate noti)
4483{
4484 int nextState = NO_TRANSITION;
4485 bool bWrongTransition = false;
4486
4487 if (m_afState == HAL_AFSTATE_INACTIVE || m_afState == HAL_AFSTATE_NEEDS_COMMAND) {
4488 switch (noti) {
4489 case AA_AFSTATE_INACTIVE:
4490 case AA_AFSTATE_ACTIVE_SCAN:
4491 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4492 case AA_AFSTATE_AF_FAILED_FOCUS:
4493 default:
4494 nextState = NO_TRANSITION;
4495 break;
4496 }
4497 }
4498 else if (m_afState == HAL_AFSTATE_STARTED) {
4499 switch (noti) {
4500 case AA_AFSTATE_INACTIVE:
4501 nextState = NO_TRANSITION;
4502 break;
4503 case AA_AFSTATE_ACTIVE_SCAN:
4504 nextState = HAL_AFSTATE_SCANNING;
4505 SetAfStateForService(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN);
4506 break;
4507 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4508 nextState = NO_TRANSITION;
4509 break;
4510 case AA_AFSTATE_AF_FAILED_FOCUS:
4511 nextState = NO_TRANSITION;
4512 break;
4513 default:
4514 bWrongTransition = true;
4515 break;
4516 }
4517 }
4518 else if (m_afState == HAL_AFSTATE_SCANNING) {
4519 switch (noti) {
4520 case AA_AFSTATE_INACTIVE:
4521 bWrongTransition = true;
4522 break;
4523 case AA_AFSTATE_ACTIVE_SCAN:
4524 nextState = NO_TRANSITION;
4525 break;
4526 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
Younghwan Joo9a710a42012-09-05 17:52:08 -07004527 // If Flash mode is enable, after AF execute pre-capture metering
4528 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4529 if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_ON_DONE) {
4530 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_AE_AWB_LOCK;
4531 } else if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_AUTO_END) {
4532 nextState = HAL_AFSTATE_LOCKED;
4533 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4534 } else {
4535 nextState = NO_TRANSITION;
4536 }
4537 } else {
4538 nextState = HAL_AFSTATE_LOCKED;
4539 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4540 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004541 break;
4542 case AA_AFSTATE_AF_FAILED_FOCUS:
Younghwan Joo9a710a42012-09-05 17:52:08 -07004543 // If Flash mode is enable, after AF execute pre-capture metering
4544 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4545 if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_ON_DONE) {
4546 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_AE_AWB_LOCK;
4547 } else if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_AUTO_END) {
4548 nextState = HAL_AFSTATE_FAILED;
4549 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4550 } else {
4551 nextState = NO_TRANSITION;
4552 }
4553 } else {
4554 nextState = HAL_AFSTATE_FAILED;
4555 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4556 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004557 break;
4558 default:
4559 bWrongTransition = true;
4560 break;
4561 }
4562 }
4563 else if (m_afState == HAL_AFSTATE_LOCKED) {
4564 switch (noti) {
4565 case AA_AFSTATE_INACTIVE:
4566 case AA_AFSTATE_ACTIVE_SCAN:
4567 bWrongTransition = true;
4568 break;
4569 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07004570 // Flash off if flash mode is available.
Younghwan Joo9a710a42012-09-05 17:52:08 -07004571 if (m_ctlInfo.flash.m_afFlashEnableFlg)
4572 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004573 nextState = NO_TRANSITION;
4574 break;
4575 case AA_AFSTATE_AF_FAILED_FOCUS:
4576 default:
4577 bWrongTransition = true;
4578 break;
4579 }
4580 }
4581 else if (m_afState == HAL_AFSTATE_FAILED) {
4582 switch (noti) {
4583 case AA_AFSTATE_INACTIVE:
4584 case AA_AFSTATE_ACTIVE_SCAN:
4585 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4586 bWrongTransition = true;
4587 break;
4588 case AA_AFSTATE_AF_FAILED_FOCUS:
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07004589 // Flash off if flash mode is available.
Younghwan Joo9a710a42012-09-05 17:52:08 -07004590 if (m_ctlInfo.flash.m_afFlashEnableFlg)
4591 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004592 nextState = NO_TRANSITION;
4593 break;
4594 default:
4595 bWrongTransition = true;
4596 break;
4597 }
4598 }
4599 if (bWrongTransition) {
4600 ALOGV("(%s): Wrong Transition state(%d) noti(%d)", __FUNCTION__, m_afState, noti);
4601 return;
4602 }
4603 ALOGV("(%s): State (%d) -> (%d) by (%d)", __FUNCTION__, m_afState, nextState, noti);
4604 if (nextState != NO_TRANSITION)
4605 m_afState = nextState;
4606}
4607
4608void ExynosCameraHWInterface2::OnAfNotificationCAFPicture(enum aa_afstate noti)
4609{
4610 int nextState = NO_TRANSITION;
4611 bool bWrongTransition = false;
4612
4613 if (m_afState == HAL_AFSTATE_INACTIVE) {
4614 switch (noti) {
4615 case AA_AFSTATE_INACTIVE:
4616 case AA_AFSTATE_ACTIVE_SCAN:
4617 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4618 case AA_AFSTATE_AF_FAILED_FOCUS:
4619 default:
4620 nextState = NO_TRANSITION;
4621 break;
4622 }
4623 }
4624 else if (m_afState == HAL_AFSTATE_STARTED) {
4625 switch (noti) {
4626 case AA_AFSTATE_INACTIVE:
4627 nextState = NO_TRANSITION;
4628 break;
4629 case AA_AFSTATE_ACTIVE_SCAN:
4630 nextState = HAL_AFSTATE_SCANNING;
4631 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
4632 break;
4633 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4634 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
4635 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
4636 break;
4637 case AA_AFSTATE_AF_FAILED_FOCUS:
Sungjoong Kangcd13bb72012-08-28 13:05:01 -07004638 //nextState = HAL_AFSTATE_FAILED;
4639 //SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4640 nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004641 break;
4642 default:
4643 bWrongTransition = true;
4644 break;
4645 }
4646 }
4647 else if (m_afState == HAL_AFSTATE_SCANNING) {
4648 switch (noti) {
4649 case AA_AFSTATE_INACTIVE:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004650 nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004651 break;
4652 case AA_AFSTATE_ACTIVE_SCAN:
4653 nextState = NO_TRANSITION;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004654 m_AfHwStateFailed = false;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004655 break;
4656 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4657 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004658 m_AfHwStateFailed = false;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004659 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
4660 break;
4661 case AA_AFSTATE_AF_FAILED_FOCUS:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004662 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
4663 m_AfHwStateFailed = true;
4664 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004665 break;
4666 default:
4667 bWrongTransition = true;
4668 break;
4669 }
4670 }
4671 else if (m_afState == HAL_AFSTATE_PASSIVE_FOCUSED) {
4672 switch (noti) {
4673 case AA_AFSTATE_INACTIVE:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004674 nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004675 break;
4676 case AA_AFSTATE_ACTIVE_SCAN:
4677 nextState = HAL_AFSTATE_SCANNING;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004678 m_AfHwStateFailed = false;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004679 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
4680 break;
4681 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4682 nextState = NO_TRANSITION;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004683 m_AfHwStateFailed = false;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004684 // Flash off if flash mode is available.
4685 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4686 ALOGD("[AF Flash] Off with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4687 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
4688 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004689 break;
4690 case AA_AFSTATE_AF_FAILED_FOCUS:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004691 nextState = NO_TRANSITION;
4692 m_AfHwStateFailed = true;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004693 // Flash off if flash mode is available.
4694 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4695 ALOGD("[AF Flash] Off with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4696 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
4697 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004698 break;
4699 default:
4700 bWrongTransition = true;
4701 break;
4702 }
4703 }
4704 else if (m_afState == HAL_AFSTATE_NEEDS_DETERMINATION) {
4705 switch (noti) {
4706 case AA_AFSTATE_INACTIVE:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004707 nextState = NO_TRANSITION;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004708 break;
4709 case AA_AFSTATE_ACTIVE_SCAN:
4710 nextState = NO_TRANSITION;
4711 break;
4712 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
Younghwan Joocaea49e2012-09-07 13:34:20 -07004713 // If Flash mode is enable, after AF execute pre-capture metering
4714 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4715 ALOGD("[AF Flash] AUTO start with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4716 if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_ON_DONE) {
4717 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_AE_AWB_LOCK;
4718 } else if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_AUTO_END) {
4719 m_IsAfLockRequired = true;
4720 nextState = HAL_AFSTATE_LOCKED;
4721 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4722 } else {
4723 nextState = NO_TRANSITION;
4724 }
4725 } else {
4726 m_IsAfLockRequired = true;
4727 nextState = HAL_AFSTATE_LOCKED;
4728 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4729 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004730 break;
4731 case AA_AFSTATE_AF_FAILED_FOCUS:
Younghwan Joocaea49e2012-09-07 13:34:20 -07004732 // If Flash mode is enable, after AF execute pre-capture metering
4733 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4734 ALOGD("[AF Flash] AUTO start with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4735 if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_ON_DONE) {
4736 m_ctlInfo.flash.m_afFlashCnt = IS_FLASH_AF_AUTO_AE_AWB_LOCK;
4737 } else if (m_ctlInfo.flash.m_afFlashCnt == IS_FLASH_AF_AUTO_END) {
4738 m_IsAfLockRequired = true;
4739 nextState = HAL_AFSTATE_FAILED;
4740 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4741 } else {
4742 nextState = NO_TRANSITION;
4743 }
4744 } else {
4745 m_IsAfLockRequired = true;
4746 nextState = HAL_AFSTATE_FAILED;
4747 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4748 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004749 break;
4750 default:
4751 bWrongTransition = true;
4752 break;
4753 }
4754 }
4755 else if (m_afState == HAL_AFSTATE_LOCKED) {
4756 switch (noti) {
4757 case AA_AFSTATE_INACTIVE:
4758 nextState = NO_TRANSITION;
4759 break;
4760 case AA_AFSTATE_ACTIVE_SCAN:
4761 bWrongTransition = true;
4762 break;
4763 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4764 nextState = NO_TRANSITION;
Younghwan Joocaea49e2012-09-07 13:34:20 -07004765 // Flash off if flash mode is available.
4766 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4767 ALOGD("[AF Flash] Off with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4768 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
4769 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004770 break;
4771 case AA_AFSTATE_AF_FAILED_FOCUS:
4772 default:
4773 bWrongTransition = true;
4774 break;
4775 }
4776 }
4777 else if (m_afState == HAL_AFSTATE_FAILED) {
4778 switch (noti) {
4779 case AA_AFSTATE_INACTIVE:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004780 bWrongTransition = true;
4781 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004782 case AA_AFSTATE_ACTIVE_SCAN:
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004783 nextState = HAL_AFSTATE_SCANNING;
4784 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004785 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4786 bWrongTransition = true;
4787 break;
4788 case AA_AFSTATE_AF_FAILED_FOCUS:
Younghwan Joocaea49e2012-09-07 13:34:20 -07004789 // Flash off if flash mode is available.
4790 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4791 ALOGD("[AF Flash] Off with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4792 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
4793 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004794 nextState = NO_TRANSITION;
4795 break;
4796 default:
4797 bWrongTransition = true;
4798 break;
4799 }
4800 }
4801 if (bWrongTransition) {
4802 ALOGV("(%s): Wrong Transition state(%d) noti(%d)", __FUNCTION__, m_afState, noti);
4803 return;
4804 }
4805 ALOGV("(%s): State (%d) -> (%d) by (%d)", __FUNCTION__, m_afState, nextState, noti);
4806 if (nextState != NO_TRANSITION)
4807 m_afState = nextState;
4808}
4809
4810void ExynosCameraHWInterface2::OnAfNotificationCAFVideo(enum aa_afstate noti)
4811{
4812 int nextState = NO_TRANSITION;
4813 bool bWrongTransition = false;
4814
4815 if (m_afState == HAL_AFSTATE_INACTIVE) {
4816 switch (noti) {
4817 case AA_AFSTATE_INACTIVE:
4818 case AA_AFSTATE_ACTIVE_SCAN:
4819 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4820 case AA_AFSTATE_AF_FAILED_FOCUS:
4821 default:
4822 nextState = NO_TRANSITION;
4823 break;
4824 }
4825 }
4826 else if (m_afState == HAL_AFSTATE_STARTED) {
4827 switch (noti) {
4828 case AA_AFSTATE_INACTIVE:
4829 nextState = NO_TRANSITION;
4830 break;
4831 case AA_AFSTATE_ACTIVE_SCAN:
4832 nextState = HAL_AFSTATE_SCANNING;
4833 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
4834 break;
4835 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4836 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
4837 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
4838 break;
4839 case AA_AFSTATE_AF_FAILED_FOCUS:
4840 nextState = HAL_AFSTATE_FAILED;
4841 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4842 break;
4843 default:
4844 bWrongTransition = true;
4845 break;
4846 }
4847 }
4848 else if (m_afState == HAL_AFSTATE_SCANNING) {
4849 switch (noti) {
4850 case AA_AFSTATE_INACTIVE:
4851 bWrongTransition = true;
4852 break;
4853 case AA_AFSTATE_ACTIVE_SCAN:
4854 nextState = NO_TRANSITION;
4855 break;
4856 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4857 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
4858 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
4859 break;
4860 case AA_AFSTATE_AF_FAILED_FOCUS:
4861 nextState = NO_TRANSITION;
Sungjoong Kang36c106c2012-08-23 17:38:20 -07004862 m_IsAfTriggerRequired = true;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004863 break;
4864 default:
4865 bWrongTransition = true;
4866 break;
4867 }
4868 }
4869 else if (m_afState == HAL_AFSTATE_PASSIVE_FOCUSED) {
4870 switch (noti) {
4871 case AA_AFSTATE_INACTIVE:
4872 bWrongTransition = true;
4873 break;
4874 case AA_AFSTATE_ACTIVE_SCAN:
4875 nextState = HAL_AFSTATE_SCANNING;
4876 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
4877 break;
4878 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4879 nextState = NO_TRANSITION;
4880 break;
4881 case AA_AFSTATE_AF_FAILED_FOCUS:
4882 nextState = HAL_AFSTATE_FAILED;
4883 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004884 // TODO : needs NO_TRANSITION ?
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004885 break;
4886 default:
4887 bWrongTransition = true;
4888 break;
4889 }
4890 }
4891 else if (m_afState == HAL_AFSTATE_NEEDS_DETERMINATION) {
4892 switch (noti) {
4893 case AA_AFSTATE_INACTIVE:
4894 bWrongTransition = true;
4895 break;
4896 case AA_AFSTATE_ACTIVE_SCAN:
4897 nextState = NO_TRANSITION;
4898 break;
4899 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4900 m_IsAfLockRequired = true;
4901 nextState = HAL_AFSTATE_LOCKED;
4902 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4903 break;
4904 case AA_AFSTATE_AF_FAILED_FOCUS:
4905 nextState = HAL_AFSTATE_FAILED;
4906 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4907 break;
4908 default:
4909 bWrongTransition = true;
4910 break;
4911 }
4912 }
4913 else if (m_afState == HAL_AFSTATE_LOCKED) {
4914 switch (noti) {
4915 case AA_AFSTATE_INACTIVE:
4916 nextState = NO_TRANSITION;
4917 break;
4918 case AA_AFSTATE_ACTIVE_SCAN:
4919 bWrongTransition = true;
4920 break;
4921 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4922 nextState = NO_TRANSITION;
4923 break;
4924 case AA_AFSTATE_AF_FAILED_FOCUS:
4925 default:
4926 bWrongTransition = true;
4927 break;
4928 }
4929 }
4930 else if (m_afState == HAL_AFSTATE_FAILED) {
4931 switch (noti) {
4932 case AA_AFSTATE_INACTIVE:
4933 case AA_AFSTATE_ACTIVE_SCAN:
4934 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4935 bWrongTransition = true;
4936 break;
4937 case AA_AFSTATE_AF_FAILED_FOCUS:
4938 nextState = NO_TRANSITION;
4939 break;
4940 default:
4941 bWrongTransition = true;
4942 break;
4943 }
4944 }
4945 if (bWrongTransition) {
4946 ALOGV("(%s): Wrong Transition state(%d) noti(%d)", __FUNCTION__, m_afState, noti);
4947 return;
4948 }
4949 ALOGV("(%s): State (%d) -> (%d) by (%d)", __FUNCTION__, m_afState, nextState, noti);
4950 if (nextState != NO_TRANSITION)
4951 m_afState = nextState;
4952}
4953
4954void ExynosCameraHWInterface2::OnAfCancel(int id)
4955{
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004956 m_afTriggerId = id;
4957
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004958 switch (m_afMode) {
4959 case AA_AFMODE_AUTO:
4960 case AA_AFMODE_MACRO:
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07004961 case AA_AFMODE_OFF:
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004962 OnAfCancelAutoMacro(id);
4963 break;
4964 case AA_AFMODE_CONTINUOUS_VIDEO:
4965 OnAfCancelCAFVideo(id);
4966 break;
4967 case AA_AFMODE_CONTINUOUS_PICTURE:
4968 OnAfCancelCAFPicture(id);
4969 break;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004970 default:
4971 break;
4972 }
4973}
4974
4975void ExynosCameraHWInterface2::OnAfCancelAutoMacro(int id)
4976{
4977 int nextState = NO_TRANSITION;
4978 m_afTriggerId = id;
4979
Younghwan Joo9a710a42012-09-05 17:52:08 -07004980 if (m_ctlInfo.flash.m_afFlashEnableFlg) {
4981 m_ctlInfo.flash.m_afFlashCnt = IF_FLASH_AF_OFF;
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07004982 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004983 switch (m_afState) {
4984 case HAL_AFSTATE_INACTIVE:
4985 nextState = NO_TRANSITION;
Sungjoong Kangcd13bb72012-08-28 13:05:01 -07004986 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
Sungjoong Kang0f26b202012-08-17 15:43:12 -07004987 break;
4988 case HAL_AFSTATE_NEEDS_COMMAND:
4989 case HAL_AFSTATE_STARTED:
4990 case HAL_AFSTATE_SCANNING:
4991 case HAL_AFSTATE_LOCKED:
4992 case HAL_AFSTATE_FAILED:
4993 SetAfMode(AA_AFMODE_OFF);
4994 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
4995 nextState = HAL_AFSTATE_INACTIVE;
4996 break;
4997 default:
4998 break;
4999 }
5000 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
5001 if (nextState != NO_TRANSITION)
5002 m_afState = nextState;
5003}
5004
5005void ExynosCameraHWInterface2::OnAfCancelCAFPicture(int id)
5006{
5007 int nextState = NO_TRANSITION;
5008 m_afTriggerId = id;
5009
5010 switch (m_afState) {
5011 case HAL_AFSTATE_INACTIVE:
5012 nextState = NO_TRANSITION;
5013 break;
5014 case HAL_AFSTATE_NEEDS_COMMAND:
5015 case HAL_AFSTATE_STARTED:
5016 case HAL_AFSTATE_SCANNING:
5017 case HAL_AFSTATE_LOCKED:
5018 case HAL_AFSTATE_FAILED:
5019 case HAL_AFSTATE_NEEDS_DETERMINATION:
5020 case HAL_AFSTATE_PASSIVE_FOCUSED:
5021 SetAfMode(AA_AFMODE_OFF);
5022 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
5023 SetAfMode(AA_AFMODE_CONTINUOUS_PICTURE);
5024 nextState = HAL_AFSTATE_INACTIVE;
5025 break;
5026 default:
5027 break;
5028 }
5029 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
5030 if (nextState != NO_TRANSITION)
5031 m_afState = nextState;
5032}
5033
5034void ExynosCameraHWInterface2::OnAfCancelCAFVideo(int id)
5035{
5036 int nextState = NO_TRANSITION;
5037 m_afTriggerId = id;
5038
5039 switch (m_afState) {
5040 case HAL_AFSTATE_INACTIVE:
5041 nextState = NO_TRANSITION;
5042 break;
5043 case HAL_AFSTATE_NEEDS_COMMAND:
5044 case HAL_AFSTATE_STARTED:
5045 case HAL_AFSTATE_SCANNING:
5046 case HAL_AFSTATE_LOCKED:
5047 case HAL_AFSTATE_FAILED:
5048 case HAL_AFSTATE_NEEDS_DETERMINATION:
5049 case HAL_AFSTATE_PASSIVE_FOCUSED:
5050 SetAfMode(AA_AFMODE_OFF);
5051 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
5052 SetAfMode(AA_AFMODE_CONTINUOUS_VIDEO);
5053 nextState = HAL_AFSTATE_INACTIVE;
5054 break;
5055 default:
5056 break;
5057 }
5058 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
5059 if (nextState != NO_TRANSITION)
5060 m_afState = nextState;
5061}
5062
5063void ExynosCameraHWInterface2::SetAfStateForService(int newState)
5064{
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07005065 if (m_serviceAfState != newState || newState == 0)
5066 m_notifyCb(CAMERA2_MSG_AUTOFOCUS, newState, m_afTriggerId, 0, m_callbackCookie);
Sungjoong Kang0f26b202012-08-17 15:43:12 -07005067 m_serviceAfState = newState;
Sungjoong Kang0f26b202012-08-17 15:43:12 -07005068}
5069
5070int ExynosCameraHWInterface2::GetAfStateForService()
5071{
5072 return m_serviceAfState;
5073}
5074
5075void ExynosCameraHWInterface2::SetAfMode(enum aa_afmode afMode)
5076{
5077 if (m_afMode != afMode) {
5078 if (m_IsAfModeUpdateRequired) {
5079 m_afMode2 = afMode;
5080 ALOGV("(%s): pending(%d) and new(%d)", __FUNCTION__, m_afMode, afMode);
5081 }
5082 else {
5083 ALOGV("(%s): current(%d) new(%d)", __FUNCTION__, m_afMode, afMode);
5084 m_IsAfModeUpdateRequired = true;
5085 m_afMode = afMode;
Sungjoong Kangcd13bb72012-08-28 13:05:01 -07005086 if (m_afModeWaitingCnt != 0) {
5087 m_afModeWaitingCnt = 0;
hyeonmyeong Choi7d0efb52012-09-02 16:02:13 -07005088 m_afState = HAL_AFSTATE_INACTIVE;
Sungjoong Kangcd13bb72012-08-28 13:05:01 -07005089 OnAfTrigger(m_afPendingTriggerId);
5090 }
Sungjoong Kang8e2c2fd2012-08-27 00:02:22 -07005091 }
Sungjoong Kang0f26b202012-08-17 15:43:12 -07005092 }
5093}
5094
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005095void ExynosCameraHWInterface2::m_setExifFixedAttribute(void)
5096{
5097 char property[PROPERTY_VALUE_MAX];
5098
5099 //2 0th IFD TIFF Tags
Rebecca Schultz Zavin1b8ef182012-09-04 09:44:10 -07005100#if 0 // STOPSHIP TODO(aray): remove before launch, but for now don't leak product data
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005101 //3 Maker
5102 property_get("ro.product.brand", property, EXIF_DEF_MAKER);
5103 strncpy((char *)mExifInfo.maker, property,
5104 sizeof(mExifInfo.maker) - 1);
5105 mExifInfo.maker[sizeof(mExifInfo.maker) - 1] = '\0';
5106 //3 Model
5107 property_get("ro.product.model", property, EXIF_DEF_MODEL);
5108 strncpy((char *)mExifInfo.model, property,
5109 sizeof(mExifInfo.model) - 1);
5110 mExifInfo.model[sizeof(mExifInfo.model) - 1] = '\0';
5111 //3 Software
5112 property_get("ro.build.id", property, EXIF_DEF_SOFTWARE);
5113 strncpy((char *)mExifInfo.software, property,
5114 sizeof(mExifInfo.software) - 1);
5115 mExifInfo.software[sizeof(mExifInfo.software) - 1] = '\0';
Alex Ray5a92f772012-08-27 17:23:41 -07005116#endif
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005117
5118 //3 YCbCr Positioning
5119 mExifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
5120
5121 //2 0th IFD Exif Private Tags
5122 //3 F Number
Sungjoong Kange00f6592012-09-07 19:05:31 -07005123 mExifInfo.fnumber.num = (uint32_t)(m_camera2->m_curCameraInfo->fnumber * EXIF_DEF_FNUMBER_DEN);
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005124 mExifInfo.fnumber.den = EXIF_DEF_FNUMBER_DEN;
5125 //3 Exposure Program
5126 mExifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
5127 //3 Exif Version
5128 memcpy(mExifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(mExifInfo.exif_version));
5129 //3 Aperture
Sungjoong Kange00f6592012-09-07 19:05:31 -07005130 double av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num/mExifInfo.fnumber.den);
5131 mExifInfo.aperture.num = (uint32_t)(av*EXIF_DEF_APEX_DEN);
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005132 mExifInfo.aperture.den = EXIF_DEF_APEX_DEN;
5133 //3 Maximum lens aperture
5134 mExifInfo.max_aperture.num = mExifInfo.aperture.num;
5135 mExifInfo.max_aperture.den = mExifInfo.aperture.den;
5136 //3 Lens Focal Length
Sungjoong Kange00f6592012-09-07 19:05:31 -07005137 mExifInfo.focal_length.num = (uint32_t)(m_camera2->m_curCameraInfo->focalLength * 100);
5138
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005139 mExifInfo.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
5140 //3 User Comments
5141 strcpy((char *)mExifInfo.user_comment, EXIF_DEF_USERCOMMENTS);
5142 //3 Color Space information
5143 mExifInfo.color_space = EXIF_DEF_COLOR_SPACE;
5144 //3 Exposure Mode
5145 mExifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
5146
5147 //2 0th IFD GPS Info Tags
5148 unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
5149 memcpy(mExifInfo.gps_version_id, gps_version, sizeof(gps_version));
5150
5151 //2 1th IFD TIFF Tags
5152 mExifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
5153 mExifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
5154 mExifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
5155 mExifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
5156 mExifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
5157 mExifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
5158}
5159
5160void ExynosCameraHWInterface2::m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
5161 camera2_shot *currentEntry)
5162{
5163 camera2_dm *dm = &(currentEntry->dm);
5164 camera2_ctl *ctl = &(currentEntry->ctl);
5165
5166 ALOGV("(%s): framecnt(%d) exp(%lld) iso(%d)", __FUNCTION__, ctl->request.frameCount, dm->sensor.exposureTime,dm->aa.isoValue );
5167 if (!ctl->request.frameCount)
5168 return;
5169 //2 0th IFD TIFF Tags
5170 //3 Width
5171 exifInfo->width = rect->w;
5172 //3 Height
5173 exifInfo->height = rect->h;
5174 //3 Orientation
5175 switch (ctl->jpeg.orientation) {
5176 case 90:
5177 exifInfo->orientation = EXIF_ORIENTATION_90;
5178 break;
5179 case 180:
5180 exifInfo->orientation = EXIF_ORIENTATION_180;
5181 break;
5182 case 270:
5183 exifInfo->orientation = EXIF_ORIENTATION_270;
5184 break;
5185 case 0:
5186 default:
5187 exifInfo->orientation = EXIF_ORIENTATION_UP;
5188 break;
5189 }
5190
5191 //3 Date time
5192 time_t rawtime;
5193 struct tm *timeinfo;
5194 time(&rawtime);
5195 timeinfo = localtime(&rawtime);
5196 strftime((char *)exifInfo->date_time, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
5197
5198 //2 0th IFD Exif Private Tags
5199 //3 Exposure Time
5200 int shutterSpeed = (dm->sensor.exposureTime/1000);
5201
5202 if (shutterSpeed < 0) {
5203 shutterSpeed = 100;
5204 }
5205
5206 exifInfo->exposure_time.num = 1;
5207 // x us -> 1/x s */
5208 //exifInfo->exposure_time.den = (uint32_t)(1000000 / shutterSpeed);
5209 exifInfo->exposure_time.den = (uint32_t)((double)1000000 / shutterSpeed);
5210
5211 //3 ISO Speed Rating
5212 exifInfo->iso_speed_rating = dm->aa.isoValue;
5213
5214 uint32_t av, tv, bv, sv, ev;
5215 av = APEX_FNUM_TO_APERTURE((double)exifInfo->fnumber.num / exifInfo->fnumber.den);
5216 tv = APEX_EXPOSURE_TO_SHUTTER((double)exifInfo->exposure_time.num / exifInfo->exposure_time.den);
5217 sv = APEX_ISO_TO_FILMSENSITIVITY(exifInfo->iso_speed_rating);
5218 bv = av + tv - sv;
5219 ev = av + tv;
5220 //ALOGD("Shutter speed=%d us, iso=%d", shutterSpeed, exifInfo->iso_speed_rating);
5221 ALOGD("AV=%d, TV=%d, SV=%d", av, tv, sv);
5222
5223 //3 Shutter Speed
5224 exifInfo->shutter_speed.num = tv * EXIF_DEF_APEX_DEN;
5225 exifInfo->shutter_speed.den = EXIF_DEF_APEX_DEN;
5226 //3 Brightness
5227 exifInfo->brightness.num = bv*EXIF_DEF_APEX_DEN;
5228 exifInfo->brightness.den = EXIF_DEF_APEX_DEN;
5229 //3 Exposure Bias
5230 if (ctl->aa.sceneMode== AA_SCENE_MODE_BEACH||
5231 ctl->aa.sceneMode== AA_SCENE_MODE_SNOW) {
5232 exifInfo->exposure_bias.num = EXIF_DEF_APEX_DEN;
5233 exifInfo->exposure_bias.den = EXIF_DEF_APEX_DEN;
5234 } else {
5235 exifInfo->exposure_bias.num = 0;
5236 exifInfo->exposure_bias.den = 0;
5237 }
5238 //3 Metering Mode
5239 /*switch (m_curCameraInfo->metering) {
5240 case METERING_MODE_CENTER:
5241 exifInfo->metering_mode = EXIF_METERING_CENTER;
5242 break;
5243 case METERING_MODE_MATRIX:
5244 exifInfo->metering_mode = EXIF_METERING_MULTISPOT;
5245 break;
5246 case METERING_MODE_SPOT:
5247 exifInfo->metering_mode = EXIF_METERING_SPOT;
5248 break;
5249 case METERING_MODE_AVERAGE:
5250 default:
5251 exifInfo->metering_mode = EXIF_METERING_AVERAGE;
5252 break;
5253 }*/
5254 exifInfo->metering_mode = EXIF_METERING_CENTER;
5255
5256 //3 Flash
Younghwan Joo9257e292012-09-08 21:11:18 -07005257 /*
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005258 int flash = dm->flash.flashMode;
5259 if (dm->flash.flashMode == FLASH_MODE_OFF || flash < 0)
5260 exifInfo->flash = EXIF_DEF_FLASH;
5261 else
5262 exifInfo->flash = flash;
Younghwan Joo9257e292012-09-08 21:11:18 -07005263 */
5264 if (m_ctlInfo.flash.m_flashDecisionResult)
5265 exifInfo->flash = 1;
5266 else
5267 exifInfo->flash = EXIF_DEF_FLASH;
Sungjoong Kangeed7ed12012-08-23 16:35:08 -07005268
5269 //3 White Balance
5270 if (dm->aa.awbMode == AA_AWBMODE_WB_AUTO)
5271 exifInfo->white_balance = EXIF_WB_AUTO;
5272 else
5273 exifInfo->white_balance = EXIF_WB_MANUAL;
5274
5275 //3 Scene Capture Type
5276 switch (ctl->aa.sceneMode) {
5277 case AA_SCENE_MODE_PORTRAIT:
5278 exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
5279 break;
5280 case AA_SCENE_MODE_LANDSCAPE:
5281 exifInfo->scene_capture_type = EXIF_SCENE_LANDSCAPE;
5282 break;
5283 case AA_SCENE_MODE_NIGHT_PORTRAIT:
5284 exifInfo->scene_capture_type = EXIF_SCENE_NIGHT;
5285 break;
5286 default:
5287 exifInfo->scene_capture_type = EXIF_SCENE_STANDARD;
5288 break;
5289 }
5290
5291 //2 0th IFD GPS Info Tags
5292 if (ctl->jpeg.gpsCoordinates[0] != 0 && ctl->jpeg.gpsCoordinates[1] != 0) {
5293
5294 if (ctl->jpeg.gpsCoordinates[0] > 0)
5295 strcpy((char *)exifInfo->gps_latitude_ref, "N");
5296 else
5297 strcpy((char *)exifInfo->gps_latitude_ref, "S");
5298
5299 if (ctl->jpeg.gpsCoordinates[1] > 0)
5300 strcpy((char *)exifInfo->gps_longitude_ref, "E");
5301 else
5302 strcpy((char *)exifInfo->gps_longitude_ref, "W");
5303
5304 if (ctl->jpeg.gpsCoordinates[2] > 0)
5305 exifInfo->gps_altitude_ref = 0;
5306 else
5307 exifInfo->gps_altitude_ref = 1;
5308
5309 double latitude = fabs(ctl->jpeg.gpsCoordinates[0] / 10000.0);
5310 double longitude = fabs(ctl->jpeg.gpsCoordinates[1] / 10000.0);
5311 double altitude = fabs(ctl->jpeg.gpsCoordinates[2] / 100.0);
5312
5313 exifInfo->gps_latitude[0].num = (uint32_t)latitude;
5314 exifInfo->gps_latitude[0].den = 1;
5315 exifInfo->gps_latitude[1].num = (uint32_t)((latitude - exifInfo->gps_latitude[0].num) * 60);
5316 exifInfo->gps_latitude[1].den = 1;
5317 exifInfo->gps_latitude[2].num = (uint32_t)((((latitude - exifInfo->gps_latitude[0].num) * 60)
5318 - exifInfo->gps_latitude[1].num) * 60);
5319 exifInfo->gps_latitude[2].den = 1;
5320
5321 exifInfo->gps_longitude[0].num = (uint32_t)longitude;
5322 exifInfo->gps_longitude[0].den = 1;
5323 exifInfo->gps_longitude[1].num = (uint32_t)((longitude - exifInfo->gps_longitude[0].num) * 60);
5324 exifInfo->gps_longitude[1].den = 1;
5325 exifInfo->gps_longitude[2].num = (uint32_t)((((longitude - exifInfo->gps_longitude[0].num) * 60)
5326 - exifInfo->gps_longitude[1].num) * 60);
5327 exifInfo->gps_longitude[2].den = 1;
5328
5329 exifInfo->gps_altitude.num = (uint32_t)altitude;
5330 exifInfo->gps_altitude.den = 1;
5331
5332 struct tm tm_data;
5333 long timestamp;
5334 timestamp = (long)ctl->jpeg.gpsTimestamp;
5335 gmtime_r(&timestamp, &tm_data);
5336 exifInfo->gps_timestamp[0].num = tm_data.tm_hour;
5337 exifInfo->gps_timestamp[0].den = 1;
5338 exifInfo->gps_timestamp[1].num = tm_data.tm_min;
5339 exifInfo->gps_timestamp[1].den = 1;
5340 exifInfo->gps_timestamp[2].num = tm_data.tm_sec;
5341 exifInfo->gps_timestamp[2].den = 1;
5342 snprintf((char*)exifInfo->gps_datestamp, sizeof(exifInfo->gps_datestamp),
5343 "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
5344
5345 exifInfo->enableGps = true;
5346 } else {
5347 exifInfo->enableGps = false;
5348 }
5349
5350 //2 1th IFD TIFF Tags
5351 exifInfo->widthThumb = ctl->jpeg.thumbnailSize[0];
5352 exifInfo->heightThumb = ctl->jpeg.thumbnailSize[1];
5353}
5354
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005355ExynosCameraHWInterface2::MainThread::~MainThread()
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005356{
Sungjoong Kangad378612012-08-17 12:34:33 -07005357 ALOGV("(%s):", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005358}
5359
5360void ExynosCameraHWInterface2::MainThread::release()
5361{
Sungjoong Kangad378612012-08-17 12:34:33 -07005362 ALOGV("(%s):", __func__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005363 SetSignal(SIGNAL_THREAD_RELEASE);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005364}
5365
5366ExynosCameraHWInterface2::SensorThread::~SensorThread()
5367{
Sungjoong Kangad378612012-08-17 12:34:33 -07005368 ALOGV("(%s):", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005369}
5370
5371void ExynosCameraHWInterface2::SensorThread::release()
5372{
Sungjoong Kangad378612012-08-17 12:34:33 -07005373 ALOGV("(%s):", __func__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005374 SetSignal(SIGNAL_THREAD_RELEASE);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005375}
5376
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005377ExynosCameraHWInterface2::StreamThread::~StreamThread()
5378{
Sungjoong Kangad378612012-08-17 12:34:33 -07005379 ALOGV("(%s):", __FUNCTION__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005380}
5381
5382void ExynosCameraHWInterface2::StreamThread::setParameter(stream_parameters_t * new_parameters)
5383{
5384 ALOGV("DEBUG(%s):", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005385 memcpy(&m_parameters, new_parameters, sizeof(stream_parameters_t));
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005386}
5387
5388void ExynosCameraHWInterface2::StreamThread::release()
5389{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005390 ALOGV("(%s):", __func__);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005391 SetSignal(SIGNAL_THREAD_RELEASE);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005392}
5393
5394int ExynosCameraHWInterface2::StreamThread::findBufferIndex(void * bufAddr)
5395{
5396 int index;
5397 for (index = 0 ; index < m_parameters.numSvcBuffers ; index++) {
5398 if (m_parameters.svcBuffers[index].virt.extP[0] == bufAddr)
5399 return index;
5400 }
5401 return -1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005402}
5403
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005404int ExynosCameraHWInterface2::StreamThread::findBufferIndex(buffer_handle_t * bufHandle)
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005405{
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005406 int index;
5407 for (index = 0 ; index < m_parameters.numSvcBuffers ; index++) {
5408 if (m_parameters.svcBufHandle[index] == *bufHandle)
5409 return index;
5410 }
5411 return -1;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005412}
5413
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005414status_t ExynosCameraHWInterface2::StreamThread::attachSubStream(int stream_id, int priority)
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07005415{
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005416 ALOGV("(%s): substream_id(%d)", __FUNCTION__, stream_id);
5417 int index, vacantIndex;
5418 bool vacancy = false;
5419
5420 for (index = 0 ; index < NUM_MAX_SUBSTREAM ; index++) {
5421 if (!vacancy && m_attachedSubStreams[index].streamId == -1) {
5422 vacancy = true;
5423 vacantIndex = index;
5424 } else if (m_attachedSubStreams[index].streamId == stream_id) {
5425 return BAD_VALUE;
5426 }
5427 }
5428 if (!vacancy)
5429 return NO_MEMORY;
5430 m_attachedSubStreams[vacantIndex].streamId = stream_id;
5431 m_attachedSubStreams[vacantIndex].priority = priority;
5432 m_numRegisteredStream++;
5433 return NO_ERROR;
5434}
5435
5436status_t ExynosCameraHWInterface2::StreamThread::detachSubStream(int stream_id)
5437{
5438 ALOGV("(%s): substream_id(%d)", __FUNCTION__, stream_id);
5439 int index;
5440 bool found = false;
5441
5442 for (index = 0 ; index < NUM_MAX_SUBSTREAM ; index++) {
5443 if (m_attachedSubStreams[index].streamId == stream_id) {
5444 found = true;
5445 break;
5446 }
5447 }
5448 if (!found)
5449 return BAD_VALUE;
5450 m_attachedSubStreams[index].streamId = -1;
5451 m_attachedSubStreams[index].priority = 0;
5452 m_numRegisteredStream--;
5453 return NO_ERROR;
Sungjoong Kang74d78eb2012-08-29 13:25:46 -07005454}
5455
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005456int ExynosCameraHWInterface2::createIonClient(ion_client ionClient)
5457{
5458 if (ionClient == 0) {
5459 ionClient = ion_client_create();
5460 if (ionClient < 0) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005461 ALOGE("[%s]src ion client create failed, value = %d\n", __FUNCTION__, ionClient);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005462 return 0;
5463 }
5464 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005465 return ionClient;
5466}
5467
5468int ExynosCameraHWInterface2::deleteIonClient(ion_client ionClient)
5469{
5470 if (ionClient != 0) {
5471 if (ionClient > 0) {
5472 ion_client_destroy(ionClient);
5473 }
5474 ionClient = 0;
5475 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005476 return ionClient;
5477}
5478
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005479int ExynosCameraHWInterface2::allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005480{
Sungjoong Kang181e4252012-08-29 02:11:07 -07005481 return allocCameraMemory(ionClient, buf, iMemoryNum, 0);
5482}
5483
5484int ExynosCameraHWInterface2::allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum, int cacheFlag)
5485{
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005486 int ret = 0;
5487 int i = 0;
Sungjoong Kang181e4252012-08-29 02:11:07 -07005488 int flag = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005489
5490 if (ionClient == 0) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005491 ALOGE("[%s] ionClient is zero (%d)\n", __FUNCTION__, ionClient);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005492 return -1;
5493 }
5494
Sungjoong Kang181e4252012-08-29 02:11:07 -07005495 for (i = 0 ; i < iMemoryNum ; i++) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005496 if (buf->size.extS[i] == 0) {
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005497 break;
5498 }
Sungjoong Kang181e4252012-08-29 02:11:07 -07005499 if (1 << i & cacheFlag)
5500 flag = ION_FLAG_CACHED;
5501 else
5502 flag = 0;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005503 buf->fd.extFd[i] = ion_alloc(ionClient, \
Sungjoong Kang181e4252012-08-29 02:11:07 -07005504 buf->size.extS[i], 0, ION_HEAP_EXYNOS_MASK, flag);
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005505 if ((buf->fd.extFd[i] == -1) ||(buf->fd.extFd[i] == 0)) {
5506 ALOGE("[%s]ion_alloc(%d) failed\n", __FUNCTION__, buf->size.extS[i]);
5507 buf->fd.extFd[i] = -1;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005508 freeCameraMemory(buf, iMemoryNum);
5509 return -1;
5510 }
5511
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005512 buf->virt.extP[i] = (char *)ion_map(buf->fd.extFd[i], \
5513 buf->size.extS[i], 0);
5514 if ((buf->virt.extP[i] == (char *)MAP_FAILED) || (buf->virt.extP[i] == NULL)) {
5515 ALOGE("[%s]src ion map failed(%d)\n", __FUNCTION__, buf->size.extS[i]);
5516 buf->virt.extP[i] = (char *)MAP_FAILED;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005517 freeCameraMemory(buf, iMemoryNum);
5518 return -1;
5519 }
Sungjoong Kang181e4252012-08-29 02:11:07 -07005520 ALOGV("allocCameraMem : [%d][0x%08x] size(%d) flag(%d)", i, (unsigned int)(buf->virt.extP[i]), buf->size.extS[i], flag);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005521 }
5522
5523 return ret;
5524}
5525
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005526void ExynosCameraHWInterface2::freeCameraMemory(ExynosBuffer *buf, int iMemoryNum)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005527{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005528
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005529 int i = 0 ;
Sungjoong Kang15fd8232012-08-23 16:16:44 -07005530 int ret = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005531
5532 for (i=0;i<iMemoryNum;i++) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005533 if (buf->fd.extFd[i] != -1) {
5534 if (buf->virt.extP[i] != (char *)MAP_FAILED) {
Sungjoong Kang15fd8232012-08-23 16:16:44 -07005535 ret = ion_unmap(buf->virt.extP[i], buf->size.extS[i]);
5536 if (ret < 0)
5537 ALOGE("ERR(%s)", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005538 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005539 ion_free(buf->fd.extFd[i]);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005540 }
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005541 buf->fd.extFd[i] = -1;
5542 buf->virt.extP[i] = (char *)MAP_FAILED;
5543 buf->size.extS[i] = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005544 }
5545}
5546
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005547void ExynosCameraHWInterface2::initCameraMemory(ExynosBuffer *buf, int iMemoryNum)
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005548{
5549 int i =0 ;
5550 for (i=0;i<iMemoryNum;i++) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005551 buf->virt.extP[i] = (char *)MAP_FAILED;
5552 buf->fd.extFd[i] = -1;
5553 buf->size.extS[i] = 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005554 }
5555}
5556
5557
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005558
5559
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005560static camera2_device_t *g_cam2_device = NULL;
Sungjoong Kangb5237e62012-07-27 07:39:05 -07005561static bool g_camera_vaild = false;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07005562ExynosCamera2 * g_camera2[2] = { NULL, NULL };
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005563
5564static int HAL2_camera_device_close(struct hw_device_t* device)
5565{
Sungjoong Kangad378612012-08-17 12:34:33 -07005566 ALOGV("%s: ENTER", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005567 if (device) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005568
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005569 camera2_device_t *cam_device = (camera2_device_t *)device;
Sungjoong Kangad378612012-08-17 12:34:33 -07005570 ALOGV("cam_device(0x%08x):", (unsigned int)cam_device);
5571 ALOGV("g_cam2_device(0x%08x):", (unsigned int)g_cam2_device);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005572 delete static_cast<ExynosCameraHWInterface2 *>(cam_device->priv);
Sungjoong Kangad378612012-08-17 12:34:33 -07005573 g_cam2_device = NULL;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005574 free(cam_device);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07005575 g_camera_vaild = false;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005576 }
Sungjoong Kang15fd8232012-08-23 16:16:44 -07005577
Sungjoong Kangad378612012-08-17 12:34:33 -07005578 ALOGV("%s: EXIT", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005579 return 0;
5580}
5581
5582static inline ExynosCameraHWInterface2 *obj(const struct camera2_device *dev)
5583{
5584 return reinterpret_cast<ExynosCameraHWInterface2 *>(dev->priv);
5585}
5586
5587static int HAL2_device_set_request_queue_src_ops(const struct camera2_device *dev,
5588 const camera2_request_queue_src_ops_t *request_src_ops)
5589{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005590 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005591 return obj(dev)->setRequestQueueSrcOps(request_src_ops);
5592}
5593
5594static int HAL2_device_notify_request_queue_not_empty(const struct camera2_device *dev)
5595{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005596 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005597 return obj(dev)->notifyRequestQueueNotEmpty();
5598}
5599
5600static int HAL2_device_set_frame_queue_dst_ops(const struct camera2_device *dev,
5601 const camera2_frame_queue_dst_ops_t *frame_dst_ops)
5602{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005603 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005604 return obj(dev)->setFrameQueueDstOps(frame_dst_ops);
5605}
5606
5607static int HAL2_device_get_in_progress_count(const struct camera2_device *dev)
5608{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005609 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005610 return obj(dev)->getInProgressCount();
5611}
5612
5613static int HAL2_device_flush_captures_in_progress(const struct camera2_device *dev)
5614{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005615 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005616 return obj(dev)->flushCapturesInProgress();
5617}
5618
5619static int HAL2_device_construct_default_request(const struct camera2_device *dev,
5620 int request_template, camera_metadata_t **request)
5621{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005622 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005623 return obj(dev)->constructDefaultRequest(request_template, request);
5624}
5625
5626static int HAL2_device_allocate_stream(
5627 const struct camera2_device *dev,
5628 // inputs
5629 uint32_t width,
5630 uint32_t height,
5631 int format,
5632 const camera2_stream_ops_t *stream_ops,
5633 // outputs
5634 uint32_t *stream_id,
5635 uint32_t *format_actual,
5636 uint32_t *usage,
5637 uint32_t *max_buffers)
5638{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005639 ALOGV("(%s): ", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005640 return obj(dev)->allocateStream(width, height, format, stream_ops,
5641 stream_id, format_actual, usage, max_buffers);
5642}
5643
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005644static int HAL2_device_register_stream_buffers(const struct camera2_device *dev,
5645 uint32_t stream_id,
5646 int num_buffers,
5647 buffer_handle_t *buffers)
5648{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005649 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005650 return obj(dev)->registerStreamBuffers(stream_id, num_buffers, buffers);
5651}
5652
5653static int HAL2_device_release_stream(
5654 const struct camera2_device *dev,
5655 uint32_t stream_id)
5656{
Sungjoong Kangad378612012-08-17 12:34:33 -07005657 ALOGV("DEBUG(%s)(id: %d):", __FUNCTION__, stream_id);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07005658 if (!g_camera_vaild)
5659 return 0;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005660 return obj(dev)->releaseStream(stream_id);
5661}
5662
5663static int HAL2_device_allocate_reprocess_stream(
5664 const struct camera2_device *dev,
5665 uint32_t width,
5666 uint32_t height,
5667 uint32_t format,
5668 const camera2_stream_in_ops_t *reprocess_stream_ops,
5669 // outputs
5670 uint32_t *stream_id,
5671 uint32_t *consumer_usage,
5672 uint32_t *max_buffers)
5673{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005674 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005675 return obj(dev)->allocateReprocessStream(width, height, format, reprocess_stream_ops,
5676 stream_id, consumer_usage, max_buffers);
5677}
5678
Eino-Ville Talvala2b0421d2012-09-04 13:41:55 -07005679static int HAL2_device_allocate_reprocess_stream_from_stream(
5680 const struct camera2_device *dev,
5681 uint32_t output_stream_id,
5682 const camera2_stream_in_ops_t *reprocess_stream_ops,
5683 // outputs
5684 uint32_t *stream_id)
5685{
5686 ALOGV("DEBUG(%s):", __FUNCTION__);
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005687 return obj(dev)->allocateReprocessStreamFromStream(output_stream_id,
5688 reprocess_stream_ops, stream_id);
Eino-Ville Talvala2b0421d2012-09-04 13:41:55 -07005689}
5690
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005691static int HAL2_device_release_reprocess_stream(
5692 const struct camera2_device *dev,
5693 uint32_t stream_id)
5694{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005695 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005696 return obj(dev)->releaseReprocessStream(stream_id);
5697}
5698
5699static int HAL2_device_trigger_action(const struct camera2_device *dev,
5700 uint32_t trigger_id,
5701 int ext1,
5702 int ext2)
5703{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005704 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005705 return obj(dev)->triggerAction(trigger_id, ext1, ext2);
5706}
5707
5708static int HAL2_device_set_notify_callback(const struct camera2_device *dev,
5709 camera2_notify_callback notify_cb,
5710 void *user)
5711{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005712 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005713 return obj(dev)->setNotifyCallback(notify_cb, user);
5714}
5715
5716static int HAL2_device_get_metadata_vendor_tag_ops(const struct camera2_device*dev,
5717 vendor_tag_query_ops_t **ops)
5718{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005719 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005720 return obj(dev)->getMetadataVendorTagOps(ops);
5721}
5722
5723static int HAL2_device_dump(const struct camera2_device *dev, int fd)
5724{
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005725 ALOGV("DEBUG(%s):", __FUNCTION__);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005726 return obj(dev)->dump(fd);
5727}
5728
5729
5730
5731
5732
5733static int HAL2_getNumberOfCameras()
5734{
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005735 ALOGV("(%s): returning 2", __FUNCTION__);
5736 return 2;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005737}
5738
5739
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005740static int HAL2_getCameraInfo(int cameraId, struct camera_info *info)
5741{
Sungjoong Kangad378612012-08-17 12:34:33 -07005742 ALOGV("DEBUG(%s): cameraID: %d", __FUNCTION__, cameraId);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005743 static camera_metadata_t * mCameraInfo[2] = {NULL, NULL};
Sungjoong Kangad378612012-08-17 12:34:33 -07005744
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005745 status_t res;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005746
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07005747 if (cameraId == 0) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005748 info->facing = CAMERA_FACING_BACK;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07005749 if (!g_camera2[0])
5750 g_camera2[0] = new ExynosCamera2(0);
5751 }
5752 else if (cameraId == 1) {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005753 info->facing = CAMERA_FACING_FRONT;
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07005754 if (!g_camera2[1])
5755 g_camera2[1] = new ExynosCamera2(1);
5756 }
5757 else
5758 return BAD_VALUE;
5759
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005760 info->orientation = 0;
5761 info->device_version = HARDWARE_DEVICE_API_VERSION(2, 0);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005762 if (mCameraInfo[cameraId] == NULL) {
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07005763 res = g_camera2[cameraId]->constructStaticInfo(&(mCameraInfo[cameraId]), cameraId, true);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005764 if (res != OK) {
5765 ALOGE("%s: Unable to allocate static info: %s (%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005766 __FUNCTION__, strerror(-res), res);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005767 return res;
5768 }
Sungjoong Kangdaa1fcd2012-08-08 11:49:43 -07005769 res = g_camera2[cameraId]->constructStaticInfo(&(mCameraInfo[cameraId]), cameraId, false);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005770 if (res != OK) {
5771 ALOGE("%s: Unable to fill in static info: %s (%d)",
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005772 __FUNCTION__, strerror(-res), res);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005773 return res;
5774 }
5775 }
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005776 info->static_camera_characteristics = mCameraInfo[cameraId];
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005777 return NO_ERROR;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005778}
5779
5780#define SET_METHOD(m) m : HAL2_device_##m
5781
5782static camera2_device_ops_t camera2_device_ops = {
5783 SET_METHOD(set_request_queue_src_ops),
5784 SET_METHOD(notify_request_queue_not_empty),
5785 SET_METHOD(set_frame_queue_dst_ops),
5786 SET_METHOD(get_in_progress_count),
5787 SET_METHOD(flush_captures_in_progress),
5788 SET_METHOD(construct_default_request),
5789 SET_METHOD(allocate_stream),
5790 SET_METHOD(register_stream_buffers),
5791 SET_METHOD(release_stream),
5792 SET_METHOD(allocate_reprocess_stream),
Eino-Ville Talvala2b0421d2012-09-04 13:41:55 -07005793 SET_METHOD(allocate_reprocess_stream_from_stream),
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005794 SET_METHOD(release_reprocess_stream),
5795 SET_METHOD(trigger_action),
5796 SET_METHOD(set_notify_callback),
5797 SET_METHOD(get_metadata_vendor_tag_ops),
5798 SET_METHOD(dump),
5799};
5800
5801#undef SET_METHOD
5802
5803
5804static int HAL2_camera_device_open(const struct hw_module_t* module,
5805 const char *id,
5806 struct hw_device_t** device)
5807{
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005808 int cameraId = atoi(id);
Sungjoong Kang6044e502012-08-27 00:29:28 -07005809 int openInvalid = 0;
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005810
Sungjoong Kangb5237e62012-07-27 07:39:05 -07005811 g_camera_vaild = false;
Sungjoong Kangad378612012-08-17 12:34:33 -07005812 ALOGV("\n\n>>> I'm Samsung's CameraHAL_2(ID:%d) <<<\n\n", cameraId);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005813 if (cameraId < 0 || cameraId >= HAL2_getNumberOfCameras()) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005814 ALOGE("ERR(%s):Invalid camera ID %s", __FUNCTION__, id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005815 return -EINVAL;
5816 }
5817
Sungjoong Kangad378612012-08-17 12:34:33 -07005818 ALOGV("g_cam2_device : 0x%08x", (unsigned int)g_cam2_device);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005819 if (g_cam2_device) {
5820 if (obj(g_cam2_device)->getCameraId() == cameraId) {
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005821 ALOGV("DEBUG(%s):returning existing camera ID %s", __FUNCTION__, id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005822 goto done;
5823 } else {
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005824
5825 while (g_cam2_device)
5826 usleep(10000);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005827 }
5828 }
5829
5830 g_cam2_device = (camera2_device_t *)malloc(sizeof(camera2_device_t));
Sungjoong Kangad378612012-08-17 12:34:33 -07005831 ALOGV("g_cam2_device : 0x%08x", (unsigned int)g_cam2_device);
Sungjoong Kang9dd63e12012-07-24 00:25:51 +09005832
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005833 if (!g_cam2_device)
5834 return -ENOMEM;
5835
5836 g_cam2_device->common.tag = HARDWARE_DEVICE_TAG;
5837 g_cam2_device->common.version = CAMERA_DEVICE_API_VERSION_2_0;
5838 g_cam2_device->common.module = const_cast<hw_module_t *>(module);
5839 g_cam2_device->common.close = HAL2_camera_device_close;
5840
5841 g_cam2_device->ops = &camera2_device_ops;
5842
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005843 ALOGV("DEBUG(%s):open camera2 %s", __FUNCTION__, id);
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005844
Sungjoong Kang6044e502012-08-27 00:29:28 -07005845 g_cam2_device->priv = new ExynosCameraHWInterface2(cameraId, g_cam2_device, g_camera2[cameraId], &openInvalid);
5846 if (!openInvalid) {
Sungjoong Kang5506ceb2012-09-11 20:41:10 -07005847 ALOGE("DEBUG(%s): ExynosCameraHWInterface2 creation failed", __FUNCTION__);
Younghwan Joo6f19b6c2012-08-30 13:56:53 -07005848 return -ENODEV;
Sungjoong Kang6044e502012-08-27 00:29:28 -07005849 }
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005850done:
5851 *device = (hw_device_t *)g_cam2_device;
Sungjoong Kang13d8c7b2012-07-14 10:20:39 +09005852 ALOGV("DEBUG(%s):opened camera2 %s (%p)", __FUNCTION__, id, *device);
Sungjoong Kangb5237e62012-07-27 07:39:05 -07005853 g_camera_vaild = true;
Jiyoung Shinc15a6b02012-06-05 01:08:14 -07005854
5855 return 0;
5856}
5857
5858
5859static hw_module_methods_t camera_module_methods = {
5860 open : HAL2_camera_device_open
5861};
5862
5863extern "C" {
5864 struct camera_module HAL_MODULE_INFO_SYM = {
5865 common : {
5866 tag : HARDWARE_MODULE_TAG,
5867 module_api_version : CAMERA_MODULE_API_VERSION_2_0,
5868 hal_api_version : HARDWARE_HAL_API_VERSION,
5869 id : CAMERA_HARDWARE_MODULE_ID,
5870 name : "Exynos Camera HAL2",
5871 author : "Samsung Corporation",
5872 methods : &camera_module_methods,
5873 dso: NULL,
5874 reserved: {0},
5875 },
5876 get_number_of_cameras : HAL2_getNumberOfCameras,
5877 get_camera_info : HAL2_getCameraInfo
5878 };
5879}
5880
5881}; // namespace android