hardware: samsung_slsi: libcamera2: Support reverse order of ZSL setup
[GitHub/LineageOS/android_hardware_samsung_slsi_exynos5.git] / libcamera2 / ExynosCameraHWInterface2.cpp
CommitLineData
c15a6b00
JS
1/*
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)
13d8c7b4 23 * \date 2012/07/10
c15a6b00
JS
24 *
25 * <b>Revision History: </b>
26 * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n
27 * Initial Release
13d8c7b4
SK
28 *
29 * - 2012/07/10 : Sungjoong Kang(sj3.kang@samsung.com) \n
30 * 2nd Release
31 *
c15a6b00
JS
32 */
33
34//#define LOG_NDEBUG 0
9dd63e1f 35#define LOG_TAG "ExynosCameraHAL2"
c15a6b00
JS
36#include <utils/Log.h>
37
38#include "ExynosCameraHWInterface2.h"
39#include "exynos_format.h"
40
c15a6b00
JS
41namespace android {
42
9dd63e1f
SK
43void m_savePostView(const char *fname, uint8_t *buf, uint32_t size)
44{
45 int nw;
46 int cnt = 0;
47 uint32_t written = 0;
48
ad37861e 49 ALOGV("opening file [%s], address[%x], size(%d)", fname, (unsigned int)buf, size);
9dd63e1f
SK
50 int fd = open(fname, O_RDWR | O_CREAT, 0644);
51 if (fd < 0) {
52 ALOGE("failed to create file [%s]: %s", fname, strerror(errno));
53 return;
54 }
55
ad37861e 56 ALOGV("writing %d bytes to file [%s]", size, fname);
9dd63e1f
SK
57 while (written < size) {
58 nw = ::write(fd, buf + written, size - written);
59 if (nw < 0) {
60 ALOGE("failed to write to file %d [%s]: %s",written,fname, strerror(errno));
61 break;
62 }
63 written += nw;
64 cnt++;
65 }
ad37861e 66 ALOGV("done writing %d bytes to file [%s] in %d passes",size, fname, cnt);
9dd63e1f
SK
67 ::close(fd);
68}
69
c15a6b00
JS
70int get_pixel_depth(uint32_t fmt)
71{
72 int depth = 0;
73
74 switch (fmt) {
75 case V4L2_PIX_FMT_JPEG:
76 depth = 8;
77 break;
78
79 case V4L2_PIX_FMT_NV12:
80 case V4L2_PIX_FMT_NV21:
81 case V4L2_PIX_FMT_YUV420:
82 case V4L2_PIX_FMT_YVU420M:
83 case V4L2_PIX_FMT_NV12M:
84 case V4L2_PIX_FMT_NV12MT:
85 depth = 12;
86 break;
87
88 case V4L2_PIX_FMT_RGB565:
89 case V4L2_PIX_FMT_YUYV:
90 case V4L2_PIX_FMT_YVYU:
91 case V4L2_PIX_FMT_UYVY:
92 case V4L2_PIX_FMT_VYUY:
93 case V4L2_PIX_FMT_NV16:
94 case V4L2_PIX_FMT_NV61:
95 case V4L2_PIX_FMT_YUV422P:
96 case V4L2_PIX_FMT_SBGGR10:
97 case V4L2_PIX_FMT_SBGGR12:
98 case V4L2_PIX_FMT_SBGGR16:
99 depth = 16;
100 break;
101
102 case V4L2_PIX_FMT_RGB32:
103 depth = 32;
104 break;
105 default:
106 ALOGE("Get depth failed(format : %d)", fmt);
107 break;
108 }
109
110 return depth;
13d8c7b4 111}
c15a6b00
JS
112
113int cam_int_s_fmt(node_info_t *node)
114{
115 struct v4l2_format v4l2_fmt;
116 unsigned int framesize;
117 int ret;
118
119 memset(&v4l2_fmt, 0, sizeof(struct v4l2_format));
120
121 v4l2_fmt.type = node->type;
122 framesize = (node->width * node->height * get_pixel_depth(node->format)) / 8;
123
124 if (node->planes >= 1) {
125 v4l2_fmt.fmt.pix_mp.width = node->width;
126 v4l2_fmt.fmt.pix_mp.height = node->height;
127 v4l2_fmt.fmt.pix_mp.pixelformat = node->format;
128 v4l2_fmt.fmt.pix_mp.field = V4L2_FIELD_ANY;
129 } else {
13d8c7b4 130 ALOGE("%s:S_FMT, Out of bound : Number of element plane",__FUNCTION__);
c15a6b00
JS
131 }
132
133 /* Set up for capture */
134 ret = exynos_v4l2_s_fmt(node->fd, &v4l2_fmt);
135
136 if (ret < 0)
13d8c7b4 137 ALOGE("%s: exynos_v4l2_s_fmt fail (%d)",__FUNCTION__, ret);
c15a6b00 138
be494d19 139
c15a6b00
JS
140 return ret;
141}
142
143int cam_int_reqbufs(node_info_t *node)
144{
145 struct v4l2_requestbuffers req;
146 int ret;
147
148 req.count = node->buffers;
149 req.type = node->type;
150 req.memory = node->memory;
151
152 ret = exynos_v4l2_reqbufs(node->fd, &req);
153
154 if (ret < 0)
13d8c7b4 155 ALOGE("%s: VIDIOC_REQBUFS (fd:%d) failed (%d)",__FUNCTION__,node->fd, ret);
c15a6b00
JS
156
157 return req.count;
158}
159
160int cam_int_qbuf(node_info_t *node, int index)
161{
162 struct v4l2_buffer v4l2_buf;
163 struct v4l2_plane planes[VIDEO_MAX_PLANES];
164 int i;
165 int ret = 0;
166
167 v4l2_buf.m.planes = planes;
168 v4l2_buf.type = node->type;
169 v4l2_buf.memory = node->memory;
170 v4l2_buf.index = index;
171 v4l2_buf.length = node->planes;
172
173 for(i = 0; i < node->planes; i++){
13d8c7b4
SK
174 v4l2_buf.m.planes[i].m.fd = (int)(node->buffer[index].fd.extFd[i]);
175 v4l2_buf.m.planes[i].length = (unsigned long)(node->buffer[index].size.extS[i]);
c15a6b00
JS
176 }
177
178 ret = exynos_v4l2_qbuf(node->fd, &v4l2_buf);
179
180 if (ret < 0)
13d8c7b4 181 ALOGE("%s: cam_int_qbuf failed (index:%d)(ret:%d)",__FUNCTION__, index, ret);
c15a6b00
JS
182
183 return ret;
184}
185
186int cam_int_streamon(node_info_t *node)
187{
188 enum v4l2_buf_type type = node->type;
189 int ret;
190
be494d19 191
c15a6b00
JS
192 ret = exynos_v4l2_streamon(node->fd, type);
193
194 if (ret < 0)
ad37861e 195 ALOGE("%s: VIDIOC_STREAMON failed [%d] (%d)",__FUNCTION__, node->fd,ret);
c15a6b00
JS
196
197 ALOGV("On streaming I/O... ... fd(%d)", node->fd);
198
199 return ret;
200}
201
13d8c7b4
SK
202int cam_int_streamoff(node_info_t *node)
203{
ad37861e
SK
204 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
205 int ret;
13d8c7b4 206
be494d19 207
ad37861e
SK
208 ALOGV("Off streaming I/O... fd(%d)", node->fd);
209 ret = exynos_v4l2_streamoff(node->fd, type);
13d8c7b4
SK
210
211 if (ret < 0)
212 ALOGE("%s: VIDIOC_STREAMOFF failed (%d)",__FUNCTION__, ret);
213
ad37861e 214 return ret;
13d8c7b4
SK
215}
216
9dd63e1f
SK
217int isp_int_streamoff(node_info_t *node)
218{
ad37861e
SK
219 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
220 int ret;
9dd63e1f 221
ad37861e
SK
222 ALOGV("Off streaming I/O... fd(%d)", node->fd);
223 ret = exynos_v4l2_streamoff(node->fd, type);
9dd63e1f
SK
224
225 if (ret < 0)
226 ALOGE("%s: VIDIOC_STREAMOFF failed (%d)",__FUNCTION__, ret);
227
ad37861e 228 return ret;
9dd63e1f
SK
229}
230
c15a6b00
JS
231int cam_int_dqbuf(node_info_t *node)
232{
233 struct v4l2_buffer v4l2_buf;
234 struct v4l2_plane planes[VIDEO_MAX_PLANES];
235 int ret;
236
237 v4l2_buf.type = node->type;
238 v4l2_buf.memory = node->memory;
239 v4l2_buf.m.planes = planes;
240 v4l2_buf.length = node->planes;
241
242 ret = exynos_v4l2_dqbuf(node->fd, &v4l2_buf);
243 if (ret < 0)
13d8c7b4 244 ALOGE("%s: VIDIOC_DQBUF failed (%d)",__FUNCTION__, ret);
c15a6b00
JS
245
246 return v4l2_buf.index;
247}
248
feb7df4c
SK
249int cam_int_dqbuf(node_info_t *node, int num_plane)
250{
251 struct v4l2_buffer v4l2_buf;
252 struct v4l2_plane planes[VIDEO_MAX_PLANES];
253 int ret;
254
255 v4l2_buf.type = node->type;
256 v4l2_buf.memory = node->memory;
257 v4l2_buf.m.planes = planes;
258 v4l2_buf.length = num_plane;
259
260 ret = exynos_v4l2_dqbuf(node->fd, &v4l2_buf);
261 if (ret < 0)
262 ALOGE("%s: VIDIOC_DQBUF failed (%d)",__FUNCTION__, ret);
263
264 return v4l2_buf.index;
265}
266
c15a6b00
JS
267int cam_int_s_input(node_info_t *node, int index)
268{
269 int ret;
13d8c7b4 270
c15a6b00
JS
271 ret = exynos_v4l2_s_input(node->fd, index);
272 if (ret < 0)
13d8c7b4 273 ALOGE("%s: VIDIOC_S_INPUT failed (%d)",__FUNCTION__, ret);
c15a6b00
JS
274
275 return ret;
276}
277
278
279gralloc_module_t const* ExynosCameraHWInterface2::m_grallocHal;
280
281RequestManager::RequestManager(SignalDrivenThread* main_thread):
2bdec060
SK
282 m_lastAeMode(0),
283 m_lastAaMode(0),
284 m_lastAwbMode(0),
5c88d1f2 285 m_vdisBubbleEn(false),
2bdec060 286 m_lastAeComp(0),
ad37861e 287 m_frameIndex(-1)
c15a6b00
JS
288{
289 m_metadataConverter = new MetadataConverter;
290 m_mainThread = main_thread;
2adfa429 291 ResetEntry();
ad37861e 292 m_sensorPipelineSkipCnt = 0;
c15a6b00
JS
293 return;
294}
295
296RequestManager::~RequestManager()
297{
15fd8231
SK
298 ALOGV("%s", __FUNCTION__);
299 if (m_metadataConverter != NULL) {
300 delete m_metadataConverter;
301 m_metadataConverter = NULL;
302 }
303
52f54308 304 releaseSensorQ();
c15a6b00
JS
305 return;
306}
307
2adfa429
JS
308void RequestManager::ResetEntry()
309{
310 Mutex::Autolock lock(m_requestMutex);
311 for (int i=0 ; i<NUM_MAX_REQUEST_MGR_ENTRY; i++) {
312 memset(&(entries[i]), 0x00, sizeof(request_manager_entry_t));
313 entries[i].internal_shot.shot.ctl.request.frameCount = -1;
314 }
315 m_numOfEntries = 0;
316 m_entryInsertionIndex = -1;
317 m_entryProcessingIndex = -1;
318 m_entryFrameOutputIndex = -1;
319}
320
c15a6b00
JS
321int RequestManager::GetNumEntries()
322{
323 return m_numOfEntries;
324}
325
9dd63e1f
SK
326void RequestManager::SetDefaultParameters(int cropX)
327{
328 m_cropX = cropX;
329}
330
c15a6b00
JS
331bool RequestManager::IsRequestQueueFull()
332{
333 Mutex::Autolock lock(m_requestMutex);
334 if (m_numOfEntries>=NUM_MAX_REQUEST_MGR_ENTRY)
335 return true;
336 else
337 return false;
338}
339
340void RequestManager::RegisterRequest(camera_metadata_t * new_request)
341{
13d8c7b4
SK
342 ALOGV("DEBUG(%s):", __FUNCTION__);
343
c15a6b00 344 Mutex::Autolock lock(m_requestMutex);
13d8c7b4 345
c15a6b00 346 request_manager_entry * newEntry = NULL;
9dd63e1f 347 int newInsertionIndex = GetNextIndex(m_entryInsertionIndex);
13d8c7b4
SK
348 ALOGV("DEBUG(%s): got lock, new insertIndex(%d), cnt before reg(%d)", __FUNCTION__,newInsertionIndex,m_numOfEntries );
349
c15a6b00 350
c15a6b00
JS
351 newEntry = &(entries[newInsertionIndex]);
352
353 if (newEntry->status!=EMPTY) {
13d8c7b4
SK
354 ALOGV("DEBUG(%s): Circular buffer abnormal ", __FUNCTION__);
355 return;
c15a6b00
JS
356 }
357 newEntry->status = REGISTERED;
358 newEntry->original_request = new_request;
ad37861e 359 memset(&(newEntry->internal_shot), 0, sizeof(struct camera2_shot_ext));
13d8c7b4 360 m_metadataConverter->ToInternalShot(new_request, &(newEntry->internal_shot));
b56dcc00 361 newEntry->output_stream_count = newEntry->internal_shot.shot.ctl.request.outputStreams[15];
c15a6b00
JS
362
363 m_numOfEntries++;
364 m_entryInsertionIndex = newInsertionIndex;
365
13d8c7b4 366
c15a6b00 367 ALOGV("## RegisterReq DONE num(%d), insert(%d), processing(%d), frame(%d), (frameCnt(%d))",
be494d19 368 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex, newEntry->internal_shot.shot.ctl.request.frameCount);
c15a6b00
JS
369}
370
371void RequestManager::DeregisterRequest(camera_metadata_t ** deregistered_request)
372{
13d8c7b4 373 ALOGV("DEBUG(%s):", __FUNCTION__);
ad37861e
SK
374 int frame_index;
375 request_manager_entry * currentEntry;
c15a6b00 376
ad37861e 377 Mutex::Autolock lock(m_requestMutex);
13d8c7b4 378
ad37861e
SK
379 frame_index = GetFrameIndex();
380 currentEntry = &(entries[frame_index]);
2adfa429 381 if (currentEntry->status != METADONE) {
5c88d1f2
C
382 CAM_LOGD("DBG(%s): Circular buffer abnormal. processing(%d), frame(%d), status(%d) ", __FUNCTION__,
383 m_entryProcessingIndex, frame_index,(int)(currentEntry->status));
13d8c7b4 384 return;
c15a6b00 385 }
13d8c7b4
SK
386 if (deregistered_request) *deregistered_request = currentEntry->original_request;
387
c15a6b00
JS
388 currentEntry->status = EMPTY;
389 currentEntry->original_request = NULL;
be494d19
SK
390 memset(&(currentEntry->internal_shot), 0, sizeof(struct camera2_shot_ext));
391 currentEntry->internal_shot.shot.ctl.request.frameCount = -1;
c15a6b00
JS
392 currentEntry->output_stream_count = 0;
393 m_numOfEntries--;
394 ALOGV("## DeRegistReq DONE num(%d), insert(%d), processing(%d), frame(%d)",
395 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex);
13d8c7b4 396
c15a6b00 397 return;
c15a6b00
JS
398}
399
13d8c7b4 400bool RequestManager::PrepareFrame(size_t* num_entries, size_t* frame_size,
0f26b20f 401 camera_metadata_t ** prepared_frame, int afState)
c15a6b00 402{
13d8c7b4 403 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
404 Mutex::Autolock lock(m_requestMutex);
405 status_t res = NO_ERROR;
ad37861e 406 int tempFrameOutputIndex = GetFrameIndex();
13d8c7b4
SK
407 request_manager_entry * currentEntry = &(entries[tempFrameOutputIndex]);
408 ALOGV("DEBUG(%s): processing(%d), frameOut(%d), insert(%d) recentlycompleted(%d)", __FUNCTION__,
409 m_entryProcessingIndex, m_entryFrameOutputIndex, m_entryInsertionIndex, m_completedIndex);
410
2adfa429 411 if (currentEntry->status != METADONE) {
ad37861e 412 ALOGV("DBG(%s): Circular buffer abnormal status(%d)", __FUNCTION__, (int)(currentEntry->status));
13d8c7b4
SK
413
414 return false;
415 }
416 m_entryFrameOutputIndex = tempFrameOutputIndex;
a8be0011 417 m_tempFrameMetadata = place_camera_metadata(m_tempFrameMetadataBuf, 2000, 25, 500); //estimated
0f26b20f 418 add_camera_metadata_entry(m_tempFrameMetadata, ANDROID_CONTROL_AF_STATE, &afState, 1);
13d8c7b4 419 res = m_metadataConverter->ToDynamicMetadata(&(currentEntry->internal_shot),
c15a6b00
JS
420 m_tempFrameMetadata);
421 if (res!=NO_ERROR) {
13d8c7b4
SK
422 ALOGE("ERROR(%s): ToDynamicMetadata (%d) ", __FUNCTION__, res);
423 return false;
c15a6b00
JS
424 }
425 *num_entries = get_camera_metadata_entry_count(m_tempFrameMetadata);
426 *frame_size = get_camera_metadata_size(m_tempFrameMetadata);
427 *prepared_frame = m_tempFrameMetadata;
5506cebf
SK
428 ALOGV("## PrepareFrame DONE: frameOut(%d) frameCnt-req(%d) timestamp(%lld)", m_entryFrameOutputIndex,
429 currentEntry->internal_shot.shot.ctl.request.frameCount, currentEntry->internal_shot.shot.dm.sensor.timeStamp);
9dd63e1f 430 // Dump();
13d8c7b4 431 return true;
c15a6b00
JS
432}
433
0f26b20f 434int RequestManager::MarkProcessingRequest(ExynosBuffer* buf, int *afMode)
c15a6b00 435{
13d8c7b4 436 struct camera2_shot_ext * shot_ext;
b56dcc00 437 struct camera2_shot_ext * request_shot;
13d8c7b4 438 int targetStreamIndex = 0;
ad37861e 439 request_manager_entry * newEntry = NULL;
0f26b20f 440 static int count = 0;
13d8c7b4 441
52f54308 442 Mutex::Autolock lock(m_requestMutex);
13d8c7b4 443 if (m_numOfEntries == 0) {
4aa4d739 444 CAM_LOGD("DEBUG(%s): Request Manager Empty ", __FUNCTION__);
13d8c7b4
SK
445 return -1;
446 }
447
448 if ((m_entryProcessingIndex == m_entryInsertionIndex)
be494d19 449 && (entries[m_entryProcessingIndex].status == REQUESTED || entries[m_entryProcessingIndex].status == CAPTURED)) {
da7ca692 450 ALOGV("## MarkProcReq skipping(request underrun) - num(%d), insert(%d), processing(%d), frame(%d)",
13d8c7b4
SK
451 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex);
452 return -1;
453 }
c15a6b00 454
9dd63e1f 455 int newProcessingIndex = GetNextIndex(m_entryProcessingIndex);
ad37861e 456 ALOGV("DEBUG(%s): index(%d)", __FUNCTION__, newProcessingIndex);
c15a6b00 457
c15a6b00 458 newEntry = &(entries[newProcessingIndex]);
ad37861e 459 request_shot = &(newEntry->internal_shot);
0f26b20f 460 *afMode = (int)(newEntry->internal_shot.shot.ctl.aa.afMode);
be494d19 461 if (newEntry->status != REGISTERED) {
5c88d1f2
C
462 CAM_LOGD("DEBUG(%s)(%d): Circular buffer abnormal, numOfEntries(%d), status(%d)", __FUNCTION__, newProcessingIndex, m_numOfEntries, newEntry->status);
463 for (int i = 0; i < NUM_MAX_REQUEST_MGR_ENTRY; i++) {
464 CAM_LOGD("DBG: entrie[%d].stream output cnt = %d, framecnt(%d)", i, entries[i].output_stream_count, entries[i].internal_shot.shot.ctl.request.frameCount);
465 }
13d8c7b4 466 return -1;
c15a6b00 467 }
ad37861e 468
be494d19 469 newEntry->status = REQUESTED;
c15a6b00 470
ad37861e 471 shot_ext = (struct camera2_shot_ext *)buf->virt.extP[1];
13d8c7b4 472
ad37861e
SK
473 memset(shot_ext, 0x00, sizeof(struct camera2_shot_ext));
474 shot_ext->shot.ctl.request.frameCount = request_shot->shot.ctl.request.frameCount;
13d8c7b4 475 shot_ext->request_sensor = 1;
9dd63e1f
SK
476 shot_ext->dis_bypass = 1;
477 shot_ext->dnr_bypass = 1;
ad37861e
SK
478 shot_ext->fd_bypass = 1;
479 shot_ext->setfile = 0;
480
5506cebf
SK
481 targetStreamIndex = newEntry->internal_shot.shot.ctl.request.outputStreams[0];
482 shot_ext->shot.ctl.request.outputStreams[0] = targetStreamIndex;
483 if (targetStreamIndex & MASK_OUTPUT_SCP)
484 shot_ext->request_scp = 1;
13d8c7b4 485
5506cebf
SK
486 if (targetStreamIndex & MASK_OUTPUT_SCC)
487 shot_ext->request_scc = 1;
488
489 if (shot_ext->shot.ctl.stats.faceDetectMode != FACEDETECT_MODE_OFF)
490 shot_ext->fd_bypass = 0;
13d8c7b4 491
0f26b20f
SK
492 if (count == 0){
493 shot_ext->shot.ctl.aa.mode = AA_CONTROL_AUTO;
494 } else
495 shot_ext->shot.ctl.aa.mode = AA_CONTROL_NONE;
496
497 count++;
ad37861e
SK
498 shot_ext->shot.ctl.request.metadataMode = METADATA_MODE_FULL;
499 shot_ext->shot.ctl.stats.faceDetectMode = FACEDETECT_MODE_FULL;
500 shot_ext->shot.magicNumber = 0x23456789;
501 shot_ext->shot.ctl.sensor.exposureTime = 0;
502 shot_ext->shot.ctl.sensor.frameDuration = 33*1000*1000;
503 shot_ext->shot.ctl.sensor.sensitivity = 0;
504
e4657e32
SK
505
506 shot_ext->shot.ctl.scaler.cropRegion[0] = newEntry->internal_shot.shot.ctl.scaler.cropRegion[0];
507 shot_ext->shot.ctl.scaler.cropRegion[1] = newEntry->internal_shot.shot.ctl.scaler.cropRegion[1];
508 shot_ext->shot.ctl.scaler.cropRegion[2] = newEntry->internal_shot.shot.ctl.scaler.cropRegion[2];
13d8c7b4 509
ad37861e
SK
510 m_entryProcessingIndex = newProcessingIndex;
511 return newProcessingIndex;
c15a6b00
JS
512}
513
2adfa429 514void RequestManager::NotifyStreamOutput(int frameCnt)
c15a6b00 515{
9dd63e1f
SK
516 int index;
517
2adfa429
JS
518 Mutex::Autolock lock(m_requestMutex);
519 ALOGV("DEBUG(%s): frameCnt(%d)", __FUNCTION__, frameCnt);
9dd63e1f
SK
520
521 index = FindEntryIndexByFrameCnt(frameCnt);
522 if (index == -1) {
523 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
524 return;
525 }
2adfa429 526 ALOGV("DEBUG(%s): frameCnt(%d), last cnt (%d)", __FUNCTION__, frameCnt, entries[index].output_stream_count);
9dd63e1f 527
be494d19
SK
528 entries[index].output_stream_count--; //TODO : match stream id also
529 CheckCompleted(index);
13d8c7b4
SK
530}
531
532void RequestManager::CheckCompleted(int index)
533{
2adfa429
JS
534 if((entries[index].status == METADONE) && (entries[index].output_stream_count <= 0)){
535 ALOGV("send SIGNAL_MAIN_STREAM_OUTPUT_DONE(index:%d)(frameCnt:%d)",
536 index, entries[index].internal_shot.shot.ctl.request.frameCount );
537 SetFrameIndex(index);
538 m_mainThread->SetSignal(SIGNAL_MAIN_STREAM_OUTPUT_DONE);
539 }
c15a6b00 540}
9dd63e1f 541
ad37861e
SK
542void RequestManager::SetFrameIndex(int index)
543{
ad37861e
SK
544 m_frameIndex = index;
545}
546
547int RequestManager::GetFrameIndex()
548{
549 return m_frameIndex;
550}
551
52f54308
SK
552void RequestManager::pushSensorQ(int index)
553{
554 Mutex::Autolock lock(m_requestMutex);
555 m_sensorQ.push_back(index);
556}
557
558int RequestManager::popSensorQ()
559{
560 List<int>::iterator sensor_token;
561 int index;
562
563 Mutex::Autolock lock(m_requestMutex);
564
565 if(m_sensorQ.size() == 0)
566 return -1;
567
568 sensor_token = m_sensorQ.begin()++;
569 index = *sensor_token;
570 m_sensorQ.erase(sensor_token);
571
572 return (index);
573}
574
575void RequestManager::releaseSensorQ()
576{
577 List<int>::iterator r;
578
579 Mutex::Autolock lock(m_requestMutex);
0eb27a9d 580 ALOGV("(%s)m_sensorQ.size : %d", __FUNCTION__, m_sensorQ.size());
52f54308
SK
581
582 while(m_sensorQ.size() > 0){
583 r = m_sensorQ.begin()++;
584 m_sensorQ.erase(r);
585 }
586 return;
587}
588
ad37861e 589void RequestManager::ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext)
13d8c7b4 590{
9dd63e1f 591 int index;
b56dcc00
SK
592 struct camera2_shot_ext * request_shot;
593 nsecs_t timeStamp;
ad37861e 594 int i;
13d8c7b4 595
52f54308 596 Mutex::Autolock lock(m_requestMutex);
ad37861e 597 ALOGV("DEBUG(%s): frameCnt(%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount);
9dd63e1f 598
ad37861e
SK
599 for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
600 if((entries[i].internal_shot.shot.ctl.request.frameCount == shot_ext->shot.ctl.request.frameCount)
2adfa429
JS
601 && (entries[i].status == CAPTURED)){
602 entries[i].status =METADONE;
ad37861e 603 break;
2adfa429 604 }
ad37861e
SK
605 }
606
607 if (i == NUM_MAX_REQUEST_MGR_ENTRY){
608 ALOGE("[%s] no entry found(framecount:%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount);
9dd63e1f 609 return;
13d8c7b4 610 }
9dd63e1f 611
ad37861e 612 request_manager_entry * newEntry = &(entries[i]);
b56dcc00 613 request_shot = &(newEntry->internal_shot);
9dd63e1f 614
b56dcc00 615 timeStamp = request_shot->shot.dm.sensor.timeStamp;
ad37861e 616 memcpy(&(request_shot->shot.dm), &(shot_ext->shot.dm), sizeof(struct camera2_dm));
b56dcc00 617 request_shot->shot.dm.sensor.timeStamp = timeStamp;
5506cebf 618 m_lastTimeStamp = timeStamp;
ad37861e 619 CheckCompleted(i);
13d8c7b4
SK
620}
621
53f62ad9 622void RequestManager::UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt, ctl_request_info_t *ctl_info)
13d8c7b4 623{
9dd63e1f 624 int index, targetStreamIndex;
b56dcc00 625 struct camera2_shot_ext * request_shot;
9dd63e1f
SK
626
627 ALOGV("DEBUG(%s): updating info with frameCnt(%d)", __FUNCTION__, frameCnt);
628 if (frameCnt < 0)
13d8c7b4 629 return;
9dd63e1f
SK
630
631 index = FindEntryIndexByFrameCnt(frameCnt);
632 if (index == -1) {
633 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
634 return;
635 }
636
13d8c7b4 637 request_manager_entry * newEntry = &(entries[index]);
ad37861e 638 request_shot = &(newEntry->internal_shot);
2bdec060 639 memcpy(&(shot_ext->shot.ctl), &(request_shot->shot.ctl), sizeof(struct camera2_ctl));
2adfa429 640 shot_ext->shot.ctl.request.frameCount = frameCnt;
13d8c7b4 641 shot_ext->request_sensor = 1;
ad37861e
SK
642 shot_ext->dis_bypass = 1;
643 shot_ext->dnr_bypass = 1;
644 shot_ext->fd_bypass = 1;
645 shot_ext->setfile = 0;
646
13d8c7b4
SK
647 shot_ext->request_scc = 0;
648 shot_ext->request_scp = 0;
ad37861e 649
5506cebf
SK
650 shot_ext->isReprocessing = request_shot->isReprocessing;
651 shot_ext->reprocessInput = request_shot->reprocessInput;
9dd63e1f 652 shot_ext->shot.ctl.request.outputStreams[0] = 0;
9dd63e1f 653
e4657e32
SK
654 shot_ext->shot.ctl.scaler.cropRegion[0] = request_shot->shot.ctl.scaler.cropRegion[0];
655 shot_ext->shot.ctl.scaler.cropRegion[1] = request_shot->shot.ctl.scaler.cropRegion[1];
656 shot_ext->shot.ctl.scaler.cropRegion[2] = request_shot->shot.ctl.scaler.cropRegion[2];
657
53f62ad9
YJ
658 // mapping flash UI mode from aeMode
659 if (request_shot->shot.ctl.aa.aeMode >= AA_AEMODE_ON) {
4a9565ae 660 if (request_shot->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_PREVIEW)
73f5ad60 661 ctl_info->flash.i_flashMode = request_shot->shot.ctl.aa.aeMode;
53f62ad9
YJ
662 request_shot->shot.ctl.aa.aeMode = AA_AEMODE_ON;
663 }
664 // mapping awb UI mode form awbMode
4a9565ae
YJ
665 if (request_shot->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_PREVIEW)
666 ctl_info->awb.i_awbMode = request_shot->shot.ctl.aa.awbMode;
53f62ad9
YJ
667
668 // Apply ae/awb lock or unlock
e117f756
YJ
669 if (request_shot->ae_lock == AEMODE_LOCK_ON)
670 request_shot->shot.ctl.aa.aeMode = AA_AEMODE_LOCKED;
671 if (request_shot->awb_lock == AWBMODE_LOCK_ON)
672 request_shot->shot.ctl.aa.awbMode = AA_AWBMODE_LOCKED;
673
2bdec060
SK
674 if (m_lastAaMode == request_shot->shot.ctl.aa.mode) {
675 shot_ext->shot.ctl.aa.mode = (enum aa_mode)(0);
676 }
677 else {
678 shot_ext->shot.ctl.aa.mode = request_shot->shot.ctl.aa.mode;
679 m_lastAaMode = (int)(shot_ext->shot.ctl.aa.mode);
680 }
681 if (m_lastAeMode == request_shot->shot.ctl.aa.aeMode) {
682 shot_ext->shot.ctl.aa.aeMode = (enum aa_aemode)(0);
683 }
684 else {
685 shot_ext->shot.ctl.aa.aeMode = request_shot->shot.ctl.aa.aeMode;
686 m_lastAeMode = (int)(shot_ext->shot.ctl.aa.aeMode);
687 }
688 if (m_lastAwbMode == request_shot->shot.ctl.aa.awbMode) {
689 shot_ext->shot.ctl.aa.awbMode = (enum aa_awbmode)(0);
690 }
691 else {
692 shot_ext->shot.ctl.aa.awbMode = request_shot->shot.ctl.aa.awbMode;
693 m_lastAwbMode = (int)(shot_ext->shot.ctl.aa.awbMode);
694 }
695 if (m_lastAeComp == request_shot->shot.ctl.aa.aeExpCompensation) {
696 shot_ext->shot.ctl.aa.aeExpCompensation = 0;
697 }
698 else {
699 shot_ext->shot.ctl.aa.aeExpCompensation = request_shot->shot.ctl.aa.aeExpCompensation;
700 m_lastAeComp = (int)(shot_ext->shot.ctl.aa.aeExpCompensation);
701 }
ef6f83ca 702
5c88d1f2
C
703 if (request_shot->shot.ctl.aa.videoStabilizationMode) {
704 m_vdisBubbleEn = true;
705 shot_ext->dis_bypass = 0;
706 } else {
707 m_vdisBubbleEn = false;
708 shot_ext->dis_bypass = 1;
709 }
5c88d1f2 710
ef6f83ca
SK
711 shot_ext->shot.ctl.aa.afTrigger = 0;
712
5506cebf
SK
713 targetStreamIndex = newEntry->internal_shot.shot.ctl.request.outputStreams[0];
714 shot_ext->shot.ctl.request.outputStreams[0] = targetStreamIndex;
715 if (targetStreamIndex & MASK_OUTPUT_SCP)
716 shot_ext->request_scp = 1;
13d8c7b4 717
5506cebf
SK
718 if (targetStreamIndex & MASK_OUTPUT_SCC)
719 shot_ext->request_scc = 1;
720
721 if (shot_ext->shot.ctl.stats.faceDetectMode != FACEDETECT_MODE_OFF)
722 shot_ext->fd_bypass = 0;
723
724 if (targetStreamIndex & STREAM_MASK_RECORD) {
725 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 30;
726 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
13d8c7b4 727 }
5506cebf
SK
728
729 ALOGV("(%s): applied aa(%d) aemode(%d) expComp(%d), awb(%d) afmode(%d), ", __FUNCTION__,
730 (int)(shot_ext->shot.ctl.aa.mode), (int)(shot_ext->shot.ctl.aa.aeMode),
731 (int)(shot_ext->shot.ctl.aa.aeExpCompensation), (int)(shot_ext->shot.ctl.aa.awbMode),
732 (int)(shot_ext->shot.ctl.aa.afMode));
13d8c7b4
SK
733}
734
5c88d1f2
C
735bool RequestManager::IsVdisEnable(void)
736{
737 return m_vdisBubbleEn;
738}
5c88d1f2 739
9dd63e1f
SK
740int RequestManager::FindEntryIndexByFrameCnt(int frameCnt)
741{
742 for (int i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
be494d19 743 if (entries[i].internal_shot.shot.ctl.request.frameCount == frameCnt)
9dd63e1f
SK
744 return i;
745 }
746 return -1;
747}
748
749void RequestManager::RegisterTimestamp(int frameCnt, nsecs_t * frameTime)
13d8c7b4 750{
9dd63e1f
SK
751 int index = FindEntryIndexByFrameCnt(frameCnt);
752 if (index == -1) {
753 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
754 return;
755 }
756
13d8c7b4 757 request_manager_entry * currentEntry = &(entries[index]);
a8be0011
SK
758 if (currentEntry->internal_shot.isReprocessing == 1) {
759 ALOGV("DEBUG(%s): REPROCESSING : preserving timestamp for reqIndex(%d) frameCnt(%d) (%lld)", __FUNCTION__,
be494d19 760 index, frameCnt, currentEntry->internal_shot.shot.dm.sensor.timeStamp);
a8be0011
SK
761 } else {
762 currentEntry->internal_shot.shot.dm.sensor.timeStamp = *((uint64_t*)frameTime);
763 ALOGV("DEBUG(%s): applied timestamp for reqIndex(%d) frameCnt(%d) (%lld)", __FUNCTION__,
764 index, frameCnt, currentEntry->internal_shot.shot.dm.sensor.timeStamp);
765 }
13d8c7b4
SK
766}
767
5506cebf
SK
768
769nsecs_t RequestManager::GetTimestampByFrameCnt(int frameCnt)
770{
771 int index = FindEntryIndexByFrameCnt(frameCnt);
772 if (index == -1) {
773 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d) returning saved time(%lld)", __FUNCTION__, frameCnt, m_lastTimeStamp);
774 return m_lastTimeStamp;
775 }
776 else
777 return GetTimestamp(index);
778}
779
780nsecs_t RequestManager::GetTimestamp(int index)
13d8c7b4 781{
5f643a75 782 Mutex::Autolock lock(m_requestMutex);
eed7ed1b
SK
783 if (index < 0 || index >= NUM_MAX_REQUEST_MGR_ENTRY) {
784 ALOGE("ERR(%s): Request entry outside of bounds (%d)", __FUNCTION__, index);
9dd63e1f
SK
785 return 0;
786 }
787
13d8c7b4 788 request_manager_entry * currentEntry = &(entries[index]);
5f643a75 789 nsecs_t frameTime = currentEntry->internal_shot.shot.dm.sensor.timeStamp;
5506cebf
SK
790 if (frameTime == 0) {
791 ALOGV("DEBUG(%s): timestamp null, returning saved value", __FUNCTION__);
792 frameTime = m_lastTimeStamp;
793 }
9dd63e1f 794 ALOGV("DEBUG(%s): Returning timestamp for reqIndex(%d) (%lld)", __FUNCTION__, index, frameTime);
13d8c7b4
SK
795 return frameTime;
796}
797
2f4d175d
SK
798uint8_t RequestManager::GetOutputStreamByFrameCnt(int frameCnt)
799{
800 int index = FindEntryIndexByFrameCnt(frameCnt);
801 if (index == -1) {
802 ALOGE("ERR(%s): Cannot find entry for frameCnt(%d)", __FUNCTION__, frameCnt);
803 return 0;
804 }
805 else
806 return GetOutputStream(index);
807}
808
809uint8_t RequestManager::GetOutputStream(int index)
810{
811 Mutex::Autolock lock(m_requestMutex);
812 if (index < 0 || index >= NUM_MAX_REQUEST_MGR_ENTRY) {
813 ALOGE("ERR(%s): Request entry outside of bounds (%d)", __FUNCTION__, index);
814 return 0;
815 }
816
817 request_manager_entry * currentEntry = &(entries[index]);
818 return currentEntry->internal_shot.shot.ctl.request.outputStreams[0];
819}
820
9dd63e1f
SK
821int RequestManager::FindFrameCnt(struct camera2_shot_ext * shot_ext)
822{
ad37861e
SK
823 int i;
824
be494d19 825 if (m_numOfEntries == 0) {
5c88d1f2 826 CAM_LOGD("DBG(%s): No Entry found", __FUNCTION__);
be494d19
SK
827 return -1;
828 }
ad37861e 829
be494d19 830 for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
ad37861e 831 if(entries[i].internal_shot.shot.ctl.request.frameCount != shot_ext->shot.ctl.request.frameCount)
be494d19 832 continue;
ad37861e
SK
833
834 if (entries[i].status == REQUESTED) {
835 entries[i].status = CAPTURED;
836 return entries[i].internal_shot.shot.ctl.request.frameCount;
be494d19 837 }
5c88d1f2 838 CAM_LOGE("ERR(%s): frameCount(%d), index(%d), status(%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount, i, entries[i].status);
ad37861e 839
be494d19 840 }
5c88d1f2 841 CAM_LOGD("(%s): No Entry found frame count(%d)", __FUNCTION__, shot_ext->shot.ctl.request.frameCount);
ad37861e 842
be494d19 843 return -1;
9dd63e1f 844}
13d8c7b4 845
b5237e6b
SK
846void RequestManager::SetInitialSkip(int count)
847{
848 ALOGV("(%s): Pipeline Restarting. setting cnt(%d) - current(%d)", __FUNCTION__, count, m_sensorPipelineSkipCnt);
849 if (count > m_sensorPipelineSkipCnt)
850 m_sensorPipelineSkipCnt = count;
851}
852
ad37861e
SK
853int RequestManager::GetSkipCnt()
854{
855 ALOGV("(%s): skip cnt(%d)", __FUNCTION__, m_sensorPipelineSkipCnt);
856 if (m_sensorPipelineSkipCnt == 0)
857 return m_sensorPipelineSkipCnt;
858 else
859 return --m_sensorPipelineSkipCnt;
860}
861
13d8c7b4
SK
862void RequestManager::Dump(void)
863{
13d8c7b4
SK
864 int i = 0;
865 request_manager_entry * currentEntry;
ad37861e 866 ALOGD("## Dump totalentry(%d), insert(%d), processing(%d), frame(%d)",
13d8c7b4
SK
867 m_numOfEntries,m_entryInsertionIndex,m_entryProcessingIndex, m_entryFrameOutputIndex);
868
869 for (i = 0 ; i < NUM_MAX_REQUEST_MGR_ENTRY ; i++) {
870 currentEntry = &(entries[i]);
5506cebf 871 ALOGD("[%2d] status[%d] frameCnt[%3d] numOutput[%d] outstream[0]-%x ", i,
be494d19 872 currentEntry->status, currentEntry->internal_shot.shot.ctl.request.frameCount,
ad37861e 873 currentEntry->output_stream_count,
5506cebf 874 currentEntry->internal_shot.shot.ctl.request.outputStreams[0]);
13d8c7b4
SK
875 }
876}
c15a6b00 877
9dd63e1f
SK
878int RequestManager::GetNextIndex(int index)
879{
880 index++;
881 if (index >= NUM_MAX_REQUEST_MGR_ENTRY)
882 index = 0;
883
884 return index;
885}
886
6044e509 887ExynosCameraHWInterface2::ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid):
c15a6b00
JS
888 m_requestQueueOps(NULL),
889 m_frameQueueOps(NULL),
890 m_callbackCookie(NULL),
891 m_numOfRemainingReqInSvc(0),
892 m_isRequestQueuePending(false),
13d8c7b4 893 m_isRequestQueueNull(true),
ad37861e 894 m_isIspStarted(false),
13d8c7b4 895 m_ionCameraClient(0),
308291de 896 m_zoomRatio(1),
9dd63e1f
SK
897 m_scp_closing(false),
898 m_scp_closed(false),
0f26b20f
SK
899 m_afState(HAL_AFSTATE_INACTIVE),
900 m_afMode(NO_CHANGE),
901 m_afMode2(NO_CHANGE),
5c88d1f2
C
902 m_vdisBubbleCnt(0),
903 m_vdisDupFrame(0),
0f26b20f
SK
904 m_IsAfModeUpdateRequired(false),
905 m_IsAfTriggerRequired(false),
906 m_IsAfLockRequired(false),
90e439c1 907 m_sccLocalBufferValid(false),
15fd8231 908 m_wideAspect(false),
b55ed664
SK
909 m_scpOutputSignalCnt(0),
910 m_scpOutputImageCnt(0),
0f26b20f 911 m_afTriggerId(0),
8e2c2fdb
SK
912 m_afPendingTriggerId(0),
913 m_afModeWaitingCnt(0),
9dd63e1f 914 m_halDevice(dev),
a15b4e3f 915 m_nightCaptureCnt(0),
2f4d175d 916 m_nightCaptureFrameCnt(0),
2d5e6ec2
SK
917 m_cameraId(cameraId),
918 m_thumbNailW(160),
919 m_thumbNailH(120)
13d8c7b4 920{
ed4ad5fe 921 ALOGD("(%s): ENTER", __FUNCTION__);
c15a6b00 922 int ret = 0;
6044e509 923 int res = 0;
c15a6b00 924
13d8c7b4 925 m_exynosPictureCSC = NULL;
9dd63e1f 926 m_exynosVideoCSC = NULL;
13d8c7b4 927
c15a6b00
JS
928 if (!m_grallocHal) {
929 ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (const hw_module_t **)&m_grallocHal);
930 if (ret)
13d8c7b4
SK
931 ALOGE("ERR(%s):Fail on loading gralloc HAL", __FUNCTION__);
932 }
c15a6b00 933
daa1fcd6 934 m_camera2 = camera;
c15a6b00
JS
935 m_ionCameraClient = createIonClient(m_ionCameraClient);
936 if(m_ionCameraClient == 0)
13d8c7b4 937 ALOGE("ERR(%s):Fail on ion_client_create", __FUNCTION__);
c15a6b00 938
9dd63e1f
SK
939
940 m_BayerManager = new BayerBufManager();
c15a6b00 941 m_mainThread = new MainThread(this);
52f54308 942 m_requestManager = new RequestManager((SignalDrivenThread*)(m_mainThread.get()));
6044e509
SK
943 *openInvalid = InitializeISPChain();
944 if (*openInvalid < 0) {
ed4ad5fe 945 ALOGD("(%s): ISP chain init failed. exiting", __FUNCTION__);
6044e509
SK
946 // clean process
947 // 1. close video nodes
948 // SCP
5506cebf 949 res = exynos_v4l2_close(m_camera_info.scp.fd);
6044e509
SK
950 if (res != NO_ERROR ) {
951 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
952 }
953 // SCC
954 res = exynos_v4l2_close(m_camera_info.capture.fd);
955 if (res != NO_ERROR ) {
956 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
957 }
958 // Sensor
959 res = exynos_v4l2_close(m_camera_info.sensor.fd);
960 if (res != NO_ERROR ) {
961 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
962 }
963 // ISP
964 res = exynos_v4l2_close(m_camera_info.isp.fd);
965 if (res != NO_ERROR ) {
966 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
967 }
968 } else {
969 m_sensorThread = new SensorThread(this);
970 m_mainThread->Start("MainThread", PRIORITY_DEFAULT, 0);
053d38cf 971 m_sensorThread->Start("SensorThread", PRIORITY_DEFAULT, 0);
ed4ad5fe 972 ALOGV("DEBUG(%s): created sensorthread ", __FUNCTION__);
52f54308 973
5506cebf
SK
974 for (int i = 0 ; i < STREAM_ID_LAST+1 ; i++)
975 m_subStreams[i].type = SUBSTREAM_TYPE_NONE;
6044e509
SK
976 CSC_METHOD cscMethod = CSC_METHOD_HW;
977 m_exynosPictureCSC = csc_init(cscMethod);
978 if (m_exynosPictureCSC == NULL)
979 ALOGE("ERR(%s): csc_init() fail", __FUNCTION__);
980 csc_set_hw_property(m_exynosPictureCSC, CSC_HW_PROPERTY_FIXED_NODE, PICTURE_GSC_NODE_NUM);
15fd8231 981
6044e509
SK
982 m_exynosVideoCSC = csc_init(cscMethod);
983 if (m_exynosVideoCSC == NULL)
984 ALOGE("ERR(%s): csc_init() fail", __FUNCTION__);
985 csc_set_hw_property(m_exynosVideoCSC, CSC_HW_PROPERTY_FIXED_NODE, VIDEO_GSC_NODE_NUM);
9dd63e1f 986
6044e509 987 m_setExifFixedAttribute();
9a710a45
YJ
988
989 // contol information clear
990 // flash
991 m_ctlInfo.flash.i_flashMode = AA_AEMODE_ON;
992 m_ctlInfo.flash.m_afFlashDoneFlg= false;
9a710a45 993 m_ctlInfo.flash.m_flashEnableFlg = false;
9a710a45
YJ
994 m_ctlInfo.flash.m_flashFrameCount = 0;
995 m_ctlInfo.flash.m_flashCnt = 0;
996 m_ctlInfo.flash.m_flashTimeOut = 0;
caea49e6
YJ
997 m_ctlInfo.flash.m_flashDecisionResult = false;
998 m_ctlInfo.flash.m_flashTorchMode = false;
e117f756
YJ
999 m_ctlInfo.flash.m_precaptureState = 0;
1000 m_ctlInfo.flash.m_precaptureTriggerId = 0;
e117f756
YJ
1001 // awb
1002 m_ctlInfo.awb.i_awbMode = AA_AWBMODE_OFF;
73f5ad60
YJ
1003 // ae
1004 m_ctlInfo.ae.aeStateNoti = AE_STATE_INACTIVE;
4a9565ae
YJ
1005 // af
1006 m_ctlInfo.af.m_afTriggerTimeOut = 0;
6044e509 1007 }
ed4ad5fe 1008 ALOGD("(%s): EXIT", __FUNCTION__);
c15a6b00
JS
1009}
1010
1011ExynosCameraHWInterface2::~ExynosCameraHWInterface2()
1012{
ed4ad5fe 1013 ALOGD("(%s): ENTER", __FUNCTION__);
c15a6b00 1014 this->release();
ed4ad5fe 1015 ALOGD("(%s): EXIT", __FUNCTION__);
c15a6b00
JS
1016}
1017
1018void ExynosCameraHWInterface2::release()
1019{
13d8c7b4 1020 int i, res;
ed4ad5fe 1021 ALOGD("(HAL2::release): ENTER");
9dd63e1f 1022
ad37861e
SK
1023 if (m_streamThreads[1] != NULL) {
1024 m_streamThreads[1]->release();
1025 m_streamThreads[1]->SetSignal(SIGNAL_THREAD_TERMINATE);
1026 }
1027
1028 if (m_streamThreads[0] != NULL) {
1029 m_streamThreads[0]->release();
1030 m_streamThreads[0]->SetSignal(SIGNAL_THREAD_TERMINATE);
1031 }
1032
13d8c7b4
SK
1033 if (m_sensorThread != NULL) {
1034 m_sensorThread->release();
13d8c7b4 1035 }
c15a6b00
JS
1036
1037 if (m_mainThread != NULL) {
13d8c7b4 1038 m_mainThread->release();
13d8c7b4
SK
1039 }
1040
13d8c7b4
SK
1041 if (m_exynosPictureCSC)
1042 csc_deinit(m_exynosPictureCSC);
1043 m_exynosPictureCSC = NULL;
1044
9dd63e1f
SK
1045 if (m_exynosVideoCSC)
1046 csc_deinit(m_exynosVideoCSC);
1047 m_exynosVideoCSC = NULL;
1048
ad37861e 1049 if (m_streamThreads[1] != NULL) {
0eb27a9d 1050 ALOGD("(HAL2::release): START Waiting for (indirect) stream thread 1 termination");
ad37861e 1051 while (!m_streamThreads[1]->IsTerminated())
ad37861e 1052 usleep(100000);
0eb27a9d 1053 ALOGD("(HAL2::release): END Waiting for (indirect) stream thread 1 termination");
ad37861e
SK
1054 m_streamThreads[1] = NULL;
1055 }
1056
1057 if (m_streamThreads[0] != NULL) {
0eb27a9d 1058 ALOGD("(HAL2::release): START Waiting for (indirect) stream thread 0 termination");
ad37861e 1059 while (!m_streamThreads[0]->IsTerminated())
ad37861e 1060 usleep(100000);
0eb27a9d 1061 ALOGD("(HAL2::release): END Waiting for (indirect) stream thread 0 termination");
ad37861e
SK
1062 m_streamThreads[0] = NULL;
1063 }
1064
9dd63e1f 1065 if (m_sensorThread != NULL) {
0eb27a9d 1066 ALOGD("(HAL2::release): START Waiting for (indirect) sensor thread termination");
9dd63e1f 1067 while (!m_sensorThread->IsTerminated())
ad37861e 1068 usleep(100000);
0eb27a9d 1069 ALOGD("(HAL2::release): END Waiting for (indirect) sensor thread termination");
9dd63e1f
SK
1070 m_sensorThread = NULL;
1071 }
1072
ad37861e 1073 if (m_mainThread != NULL) {
0eb27a9d 1074 ALOGD("(HAL2::release): START Waiting for (indirect) main thread termination");
9dd63e1f 1075 while (!m_mainThread->IsTerminated())
ad37861e 1076 usleep(100000);
0eb27a9d 1077 ALOGD("(HAL2::release): END Waiting for (indirect) main thread termination");
9dd63e1f
SK
1078 m_mainThread = NULL;
1079 }
1080
15fd8231
SK
1081 if (m_requestManager != NULL) {
1082 delete m_requestManager;
1083 m_requestManager = NULL;
1084 }
1085
1086 if (m_BayerManager != NULL) {
1087 delete m_BayerManager;
1088 m_BayerManager = NULL;
1089 }
15fd8231 1090 for (i = 0; i < NUM_BAYER_BUFFERS; i++)
c15a6b00
JS
1091 freeCameraMemory(&m_camera_info.sensor.buffer[i], m_camera_info.sensor.planes);
1092
90e439c1
SK
1093 if (m_sccLocalBufferValid) {
1094 for (i = 0; i < NUM_SCC_BUFFERS; i++)
1095#ifdef ENABLE_FRAME_SYNC
1096 freeCameraMemory(&m_sccLocalBuffer[i], 2);
1097#else
1098 freeCameraMemory(&m_sccLocalBuffer[i], 1);
1099#endif
1100 }
1101 else {
1102 for (i = 0; i < NUM_SCC_BUFFERS; i++)
1103 freeCameraMemory(&m_camera_info.capture.buffer[i], m_camera_info.capture.planes);
1104 }
c15a6b00 1105
9dd63e1f 1106 ALOGV("DEBUG(%s): calling exynos_v4l2_close - sensor", __FUNCTION__);
13d8c7b4
SK
1107 res = exynos_v4l2_close(m_camera_info.sensor.fd);
1108 if (res != NO_ERROR ) {
9dd63e1f 1109 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
13d8c7b4
SK
1110 }
1111
9dd63e1f 1112 ALOGV("DEBUG(%s): calling exynos_v4l2_close - isp", __FUNCTION__);
13d8c7b4
SK
1113 res = exynos_v4l2_close(m_camera_info.isp.fd);
1114 if (res != NO_ERROR ) {
9dd63e1f 1115 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
13d8c7b4
SK
1116 }
1117
9dd63e1f 1118 ALOGV("DEBUG(%s): calling exynos_v4l2_close - capture", __FUNCTION__);
13d8c7b4
SK
1119 res = exynos_v4l2_close(m_camera_info.capture.fd);
1120 if (res != NO_ERROR ) {
9dd63e1f 1121 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
13d8c7b4
SK
1122 }
1123
9dd63e1f 1124 ALOGV("DEBUG(%s): calling exynos_v4l2_close - scp", __FUNCTION__);
5506cebf 1125 res = exynos_v4l2_close(m_camera_info.scp.fd);
13d8c7b4 1126 if (res != NO_ERROR ) {
9dd63e1f 1127 ALOGE("ERR(%s): exynos_v4l2_close failed(%d)",__FUNCTION__ , res);
13d8c7b4 1128 }
9dd63e1f 1129 ALOGV("DEBUG(%s): calling deleteIonClient", __FUNCTION__);
c15a6b00 1130 deleteIonClient(m_ionCameraClient);
ad37861e 1131
ed4ad5fe 1132 ALOGD("(HAL2::release): EXIT");
ad37861e
SK
1133}
1134
6044e509 1135int ExynosCameraHWInterface2::InitializeISPChain()
ad37861e
SK
1136{
1137 char node_name[30];
1138 int fd = 0;
1139 int i;
6044e509 1140 int ret = 0;
ad37861e
SK
1141
1142 /* Open Sensor */
1143 memset(&node_name, 0x00, sizeof(char[30]));
1144 sprintf(node_name, "%s%d", NODE_PREFIX, 40);
1145 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1146
1147 if (fd < 0) {
1148 ALOGE("ERR(%s): failed to open sensor video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1149 }
1150 else {
1151 ALOGV("DEBUG(%s): sensor video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1152 }
1153 m_camera_info.sensor.fd = fd;
1154
1155 /* Open ISP */
1156 memset(&node_name, 0x00, sizeof(char[30]));
1157 sprintf(node_name, "%s%d", NODE_PREFIX, 41);
1158 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1159
1160 if (fd < 0) {
1161 ALOGE("ERR(%s): failed to open isp video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1162 }
1163 else {
1164 ALOGV("DEBUG(%s): isp video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1165 }
1166 m_camera_info.isp.fd = fd;
1167
1168 /* Open ScalerC */
1169 memset(&node_name, 0x00, sizeof(char[30]));
1170 sprintf(node_name, "%s%d", NODE_PREFIX, 42);
1171 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1172
1173 if (fd < 0) {
1174 ALOGE("ERR(%s): failed to open capture video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1175 }
1176 else {
1177 ALOGV("DEBUG(%s): capture video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1178 }
1179 m_camera_info.capture.fd = fd;
1180
1181 /* Open ScalerP */
1182 memset(&node_name, 0x00, sizeof(char[30]));
1183 sprintf(node_name, "%s%d", NODE_PREFIX, 44);
1184 fd = exynos_v4l2_open(node_name, O_RDWR, 0);
1185 if (fd < 0) {
1186 ALOGE("DEBUG(%s): failed to open preview video node (%s) fd (%d)", __FUNCTION__,node_name, fd);
1187 }
1188 else {
1189 ALOGV("DEBUG(%s): preview video node opened(%s) fd (%d)", __FUNCTION__,node_name, fd);
1190 }
5506cebf 1191 m_camera_info.scp.fd = fd;
ad37861e
SK
1192
1193 if(m_cameraId == 0)
1194 m_camera_info.sensor_id = SENSOR_NAME_S5K4E5;
1195 else
1196 m_camera_info.sensor_id = SENSOR_NAME_S5K6A3;
1197
1198 memset(&m_camera_info.dummy_shot, 0x00, sizeof(struct camera2_shot_ext));
1199 m_camera_info.dummy_shot.shot.ctl.request.metadataMode = METADATA_MODE_FULL;
1200 m_camera_info.dummy_shot.shot.magicNumber = 0x23456789;
1201
1202 m_camera_info.dummy_shot.dis_bypass = 1;
1203 m_camera_info.dummy_shot.dnr_bypass = 1;
1204 m_camera_info.dummy_shot.fd_bypass = 1;
1205
1206 /*sensor setting*/
1207 m_camera_info.dummy_shot.shot.ctl.sensor.exposureTime = 0;
1208 m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 0;
1209 m_camera_info.dummy_shot.shot.ctl.sensor.sensitivity = 0;
1210
1211 m_camera_info.dummy_shot.shot.ctl.scaler.cropRegion[0] = 0;
1212 m_camera_info.dummy_shot.shot.ctl.scaler.cropRegion[1] = 0;
1213
1214 /*request setting*/
1215 m_camera_info.dummy_shot.request_sensor = 1;
1216 m_camera_info.dummy_shot.request_scc = 0;
1217 m_camera_info.dummy_shot.request_scp = 0;
1218 m_camera_info.dummy_shot.shot.ctl.request.outputStreams[0] = 0;
ad37861e
SK
1219
1220 m_camera_info.sensor.width = m_camera2->getSensorRawW();
1221 m_camera_info.sensor.height = m_camera2->getSensorRawH();
1222
1223 m_camera_info.sensor.format = V4L2_PIX_FMT_SBGGR16;
1224 m_camera_info.sensor.planes = 2;
1225 m_camera_info.sensor.buffers = NUM_BAYER_BUFFERS;
1226 m_camera_info.sensor.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1227 m_camera_info.sensor.memory = V4L2_MEMORY_DMABUF;
ad37861e
SK
1228
1229 for(i = 0; i < m_camera_info.sensor.buffers; i++){
1230 initCameraMemory(&m_camera_info.sensor.buffer[i], m_camera_info.sensor.planes);
1231 m_camera_info.sensor.buffer[i].size.extS[0] = m_camera_info.sensor.width*m_camera_info.sensor.height*2;
1232 m_camera_info.sensor.buffer[i].size.extS[1] = 8*1024; // HACK, driver use 8*1024, should be use predefined value
5506cebf 1233 allocCameraMemory(m_ionCameraClient, &m_camera_info.sensor.buffer[i], m_camera_info.sensor.planes, 1<<1);
ad37861e
SK
1234 }
1235
1236 m_camera_info.isp.width = m_camera_info.sensor.width;
1237 m_camera_info.isp.height = m_camera_info.sensor.height;
1238 m_camera_info.isp.format = m_camera_info.sensor.format;
1239 m_camera_info.isp.planes = m_camera_info.sensor.planes;
1240 m_camera_info.isp.buffers = m_camera_info.sensor.buffers;
1241 m_camera_info.isp.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1242 m_camera_info.isp.memory = V4L2_MEMORY_DMABUF;
ad37861e
SK
1243
1244 for(i = 0; i < m_camera_info.isp.buffers; i++){
1245 initCameraMemory(&m_camera_info.isp.buffer[i], m_camera_info.isp.planes);
1246 m_camera_info.isp.buffer[i].size.extS[0] = m_camera_info.sensor.buffer[i].size.extS[0];
1247 m_camera_info.isp.buffer[i].size.extS[1] = m_camera_info.sensor.buffer[i].size.extS[1];
1248 m_camera_info.isp.buffer[i].fd.extFd[0] = m_camera_info.sensor.buffer[i].fd.extFd[0];
1249 m_camera_info.isp.buffer[i].fd.extFd[1] = m_camera_info.sensor.buffer[i].fd.extFd[1];
1250 m_camera_info.isp.buffer[i].virt.extP[0] = m_camera_info.sensor.buffer[i].virt.extP[0];
1251 m_camera_info.isp.buffer[i].virt.extP[1] = m_camera_info.sensor.buffer[i].virt.extP[1];
1252 };
1253
1254 /* init ISP */
6044e509
SK
1255 ret = cam_int_s_input(&(m_camera_info.isp), m_camera_info.sensor_id);
1256 if (ret < 0) {
1257 ALOGE("ERR(%s): cam_int_s_input(%d) failed!!!! ", __FUNCTION__, m_camera_info.sensor_id);
1258 return false;
1259 }
ad37861e
SK
1260 cam_int_s_fmt(&(m_camera_info.isp));
1261 ALOGV("DEBUG(%s): isp calling reqbuf", __FUNCTION__);
1262 cam_int_reqbufs(&(m_camera_info.isp));
1263 ALOGV("DEBUG(%s): isp calling querybuf", __FUNCTION__);
1264 ALOGV("DEBUG(%s): isp mem alloc done", __FUNCTION__);
1265
1266 /* init Sensor */
1267 cam_int_s_input(&(m_camera_info.sensor), m_camera_info.sensor_id);
1268 ALOGV("DEBUG(%s): sensor s_input done", __FUNCTION__);
1269 if (cam_int_s_fmt(&(m_camera_info.sensor))< 0) {
1270 ALOGE("ERR(%s): sensor s_fmt fail", __FUNCTION__);
1271 }
1272 ALOGV("DEBUG(%s): sensor s_fmt done", __FUNCTION__);
1273 cam_int_reqbufs(&(m_camera_info.sensor));
1274 ALOGV("DEBUG(%s): sensor reqbuf done", __FUNCTION__);
1275 for (i = 0; i < m_camera_info.sensor.buffers; i++) {
1276 ALOGV("DEBUG(%s): sensor initial QBUF [%d]", __FUNCTION__, i);
ad37861e
SK
1277 m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 33*1000*1000; // apply from frame #1
1278 m_camera_info.dummy_shot.shot.ctl.request.frameCount = -1;
52f54308
SK
1279 memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
1280 sizeof(struct camera2_shot_ext));
ad37861e 1281 }
52f54308
SK
1282
1283 for (i = 0; i < NUM_MIN_SENSOR_QBUF; i++)
1284 cam_int_qbuf(&(m_camera_info.sensor), i);
1285
1286 for (i = NUM_MIN_SENSOR_QBUF; i < m_camera_info.sensor.buffers; i++)
1287 m_requestManager->pushSensorQ(i);
1288
5506cebf 1289 ALOGV("== stream_on :: sensor");
ad37861e 1290 cam_int_streamon(&(m_camera_info.sensor));
5506cebf 1291 m_camera_info.sensor.status = true;
ad37861e
SK
1292
1293 /* init Capture */
1294 m_camera_info.capture.width = m_camera2->getSensorW();
1295 m_camera_info.capture.height = m_camera2->getSensorH();
1296 m_camera_info.capture.format = V4L2_PIX_FMT_YUYV;
feb7df4c
SK
1297#ifdef ENABLE_FRAME_SYNC
1298 m_camera_info.capture.planes = 2;
1299#else
ad37861e 1300 m_camera_info.capture.planes = 1;
feb7df4c 1301#endif
ac8c2060 1302 m_camera_info.capture.buffers = NUM_SCC_BUFFERS;
ad37861e
SK
1303 m_camera_info.capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1304 m_camera_info.capture.memory = V4L2_MEMORY_DMABUF;
ad37861e 1305
5506cebf
SK
1306 m_camera_info.capture.status = false;
1307
1308 return true;
1309}
1310
1311void ExynosCameraHWInterface2::StartSCCThread(bool threadExists)
1312{
1313 ALOGV("(%s)", __FUNCTION__);
1314 StreamThread *AllocatedStream;
1315 stream_parameters_t newParameters;
1316 uint32_t format_actual;
5506cebf
SK
1317
1318
1319 if (!threadExists) {
1320 m_streamThreads[1] = new StreamThread(this, 1);
1321 }
1322 AllocatedStream = (StreamThread*)(m_streamThreads[1].get());
b8d41ae2 1323 if (!threadExists) {
053d38cf 1324 AllocatedStream->Start("StreamThread", PRIORITY_DEFAULT, 0);
5506cebf 1325 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
b8d41ae2
SK
1326 AllocatedStream->m_numRegisteredStream = 1;
1327 }
5506cebf
SK
1328 AllocatedStream->m_index = 1;
1329
1330 format_actual = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
1331
1332 newParameters.width = m_camera2->getSensorW();
1333 newParameters.height = m_camera2->getSensorH();
1334 newParameters.format = format_actual;
1335 newParameters.streamOps = NULL;
ac8c2060 1336 newParameters.numHwBuffers = NUM_SCC_BUFFERS;
feb7df4c 1337#ifdef ENABLE_FRAME_SYNC
5506cebf 1338 newParameters.planes = 2;
2adfa429 1339#else
5506cebf 1340 newParameters.planes = 1;
2adfa429 1341#endif
ad37861e 1342
5506cebf
SK
1343 newParameters.numSvcBufsInHal = 0;
1344
1345 newParameters.node = &m_camera_info.capture;
1346
1347 AllocatedStream->streamType = STREAM_TYPE_INDIRECT;
5506cebf
SK
1348 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
1349
90e439c1
SK
1350 if (!threadExists) {
1351 if (!m_sccLocalBufferValid) {
1352 for (int i = 0; i < m_camera_info.capture.buffers; i++){
1353 initCameraMemory(&m_camera_info.capture.buffer[i], newParameters.node->planes);
1354 m_camera_info.capture.buffer[i].size.extS[0] = m_camera_info.capture.width*m_camera_info.capture.height*2;
5506cebf 1355#ifdef ENABLE_FRAME_SYNC
90e439c1
SK
1356 m_camera_info.capture.buffer[i].size.extS[1] = 4*1024; // HACK, driver use 4*1024, should be use predefined value
1357 allocCameraMemory(m_ionCameraClient, &m_camera_info.capture.buffer[i], m_camera_info.capture.planes, 1<<1);
5506cebf 1358#else
90e439c1 1359 allocCameraMemory(m_ionCameraClient, &m_camera_info.capture.buffer[i], m_camera_info.capture.planes);
5506cebf 1360#endif
90e439c1
SK
1361 m_sccLocalBuffer[i] = m_camera_info.capture.buffer[i];
1362 }
1363 m_sccLocalBufferValid = true;
1364 }
1365 } else {
1366 if (m_sccLocalBufferValid) {
1367 for (int i = 0; i < m_camera_info.capture.buffers; i++)
1368 m_camera_info.capture.buffer[i] = m_sccLocalBuffer[i];
1369 } else {
1370 ALOGE("(%s): SCC Thread starting with no buffer", __FUNCTION__);
5506cebf
SK
1371 }
1372 }
1373 cam_int_s_input(newParameters.node, m_camera_info.sensor_id);
ac8c2060 1374 m_camera_info.capture.buffers = NUM_SCC_BUFFERS;
5506cebf 1375 cam_int_s_fmt(newParameters.node);
ad37861e 1376 ALOGV("DEBUG(%s): capture calling reqbuf", __FUNCTION__);
5506cebf 1377 cam_int_reqbufs(newParameters.node);
ad37861e
SK
1378 ALOGV("DEBUG(%s): capture calling querybuf", __FUNCTION__);
1379
5506cebf 1380 for (int i = 0; i < newParameters.node->buffers; i++) {
ad37861e 1381 ALOGV("DEBUG(%s): capture initial QBUF [%d]", __FUNCTION__, i);
5506cebf
SK
1382 cam_int_qbuf(newParameters.node, i);
1383 newParameters.svcBufStatus[i] = ON_DRIVER;
ad37861e
SK
1384 }
1385
1386 ALOGV("== stream_on :: capture");
5506cebf 1387 if (cam_int_streamon(newParameters.node) < 0) {
15fd8231
SK
1388 ALOGE("ERR(%s): capture stream on fail", __FUNCTION__);
1389 } else {
1390 m_camera_info.capture.status = true;
1391 }
6044e509 1392
5506cebf
SK
1393 AllocatedStream->setParameter(&newParameters);
1394 AllocatedStream->m_activated = true;
1395 AllocatedStream->m_isBufferInit = true;
ad37861e
SK
1396}
1397
1398void ExynosCameraHWInterface2::StartISP()
1399{
ad37861e
SK
1400 ALOGV("== stream_on :: isp");
1401 cam_int_streamon(&(m_camera_info.isp));
ad37861e 1402 exynos_v4l2_s_ctrl(m_camera_info.sensor.fd, V4L2_CID_IS_S_STREAM, IS_ENABLE_STREAM);
13d8c7b4
SK
1403}
1404
c15a6b00
JS
1405int ExynosCameraHWInterface2::getCameraId() const
1406{
9dd63e1f 1407 return m_cameraId;
c15a6b00 1408}
c15a6b00
JS
1409
1410int ExynosCameraHWInterface2::setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops)
1411{
13d8c7b4 1412 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
1413 if ((NULL != request_src_ops) && (NULL != request_src_ops->dequeue_request)
1414 && (NULL != request_src_ops->free_request) && (NULL != request_src_ops->request_count)) {
1415 m_requestQueueOps = (camera2_request_queue_src_ops_t*)request_src_ops;
1416 return 0;
1417 }
1418 else {
13d8c7b4 1419 ALOGE("DEBUG(%s):setRequestQueueSrcOps : NULL arguments", __FUNCTION__);
c15a6b00
JS
1420 return 1;
1421 }
1422}
1423
1424int ExynosCameraHWInterface2::notifyRequestQueueNotEmpty()
1425{
5506cebf
SK
1426 int i = 0;
1427
b5237e6b 1428 ALOGV("DEBUG(%s):setting [SIGNAL_MAIN_REQ_Q_NOT_EMPTY] current(%d)", __FUNCTION__, m_requestManager->GetNumEntries());
c15a6b00 1429 if ((NULL==m_frameQueueOps)|| (NULL==m_requestQueueOps)) {
13d8c7b4 1430 ALOGE("DEBUG(%s):queue ops NULL. ignoring request", __FUNCTION__);
c15a6b00
JS
1431 return 0;
1432 }
13d8c7b4 1433 m_isRequestQueueNull = false;
0f26b20f
SK
1434 if (m_requestManager->GetNumEntries() == 0)
1435 m_requestManager->SetInitialSkip(5);
5506cebf
SK
1436
1437 if (m_isIspStarted == false) {
1438 /* isp */
1439 m_camera_info.sensor.buffers = NUM_BAYER_BUFFERS;
1440 m_camera_info.isp.buffers = m_camera_info.sensor.buffers;
1441 cam_int_s_fmt(&(m_camera_info.isp));
1442 cam_int_reqbufs(&(m_camera_info.isp));
1443
1444 /* sensor */
1445 if (m_camera_info.sensor.status == false) {
1446 cam_int_s_fmt(&(m_camera_info.sensor));
1447 cam_int_reqbufs(&(m_camera_info.sensor));
1448
1449 for (i = 0; i < m_camera_info.sensor.buffers; i++) {
1450 ALOGV("DEBUG(%s): sensor initial QBUF [%d]", __FUNCTION__, i);
1451 m_camera_info.dummy_shot.shot.ctl.sensor.frameDuration = 33*1000*1000; // apply from frame #1
1452 m_camera_info.dummy_shot.shot.ctl.request.frameCount = -1;
1453 memcpy( m_camera_info.sensor.buffer[i].virt.extP[1], &(m_camera_info.dummy_shot),
1454 sizeof(struct camera2_shot_ext));
1455 }
1456 for (i = 0; i < NUM_MIN_SENSOR_QBUF; i++)
1457 cam_int_qbuf(&(m_camera_info.sensor), i);
1458
1459 for (i = NUM_MIN_SENSOR_QBUF; i < m_camera_info.sensor.buffers; i++)
1460 m_requestManager->pushSensorQ(i);
1461 ALOGV("DEBUG(%s): calling sensor streamon", __FUNCTION__);
1462 cam_int_streamon(&(m_camera_info.sensor));
1463 m_camera_info.sensor.status = true;
1464 }
1465 }
1466 if (!(m_streamThreads[1].get())) {
1467 ALOGV("DEBUG(%s): stream thread 1 not exist. starting without stream", __FUNCTION__);
1468 StartSCCThread(false);
1469 } else {
1470 if (m_streamThreads[1]->m_activated == false) {
1471 ALOGV("DEBUG(%s): stream thread 1 suspended. restarting", __FUNCTION__);
1472 StartSCCThread(true);
1473 } else {
1474 if (m_camera_info.capture.status == false) {
ac8c2060 1475 m_camera_info.capture.buffers = NUM_SCC_BUFFERS;
5506cebf
SK
1476 cam_int_s_fmt(&(m_camera_info.capture));
1477 ALOGV("DEBUG(%s): capture calling reqbuf", __FUNCTION__);
1478 cam_int_reqbufs(&(m_camera_info.capture));
1479 ALOGV("DEBUG(%s): capture calling querybuf", __FUNCTION__);
1480
b8d41ae2
SK
1481 if (m_streamThreads[1]->streamType == STREAM_TYPE_DIRECT) {
1482 StreamThread * targetStream = m_streamThreads[1].get();
1483 stream_parameters_t *targetStreamParms = &(targetStream->m_parameters);
1484 node_info_t *currentNode = targetStreamParms->node;
1485
1486 struct v4l2_buffer v4l2_buf;
1487 struct v4l2_plane planes[VIDEO_MAX_PLANES];
1488
1489 for (i = 0 ; i < targetStreamParms->numSvcBuffers ; i++) {
1490 v4l2_buf.m.planes = planes;
1491 v4l2_buf.type = currentNode->type;
1492 v4l2_buf.memory = currentNode->memory;
1493
1494 v4l2_buf.length = currentNode->planes;
1495 v4l2_buf.index = i;
1496 ExynosBuffer metaBuf = targetStreamParms->metaBuffers[i];
1497
1498 if (i < currentNode->buffers) {
1499#ifdef ENABLE_FRAME_SYNC
1500 v4l2_buf.m.planes[0].m.fd = targetStreamParms->svcBuffers[i].fd.extFd[0];
1501 v4l2_buf.m.planes[2].m.fd = targetStreamParms->svcBuffers[i].fd.extFd[1];
1502 v4l2_buf.m.planes[1].m.fd = targetStreamParms->svcBuffers[i].fd.extFd[2];
1503 v4l2_buf.length += targetStreamParms->metaPlanes;
1504 v4l2_buf.m.planes[v4l2_buf.length-1].m.fd = metaBuf.fd.extFd[0];
1505 v4l2_buf.m.planes[v4l2_buf.length-1].length = metaBuf.size.extS[0];
1506
1507 ALOGV("Qbuf metaBuf: fd(%d), length(%d) plane(%d)", metaBuf.fd.extFd[0], metaBuf.size.extS[0], v4l2_buf.length);
1508#endif
1509 if (exynos_v4l2_qbuf(currentNode->fd, &v4l2_buf) < 0) {
1510 ALOGE("ERR(%s): exynos_v4l2_qbuf() fail fd(%d)", __FUNCTION__, currentNode->fd);
1511 }
1512 ALOGV("DEBUG(%s): exynos_v4l2_qbuf() success fd(%d)", __FUNCTION__, currentNode->fd);
1513 targetStreamParms->svcBufStatus[i] = REQUIRES_DQ_FROM_SVC;
1514 }
1515 else {
1516 targetStreamParms->svcBufStatus[i] = ON_SERVICE;
1517 }
1518
1519 }
1520
1521 } else {
1522 for (int i = 0; i < m_camera_info.capture.buffers; i++) {
1523 ALOGV("DEBUG(%s): capture initial QBUF [%d]", __FUNCTION__, i);
1524 cam_int_qbuf(&(m_camera_info.capture), i);
1525 }
5506cebf
SK
1526 }
1527 ALOGV("== stream_on :: capture");
1528 if (cam_int_streamon(&(m_camera_info.capture)) < 0) {
1529 ALOGE("ERR(%s): capture stream on fail", __FUNCTION__);
1530 } else {
1531 m_camera_info.capture.status = true;
1532 }
1533 }
1534 }
1535 }
1536 if (m_isIspStarted == false) {
1537 StartISP();
1538 ALOGV("DEBUG(%s):starting sensor thread", __FUNCTION__);
1539 m_requestManager->SetInitialSkip(5);
1540 m_sensorThread->Start("SensorThread", PRIORITY_DEFAULT, 0);
1541 m_isIspStarted = true;
1542 }
c15a6b00
JS
1543 m_mainThread->SetSignal(SIGNAL_MAIN_REQ_Q_NOT_EMPTY);
1544 return 0;
1545}
1546
1547int ExynosCameraHWInterface2::setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops)
1548{
13d8c7b4 1549 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
1550 if ((NULL != frame_dst_ops) && (NULL != frame_dst_ops->dequeue_frame)
1551 && (NULL != frame_dst_ops->cancel_frame) && (NULL !=frame_dst_ops->enqueue_frame)) {
1552 m_frameQueueOps = (camera2_frame_queue_dst_ops_t *)frame_dst_ops;
1553 return 0;
1554 }
1555 else {
13d8c7b4 1556 ALOGE("DEBUG(%s):setFrameQueueDstOps : NULL arguments", __FUNCTION__);
c15a6b00
JS
1557 return 1;
1558 }
1559}
1560
1561int ExynosCameraHWInterface2::getInProgressCount()
1562{
1563 int inProgressCount = m_requestManager->GetNumEntries();
13d8c7b4 1564 ALOGV("DEBUG(%s): # of dequeued req (%d)", __FUNCTION__, inProgressCount);
c15a6b00
JS
1565 return inProgressCount;
1566}
1567
1568int ExynosCameraHWInterface2::flushCapturesInProgress()
1569{
1570 return 0;
1571}
1572
c15a6b00
JS
1573int ExynosCameraHWInterface2::constructDefaultRequest(int request_template, camera_metadata_t **request)
1574{
13d8c7b4 1575 ALOGV("DEBUG(%s): making template (%d) ", __FUNCTION__, request_template);
c15a6b00
JS
1576
1577 if (request == NULL) return BAD_VALUE;
1578 if (request_template < 0 || request_template >= CAMERA2_TEMPLATE_COUNT) {
1579 return BAD_VALUE;
1580 }
1581 status_t res;
1582 // Pass 1, calculate size and allocate
daa1fcd6 1583 res = m_camera2->constructDefaultRequest(request_template,
c15a6b00
JS
1584 request,
1585 true);
1586 if (res != OK) {
1587 return res;
1588 }
1589 // Pass 2, build request
daa1fcd6 1590 res = m_camera2->constructDefaultRequest(request_template,
c15a6b00
JS
1591 request,
1592 false);
1593 if (res != OK) {
1594 ALOGE("Unable to populate new request for template %d",
1595 request_template);
1596 }
1597
1598 return res;
1599}
1600
1601int ExynosCameraHWInterface2::allocateStream(uint32_t width, uint32_t height, int format, const camera2_stream_ops_t *stream_ops,
1602 uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers)
1603{
ed4ad5fe 1604 ALOGD("(%s): stream width(%d) height(%d) format(%x)", __FUNCTION__, width, height, format);
5506cebf 1605 bool useDirectOutput = false;
13d8c7b4
SK
1606 StreamThread *AllocatedStream;
1607 stream_parameters_t newParameters;
5506cebf
SK
1608 substream_parameters_t *subParameters;
1609 StreamThread *parentStream;
1610 status_t res;
1611 int allocCase = 0;
c15a6b00 1612
5506cebf
SK
1613 if ((format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED || format == CAMERA2_HAL_PIXEL_FORMAT_OPAQUE) &&
1614 m_camera2->isSupportedResolution(width, height)) {
9dd63e1f
SK
1615 if (!(m_streamThreads[0].get())) {
1616 ALOGV("DEBUG(%s): stream 0 not exist", __FUNCTION__);
1617 allocCase = 0;
13d8c7b4
SK
1618 }
1619 else {
6bbb593a 1620 if ((m_streamThreads[0].get())->m_activated == true) {
9dd63e1f
SK
1621 ALOGV("DEBUG(%s): stream 0 exists and activated.", __FUNCTION__);
1622 allocCase = 1;
1623 }
1624 else {
1625 ALOGV("DEBUG(%s): stream 0 exists and deactivated.", __FUNCTION__);
1626 allocCase = 2;
1627 }
13d8c7b4 1628 }
5506cebf
SK
1629
1630 // TODO : instead of that, use calculate aspect ratio and selection with calculated ratio.
1631 if ((width == 1920 && height == 1080) || (width == 1280 && height == 720)
1632 || (width == 720 && height == 480) || (width == 1440 && height == 960)
1633 || (width == 1344 && height == 896)) {
15fd8231 1634 m_wideAspect = true;
5506cebf 1635 } else {
15fd8231
SK
1636 m_wideAspect = false;
1637 }
1638 ALOGV("DEBUG(%s): m_wideAspect (%d)", __FUNCTION__, m_wideAspect);
1639
9dd63e1f 1640 if (allocCase == 0 || allocCase == 2) {
5506cebf 1641 *stream_id = STREAM_ID_PREVIEW;
9dd63e1f 1642
5506cebf 1643 m_streamThreads[0] = new StreamThread(this, *stream_id);
9dd63e1f 1644
5506cebf 1645 AllocatedStream = (StreamThread*)(m_streamThreads[0].get());
053d38cf 1646 AllocatedStream->Start("StreamThread", PRIORITY_DEFAULT, 0);
5506cebf
SK
1647 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
1648
1649 *format_actual = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1650 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
1651 *max_buffers = 6;
1652
1653 newParameters.width = width;
1654 newParameters.height = height;
1655 newParameters.format = *format_actual;
1656 newParameters.streamOps = stream_ops;
1657 newParameters.usage = *usage;
ac8c2060 1658 newParameters.numHwBuffers = NUM_SCP_BUFFERS;
5506cebf
SK
1659 newParameters.numOwnSvcBuffers = *max_buffers;
1660 newParameters.planes = NUM_PLANES(*format_actual);
1661 newParameters.metaPlanes = 1;
1662 newParameters.numSvcBufsInHal = 0;
1663 newParameters.minUndequedBuffer = 4;
1664
1665 newParameters.node = &m_camera_info.scp;
1666 newParameters.node->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1667 newParameters.node->memory = V4L2_MEMORY_DMABUF;
1668
1669 AllocatedStream->streamType = STREAM_TYPE_DIRECT;
1670 AllocatedStream->m_index = 0;
9dd63e1f
SK
1671 AllocatedStream->setParameter(&newParameters);
1672 AllocatedStream->m_activated = true;
5506cebf
SK
1673 AllocatedStream->m_numRegisteredStream = 1;
1674 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
ad37861e
SK
1675 m_requestManager->SetDefaultParameters(m_camera2->getSensorW());
1676 m_camera_info.dummy_shot.shot.ctl.scaler.cropRegion[2] = m_camera2->getSensorW();
5506cebf
SK
1677 if (m_subStreams[STREAM_ID_RECORD].type != SUBSTREAM_TYPE_NONE)
1678 AllocatedStream->attachSubStream(STREAM_ID_RECORD, 10);
1679 if (m_subStreams[STREAM_ID_PRVCB].type != SUBSTREAM_TYPE_NONE)
1680 AllocatedStream->attachSubStream(STREAM_ID_PRVCB, 70);
9dd63e1f 1681 return 0;
5506cebf
SK
1682 } else if (allocCase == 1) {
1683 *stream_id = STREAM_ID_RECORD;
1684
1685 subParameters = &m_subStreams[STREAM_ID_RECORD];
1686 memset(subParameters, 0, sizeof(substream_parameters_t));
1687
9dd63e1f
SK
1688 parentStream = (StreamThread*)(m_streamThreads[0].get());
1689 if (!parentStream) {
1690 return 1;
9dd63e1f 1691 }
9dd63e1f 1692
804236a7 1693 *format_actual = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M
6bbb593a 1694 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
2630679a 1695 *max_buffers = 6;
9dd63e1f 1696
5506cebf
SK
1697 subParameters->type = SUBSTREAM_TYPE_RECORD;
1698 subParameters->width = width;
1699 subParameters->height = height;
1700 subParameters->format = *format_actual;
1701 subParameters->svcPlanes = NUM_PLANES(*format_actual);
1702 subParameters->streamOps = stream_ops;
1703 subParameters->usage = *usage;
1704 subParameters->numOwnSvcBuffers = *max_buffers;
1705 subParameters->numSvcBufsInHal = 0;
1706 subParameters->needBufferInit = false;
1707 subParameters->minUndequedBuffer = 2;
1708
1709 res = parentStream->attachSubStream(STREAM_ID_RECORD, 20);
1710 if (res != NO_ERROR) {
1711 ALOGE("(%s): substream attach failed. res(%d)", __FUNCTION__, res);
1712 return 1;
1713 }
1714 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, parentStream->m_numRegisteredStream);
1715 ALOGV("(%s): Enabling Record", __FUNCTION__);
9dd63e1f
SK
1716 return 0;
1717 }
13d8c7b4 1718 }
b8d41ae2 1719 else if ((format == CAMERA2_HAL_PIXEL_FORMAT_ZSL)
5506cebf 1720 && (width == m_camera2->getSensorW()) && (height == m_camera2->getSensorH())) {
13d8c7b4 1721
5506cebf
SK
1722 if (!(m_streamThreads[1].get())) {
1723 ALOGV("DEBUG(%s): stream thread 1 not exist", __FUNCTION__);
1724 useDirectOutput = true;
15fd8231
SK
1725 }
1726 else {
5506cebf 1727 ALOGV("DEBUG(%s): stream thread 1 exists and deactivated.", __FUNCTION__);
90e439c1 1728 useDirectOutput = false;
5506cebf
SK
1729 }
1730 if (useDirectOutput) {
1731 *stream_id = STREAM_ID_ZSL;
1732
053d38cf 1733 m_streamThreads[1] = new StreamThread(this, *stream_id);
5506cebf 1734 AllocatedStream = (StreamThread*)(m_streamThreads[1].get());
053d38cf 1735 AllocatedStream->Start("StreamThread", PRIORITY_DEFAULT, 0);
5506cebf
SK
1736 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
1737
1738 *format_actual = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1739 *max_buffers = 6;
1740
1741 *format_actual = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
1742 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
1743 *max_buffers = 6;
1744
1745 newParameters.width = width;
1746 newParameters.height = height;
1747 newParameters.format = *format_actual;
1748 newParameters.streamOps = stream_ops;
1749 newParameters.usage = *usage;
ac8c2060 1750 newParameters.numHwBuffers = NUM_SCC_BUFFERS;
5506cebf
SK
1751 newParameters.numOwnSvcBuffers = *max_buffers;
1752 newParameters.planes = NUM_PLANES(*format_actual);
1753 newParameters.metaPlanes = 1;
1754
1755 newParameters.numSvcBufsInHal = 0;
1756 newParameters.minUndequedBuffer = 4;
1757
1758 newParameters.node = &m_camera_info.capture;
1759 newParameters.node->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1760 newParameters.node->memory = V4L2_MEMORY_DMABUF;
1761
1762 AllocatedStream->streamType = STREAM_TYPE_DIRECT;
1763 AllocatedStream->m_index = 1;
1764 AllocatedStream->setParameter(&newParameters);
1765 AllocatedStream->m_activated = true;
b8d41ae2 1766 AllocatedStream->m_numRegisteredStream = 1;
5506cebf
SK
1767 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
1768 return 0;
90e439c1
SK
1769 } else {
1770 bool bJpegExists = false;
1771 AllocatedStream = (StreamThread*)(m_streamThreads[1].get());
1772 subParameters = &m_subStreams[STREAM_ID_JPEG];
1773 if (subParameters->type == SUBSTREAM_TYPE_JPEG) {
1774 ALOGD("(%s): jpeg stream exists", __FUNCTION__);
1775 bJpegExists = true;
1776 AllocatedStream->detachSubStream(STREAM_ID_JPEG);
1777 }
1778 AllocatedStream->m_releasing = true;
1779 ALOGD("START stream thread 1 release %d", __LINE__);
1780 do {
1781 AllocatedStream->release();
1782 usleep(33000);
1783 } while (AllocatedStream->m_releasing);
1784 ALOGD("END stream thread 1 release %d", __LINE__);
1785
1786 *stream_id = STREAM_ID_ZSL;
1787
1788 m_streamThreadInitialize((SignalDrivenThread*)AllocatedStream);
1789
1790 *format_actual = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1791 *max_buffers = 6;
1792
1793 *format_actual = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
1794 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
1795 *max_buffers = 6;
1796
1797 newParameters.width = width;
1798 newParameters.height = height;
1799 newParameters.format = *format_actual;
1800 newParameters.streamOps = stream_ops;
1801 newParameters.usage = *usage;
1802 newParameters.numHwBuffers = NUM_SCC_BUFFERS;
1803 newParameters.numOwnSvcBuffers = *max_buffers;
1804 newParameters.planes = NUM_PLANES(*format_actual);
1805 newParameters.metaPlanes = 1;
1806
1807 newParameters.numSvcBufsInHal = 0;
1808 newParameters.minUndequedBuffer = 4;
1809
1810 newParameters.node = &m_camera_info.capture;
1811 newParameters.node->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1812 newParameters.node->memory = V4L2_MEMORY_DMABUF;
1813
1814 AllocatedStream->streamType = STREAM_TYPE_DIRECT;
1815 AllocatedStream->m_index = 1;
1816 AllocatedStream->setParameter(&newParameters);
1817 AllocatedStream->m_activated = true;
1818 AllocatedStream->m_numRegisteredStream = 1;
1819 if (bJpegExists) {
1820 AllocatedStream->attachSubStream(STREAM_ID_JPEG, 10);
1821 }
1822 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, AllocatedStream->m_numRegisteredStream);
1823 return 0;
1824
15fd8231 1825 }
5506cebf
SK
1826 }
1827 else if (format == HAL_PIXEL_FORMAT_BLOB
1828 && m_camera2->isSupportedJpegResolution(width, height)) {
1829 *stream_id = STREAM_ID_JPEG;
15fd8231 1830
5506cebf
SK
1831 subParameters = &m_subStreams[*stream_id];
1832 memset(subParameters, 0, sizeof(substream_parameters_t));
9dd63e1f 1833
5506cebf
SK
1834 if (!(m_streamThreads[1].get())) {
1835 ALOGV("DEBUG(%s): stream thread 1 not exist", __FUNCTION__);
1836 StartSCCThread(false);
1837 }
1838 else if (m_streamThreads[1]->m_activated == false) {
1839 ALOGV("DEBUG(%s): stream thread 1 suspended. restarting", __FUNCTION__);
1840 StartSCCThread(true);
1841 }
1842 parentStream = (StreamThread*)(m_streamThreads[1].get());
13d8c7b4
SK
1843
1844 *format_actual = HAL_PIXEL_FORMAT_BLOB;
13d8c7b4 1845 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
37e122d5 1846 *max_buffers = 4;
13d8c7b4 1847
5506cebf
SK
1848 subParameters->type = SUBSTREAM_TYPE_JPEG;
1849 subParameters->width = width;
1850 subParameters->height = height;
1851 subParameters->format = *format_actual;
1852 subParameters->svcPlanes = 1;
1853 subParameters->streamOps = stream_ops;
1854 subParameters->usage = *usage;
1855 subParameters->numOwnSvcBuffers = *max_buffers;
1856 subParameters->numSvcBufsInHal = 0;
1857 subParameters->needBufferInit = false;
1858 subParameters->minUndequedBuffer = 2;
1859
1860 res = parentStream->attachSubStream(STREAM_ID_JPEG, 10);
1861 if (res != NO_ERROR) {
1862 ALOGE("(%s): substream attach failed. res(%d)", __FUNCTION__, res);
1863 return 1;
1864 }
1865 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, parentStream->m_numRegisteredStream);
1866 ALOGV("(%s): Enabling Jpeg", __FUNCTION__);
13d8c7b4
SK
1867 return 0;
1868 }
74d78ebe 1869 else if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP || format == HAL_PIXEL_FORMAT_YV12) {
5506cebf
SK
1870 *stream_id = STREAM_ID_PRVCB;
1871
1872 subParameters = &m_subStreams[STREAM_ID_PRVCB];
1873 memset(subParameters, 0, sizeof(substream_parameters_t));
1874
74d78ebe
SK
1875 parentStream = (StreamThread*)(m_streamThreads[0].get());
1876 if (!parentStream) {
74d78ebe
SK
1877 return 1;
1878 }
74d78ebe
SK
1879
1880 *format_actual = format;
1881 *usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
5506cebf
SK
1882 *max_buffers = 6;
1883
1884 subParameters->type = SUBSTREAM_TYPE_PRVCB;
1885 subParameters->width = width;
1886 subParameters->height = height;
1887 subParameters->format = *format_actual;
1888 subParameters->svcPlanes = NUM_PLANES(*format_actual);
1889 subParameters->streamOps = stream_ops;
1890 subParameters->usage = *usage;
1891 subParameters->numOwnSvcBuffers = *max_buffers;
1892 subParameters->numSvcBufsInHal = 0;
1893 subParameters->needBufferInit = false;
1894 subParameters->minUndequedBuffer = 2;
1895
1896 if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
1897 subParameters->internalFormat = HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP;
1898 subParameters->internalPlanes = NUM_PLANES(HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP);
1899 }
1900 else {
1901 subParameters->internalFormat = HAL_PIXEL_FORMAT_EXYNOS_YV12;
1902 subParameters->internalPlanes = NUM_PLANES(HAL_PIXEL_FORMAT_EXYNOS_YV12);
1903 }
74d78ebe 1904
5506cebf
SK
1905 res = parentStream->attachSubStream(STREAM_ID_PRVCB, 20);
1906 if (res != NO_ERROR) {
1907 ALOGE("(%s): substream attach failed. res(%d)", __FUNCTION__, res);
1908 return 1;
74d78ebe 1909 }
5506cebf
SK
1910 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, parentStream->m_numRegisteredStream);
1911 ALOGV("(%s): Enabling previewcb", __FUNCTION__);
74d78ebe
SK
1912 return 0;
1913 }
ed4ad5fe 1914 ALOGE("(%s): Unsupported Pixel Format", __FUNCTION__);
5506cebf 1915 return 1;
c15a6b00
JS
1916}
1917
13d8c7b4
SK
1918int ExynosCameraHWInterface2::registerStreamBuffers(uint32_t stream_id,
1919 int num_buffers, buffer_handle_t *registeringBuffers)
c15a6b00 1920{
13d8c7b4
SK
1921 int i,j;
1922 void *virtAddr[3];
5506cebf
SK
1923 int plane_index = 0;
1924 StreamThread * targetStream;
13d8c7b4
SK
1925 stream_parameters_t *targetStreamParms;
1926 node_info_t *currentNode;
1927
c15a6b00
JS
1928 struct v4l2_buffer v4l2_buf;
1929 struct v4l2_plane planes[VIDEO_MAX_PLANES];
13d8c7b4 1930
ed4ad5fe 1931 ALOGD("(%s): stream_id(%d), num_buff(%d), handle(%x) ", __FUNCTION__,
13d8c7b4
SK
1932 stream_id, num_buffers, (uint32_t)registeringBuffers);
1933
5506cebf
SK
1934 if (stream_id == STREAM_ID_PREVIEW && m_streamThreads[0].get()) {
1935 targetStream = m_streamThreads[0].get();
13d8c7b4 1936 targetStreamParms = &(m_streamThreads[0]->m_parameters);
5c88d1f2 1937
13d8c7b4 1938 }
5506cebf
SK
1939 else if (stream_id == STREAM_ID_JPEG || stream_id == STREAM_ID_RECORD || stream_id == STREAM_ID_PRVCB) {
1940 substream_parameters_t *targetParms;
1941 targetParms = &m_subStreams[stream_id];
9dd63e1f 1942
5506cebf 1943 targetParms->numSvcBuffers = num_buffers;
9dd63e1f 1944
5506cebf
SK
1945 for (i = 0 ; i < targetParms->numSvcBuffers ; i++) {
1946 ALOGV("(%s): registering substream(%d) Buffers[%d] (%x) ", __FUNCTION__,
1947 i, stream_id, (uint32_t)(registeringBuffers[i]));
9dd63e1f
SK
1948 if (m_grallocHal) {
1949 if (m_grallocHal->lock(m_grallocHal, registeringBuffers[i],
5506cebf
SK
1950 targetParms->usage, 0, 0,
1951 targetParms->width, targetParms->height, virtAddr) != 0) {
9dd63e1f
SK
1952 ALOGE("ERR(%s): could not obtain gralloc buffer", __FUNCTION__);
1953 }
1954 else {
1955 ExynosBuffer currentBuf;
1956 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(registeringBuffers[i]);
5506cebf
SK
1957 if (targetParms->svcPlanes == 1) {
1958 currentBuf.fd.extFd[0] = priv_handle->fd;
1959 currentBuf.size.extS[0] = priv_handle->size;
1960 currentBuf.size.extS[1] = 0;
1961 currentBuf.size.extS[2] = 0;
1962 } else if (targetParms->svcPlanes == 2) {
1963 currentBuf.fd.extFd[0] = priv_handle->fd;
1964 currentBuf.fd.extFd[1] = priv_handle->fd1;
1965
1966 } else if (targetParms->svcPlanes == 3) {
1967 currentBuf.fd.extFd[0] = priv_handle->fd;
1968 currentBuf.fd.extFd[1] = priv_handle->fd1;
1969 currentBuf.fd.extFd[2] = priv_handle->fd2;
1970 }
1971 for (plane_index = 0 ; plane_index < targetParms->svcPlanes ; plane_index++) {
9dd63e1f 1972 currentBuf.virt.extP[plane_index] = (char *)virtAddr[plane_index];
0d220b42 1973 CAM_LOGV("DEBUG(%s): plane(%d): fd(%d) addr(%x) size(%d)",
804236a7 1974 __FUNCTION__, plane_index, currentBuf.fd.extFd[plane_index],
5506cebf 1975 (unsigned int)currentBuf.virt.extP[plane_index], currentBuf.size.extS[plane_index]);
9dd63e1f 1976 }
5506cebf
SK
1977 targetParms->svcBufStatus[i] = ON_SERVICE;
1978 targetParms->svcBuffers[i] = currentBuf;
1979 targetParms->svcBufHandle[i] = registeringBuffers[i];
9dd63e1f
SK
1980 }
1981 }
1982 }
5506cebf 1983 targetParms->needBufferInit = true;
9dd63e1f
SK
1984 return 0;
1985 }
5506cebf
SK
1986 else if (stream_id == STREAM_ID_ZSL && m_streamThreads[1].get()) {
1987 targetStream = m_streamThreads[1].get();
1988 targetStreamParms = &(m_streamThreads[1]->m_parameters);
74d78ebe 1989 }
13d8c7b4 1990 else {
ed4ad5fe 1991 ALOGE("(%s): unregistered stream id (%d)", __FUNCTION__, stream_id);
be494d19 1992 return 1;
13d8c7b4 1993 }
c15a6b00 1994
5506cebf 1995 if (targetStream->streamType == STREAM_TYPE_DIRECT) {
13d8c7b4
SK
1996 if (num_buffers < targetStreamParms->numHwBuffers) {
1997 ALOGE("ERR(%s) registering insufficient num of buffers (%d) < (%d)",
1998 __FUNCTION__, num_buffers, targetStreamParms->numHwBuffers);
be494d19 1999 return 1;
13d8c7b4
SK
2000 }
2001 }
0d220b42 2002 CAM_LOGV("DEBUG(%s): format(%x) width(%d), height(%d) svcPlanes(%d)",
5506cebf
SK
2003 __FUNCTION__, targetStreamParms->format, targetStreamParms->width,
2004 targetStreamParms->height, targetStreamParms->planes);
13d8c7b4 2005 targetStreamParms->numSvcBuffers = num_buffers;
5506cebf
SK
2006 currentNode = targetStreamParms->node;
2007 currentNode->width = targetStreamParms->width;
2008 currentNode->height = targetStreamParms->height;
2009 currentNode->format = HAL_PIXEL_FORMAT_2_V4L2_PIX(targetStreamParms->format);
2010 currentNode->planes = targetStreamParms->planes;
13d8c7b4 2011 currentNode->buffers = targetStreamParms->numHwBuffers;
5506cebf
SK
2012 cam_int_s_input(currentNode, m_camera_info.sensor_id);
2013 cam_int_s_fmt(currentNode);
2014 cam_int_reqbufs(currentNode);
2015 for (i = 0 ; i < targetStreamParms->numSvcBuffers ; i++) {
13d8c7b4
SK
2016 ALOGV("DEBUG(%s): registering Stream Buffers[%d] (%x) ", __FUNCTION__,
2017 i, (uint32_t)(registeringBuffers[i]));
13d8c7b4
SK
2018 v4l2_buf.m.planes = planes;
2019 v4l2_buf.type = currentNode->type;
2020 v4l2_buf.memory = currentNode->memory;
2021 v4l2_buf.index = i;
2022 v4l2_buf.length = currentNode->planes;
c15a6b00 2023
13d8c7b4 2024 ExynosBuffer currentBuf;
feb7df4c 2025 ExynosBuffer metaBuf;
13d8c7b4
SK
2026 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(registeringBuffers[i]);
2027
2028 m_getAlignedYUVSize(currentNode->format,
2029 currentNode->width, currentNode->height, &currentBuf);
24231221 2030
37e122d5
SK
2031 ALOGV("DEBUG(%s): ion_size(%d), stride(%d), ", __FUNCTION__, priv_handle->size, priv_handle->stride);
2032 if (currentNode->planes == 1) {
74d78ebe
SK
2033 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
2034 currentBuf.fd.extFd[0] = priv_handle->fd;
37e122d5
SK
2035 currentBuf.size.extS[0] = priv_handle->size;
2036 currentBuf.size.extS[1] = 0;
2037 currentBuf.size.extS[2] = 0;
74d78ebe
SK
2038 } else if (currentNode->planes == 2) {
2039 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
2040 v4l2_buf.m.planes[1].m.fd = priv_handle->fd1;
2041 currentBuf.fd.extFd[0] = priv_handle->fd;
2042 currentBuf.fd.extFd[1] = priv_handle->fd1;
2043
2044 } else if (currentNode->planes == 3) {
2045 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
2046 v4l2_buf.m.planes[2].m.fd = priv_handle->fd1;
2047 v4l2_buf.m.planes[1].m.fd = priv_handle->fd2;
2048 currentBuf.fd.extFd[0] = priv_handle->fd;
2049 currentBuf.fd.extFd[2] = priv_handle->fd1;
2050 currentBuf.fd.extFd[1] = priv_handle->fd2;
37e122d5 2051 }
0d220b42 2052
5506cebf 2053 for (plane_index = 0 ; plane_index < (int)v4l2_buf.length ; plane_index++) {
0d220b42 2054 currentBuf.virt.extP[plane_index] = (char *)ion_map(currentBuf.fd.extFd[plane_index], currentBuf.size.extS[plane_index], 0);
13d8c7b4 2055 v4l2_buf.m.planes[plane_index].length = currentBuf.size.extS[plane_index];
0d220b42 2056 CAM_LOGV("DEBUG(%s): plane(%d): fd(%d) addr(%x), length(%d)",
13d8c7b4
SK
2057 __FUNCTION__, plane_index, v4l2_buf.m.planes[plane_index].m.fd,
2058 (unsigned int)currentBuf.virt.extP[plane_index],
2059 v4l2_buf.m.planes[plane_index].length);
2060 }
c15a6b00 2061
5506cebf 2062 if (i < currentNode->buffers) {
feb7df4c
SK
2063
2064
2065#ifdef ENABLE_FRAME_SYNC
5506cebf
SK
2066 /* add plane for metadata*/
2067 metaBuf.size.extS[0] = 4*1024;
2068 allocCameraMemory(m_ionCameraClient , &metaBuf, 1, 1<<0);
feb7df4c 2069
5506cebf
SK
2070 v4l2_buf.length += targetStreamParms->metaPlanes;
2071 v4l2_buf.m.planes[v4l2_buf.length-1].m.fd = metaBuf.fd.extFd[0];
2072 v4l2_buf.m.planes[v4l2_buf.length-1].length = metaBuf.size.extS[0];
feb7df4c 2073
5506cebf 2074 ALOGV("Qbuf metaBuf: fd(%d), length(%d) plane(%d)", metaBuf.fd.extFd[0], metaBuf.size.extS[0], v4l2_buf.length);
feb7df4c 2075#endif
5506cebf
SK
2076 if (exynos_v4l2_qbuf(currentNode->fd, &v4l2_buf) < 0) {
2077 ALOGE("ERR(%s): stream id(%d) exynos_v4l2_qbuf() fail fd(%d)",
2078 __FUNCTION__, stream_id, currentNode->fd);
13d8c7b4 2079 }
5506cebf
SK
2080 ALOGV("DEBUG(%s): stream id(%d) exynos_v4l2_qbuf() success fd(%d)",
2081 __FUNCTION__, stream_id, currentNode->fd);
2082 targetStreamParms->svcBufStatus[i] = REQUIRES_DQ_FROM_SVC;
13d8c7b4 2083 }
5506cebf 2084 else {
13d8c7b4 2085 targetStreamParms->svcBufStatus[i] = ON_SERVICE;
c15a6b00 2086 }
5506cebf 2087
13d8c7b4 2088 targetStreamParms->svcBuffers[i] = currentBuf;
feb7df4c 2089 targetStreamParms->metaBuffers[i] = metaBuf;
13d8c7b4
SK
2090 targetStreamParms->svcBufHandle[i] = registeringBuffers[i];
2091 }
15fd8231 2092
5506cebf
SK
2093 ALOGV("DEBUG(%s): calling streamon stream id = %d", __FUNCTION__, stream_id);
2094 cam_int_streamon(targetStreamParms->node);
ad37861e 2095 ALOGV("DEBUG(%s): calling streamon END", __FUNCTION__);
5506cebf 2096 currentNode->status = true;
13d8c7b4 2097 ALOGV("DEBUG(%s): END registerStreamBuffers", __FUNCTION__);
ad37861e 2098
c15a6b00
JS
2099 return 0;
2100}
2101
2102int ExynosCameraHWInterface2::releaseStream(uint32_t stream_id)
2103{
13d8c7b4 2104 StreamThread *targetStream;
5506cebf 2105 status_t res = NO_ERROR;
ed4ad5fe 2106 ALOGD("(%s): stream_id(%d)", __FUNCTION__, stream_id);
5506cebf 2107 bool releasingScpMain = false;
13d8c7b4 2108
5506cebf 2109 if (stream_id == STREAM_ID_PREVIEW) {
13d8c7b4 2110 targetStream = (StreamThread*)(m_streamThreads[0].get());
5506cebf
SK
2111 targetStream->m_numRegisteredStream--;
2112 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, targetStream->m_numRegisteredStream);
2113 releasingScpMain = true;
0d220b42
C
2114 for (int i = 0; i < targetStream->m_parameters.numSvcBuffers; i++) {
2115 for (int j = 0; j < targetStream->m_parameters.planes; j++) {
2116 ion_unmap(targetStream->m_parameters.svcBuffers[i].virt.extP[j],
2117 targetStream->m_parameters.svcBuffers[i].size.extS[j]);
2118 CAM_LOGD("DBG(%s) ummap stream buffer[%d], plane(%d), fd %d vaddr %x", __FUNCTION__, i, j,
2119 targetStream->m_parameters.svcBuffers[i].fd.extFd[j], targetStream->m_parameters.svcBuffers[i].virt.extP[j]);
2120 }
2121 }
5506cebf 2122 } else if (stream_id == STREAM_ID_JPEG) {
13d8c7b4 2123 targetStream = (StreamThread*)(m_streamThreads[1].get());
5506cebf
SK
2124 memset(&m_subStreams[stream_id], 0, sizeof(substream_parameters_t));
2125 if (m_resizeBuf.size.s != 0) {
2126 freeCameraMemory(&m_resizeBuf, 1);
2127 }
2128 if (targetStream)
2129 res = targetStream->detachSubStream(stream_id);
2130 if (res != NO_ERROR) {
2131 ALOGE("(%s): substream detach failed. res(%d)", __FUNCTION__, res);
2132 return 1;
2133 }
2134 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, targetStream->m_numRegisteredStream);
74d78ebe 2135 return 0;
5506cebf
SK
2136 } else if (stream_id == STREAM_ID_RECORD) {
2137 targetStream = (StreamThread*)(m_streamThreads[0].get());
2138 memset(&m_subStreams[stream_id], 0, sizeof(substream_parameters_t));
2139 if (targetStream)
2140 res = targetStream->detachSubStream(stream_id);
2141 else
2142 return 0;
2143 } else if (stream_id == STREAM_ID_PRVCB) {
2144 targetStream = (StreamThread*)(m_streamThreads[0].get());
2145 if (m_resizeBuf.size.s != 0) {
2146 freeCameraMemory(&m_previewCbBuf, m_subStreams[stream_id].internalPlanes);
2147 }
2148 memset(&m_subStreams[stream_id], 0, sizeof(substream_parameters_t));
2149 if (targetStream)
2150 res = targetStream->detachSubStream(stream_id);
2151 else
2152 return 0;
2153 } else if (stream_id == STREAM_ID_ZSL) {
2154 targetStream = (StreamThread*)(m_streamThreads[1].get());
2155 targetStream->m_numRegisteredStream--;
2156 ALOGV("(%s): m_numRegisteredStream = %d", __FUNCTION__, targetStream->m_numRegisteredStream);
2157 } else {
13d8c7b4 2158 ALOGE("ERR:(%s): wrong stream id (%d)", __FUNCTION__, stream_id);
be494d19 2159 return 1;
13d8c7b4
SK
2160 }
2161
5506cebf
SK
2162 if (m_streamThreads[1]->m_numRegisteredStream == 0 && m_streamThreads[1]->m_activated) {
2163 ALOGV("(%s): deactivating stream thread 1 ", __FUNCTION__);
2164 targetStream = (StreamThread*)(m_streamThreads[1].get());
2165 targetStream->m_releasing = true;
0eb27a9d 2166 ALOGD("START stream thread release %d", __LINE__);
5506cebf 2167 do {
5506cebf
SK
2168 targetStream->release();
2169 usleep(33000);
2170 } while (targetStream->m_releasing);
a8be0011 2171 m_camera_info.capture.status = false;
0eb27a9d 2172 ALOGD("END stream thread release %d", __LINE__);
5506cebf
SK
2173 }
2174
a8be0011 2175 if (releasingScpMain || (m_streamThreads[0].get() != NULL && m_streamThreads[0]->m_numRegisteredStream == 0 && m_streamThreads[0]->m_activated)) {
5506cebf
SK
2176 ALOGV("(%s): deactivating stream thread 0", __FUNCTION__);
2177 targetStream = (StreamThread*)(m_streamThreads[0].get());
2178 targetStream->m_releasing = true;
0eb27a9d 2179 ALOGD("(%s): START Waiting for (indirect) stream thread release - line(%d)", __FUNCTION__, __LINE__);
5506cebf 2180 do {
5506cebf
SK
2181 targetStream->release();
2182 usleep(33000);
2183 } while (targetStream->m_releasing);
0eb27a9d 2184 ALOGD("(%s): END Waiting for (indirect) stream thread release - line(%d)", __FUNCTION__, __LINE__);
5506cebf
SK
2185 targetStream->SetSignal(SIGNAL_THREAD_TERMINATE);
2186
2187 if (targetStream != NULL) {
0eb27a9d
SK
2188 ALOGD("(%s): START Waiting for (indirect) stream thread termination", __FUNCTION__);
2189 while (!targetStream->IsTerminated())
5506cebf 2190 usleep(10000);
0eb27a9d 2191 ALOGD("(%s): END Waiting for (indirect) stream thread termination", __FUNCTION__);
5506cebf
SK
2192 m_streamThreads[0] = NULL;
2193 }
2194
2195 if (m_sensorThread != NULL) {
2196 m_sensorThread->release();
0eb27a9d
SK
2197 ALOGD("(%s): START Waiting for (indirect) sensor thread termination", __FUNCTION__);
2198 while (!m_sensorThread->IsTerminated())
5506cebf 2199 usleep(10000);
0eb27a9d 2200 ALOGD("(%s): END Waiting for (indirect) sensor thread termination", __FUNCTION__);
5506cebf
SK
2201 }
2202 else {
2203 ALOGE("+++++++ sensor thread is NULL %d", __LINE__);
2204 }
2205
2206 if (m_camera_info.capture.status == true) {
2207 if (cam_int_streamoff(&(m_camera_info.capture)) < 0) {
2208 ALOGE("ERR(%s): capture stream off fail", __FUNCTION__);
2209 } else {
2210 m_camera_info.capture.status = false;
2211 }
2212 ALOGV("(%s): calling capture streamoff done", __FUNCTION__);
a8be0011
SK
2213 m_camera_info.capture.buffers = 0;
2214 ALOGV("DEBUG(%s): capture calling reqbuf 0 ", __FUNCTION__);
2215 cam_int_reqbufs(&(m_camera_info.capture));
2216 ALOGV("DEBUG(%s): capture calling reqbuf 0 done", __FUNCTION__);
5506cebf
SK
2217 }
2218 m_isIspStarted = false;
2219 }
2220 ALOGV("(%s): END", __FUNCTION__);
c15a6b00
JS
2221 return 0;
2222}
2223
2224int ExynosCameraHWInterface2::allocateReprocessStream(
13d8c7b4
SK
2225 uint32_t width, uint32_t height, uint32_t format,
2226 const camera2_stream_in_ops_t *reprocess_stream_ops,
c15a6b00
JS
2227 uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers)
2228{
13d8c7b4 2229 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
2230 return 0;
2231}
2232
5506cebf
SK
2233int ExynosCameraHWInterface2::allocateReprocessStreamFromStream(
2234 uint32_t output_stream_id,
2235 const camera2_stream_in_ops_t *reprocess_stream_ops,
2236 // outputs
2237 uint32_t *stream_id)
2238{
ed4ad5fe 2239 ALOGD("(%s): output_stream_id(%d)", __FUNCTION__, output_stream_id);
5506cebf
SK
2240 *stream_id = STREAM_ID_JPEG_REPROCESS;
2241
2242 m_reprocessStreamId = *stream_id;
2243 m_reprocessOps = reprocess_stream_ops;
2244 m_reprocessOutputStreamId = output_stream_id;
2245 return 0;
2246}
2247
c15a6b00
JS
2248int ExynosCameraHWInterface2::releaseReprocessStream(uint32_t stream_id)
2249{
ed4ad5fe 2250 ALOGD("(%s): stream_id(%d)", __FUNCTION__, stream_id);
5506cebf
SK
2251 if (stream_id == STREAM_ID_JPEG_REPROCESS) {
2252 m_reprocessStreamId = 0;
2253 m_reprocessOps = NULL;
2254 m_reprocessOutputStreamId = 0;
2255 return 0;
2256 }
2257 return 1;
c15a6b00
JS
2258}
2259
2260int ExynosCameraHWInterface2::triggerAction(uint32_t trigger_id, int ext1, int ext2)
2261{
0f26b20f
SK
2262 ALOGV("DEBUG(%s): id(%x), %d, %d", __FUNCTION__, trigger_id, ext1, ext2);
2263
2264 switch (trigger_id) {
2265 case CAMERA2_TRIGGER_AUTOFOCUS:
2266 ALOGV("DEBUG(%s):TRIGGER_AUTOFOCUS id(%d)", __FUNCTION__, ext1);
8e2c2fdb 2267 OnAfTriggerStart(ext1);
0f26b20f
SK
2268 break;
2269
2270 case CAMERA2_TRIGGER_CANCEL_AUTOFOCUS:
2271 ALOGV("DEBUG(%s):CANCEL_AUTOFOCUS id(%d)", __FUNCTION__, ext1);
2272 OnAfCancel(ext1);
2273 break;
e117f756
YJ
2274 case CAMERA2_TRIGGER_PRECAPTURE_METERING:
2275 ALOGV("DEBUG(%s):CAMERA2_TRIGGER_PRECAPTURE_METERING id(%d)", __FUNCTION__, ext1);
2276 OnPrecaptureMeteringTriggerStart(ext1);
2277 break;
0f26b20f
SK
2278 default:
2279 break;
2280 }
c15a6b00
JS
2281 return 0;
2282}
2283
2284int ExynosCameraHWInterface2::setNotifyCallback(camera2_notify_callback notify_cb, void *user)
2285{
0f26b20f 2286 ALOGV("DEBUG(%s): cb_addr(%x)", __FUNCTION__, (unsigned int)notify_cb);
c15a6b00
JS
2287 m_notifyCb = notify_cb;
2288 m_callbackCookie = user;
2289 return 0;
2290}
2291
2292int ExynosCameraHWInterface2::getMetadataVendorTagOps(vendor_tag_query_ops_t **ops)
2293{
13d8c7b4 2294 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
2295 return 0;
2296}
2297
2298int ExynosCameraHWInterface2::dump(int fd)
2299{
13d8c7b4 2300 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
2301 return 0;
2302}
2303
13d8c7b4
SK
2304void ExynosCameraHWInterface2::m_getAlignedYUVSize(int colorFormat, int w, int h, ExynosBuffer *buf)
2305{
2306 switch (colorFormat) {
2307 // 1p
2308 case V4L2_PIX_FMT_RGB565 :
2309 case V4L2_PIX_FMT_YUYV :
2310 case V4L2_PIX_FMT_UYVY :
2311 case V4L2_PIX_FMT_VYUY :
2312 case V4L2_PIX_FMT_YVYU :
2313 buf->size.extS[0] = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(colorFormat), w, h);
2314 buf->size.extS[1] = 0;
2315 buf->size.extS[2] = 0;
2316 break;
2317 // 2p
2318 case V4L2_PIX_FMT_NV12 :
2319 case V4L2_PIX_FMT_NV12T :
2320 case V4L2_PIX_FMT_NV21 :
2321 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
2322 buf->size.extS[1] = ALIGN(w/2, 16) * ALIGN(h/2, 16);
2323 buf->size.extS[2] = 0;
2324 break;
2325 case V4L2_PIX_FMT_NV12M :
2326 case V4L2_PIX_FMT_NV12MT_16X16 :
9dd63e1f 2327 case V4L2_PIX_FMT_NV21M:
13d8c7b4
SK
2328 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
2329 buf->size.extS[1] = ALIGN(buf->size.extS[0] / 2, 256);
2330 buf->size.extS[2] = 0;
2331 break;
2332 case V4L2_PIX_FMT_NV16 :
2333 case V4L2_PIX_FMT_NV61 :
2334 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
2335 buf->size.extS[1] = ALIGN(w, 16) * ALIGN(h, 16);
2336 buf->size.extS[2] = 0;
2337 break;
2338 // 3p
2339 case V4L2_PIX_FMT_YUV420 :
2340 case V4L2_PIX_FMT_YVU420 :
2341 buf->size.extS[0] = (w * h);
2342 buf->size.extS[1] = (w * h) >> 2;
2343 buf->size.extS[2] = (w * h) >> 2;
2344 break;
2345 case V4L2_PIX_FMT_YUV420M:
2346 case V4L2_PIX_FMT_YVU420M :
2347 case V4L2_PIX_FMT_YUV422P :
0d220b42 2348 buf->size.extS[0] = ALIGN(w, 16) * ALIGN(h, 16);
13d8c7b4
SK
2349 buf->size.extS[1] = ALIGN(w/2, 16) * ALIGN(h/2, 8);
2350 buf->size.extS[2] = ALIGN(w/2, 16) * ALIGN(h/2, 8);
2351 break;
2352 default:
2353 ALOGE("ERR(%s):unmatched colorFormat(%d)", __FUNCTION__, colorFormat);
2354 return;
2355 break;
2356 }
2357}
c15a6b00 2358
13d8c7b4
SK
2359bool ExynosCameraHWInterface2::m_getRatioSize(int src_w, int src_h,
2360 int dst_w, int dst_h,
2361 int *crop_x, int *crop_y,
2362 int *crop_w, int *crop_h,
2363 int zoom)
c15a6b00 2364{
13d8c7b4
SK
2365 *crop_w = src_w;
2366 *crop_h = src_h;
2367
2368 if ( src_w != dst_w
2369 || src_h != dst_h) {
2370 float src_ratio = 1.0f;
2371 float dst_ratio = 1.0f;
2372
2373 // ex : 1024 / 768
2374 src_ratio = (float)src_w / (float)src_h;
2375
2376 // ex : 352 / 288
2377 dst_ratio = (float)dst_w / (float)dst_h;
2378
2379 if (dst_w * dst_h < src_w * src_h) {
2380 if (dst_ratio <= src_ratio) {
2381 // shrink w
2382 *crop_w = src_h * dst_ratio;
2383 *crop_h = src_h;
2384 } else {
2385 // shrink h
2386 *crop_w = src_w;
2387 *crop_h = src_w / dst_ratio;
c15a6b00 2388 }
13d8c7b4
SK
2389 } else {
2390 if (dst_ratio <= src_ratio) {
2391 // shrink w
2392 *crop_w = src_h * dst_ratio;
2393 *crop_h = src_h;
2394 } else {
2395 // shrink h
2396 *crop_w = src_w;
2397 *crop_h = src_w / dst_ratio;
c15a6b00
JS
2398 }
2399 }
c15a6b00
JS
2400 }
2401
13d8c7b4
SK
2402 if (zoom != 0) {
2403 float zoomLevel = ((float)zoom + 10.0) / 10.0;
2404 *crop_w = (int)((float)*crop_w / zoomLevel);
2405 *crop_h = (int)((float)*crop_h / zoomLevel);
2406 }
2407
2408 #define CAMERA_CROP_WIDTH_RESTRAIN_NUM (0x2)
2409 unsigned int w_align = (*crop_w & (CAMERA_CROP_WIDTH_RESTRAIN_NUM - 1));
2410 if (w_align != 0) {
2411 if ( (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1) <= w_align
2412 && *crop_w + (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align) <= dst_w) {
2413 *crop_w += (CAMERA_CROP_WIDTH_RESTRAIN_NUM - w_align);
2414 }
2415 else
2416 *crop_w -= w_align;
2417 }
2418
2419 #define CAMERA_CROP_HEIGHT_RESTRAIN_NUM (0x2)
2420 unsigned int h_align = (*crop_h & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - 1));
2421 if (h_align != 0) {
2422 if ( (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1) <= h_align
2423 && *crop_h + (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align) <= dst_h) {
2424 *crop_h += (CAMERA_CROP_HEIGHT_RESTRAIN_NUM - h_align);
2425 }
2426 else
2427 *crop_h -= h_align;
2428 }
2429
2430 *crop_x = (src_w - *crop_w) >> 1;
2431 *crop_y = (src_h - *crop_h) >> 1;
2432
2433 if (*crop_x & (CAMERA_CROP_WIDTH_RESTRAIN_NUM >> 1))
2434 *crop_x -= 1;
2435
2436 if (*crop_y & (CAMERA_CROP_HEIGHT_RESTRAIN_NUM >> 1))
2437 *crop_y -= 1;
2438
2439 return true;
2440}
2441
9dd63e1f 2442BayerBufManager::BayerBufManager()
13d8c7b4 2443{
9dd63e1f
SK
2444 ALOGV("DEBUG(%s): ", __FUNCTION__);
2445 for (int i = 0; i < NUM_BAYER_BUFFERS ; i++) {
2446 entries[i].status = BAYER_ON_HAL_EMPTY;
2447 entries[i].reqFrameCnt = 0;
13d8c7b4 2448 }
9dd63e1f
SK
2449 sensorEnqueueHead = 0;
2450 sensorDequeueHead = 0;
2451 ispEnqueueHead = 0;
2452 ispDequeueHead = 0;
2453 numOnSensor = 0;
2454 numOnIsp = 0;
2455 numOnHalFilled = 0;
2456 numOnHalEmpty = NUM_BAYER_BUFFERS;
13d8c7b4
SK
2457}
2458
15fd8231
SK
2459BayerBufManager::~BayerBufManager()
2460{
2461 ALOGV("%s", __FUNCTION__);
2462}
2463
9dd63e1f 2464int BayerBufManager::GetIndexForSensorEnqueue()
13d8c7b4 2465{
9dd63e1f
SK
2466 int ret = 0;
2467 if (numOnHalEmpty == 0)
2468 ret = -1;
2469 else
2470 ret = sensorEnqueueHead;
2471 ALOGV("DEBUG(%s): returning (%d)", __FUNCTION__, ret);
2472 return ret;
13d8c7b4
SK
2473}
2474
9dd63e1f 2475int BayerBufManager::MarkSensorEnqueue(int index)
13d8c7b4 2476{
9dd63e1f
SK
2477 ALOGV("DEBUG(%s) : BayerIndex[%d] ", __FUNCTION__, index);
2478
2479 // sanity check
2480 if (index != sensorEnqueueHead) {
2481 ALOGV("DEBUG(%s) : Abnormal BayerIndex[%d] - expected[%d]", __FUNCTION__, index, sensorEnqueueHead);
2482 return -1;
2483 }
2484 if (entries[index].status != BAYER_ON_HAL_EMPTY) {
2485 ALOGV("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
2486 index, entries[index].status, BAYER_ON_HAL_EMPTY);
2487 return -1;
13d8c7b4 2488 }
13d8c7b4 2489
9dd63e1f
SK
2490 entries[index].status = BAYER_ON_SENSOR;
2491 entries[index].reqFrameCnt = 0;
2492 numOnHalEmpty--;
2493 numOnSensor++;
2494 sensorEnqueueHead = GetNextIndex(index);
2495 ALOGV("DEBUG(%s) END: HAL-e(%d) HAL-f(%d) Sensor(%d) ISP(%d) ",
2496 __FUNCTION__, numOnHalEmpty, numOnHalFilled, numOnSensor, numOnIsp);
2497 return 0;
2498}
13d8c7b4 2499
9dd63e1f 2500int BayerBufManager::MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp)
13d8c7b4 2501{
9dd63e1f
SK
2502 ALOGV("DEBUG(%s) : BayerIndex[%d] reqFrameCnt(%d)", __FUNCTION__, index, reqFrameCnt);
2503
9dd63e1f 2504 if (entries[index].status != BAYER_ON_SENSOR) {
ad37861e 2505 ALOGE("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
9dd63e1f
SK
2506 index, entries[index].status, BAYER_ON_SENSOR);
2507 return -1;
13d8c7b4 2508 }
13d8c7b4 2509
9dd63e1f 2510 entries[index].status = BAYER_ON_HAL_FILLED;
9dd63e1f
SK
2511 numOnHalFilled++;
2512 numOnSensor--;
ad37861e 2513
9dd63e1f
SK
2514 return 0;
2515}
2516
2517int BayerBufManager::GetIndexForIspEnqueue(int *reqFrameCnt)
2518{
2519 int ret = 0;
2520 if (numOnHalFilled == 0)
2521 ret = -1;
2522 else {
2523 *reqFrameCnt = entries[ispEnqueueHead].reqFrameCnt;
2524 ret = ispEnqueueHead;
13d8c7b4 2525 }
9dd63e1f 2526 ALOGV("DEBUG(%s): returning BayerIndex[%d]", __FUNCTION__, ret);
13d8c7b4
SK
2527 return ret;
2528}
2529
9dd63e1f
SK
2530int BayerBufManager::GetIndexForIspDequeue(int *reqFrameCnt)
2531{
2532 int ret = 0;
2533 if (numOnIsp == 0)
2534 ret = -1;
2535 else {
2536 *reqFrameCnt = entries[ispDequeueHead].reqFrameCnt;
2537 ret = ispDequeueHead;
2538 }
2539 ALOGV("DEBUG(%s): returning BayerIndex[%d]", __FUNCTION__, ret);
2540 return ret;
2541}
13d8c7b4 2542
9dd63e1f 2543int BayerBufManager::MarkIspEnqueue(int index)
13d8c7b4 2544{
9dd63e1f
SK
2545 ALOGV("DEBUG(%s) : BayerIndex[%d] ", __FUNCTION__, index);
2546
2547 // sanity check
2548 if (index != ispEnqueueHead) {
2549 ALOGV("DEBUG(%s) : Abnormal BayerIndex[%d] - expected[%d]", __FUNCTION__, index, ispEnqueueHead);
13d8c7b4
SK
2550 return -1;
2551 }
9dd63e1f
SK
2552 if (entries[index].status != BAYER_ON_HAL_FILLED) {
2553 ALOGV("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
2554 index, entries[index].status, BAYER_ON_HAL_FILLED);
2555 return -1;
13d8c7b4
SK
2556 }
2557
9dd63e1f
SK
2558 entries[index].status = BAYER_ON_ISP;
2559 numOnHalFilled--;
2560 numOnIsp++;
2561 ispEnqueueHead = GetNextIndex(index);
2562 ALOGV("DEBUG(%s) END: HAL-e(%d) HAL-f(%d) Sensor(%d) ISP(%d) ",
2563 __FUNCTION__, numOnHalEmpty, numOnHalFilled, numOnSensor, numOnIsp);
2564 return 0;
2565}
2566
2567int BayerBufManager::MarkIspDequeue(int index)
2568{
2569 ALOGV("DEBUG(%s) : BayerIndex[%d]", __FUNCTION__, index);
2570
2571 // sanity check
2572 if (index != ispDequeueHead) {
2573 ALOGV("DEBUG(%s) : Abnormal BayerIndex[%d] - expected[%d]", __FUNCTION__, index, ispDequeueHead);
2574 return -1;
13d8c7b4 2575 }
9dd63e1f
SK
2576 if (entries[index].status != BAYER_ON_ISP) {
2577 ALOGV("DEBUG(%s) : Abnormal status in BayerIndex[%d] = (%d) expected (%d)", __FUNCTION__,
2578 index, entries[index].status, BAYER_ON_ISP);
13d8c7b4
SK
2579 return -1;
2580 }
2581
9dd63e1f
SK
2582 entries[index].status = BAYER_ON_HAL_EMPTY;
2583 entries[index].reqFrameCnt = 0;
2584 numOnHalEmpty++;
2585 numOnIsp--;
2586 ispDequeueHead = GetNextIndex(index);
2587 ALOGV("DEBUG(%s) END: HAL-e(%d) HAL-f(%d) Sensor(%d) ISP(%d) ",
2588 __FUNCTION__, numOnHalEmpty, numOnHalFilled, numOnSensor, numOnIsp);
2589 return 0;
2590}
13d8c7b4 2591
9dd63e1f
SK
2592int BayerBufManager::GetNumOnSensor()
2593{
2594 return numOnSensor;
13d8c7b4
SK
2595}
2596
9dd63e1f 2597int BayerBufManager::GetNumOnHalFilled()
13d8c7b4 2598{
9dd63e1f
SK
2599 return numOnHalFilled;
2600}
2601
2602int BayerBufManager::GetNumOnIsp()
2603{
2604 return numOnIsp;
2605}
2606
2607int BayerBufManager::GetNextIndex(int index)
2608{
2609 index++;
2610 if (index >= NUM_BAYER_BUFFERS)
2611 index = 0;
2612
2613 return index;
2614}
2615
2616void ExynosCameraHWInterface2::m_mainThreadFunc(SignalDrivenThread * self)
2617{
2618 camera_metadata_t *currentRequest = NULL;
2619 camera_metadata_t *currentFrame = NULL;
2620 size_t numEntries = 0;
2621 size_t frameSize = 0;
2622 camera_metadata_t * preparedFrame = NULL;
13d8c7b4
SK
2623 camera_metadata_t *deregisteredRequest = NULL;
2624 uint32_t currentSignal = self->GetProcessingSignal();
2625 MainThread * selfThread = ((MainThread*)self);
2626 int res = 0;
2627
ad37861e
SK
2628 int ret;
2629
13d8c7b4
SK
2630 ALOGV("DEBUG(%s): m_mainThreadFunc (%x)", __FUNCTION__, currentSignal);
2631
2632 if (currentSignal & SIGNAL_THREAD_RELEASE) {
2633 ALOGV("DEBUG(%s): processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
2634
2635 ALOGV("DEBUG(%s): processing SIGNAL_THREAD_RELEASE DONE", __FUNCTION__);
2636 selfThread->SetSignal(SIGNAL_THREAD_TERMINATE);
2637 return;
2638 }
2639
2640 if (currentSignal & SIGNAL_MAIN_REQ_Q_NOT_EMPTY) {
2641 ALOGV("DEBUG(%s): MainThread processing SIGNAL_MAIN_REQ_Q_NOT_EMPTY", __FUNCTION__);
ad37861e 2642 if (m_requestManager->IsRequestQueueFull()==false) {
13d8c7b4
SK
2643 m_requestQueueOps->dequeue_request(m_requestQueueOps, &currentRequest);
2644 if (NULL == currentRequest) {
ad37861e 2645 ALOGE("DEBUG(%s)(0x%x): dequeue_request returned NULL ", __FUNCTION__, currentSignal);
13d8c7b4 2646 m_isRequestQueueNull = true;
5c88d1f2
C
2647 if (m_requestManager->IsVdisEnable())
2648 m_vdisBubbleCnt = 1;
13d8c7b4
SK
2649 }
2650 else {
2651 m_requestManager->RegisterRequest(currentRequest);
2652
2653 m_numOfRemainingReqInSvc = m_requestQueueOps->request_count(m_requestQueueOps);
2654 ALOGV("DEBUG(%s): remaining req cnt (%d)", __FUNCTION__, m_numOfRemainingReqInSvc);
ad37861e 2655 if (m_requestManager->IsRequestQueueFull()==false)
13d8c7b4 2656 selfThread->SetSignal(SIGNAL_MAIN_REQ_Q_NOT_EMPTY); // dequeue repeatedly
9dd63e1f 2657
13d8c7b4
SK
2658 m_sensorThread->SetSignal(SIGNAL_SENSOR_START_REQ_PROCESSING);
2659 }
c15a6b00
JS
2660 }
2661 else {
13d8c7b4
SK
2662 m_isRequestQueuePending = true;
2663 }
2664 }
2665
2666 if (currentSignal & SIGNAL_MAIN_STREAM_OUTPUT_DONE) {
2667 ALOGV("DEBUG(%s): MainThread processing SIGNAL_MAIN_STREAM_OUTPUT_DONE", __FUNCTION__);
2668 /*while (1)*/ {
0f26b20f 2669 ret = m_requestManager->PrepareFrame(&numEntries, &frameSize, &preparedFrame, GetAfStateForService());
ad37861e 2670 if (ret == false)
0d220b42 2671 CAM_LOGE("ERR(%s): PrepareFrame ret = %d", __FUNCTION__, ret);
ad37861e 2672
13d8c7b4 2673 m_requestManager->DeregisterRequest(&deregisteredRequest);
ad37861e
SK
2674
2675 ret = m_requestQueueOps->free_request(m_requestQueueOps, deregisteredRequest);
2676 if (ret < 0)
0d220b42 2677 CAM_LOGE("ERR(%s): free_request ret = %d", __FUNCTION__, ret);
ad37861e
SK
2678
2679 ret = m_frameQueueOps->dequeue_frame(m_frameQueueOps, numEntries, frameSize, &currentFrame);
2680 if (ret < 0)
0d220b42 2681 CAM_LOGE("ERR(%s): dequeue_frame ret = %d", __FUNCTION__, ret);
ad37861e 2682
13d8c7b4 2683 if (currentFrame==NULL) {
ad37861e 2684 ALOGV("DBG(%s): frame dequeue returned NULL",__FUNCTION__ );
13d8c7b4
SK
2685 }
2686 else {
daa1fcd6 2687 ALOGV("DEBUG(%s): frame dequeue done. numEntries(%d) frameSize(%d)",__FUNCTION__ , numEntries, frameSize);
13d8c7b4
SK
2688 }
2689 res = append_camera_metadata(currentFrame, preparedFrame);
2690 if (res==0) {
2691 ALOGV("DEBUG(%s): frame metadata append success",__FUNCTION__);
2692 m_frameQueueOps->enqueue_frame(m_frameQueueOps, currentFrame);
ad37861e
SK
2693 }
2694 else {
2695 ALOGE("ERR(%s): frame metadata append fail (%d)",__FUNCTION__, res);
2696 }
2697 }
2698 if (!m_isRequestQueueNull) {
2699 selfThread->SetSignal(SIGNAL_MAIN_REQ_Q_NOT_EMPTY);
2700 }
c15a6b00 2701
ad37861e
SK
2702 if (getInProgressCount()>0) {
2703 ALOGV("DEBUG(%s): STREAM_OUTPUT_DONE and signalling REQ_PROCESSING",__FUNCTION__);
2704 m_sensorThread->SetSignal(SIGNAL_SENSOR_START_REQ_PROCESSING);
2705 }
c15a6b00 2706 }
ad37861e
SK
2707 ALOGV("DEBUG(%s): MainThread Exit", __FUNCTION__);
2708 return;
2709}
c15a6b00 2710
13d8c7b4
SK
2711void ExynosCameraHWInterface2::DumpInfoWithShot(struct camera2_shot_ext * shot_ext)
2712{
ad37861e
SK
2713 ALOGD("#### common Section");
2714 ALOGD("#### magic(%x) ",
13d8c7b4 2715 shot_ext->shot.magicNumber);
ad37861e
SK
2716 ALOGD("#### ctl Section");
2717 ALOGD("#### meta(%d) aper(%f) exp(%lld) duration(%lld) ISO(%d) AWB(%d)",
13d8c7b4 2718 shot_ext->shot.ctl.request.metadataMode,
b56dcc00 2719 shot_ext->shot.ctl.lens.aperture,
13d8c7b4
SK
2720 shot_ext->shot.ctl.sensor.exposureTime,
2721 shot_ext->shot.ctl.sensor.frameDuration,
b56dcc00
SK
2722 shot_ext->shot.ctl.sensor.sensitivity,
2723 shot_ext->shot.ctl.aa.awbMode);
13d8c7b4 2724
5506cebf 2725 ALOGD("#### OutputStream Sensor(%d) SCP(%d) SCC(%d) streams(%x)",
9dd63e1f 2726 shot_ext->request_sensor, shot_ext->request_scp, shot_ext->request_scc,
5506cebf 2727 shot_ext->shot.ctl.request.outputStreams[0]);
13d8c7b4 2728
ad37861e
SK
2729 ALOGD("#### DM Section");
2730 ALOGD("#### meta(%d) aper(%f) exp(%lld) duration(%lld) ISO(%d) timestamp(%lld) AWB(%d) cnt(%d)",
13d8c7b4 2731 shot_ext->shot.dm.request.metadataMode,
b56dcc00 2732 shot_ext->shot.dm.lens.aperture,
13d8c7b4
SK
2733 shot_ext->shot.dm.sensor.exposureTime,
2734 shot_ext->shot.dm.sensor.frameDuration,
2735 shot_ext->shot.dm.sensor.sensitivity,
b56dcc00
SK
2736 shot_ext->shot.dm.sensor.timeStamp,
2737 shot_ext->shot.dm.aa.awbMode,
2738 shot_ext->shot.dm.request.frameCount );
13d8c7b4
SK
2739}
2740
e117f756 2741void ExynosCameraHWInterface2::m_preCaptureSetter(struct camera2_shot_ext * shot_ext)
6f19b6cf 2742{
e117f756
YJ
2743 // Flash
2744 switch (m_ctlInfo.flash.m_flashCnt) {
2745 case IS_FLASH_STATE_ON:
73f5ad60 2746 ALOGV("(%s): [Flash] Flash ON for Capture", __FUNCTION__);
4a9565ae
YJ
2747 // check AF locked
2748 if (m_ctlInfo.flash.m_precaptureTriggerId > 0) {
2749 if (m_ctlInfo.flash.m_flashTimeOut == 0) {
2750 if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
2751 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON_ALWAYS;
2752 m_ctlInfo.flash.m_flashTimeOut = 5;
2753 } else
2754 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON;
2755 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON_WAIT;
2756 } else {
2757 m_ctlInfo.flash.m_flashTimeOut--;
2758 }
2759 } else {
2760 if (m_ctlInfo.flash.i_flashMode == AA_AEMODE_ON_ALWAYS_FLASH) {
2761 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON_ALWAYS;
2762 m_ctlInfo.flash.m_flashTimeOut = 5;
2763 } else
2764 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_ON;
2765 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON_WAIT;
2766 }
9a710a45 2767 break;
e117f756 2768 case IS_FLASH_STATE_ON_WAIT:
6f19b6cf 2769 break;
e117f756
YJ
2770 case IS_FLASH_STATE_ON_DONE:
2771 if (!m_ctlInfo.flash.m_afFlashDoneFlg)
2772 // auto transition at pre-capture trigger
2773 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_AE_AWB_LOCK;
6f19b6cf 2774 break;
e117f756 2775 case IS_FLASH_STATE_AUTO_AE_AWB_LOCK:
73f5ad60 2776 ALOGV("(%s): [Flash] IS_FLASH_AF_AUTO_AE_AWB_LOCK - %d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
e117f756
YJ
2777 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_AUTO;
2778 //shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_LOCKED;
2779 shot_ext->shot.ctl.aa.awbMode = AA_AWBMODE_LOCKED;
2780 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AE_AWB_LOCK_WAIT;
2781 break;
2782 case IS_FLASH_STATE_AE_AWB_LOCK_WAIT:
2783 case IS_FLASH_STATE_AUTO_WAIT:
2784 shot_ext->shot.ctl.aa.aeMode =(enum aa_aemode)0;
2785 shot_ext->shot.ctl.aa.awbMode = (enum aa_awbmode)0;
2786 break;
2787 case IS_FLASH_STATE_AUTO_DONE:
73f5ad60 2788 ALOGV("(%s): [Flash] IS_FLASH_AF_AUTO DONE", __FUNCTION__);
d91c0269 2789 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
e117f756
YJ
2790 break;
2791 case IS_FLASH_STATE_AUTO_OFF:
73f5ad60 2792 ALOGV("(%s): [Flash] IS_FLASH_AF_AUTO Clear", __FUNCTION__);
e117f756
YJ
2793 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
2794 m_ctlInfo.flash.m_afFlashDoneFlg = false;
2795 m_ctlInfo.flash.m_flashEnableFlg = false;
2796 break;
2797 case IS_FLASH_STATE_CAPTURE:
73f5ad60 2798 ALOGV("(%s): [Flash] IS_FLASH_CAPTURE", __FUNCTION__);
e117f756
YJ
2799 m_ctlInfo.flash.m_flashTimeOut = FLASH_STABLE_WAIT_TIMEOUT;
2800 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_CAPTURE;
2801 shot_ext->request_scc = 0;
2802 shot_ext->request_scp = 0;
2803 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_CAPTURE_WAIT; // auto transition
2804 break;
2805 case IS_FLASH_STATE_CAPTURE_WAIT:
2806 shot_ext->request_scc = 0;
2807 shot_ext->request_scp = 0;
2808 break;
2809 case IS_FLASH_STATE_CAPTURE_JPEG:
73f5ad60 2810 ALOGV("(%s): [Flash] Flash Capture (%d)!!!!!", __FUNCTION__, (FLASH_STABLE_WAIT_TIMEOUT -m_ctlInfo.flash.m_flashTimeOut));
e117f756
YJ
2811 shot_ext->request_scc = 1;
2812 shot_ext->request_scp = 1;
2813 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_CAPTURE_END; // auto transition
2814 break;
2815 case IS_FLASH_STATE_CAPTURE_END:
73f5ad60 2816 ALOGV("(%s): [Flash] Flash Capture END", __FUNCTION__);
e117f756
YJ
2817 shot_ext->shot.ctl.aa.aeflashMode = AA_FLASHMODE_OFF;
2818 shot_ext->request_scc = 0;
2819 shot_ext->request_scp = 0;
2820 m_ctlInfo.flash.m_flashEnableFlg = false;
2821 m_ctlInfo.flash.m_flashCnt = 0;
2822 m_ctlInfo.flash.m_afFlashDoneFlg= false;
2823 break;
2824 default:
2825 ALOGE("(%s): [Flash] flash state error!! (%d)", __FUNCTION__, m_ctlInfo.flash.m_flashCnt);
6f19b6cf
YJ
2826 }
2827}
2828
e117f756 2829void ExynosCameraHWInterface2::m_preCaptureListenerSensor(struct camera2_shot_ext * shot_ext)
6f19b6cf 2830{
e117f756
YJ
2831 // Flash
2832 switch (m_ctlInfo.flash.m_flashCnt) {
2833 case IS_FLASH_STATE_AUTO_WAIT:
2834 if (m_ctlInfo.flash.m_flashDecisionResult) {
2835 if (shot_ext->shot.dm.flash.flashMode == CAM2_FLASH_MODE_OFF) {
2836 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_DONE;
73f5ad60 2837 ALOGV("(%s): [Flash] Lis : AUTO -> OFF (%d)", __FUNCTION__, shot_ext->shot.dm.flash.flashMode);
9257e29e 2838 } else {
73f5ad60 2839 ALOGV("(%s): [Flash] Waiting : AUTO -> OFF", __FUNCTION__);
9257e29e 2840 }
e117f756
YJ
2841 } else {
2842 //If flash isn't activated at flash auto mode, skip flash auto control
2843 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_DONE;
73f5ad60 2844 ALOGV("(%s): [Flash] Skip : AUTO -> OFF", __FUNCTION__);
9257e29e 2845 }
e117f756 2846 break;
9257e29e 2847 }
9257e29e
YJ
2848}
2849
e117f756 2850void ExynosCameraHWInterface2::m_preCaptureListenerISP(struct camera2_shot_ext * shot_ext)
9257e29e 2851{
e117f756
YJ
2852 // Flash
2853 switch (m_ctlInfo.flash.m_flashCnt) {
2854 case IS_FLASH_STATE_ON_WAIT:
2855 if (shot_ext->shot.dm.flash.decision > 0) {
2856 // store decision result to skip capture sequenece
73f5ad60 2857 ALOGV("(%s): [Flash] IS_FLASH_ON, decision - %d", __FUNCTION__, shot_ext->shot.dm.flash.decision);
e117f756
YJ
2858 if (shot_ext->shot.dm.flash.decision == 2)
2859 m_ctlInfo.flash.m_flashDecisionResult = false;
2860 else
2861 m_ctlInfo.flash.m_flashDecisionResult = true;
2862 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON_DONE;
2863 } else {
2864 if (m_ctlInfo.flash.m_flashTimeOut == 0) {
73f5ad60 2865 ALOGV("(%s): [Flash] Timeout IS_FLASH_ON, decision is false setting", __FUNCTION__);
e117f756
YJ
2866 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON_DONE;
2867 m_ctlInfo.flash.m_flashDecisionResult = false;
caea49e6 2868 } else {
e117f756 2869 m_ctlInfo.flash.m_flashTimeOut--;
6f19b6cf 2870 }
6f19b6cf 2871 }
e117f756
YJ
2872 break;
2873 case IS_FLASH_STATE_AE_AWB_LOCK_WAIT:
2874 if (shot_ext->shot.dm.aa.awbMode == AA_AWBMODE_LOCKED) {
73f5ad60 2875 ALOGV("(%s): [Flash] FLASH_AUTO_AE_AWB_LOCK_WAIT - %d", __FUNCTION__, shot_ext->shot.dm.aa.awbMode);
e117f756
YJ
2876 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_WAIT;
2877 } else {
73f5ad60 2878 ALOGV("(%s): [Flash] Waiting : AA_AWBMODE_LOCKED", __FUNCTION__);
e117f756
YJ
2879 }
2880 break;
2881 case IS_FLASH_STATE_CAPTURE_WAIT:
2882 if (m_ctlInfo.flash.m_flashDecisionResult) {
2883 if (shot_ext->shot.dm.flash.firingStable) {
2884 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_CAPTURE_JPEG;
6f19b6cf 2885 } else {
9257e29e 2886 if (m_ctlInfo.flash.m_flashTimeOut == 0) {
e117f756
YJ
2887 ALOGE("(%s): [Flash] Wait firingStable time-out!!", __FUNCTION__);
2888 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_CAPTURE_JPEG;
9257e29e 2889 } else {
e117f756 2890 ALOGV("(%s): [Flash] Wait firingStable - %d", __FUNCTION__, m_ctlInfo.flash.m_flashTimeOut);
9257e29e
YJ
2891 m_ctlInfo.flash.m_flashTimeOut--;
2892 }
6f19b6cf 2893 }
e117f756
YJ
2894 } else {
2895 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_CAPTURE_JPEG;
6f19b6cf 2896 }
e117f756 2897 break;
6f19b6cf 2898 }
6f19b6cf
YJ
2899}
2900
4a9565ae
YJ
2901void ExynosCameraHWInterface2::m_updateAfRegion(struct camera2_shot_ext * shot_ext)
2902{
2903 if (0 == shot_ext->shot.ctl.aa.afRegions[0] && 0 == shot_ext->shot.ctl.aa.afRegions[1]
2904 && 0 == shot_ext->shot.ctl.aa.afRegions[2] && 0 == shot_ext->shot.ctl.aa.afRegions[3]) {
2905 ALOGV("(%s): AF region resetting", __FUNCTION__);
2906 lastAfRegion[0] = 0;
2907 lastAfRegion[1] = 0;
2908 lastAfRegion[2] = 0;
2909 lastAfRegion[3] = 0;
2910 } else {
2911 if (!(lastAfRegion[0] == shot_ext->shot.ctl.aa.afRegions[0] && lastAfRegion[1] == shot_ext->shot.ctl.aa.afRegions[1]
2912 && lastAfRegion[2] == shot_ext->shot.ctl.aa.afRegions[2] && lastAfRegion[3] == shot_ext->shot.ctl.aa.afRegions[3])) {
2913 ALOGD("(%s): AF region changed : triggering", __FUNCTION__);
2914 shot_ext->shot.ctl.aa.afTrigger = 1;
2915 shot_ext->shot.ctl.aa.afMode = m_afMode;
2916 m_afState = HAL_AFSTATE_STARTED;
2917 lastAfRegion[0] = shot_ext->shot.ctl.aa.afRegions[0];
2918 lastAfRegion[1] = shot_ext->shot.ctl.aa.afRegions[1];
2919 lastAfRegion[2] = shot_ext->shot.ctl.aa.afRegions[2];
2920 lastAfRegion[3] = shot_ext->shot.ctl.aa.afRegions[3];
2921 m_IsAfTriggerRequired = false;
2922 }
2923 // clear region infos in case of CAF mode
2924 if (m_afMode == AA_AFMODE_CONTINUOUS_VIDEO || m_afMode == AA_AFMODE_CONTINUOUS_PICTURE) {
2925 shot_ext->shot.ctl.aa.afRegions[0] = lastAfRegion[0] = 0;
2926 shot_ext->shot.ctl.aa.afRegions[1] = lastAfRegion[1] = 0;
2927 shot_ext->shot.ctl.aa.afRegions[2] = lastAfRegion[2] = 0;
2928 shot_ext->shot.ctl.aa.afRegions[3] = lastAfRegion[3] = 0;
2929 }
2930 }
2931}
2932
2933void ExynosCameraHWInterface2::m_afTrigger(struct camera2_shot_ext * shot_ext)
2934{
2935 if (m_afState == HAL_AFSTATE_SCANNING) {
2936 ALOGD("(%s): restarting trigger ", __FUNCTION__);
2937 } else {
2938 if (m_afState != HAL_AFSTATE_NEEDS_COMMAND)
2939 ALOGD("(%s): wrong trigger state %d", __FUNCTION__, m_afState);
2940 else
2941 m_afState = HAL_AFSTATE_STARTED;
2942 }
2943 ALOGD("### AF Triggering with mode (%d)", m_afMode);
2944 shot_ext->shot.ctl.aa.afTrigger = 1;
2945 shot_ext->shot.ctl.aa.afMode = m_afMode;
2946 m_IsAfTriggerRequired = false;
2947}
2948
13d8c7b4
SK
2949void ExynosCameraHWInterface2::m_sensorThreadFunc(SignalDrivenThread * self)
2950{
2951 uint32_t currentSignal = self->GetProcessingSignal();
2952 SensorThread * selfThread = ((SensorThread*)self);
2953 int index;
ad37861e 2954 int index_isp;
13d8c7b4
SK
2955 status_t res;
2956 nsecs_t frameTime;
2957 int bayersOnSensor = 0, bayersOnIsp = 0;
ad37861e
SK
2958 int j = 0;
2959 bool isCapture = false;
13d8c7b4
SK
2960 ALOGV("DEBUG(%s): m_sensorThreadFunc (%x)", __FUNCTION__, currentSignal);
2961
2962 if (currentSignal & SIGNAL_THREAD_RELEASE) {
2c872806 2963 CAM_LOGD("(%s): ENTER processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
13d8c7b4 2964
9dd63e1f 2965 ALOGV("(%s): calling sensor streamoff", __FUNCTION__);
13d8c7b4 2966 cam_int_streamoff(&(m_camera_info.sensor));
9dd63e1f 2967 ALOGV("(%s): calling sensor streamoff done", __FUNCTION__);
b5237e6b
SK
2968
2969 m_camera_info.sensor.buffers = 0;
2970 ALOGV("DEBUG(%s): sensor calling reqbuf 0 ", __FUNCTION__);
2971 cam_int_reqbufs(&(m_camera_info.sensor));
2972 ALOGV("DEBUG(%s): sensor calling reqbuf 0 done", __FUNCTION__);
5506cebf 2973 m_camera_info.sensor.status = false;
ad37861e 2974
9dd63e1f
SK
2975 ALOGV("(%s): calling ISP streamoff", __FUNCTION__);
2976 isp_int_streamoff(&(m_camera_info.isp));
2977 ALOGV("(%s): calling ISP streamoff done", __FUNCTION__);
ad37861e 2978
b5237e6b
SK
2979 m_camera_info.isp.buffers = 0;
2980 ALOGV("DEBUG(%s): isp calling reqbuf 0 ", __FUNCTION__);
2981 cam_int_reqbufs(&(m_camera_info.isp));
2982 ALOGV("DEBUG(%s): isp calling reqbuf 0 done", __FUNCTION__);
2983
13d8c7b4 2984 exynos_v4l2_s_ctrl(m_camera_info.sensor.fd, V4L2_CID_IS_S_STREAM, IS_DISABLE_STREAM);
13d8c7b4 2985
52f54308 2986 m_requestManager->releaseSensorQ();
2adfa429 2987 m_requestManager->ResetEntry();
ad37861e 2988 ALOGV("(%s): EXIT processing SIGNAL_THREAD_RELEASE", __FUNCTION__);
13d8c7b4
SK
2989 selfThread->SetSignal(SIGNAL_THREAD_TERMINATE);
2990 return;
2991 }
2992
2993 if (currentSignal & SIGNAL_SENSOR_START_REQ_PROCESSING)
2994 {
2995 ALOGV("DEBUG(%s): SensorThread processing SIGNAL_SENSOR_START_REQ_PROCESSING", __FUNCTION__);
9dd63e1f 2996 int targetStreamIndex = 0, i=0;
ad37861e 2997 int matchedFrameCnt = -1, processingReqIndex;
13d8c7b4 2998 struct camera2_shot_ext *shot_ext;
ad37861e 2999 struct camera2_shot_ext *shot_ext_capture;
0f26b20f
SK
3000 bool triggered = false;
3001 int afMode;
9dd63e1f 3002
ad37861e 3003 /* dqbuf from sensor */
5506cebf 3004 ALOGV("Sensor DQbuf start");
13d8c7b4 3005 index = cam_int_dqbuf(&(m_camera_info.sensor));
52f54308
SK
3006 m_requestManager->pushSensorQ(index);
3007 ALOGV("Sensor DQbuf done(%d)", index);
9dd63e1f 3008 shot_ext = (struct camera2_shot_ext *)(m_camera_info.sensor.buffer[index].virt.extP[1]);
ad37861e 3009
a15b4e3f
SK
3010 if (m_nightCaptureCnt != 0) {
3011 matchedFrameCnt = m_nightCaptureFrameCnt;
e117f756 3012 } else if (m_ctlInfo.flash.m_flashCnt >= IS_FLASH_STATE_CAPTURE) {
9a710a45 3013 matchedFrameCnt = m_ctlInfo.flash.m_flashFrameCount;
caea49e6 3014 ALOGV("Skip frame, request is fixed at %d", matchedFrameCnt);
6f19b6cf 3015 } else {
a15b4e3f
SK
3016 matchedFrameCnt = m_requestManager->FindFrameCnt(shot_ext);
3017 }
ad37861e 3018
5c88d1f2
C
3019 if (matchedFrameCnt == -1 && m_vdisBubbleCnt > 0) {
3020 matchedFrameCnt = m_vdisDupFrame;
3021 }
5c88d1f2 3022
a07cbd98 3023 if (matchedFrameCnt != -1) {
5c88d1f2
C
3024 if (m_vdisBubbleCnt == 0) {
3025 frameTime = systemTime();
3026 m_requestManager->RegisterTimestamp(matchedFrameCnt, &frameTime);
3027 m_requestManager->UpdateIspParameters(shot_ext, matchedFrameCnt, &m_ctlInfo);
3028 }
9a710a45 3029
8e2c2fdb
SK
3030 if (m_afModeWaitingCnt != 0) {
3031 ALOGV("### Af Trigger pulled, waiting for mode change cnt(%d) ", m_afModeWaitingCnt);
3032 m_afModeWaitingCnt --;
3033 if (m_afModeWaitingCnt == 1) {
cd13bb78 3034 m_afModeWaitingCnt = 0;
8e2c2fdb
SK
3035 OnAfTrigger(m_afPendingTriggerId);
3036 }
3037 }
308291de 3038 m_zoomRatio = (float)m_camera2->getSensorW() / (float)shot_ext->shot.ctl.scaler.cropRegion[2];
e4657e32
SK
3039 float zoomLeft, zoomTop, zoomWidth, zoomHeight;
3040 int crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0;
3041
3042 m_getRatioSize(m_camera2->getSensorW(), m_camera2->getSensorH(),
5506cebf 3043 m_streamThreads[0]->m_parameters.width, m_streamThreads[0]->m_parameters.height,
e4657e32
SK
3044 &crop_x, &crop_y,
3045 &crop_w, &crop_h,
3046 0);
3047
5506cebf 3048 if (m_streamThreads[0]->m_parameters.width >= m_streamThreads[0]->m_parameters.height) {
308291de 3049 zoomWidth = m_camera2->getSensorW() / m_zoomRatio;
e4657e32 3050 zoomHeight = zoomWidth *
5506cebf 3051 m_streamThreads[0]->m_parameters.height / m_streamThreads[0]->m_parameters.width;
e4657e32 3052 } else {
308291de 3053 zoomHeight = m_camera2->getSensorH() / m_zoomRatio;
e4657e32 3054 zoomWidth = zoomHeight *
5506cebf 3055 m_streamThreads[0]->m_parameters.width / m_streamThreads[0]->m_parameters.height;
e4657e32
SK
3056 }
3057 zoomLeft = (crop_w - zoomWidth) / 2;
3058 zoomTop = (crop_h - zoomHeight) / 2;
3059
3060 int32_t new_cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
3061
5506cebf 3062 if (new_cropRegion[0] * 2 + new_cropRegion[2] > (int32_t)m_camera2->getSensorW())
308291de 3063 new_cropRegion[2]--;
5506cebf 3064 else if (new_cropRegion[0] * 2 + new_cropRegion[2] < (int32_t)m_camera2->getSensorW())
308291de
C
3065 new_cropRegion[2]++;
3066
e4657e32
SK
3067 shot_ext->shot.ctl.scaler.cropRegion[0] = new_cropRegion[0];
3068 shot_ext->shot.ctl.scaler.cropRegion[1] = new_cropRegion[1];
3069 shot_ext->shot.ctl.scaler.cropRegion[2] = new_cropRegion[2];
0f26b20f 3070 if (m_IsAfModeUpdateRequired) {
ed4ad5fe 3071 ALOGD("### AF Mode change(Mode %d) ", m_afMode);
0f26b20f
SK
3072 shot_ext->shot.ctl.aa.afMode = m_afMode;
3073 if (m_afMode == AA_AFMODE_CONTINUOUS_VIDEO || m_afMode == AA_AFMODE_CONTINUOUS_PICTURE) {
ed4ad5fe 3074 ALOGD("### With Automatic triger for continuous modes");
0f26b20f
SK
3075 m_afState = HAL_AFSTATE_STARTED;
3076 shot_ext->shot.ctl.aa.afTrigger = 1;
3077 triggered = true;
3078 }
3079 m_IsAfModeUpdateRequired = false;
311d52eb 3080 // support inifinity focus mode
fdbaf5d2 3081 if ((m_afMode == AA_AFMODE_MANUAL) && ( shot_ext->shot.ctl.lens.focusDistance == 0)) {
311d52eb
YJ
3082 shot_ext->shot.ctl.aa.afMode = AA_AFMODE_INFINITY;
3083 shot_ext->shot.ctl.aa.afTrigger = 1;
3084 triggered = true;
3085 }
0f26b20f
SK
3086 if (m_afMode2 != NO_CHANGE) {
3087 enum aa_afmode tempAfMode = m_afMode2;
3088 m_afMode2 = NO_CHANGE;
3089 SetAfMode(tempAfMode);
3090 }
3091 }
3092 else {
3093 shot_ext->shot.ctl.aa.afMode = NO_CHANGE;
3094 }
3095 if (m_IsAfTriggerRequired) {
e117f756 3096 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
4a9565ae 3097 // flash case
e117f756 3098 if (m_ctlInfo.flash.m_flashCnt == IS_FLASH_STATE_ON_DONE) {
4a9565ae
YJ
3099 if ((m_afMode != AA_AFMODE_AUTO) && (m_afMode != AA_AFMODE_MACRO)) {
3100 // Flash is enabled and start AF
3101 m_afTrigger(shot_ext);
6f19b6cf 3102 } else {
4a9565ae
YJ
3103 if (m_ctlInfo.af.m_afTriggerTimeOut == 0)
3104 m_afTrigger(shot_ext);
6f19b6cf 3105 else
4a9565ae 3106 m_ctlInfo.af.m_afTriggerTimeOut--;
6f19b6cf 3107 }
6f19b6cf
YJ
3108 }
3109 } else {
4a9565ae
YJ
3110 // non-flash case
3111 if ((m_afMode != AA_AFMODE_AUTO) && (m_afMode != AA_AFMODE_MACRO)) {
3112 m_afTrigger(shot_ext);
6f19b6cf 3113 } else {
4a9565ae
YJ
3114 if (m_ctlInfo.af.m_afTriggerTimeOut == 0)
3115 m_afTrigger(shot_ext);
6f19b6cf 3116 else
4a9565ae 3117 m_ctlInfo.af.m_afTriggerTimeOut--;
6f19b6cf 3118 }
36c106c9 3119 }
4a9565ae 3120 } else {
8e2c2fdb 3121 shot_ext->shot.ctl.aa.afTrigger = 0;
0f26b20f 3122 }
5506cebf
SK
3123
3124 if (m_wideAspect) {
3125 shot_ext->setfile = ISS_SUB_SCENARIO_VIDEO;
3126 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 30;
15fd8231 3127 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
5506cebf
SK
3128 } else {
3129 shot_ext->setfile = ISS_SUB_SCENARIO_STILL;
15fd8231 3130 }
0f26b20f
SK
3131 if (triggered)
3132 shot_ext->shot.ctl.aa.afTrigger = 1;
3133
3134 // TODO : check collision with AFMode Update
3135 if (m_IsAfLockRequired) {
3136 shot_ext->shot.ctl.aa.afMode = AA_AFMODE_OFF;
3137 m_IsAfLockRequired = false;
3138 }
4ed2f103 3139 ALOGV("### Isp Qbuf start(%d) count (%d), SCP(%d) SCC(%d) DIS(%d) shot_size(%d)",
ad37861e
SK
3140 index,
3141 shot_ext->shot.ctl.request.frameCount,
3142 shot_ext->request_scp,
3143 shot_ext->request_scc,
3144 shot_ext->dis_bypass, sizeof(camera2_shot));
4a9565ae
YJ
3145
3146 // update AF region
3147 m_updateAfRegion(shot_ext);
3148
6bf36b60
SK
3149 if (shot_ext->shot.ctl.aa.sceneMode == AA_SCENE_MODE_NIGHT
3150 && shot_ext->shot.ctl.aa.aeMode == AA_AEMODE_LOCKED)
3151 shot_ext->shot.ctl.aa.aeMode = AA_AEMODE_ON;
a15b4e3f 3152 if (m_nightCaptureCnt == 0) {
5506cebf 3153 if (shot_ext->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_STILL_CAPTURE
a15b4e3f
SK
3154 && shot_ext->shot.ctl.aa.sceneMode == AA_SCENE_MODE_NIGHT) {
3155 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
6bf36b60 3156 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 8;
a15b4e3f
SK
3157 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
3158 m_nightCaptureCnt = 4;
3159 m_nightCaptureFrameCnt = matchedFrameCnt;
3160 shot_ext->request_scc = 0;
3161 }
3162 }
3163 else if (m_nightCaptureCnt == 1) {
3164 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
6bf36b60 3165 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 8;
a15b4e3f
SK
3166 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
3167 m_nightCaptureCnt--;
2f4d175d 3168 m_nightCaptureFrameCnt = 0;
a15b4e3f
SK
3169 shot_ext->request_scc = 1;
3170 }
6bf36b60
SK
3171 else if (m_nightCaptureCnt == 2) {
3172 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
3173 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 8;
3174 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
3175 m_nightCaptureCnt--;
3176 shot_ext->request_scc = 0;
3177 }
3178 else if (m_nightCaptureCnt == 3 || m_nightCaptureCnt == 4) {
a15b4e3f
SK
3179 shot_ext->shot.ctl.aa.sceneMode = AA_SCENE_MODE_NIGHT_CAPTURE;
3180 shot_ext->shot.ctl.aa.aeTargetFpsRange[0] = 2;
3181 shot_ext->shot.ctl.aa.aeTargetFpsRange[1] = 30;
3182 m_nightCaptureCnt--;
3183 shot_ext->request_scc = 0;
3184 }
6f19b6cf
YJ
3185
3186 // Flash mode
3187 // Keep and Skip request_scc = 1 at flash enable mode to operate flash sequence
e117f756
YJ
3188 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH)
3189 && (shot_ext->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_STILL_CAPTURE)
6f19b6cf 3190 && (m_cameraId == 0)) {
e117f756
YJ
3191 if (!m_ctlInfo.flash.m_flashDecisionResult) {
3192 m_ctlInfo.flash.m_flashEnableFlg = false;
3193 m_ctlInfo.flash.m_afFlashDoneFlg = false;
3194 m_ctlInfo.flash.m_flashCnt = 0;
3195 } else if ((m_ctlInfo.flash.m_flashCnt == IS_FLASH_STATE_AUTO_DONE) || (m_ctlInfo.flash.m_flashCnt == IS_FLASH_STATE_AUTO_OFF)) {
6f19b6cf
YJ
3196 ALOGE("(%s): [Flash] Flash capture start : skip request scc 1#####", __FUNCTION__);
3197 shot_ext->request_scc = 0;
9a710a45
YJ
3198 m_ctlInfo.flash.m_flashFrameCount = matchedFrameCnt;
3199 m_ctlInfo.flash.m_flashEnableFlg = true;
e117f756
YJ
3200 m_ctlInfo.flash.m_afFlashDoneFlg = false;
3201 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_CAPTURE;
73f5ad60 3202 } else if (m_ctlInfo.flash.m_flashCnt < IS_FLASH_STATE_AUTO_DONE) {
4a9565ae 3203 ALOGE("(%s): [Flash] Flash capture Error!!!!!!", __FUNCTION__);
caea49e6 3204 }
4a9565ae
YJ
3205 } else if (shot_ext->shot.ctl.aa.captureIntent == AA_CAPTURE_INTENT_STILL_CAPTURE) {
3206 m_ctlInfo.flash.m_flashDecisionResult = false;
caea49e6
YJ
3207 }
3208
3209 // TODO : set torch mode for video recording. need to find proper position.
3210 // m_wideAspect is will be changed to recording hint
3211 if ((shot_ext->shot.ctl.flash.flashMode == CAM2_FLASH_MODE_SINGLE) && m_wideAspect) {
3212 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_TORCH;
3213 shot_ext->shot.ctl.flash.firingPower = 10;
3214 m_ctlInfo.flash.m_flashTorchMode = true;
3215 } else if (m_wideAspect){
3216 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_OFF;
3217 shot_ext->shot.ctl.flash.firingPower = 0;
3218 m_ctlInfo.flash.m_flashTorchMode = false;
3219 } else {
3220 if (m_ctlInfo.flash.m_flashTorchMode) {
3221 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_OFF;
3222 shot_ext->shot.ctl.flash.firingPower = 0;
3223 m_ctlInfo.flash.m_flashTorchMode = false;
3224 } else {
3225 shot_ext->shot.ctl.flash.flashMode = CAM2_FLASH_MODE_NOP;
6f19b6cf
YJ
3226 }
3227 }
3228
e117f756
YJ
3229 if (m_ctlInfo.flash.m_flashEnableFlg) {
3230 m_preCaptureListenerSensor(shot_ext);
3231 m_preCaptureSetter(shot_ext);
3232 }
3233
5506cebf
SK
3234 if (shot_ext->isReprocessing) {
3235 ALOGE("(%s): Reprocess request ", __FUNCTION__);
3236 m_currentReprocessOutStreams = shot_ext->shot.ctl.request.outputStreams[0];
3237 shot_ext->request_scp = 0;
3238 shot_ext->request_scc = 0;
3239 m_reprocessingFrameCnt = shot_ext->shot.ctl.request.frameCount;
3240 memcpy(&m_jpegMetadata, &shot_ext->shot, sizeof(struct camera2_shot));
3241 m_streamThreads[1]->SetSignal(SIGNAL_STREAM_REPROCESSING_START);
3242 }
fdbaf5d2 3243
8e2c2fdb
SK
3244 ALOGV("(%s): queued aa(%d) aemode(%d) awb(%d) afmode(%d) trigger(%d)", __FUNCTION__,
3245 (int)(shot_ext->shot.ctl.aa.mode), (int)(shot_ext->shot.ctl.aa.aeMode),
3246 (int)(shot_ext->shot.ctl.aa.awbMode), (int)(shot_ext->shot.ctl.aa.afMode),
3247 (int)(shot_ext->shot.ctl.aa.afTrigger));
7d0efb59 3248
5c88d1f2
C
3249 if (m_vdisBubbleCnt > 0 && m_vdisDupFrame == matchedFrameCnt) {
3250 shot_ext->dis_bypass = 1;
3251 shot_ext->request_scp = 0;
3252 shot_ext->request_scc = 0;
3253 m_vdisBubbleCnt--;
3254 matchedFrameCnt = -1;
3255 } else {
3256 m_vdisDupFrame = matchedFrameCnt;
3257 }
5c88d1f2 3258
5506cebf 3259 uint32_t current_scp = shot_ext->request_scp;
7d0efb59 3260
c0b6e17e 3261 if (shot_ext->shot.dm.request.frameCount == 0) {
4aa4d739 3262 CAM_LOGE("ERR(%s): dm.request.frameCount = %d", __FUNCTION__, shot_ext->shot.dm.request.frameCount);
c0b6e17e
C
3263 }
3264
ad37861e 3265 cam_int_qbuf(&(m_camera_info.isp), index);
13d8c7b4 3266
ad37861e 3267 usleep(10000);
13d8c7b4 3268
ad37861e
SK
3269 ALOGV("### isp DQBUF start");
3270 index_isp = cam_int_dqbuf(&(m_camera_info.isp));
ef6f83ca 3271
ad37861e 3272 shot_ext = (struct camera2_shot_ext *)(m_camera_info.isp.buffer[index_isp].virt.extP[1]);
13d8c7b4 3273
e117f756
YJ
3274 if (m_ctlInfo.flash.m_flashEnableFlg)
3275 m_preCaptureListenerISP(shot_ext);
9a710a45 3276
5506cebf 3277 ALOGV("### Isp DQbuf done(%d) count (%d), SCP(%d) SCC(%d) dis_bypass(%d) shot_size(%d)",
ad37861e
SK
3278 index,
3279 shot_ext->shot.ctl.request.frameCount,
3280 shot_ext->request_scp,
3281 shot_ext->request_scc,
3282 shot_ext->dis_bypass, sizeof(camera2_shot));
fdbaf5d2 3283
ef6f83ca 3284 ALOGV("(%s): DM aa(%d) aemode(%d) awb(%d) afmode(%d)", __FUNCTION__,
8e2c2fdb
SK
3285 (int)(shot_ext->shot.dm.aa.mode), (int)(shot_ext->shot.dm.aa.aeMode),
3286 (int)(shot_ext->shot.dm.aa.awbMode),
3287 (int)(shot_ext->shot.dm.aa.afMode));
13d8c7b4 3288
2f4d175d 3289#ifndef ENABLE_FRAME_SYNC
5506cebf 3290 m_currentOutputStreams = shot_ext->shot.ctl.request.outputStreams[0];
2f4d175d 3291#endif
2adfa429
JS
3292
3293 if (current_scp) {
3294 ALOGV("send SIGNAL_STREAM_DATA_COMING(return scp : %d)", shot_ext->request_scp);
b55ed664 3295 m_scpOutputSignalCnt++;
ad37861e
SK
3296 m_streamThreads[0]->SetSignal(SIGNAL_STREAM_DATA_COMING);
3297 }
7d0efb59
C
3298
3299 if (current_scp != shot_ext->request_scp) {
4aa4d739 3300 CAM_LOGW("WARN(%s): scp frame drop1 request_scp(%d to %d)",
7d0efb59
C
3301 __FUNCTION__, current_scp, shot_ext->request_scp);
3302 }
15fd8231 3303 if (shot_ext->request_scc) {
a15b4e3f 3304 memcpy(&m_jpegMetadata, &shot_ext->shot, sizeof(struct camera2_shot));
15fd8231
SK
3305 m_streamThreads[1]->SetSignal(SIGNAL_STREAM_DATA_COMING);
3306 }
c15a6b00 3307
ad37861e
SK
3308 ALOGV("(%s): SCP_CLOSING check sensor(%d) scc(%d) scp(%d) ", __FUNCTION__,
3309 shot_ext->request_sensor, shot_ext->request_scc, shot_ext->request_scp);
3310 if (shot_ext->request_scc + shot_ext->request_scp + shot_ext->request_sensor == 0) {
3311 ALOGV("(%s): SCP_CLOSING check OK ", __FUNCTION__);
3312 m_scp_closed = true;
3313 }
3314 else
3315 m_scp_closed = false;
c15a6b00 3316
fd2d78a2
SK
3317 if (!shot_ext->fd_bypass) {
3318 /* FD orientation axis transformation */
3319 for (int i=0; i < CAMERA2_MAX_FACES; i++) {
3320 if (shot_ext->shot.dm.stats.faceRectangles[i][0] > 0)
3321 shot_ext->shot.dm.stats.faceRectangles[i][0] = (m_camera2->m_curCameraInfo->sensorW
ef6f83ca 3322 * shot_ext->shot.dm.stats.faceRectangles[i][0])
5506cebf 3323 / m_streamThreads[0].get()->m_parameters.width;
fd2d78a2
SK
3324 if (shot_ext->shot.dm.stats.faceRectangles[i][1] > 0)
3325 shot_ext->shot.dm.stats.faceRectangles[i][1] = (m_camera2->m_curCameraInfo->sensorH
ef6f83ca 3326 * shot_ext->shot.dm.stats.faceRectangles[i][1])
5506cebf 3327 / m_streamThreads[0].get()->m_parameters.height;
fd2d78a2
SK
3328 if (shot_ext->shot.dm.stats.faceRectangles[i][2] > 0)
3329 shot_ext->shot.dm.stats.faceRectangles[i][2] = (m_camera2->m_curCameraInfo->sensorW
ef6f83ca 3330 * shot_ext->shot.dm.stats.faceRectangles[i][2])
5506cebf 3331 / m_streamThreads[0].get()->m_parameters.width;
fd2d78a2
SK
3332 if (shot_ext->shot.dm.stats.faceRectangles[i][3] > 0)
3333 shot_ext->shot.dm.stats.faceRectangles[i][3] = (m_camera2->m_curCameraInfo->sensorH
ef6f83ca 3334 * shot_ext->shot.dm.stats.faceRectangles[i][3])
5506cebf 3335 / m_streamThreads[0].get()->m_parameters.height;
fd2d78a2
SK
3336 }
3337 }
e117f756 3338 if (m_nightCaptureCnt == 0 && (m_ctlInfo.flash.m_flashCnt < IS_FLASH_STATE_CAPTURE)) {
a15b4e3f
SK
3339 m_requestManager->ApplyDynamicMetadata(shot_ext);
3340 }
0f26b20f 3341 OnAfNotification(shot_ext->shot.dm.aa.afState);
73f5ad60 3342 OnPrecaptureMeteringNotificationISP();
ad37861e 3343 }
13d8c7b4 3344
52f54308
SK
3345 index = m_requestManager->popSensorQ();
3346 if(index < 0){
3347 ALOGE("sensorQ is empty");
3348 return;
3349 }
3350
0f26b20f 3351 processingReqIndex = m_requestManager->MarkProcessingRequest(&(m_camera_info.sensor.buffer[index]), &afMode);
ef6f83ca 3352 if (processingReqIndex != -1)
0f26b20f 3353 SetAfMode((enum aa_afmode)afMode);
ef6f83ca 3354
9dd63e1f 3355
ad37861e
SK
3356 shot_ext = (struct camera2_shot_ext *)(m_camera_info.sensor.buffer[index].virt.extP[1]);
3357 if (m_scp_closing || m_scp_closed) {
3358 ALOGD("(%s): SCP_CLOSING(%d) SCP_CLOSED(%d)", __FUNCTION__, m_scp_closing, m_scp_closed);
3359 shot_ext->request_scc = 0;
3360 shot_ext->request_scp = 0;
3361 shot_ext->request_sensor = 0;
3362 }
ad37861e 3363 cam_int_qbuf(&(m_camera_info.sensor), index);
52f54308 3364 ALOGV("Sensor Qbuf done(%d)", index);
c15a6b00 3365
ef6f83ca
SK
3366 if (!m_scp_closing
3367 && ((matchedFrameCnt == -1) || (processingReqIndex == -1))){
da7ca692 3368 ALOGV("make bubble shot: matchedFramcnt(%d) processingReqIndex(%d)",
ef6f83ca 3369 matchedFrameCnt, processingReqIndex);
ad37861e
SK
3370 selfThread->SetSignal(SIGNAL_SENSOR_START_REQ_PROCESSING);
3371 }
c15a6b00 3372 }
ad37861e
SK
3373 return;
3374}
9dd63e1f 3375
86646da4
SK
3376void ExynosCameraHWInterface2::m_streamBufferInit(SignalDrivenThread *self)
3377{
3378 uint32_t currentSignal = self->GetProcessingSignal();
3379 StreamThread * selfThread = ((StreamThread*)self);
3380 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
5506cebf
SK
3381 node_info_t *currentNode = selfStreamParms->node;
3382 substream_parameters_t *subParms;
86646da4
SK
3383 buffer_handle_t * buf = NULL;
3384 status_t res;
3385 void *virtAddr[3];
3386 int i, j;
3387 int index;
3388 nsecs_t timestamp;
3389
3390 if (!(selfThread->m_isBufferInit))
3391 {
3392 for ( i=0 ; i < selfStreamParms->numSvcBuffers; i++) {
3393 res = selfStreamParms->streamOps->dequeue_buffer(selfStreamParms->streamOps, &buf);
3394 if (res != NO_ERROR || buf == NULL) {
3395 ALOGE("ERR(%s): Init: unable to dequeue buffer : %d",__FUNCTION__ , res);
3396 return;
3397 }
3398 ALOGV("DEBUG(%s): got buf(%x) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
3399 ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
3400
5506cebf 3401 index = selfThread->findBufferIndex(buf);
86646da4
SK
3402 if (index == -1) {
3403 ALOGE("ERR(%s): could not find buffer index", __FUNCTION__);
3404 }
3405 else {
3406 ALOGV("DEBUG(%s): found buffer index[%d] - status(%d)",
3407 __FUNCTION__, index, selfStreamParms->svcBufStatus[index]);
3408 if (selfStreamParms->svcBufStatus[index]== REQUIRES_DQ_FROM_SVC)
3409 selfStreamParms->svcBufStatus[index] = ON_DRIVER;
3410 else if (selfStreamParms->svcBufStatus[index]== ON_SERVICE)
3411 selfStreamParms->svcBufStatus[index] = ON_HAL;
3412 else {
3413 ALOGV("DBG(%s): buffer status abnormal (%d) "
3414 , __FUNCTION__, selfStreamParms->svcBufStatus[index]);
3415 }
3416 selfStreamParms->numSvcBufsInHal++;
86646da4 3417 }
5506cebf 3418 selfStreamParms->bufIndex = 0;
86646da4
SK
3419 }
3420 selfThread->m_isBufferInit = true;
3421 }
5506cebf
SK
3422 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3423 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3424 continue;
86646da4 3425
5506cebf
SK
3426 subParms = &m_subStreams[selfThread->m_attachedSubStreams[i].streamId];
3427 if (subParms->type && subParms->needBufferInit) {
3428 ALOGV("(%s): [subStream] (id:%d) Buffer Initialization numsvcbuf(%d)",
3429 __FUNCTION__, selfThread->m_attachedSubStreams[i].streamId, subParms->numSvcBuffers);
74d78ebe
SK
3430 int checkingIndex = 0;
3431 bool found = false;
5506cebf
SK
3432 for ( i = 0 ; i < subParms->numSvcBuffers; i++) {
3433 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
74d78ebe
SK
3434 if (res != NO_ERROR || buf == NULL) {
3435 ALOGE("ERR(%s): Init: unable to dequeue buffer : %d",__FUNCTION__ , res);
3436 return;
3437 }
5506cebf
SK
3438 subParms->numSvcBufsInHal++;
3439 ALOGV("DEBUG(%s): [subStream] got buf(%x) bufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
3440 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
74d78ebe
SK
3441
3442 if (m_grallocHal->lock(m_grallocHal, *buf,
5506cebf
SK
3443 subParms->usage, 0, 0,
3444 subParms->width, subParms->height, virtAddr) != 0) {
74d78ebe
SK
3445 ALOGE("ERR(%s): could not obtain gralloc buffer", __FUNCTION__);
3446 }
3447 else {
5506cebf 3448 ALOGV("DEBUG(%s): [subStream] locked img buf plane0(%x) plane1(%x) plane2(%x)",
74d78ebe
SK
3449 __FUNCTION__, (unsigned int)virtAddr[0], (unsigned int)virtAddr[1], (unsigned int)virtAddr[2]);
3450 }
3451 found = false;
5506cebf
SK
3452 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
3453 if (subParms->svcBufHandle[checkingIndex] == *buf ) {
74d78ebe
SK
3454 found = true;
3455 break;
3456 }
3457 }
5506cebf 3458 ALOGV("DEBUG(%s): [subStream] found(%d) - index[%d]", __FUNCTION__, found, checkingIndex);
74d78ebe
SK
3459 if (!found) break;
3460
3461 index = checkingIndex;
3462
3463 if (index == -1) {
3464 ALOGV("ERR(%s): could not find buffer index", __FUNCTION__);
3465 }
3466 else {
3467 ALOGV("DEBUG(%s): found buffer index[%d] - status(%d)",
5506cebf
SK
3468 __FUNCTION__, index, subParms->svcBufStatus[index]);
3469 if (subParms->svcBufStatus[index]== ON_SERVICE)
3470 subParms->svcBufStatus[index] = ON_HAL;
74d78ebe
SK
3471 else {
3472 ALOGV("DBG(%s): buffer status abnormal (%d) "
5506cebf 3473 , __FUNCTION__, subParms->svcBufStatus[index]);
74d78ebe 3474 }
5506cebf 3475 if (*buf != subParms->svcBufHandle[index])
74d78ebe
SK
3476 ALOGV("DBG(%s): different buf_handle index ", __FUNCTION__);
3477 else
3478 ALOGV("DEBUG(%s): same buf_handle index", __FUNCTION__);
3479 }
5506cebf 3480 subParms->svcBufIndex = 0;
74d78ebe 3481 }
5506cebf
SK
3482 if (subParms->type == SUBSTREAM_TYPE_JPEG) {
3483 m_resizeBuf.size.extS[0] = ALIGN(subParms->width, 16) * ALIGN(subParms->height, 16) * 2;
3484 m_resizeBuf.size.extS[1] = 0;
3485 m_resizeBuf.size.extS[2] = 0;
3486
3487 if (allocCameraMemory(m_ionCameraClient, &m_resizeBuf, 1) == -1) {
3488 ALOGE("ERR(%s): Failed to allocate resize buf", __FUNCTION__);
3489 }
3490 }
3491 if (subParms->type == SUBSTREAM_TYPE_PRVCB) {
3492 m_getAlignedYUVSize(HAL_PIXEL_FORMAT_2_V4L2_PIX(subParms->internalFormat), subParms->width,
3493 subParms->height, &m_previewCbBuf);
86646da4 3494
5506cebf
SK
3495 if (allocCameraMemory(m_ionCameraClient, &m_previewCbBuf, subParms->internalPlanes) == -1) {
3496 ALOGE("ERR(%s): Failed to allocate prvcb buf", __FUNCTION__);
3497 }
3498 }
3499 subParms->needBufferInit= false;
3500 }
3501 }
86646da4
SK
3502}
3503
c15a6b00
JS
3504void ExynosCameraHWInterface2::m_streamThreadInitialize(SignalDrivenThread * self)
3505{
13d8c7b4
SK
3506 StreamThread * selfThread = ((StreamThread*)self);
3507 ALOGV("DEBUG(%s): ", __FUNCTION__ );
3508 memset(&(selfThread->m_parameters), 0, sizeof(stream_parameters_t));
3509 selfThread->m_isBufferInit = false;
5506cebf
SK
3510 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3511 selfThread->m_attachedSubStreams[i].streamId = -1;
3512 selfThread->m_attachedSubStreams[i].priority = 0;
3513 }
c15a6b00
JS
3514 return;
3515}
3516
5506cebf
SK
3517int ExynosCameraHWInterface2::m_runSubStreamFunc(StreamThread *selfThread, ExynosBuffer *srcImageBuf,
3518 int stream_id, nsecs_t frameTimeStamp)
c15a6b00 3519{
5506cebf
SK
3520 substream_parameters_t *subParms = &m_subStreams[stream_id];
3521
3522 switch (stream_id) {
c15a6b00 3523
5506cebf
SK
3524 case STREAM_ID_JPEG:
3525 return m_jpegCreator(selfThread, srcImageBuf, frameTimeStamp);
c15a6b00 3526
5506cebf
SK
3527 case STREAM_ID_RECORD:
3528 return m_recordCreator(selfThread, srcImageBuf, frameTimeStamp);
3529
3530 case STREAM_ID_PRVCB:
3531 return m_prvcbCreator(selfThread, srcImageBuf, frameTimeStamp);
3532
3533 default:
3534 return 0;
c15a6b00 3535 }
5506cebf
SK
3536}
3537void ExynosCameraHWInterface2::m_streamFunc_direct(SignalDrivenThread *self)
3538{
3539 uint32_t currentSignal = self->GetProcessingSignal();
3540 StreamThread * selfThread = ((StreamThread*)self);
3541 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
3542 node_info_t *currentNode = selfStreamParms->node;
3543 int i = 0;
3544 nsecs_t frameTimeStamp;
13d8c7b4 3545
b55ed664 3546 if (currentSignal & SIGNAL_THREAD_RELEASE) {
5506cebf 3547 CAM_LOGD("(%s): [%d] START SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
b55ed664
SK
3548
3549 if (selfThread->m_isBufferInit) {
a8be0011
SK
3550 if (!(currentNode->fd == m_camera_info.capture.fd && m_camera_info.capture.status == false)) {
3551 ALOGV("(%s): [%d] calling streamoff (fd:%d)", __FUNCTION__,
5506cebf 3552 selfThread->m_index, currentNode->fd);
a8be0011
SK
3553 if (cam_int_streamoff(currentNode) < 0 ) {
3554 ALOGE("ERR(%s): stream off fail", __FUNCTION__);
3555 }
3556 ALOGV("(%s): [%d] streamoff done and calling reqbuf 0 (fd:%d)", __FUNCTION__,
3557 selfThread->m_index, currentNode->fd);
3558 currentNode->buffers = 0;
3559 cam_int_reqbufs(currentNode);
3560 ALOGV("(%s): [%d] reqbuf 0 DONE (fd:%d)", __FUNCTION__,
3561 selfThread->m_index, currentNode->fd);
3562 }
b55ed664
SK
3563 }
3564#ifdef ENABLE_FRAME_SYNC
3565 // free metabuffers
5506cebf
SK
3566 for (i = 0; i < NUM_MAX_CAMERA_BUFFERS; i++)
3567 if (selfStreamParms->metaBuffers[i].fd.extFd[0] != 0) {
b55ed664
SK
3568 freeCameraMemory(&(selfStreamParms->metaBuffers[i]), 1);
3569 selfStreamParms->metaBuffers[i].fd.extFd[0] = 0;
3570 selfStreamParms->metaBuffers[i].size.extS[0] = 0;
3571 }
3572#endif
3573 selfThread->m_isBufferInit = false;
b55ed664 3574 selfThread->m_releasing = false;
5506cebf
SK
3575 selfThread->m_activated = false;
3576 ALOGV("(%s): [%d] END SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
3577 return;
3578 }
3579 if (currentSignal & SIGNAL_STREAM_REPROCESSING_START) {
3580 status_t res;
3581 buffer_handle_t * buf = NULL;
3582 bool found = false;
3583 ALOGV("(%s): streamthread[%d] START SIGNAL_STREAM_REPROCESSING_START",
3584 __FUNCTION__, selfThread->m_index);
3585 res = m_reprocessOps->acquire_buffer(m_reprocessOps, &buf);
3586 if (res != NO_ERROR || buf == NULL) {
3587 ALOGE("ERR(%s): [reprocess] unable to acquire_buffer : %d",__FUNCTION__ , res);
3588 return;
3589 }
3590 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
3591 int checkingIndex = 0;
3592 for (checkingIndex = 0; checkingIndex < selfStreamParms->numSvcBuffers ; checkingIndex++) {
3593 if (priv_handle->fd == selfStreamParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
3594 found = true;
3595 break;
3596 }
3597 }
3598 ALOGV("DEBUG(%s): dequeued buf %x => found(%d) index(%d) ",
3599 __FUNCTION__, (unsigned int)buf, found, checkingIndex);
b55ed664 3600
5506cebf
SK
3601 if (!found) return;
3602
3603 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3604 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3605 continue;
3606
3607#ifdef ENABLE_FRAME_SYNC
a8be0011 3608 frameTimeStamp = m_requestManager->GetTimestampByFrameCnt(m_reprocessingFrameCnt);
5506cebf
SK
3609 m_requestManager->NotifyStreamOutput(m_reprocessingFrameCnt);
3610#else
3611 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex());
3612#endif
3613 if (m_currentReprocessOutStreams & (1<<selfThread->m_attachedSubStreams[i].streamId))
3614 m_runSubStreamFunc(selfThread, &(selfStreamParms->svcBuffers[checkingIndex]),
3615 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
3616 }
3617
3618 res = m_reprocessOps->release_buffer(m_reprocessOps, buf);
3619 if (res != NO_ERROR) {
3620 ALOGE("ERR(%s): [reprocess] unable to release_buffer : %d",__FUNCTION__ , res);
3621 return;
3622 }
3623 ALOGV("(%s): streamthread[%d] END SIGNAL_STREAM_REPROCESSING_START",
3624 __FUNCTION__,selfThread->m_index);
b55ed664
SK
3625
3626 return;
3627 }
13d8c7b4 3628 if (currentSignal & SIGNAL_STREAM_DATA_COMING) {
c15a6b00 3629 buffer_handle_t * buf = NULL;
5506cebf 3630 status_t res = 0;
c15a6b00
JS
3631 int i, j;
3632 int index;
ad37861e 3633 nsecs_t timestamp;
5506cebf 3634#ifdef ENABLE_FRAME_SYNC
feb7df4c 3635 camera2_stream *frame;
2f4d175d 3636 uint8_t currentOutputStreams;
5506cebf 3637#endif
c0b6e17e 3638 int numOfUndqbuf = 0;
c0b6e17e 3639
5506cebf 3640 ALOGV("(%s): streamthread[%d] START SIGNAL_STREAM_DATA_COMING", __FUNCTION__,selfThread->m_index);
ad37861e 3641
86646da4 3642 m_streamBufferInit(self);
c15a6b00 3643
b5237e6b 3644 do {
5506cebf
SK
3645 ALOGV("DEBUG(%s): streamthread[%d] type(%d) DQBUF START ",__FUNCTION__,
3646 selfThread->m_index, selfThread->streamType);
b5237e6b 3647
feb7df4c 3648#ifdef ENABLE_FRAME_SYNC
5506cebf
SK
3649 selfStreamParms->bufIndex = cam_int_dqbuf(currentNode, selfStreamParms->planes + selfStreamParms->metaPlanes);
3650 frame = (struct camera2_stream *)(selfStreamParms->metaBuffers[selfStreamParms->bufIndex].virt.extP[0]);
5506cebf 3651 frameTimeStamp = m_requestManager->GetTimestampByFrameCnt(frame->rcount);
2f4d175d
SK
3652 currentOutputStreams = m_requestManager->GetOutputStreamByFrameCnt(frame->rcount);
3653 ALOGV("frame count streamthread[%d] : %d, outputStream(%x)", selfThread->m_index, frame->rcount, currentOutputStreams);
feb7df4c 3654#else
5506cebf
SK
3655 selfStreamParms->bufIndex = cam_int_dqbuf(currentNode);
3656 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex())
feb7df4c 3657#endif
5506cebf
SK
3658 ALOGV("DEBUG(%s): streamthread[%d] DQBUF done index(%d) sigcnt(%d)",__FUNCTION__,
3659 selfThread->m_index, selfStreamParms->bufIndex, m_scpOutputSignalCnt);
804236a7 3660
5506cebf 3661 if (selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] != ON_DRIVER)
86646da4 3662 ALOGV("DBG(%s): DQed buffer status abnormal (%d) ",
5506cebf
SK
3663 __FUNCTION__, selfStreamParms->svcBufStatus[selfStreamParms->bufIndex]);
3664 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_HAL;
b5237e6b 3665
5506cebf
SK
3666 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3667 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3668 continue;
5506cebf 3669#ifdef ENABLE_FRAME_SYNC
2f4d175d 3670 if (currentOutputStreams & (1<<selfThread->m_attachedSubStreams[i].streamId)) {
5506cebf 3671 m_requestManager->NotifyStreamOutput(frame->rcount);
5506cebf
SK
3672 m_runSubStreamFunc(selfThread, &(selfStreamParms->svcBuffers[selfStreamParms->bufIndex]),
3673 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
b5237e6b 3674 }
2f4d175d
SK
3675#else
3676 if (m_currentOutputStreams & (1<<selfThread->m_attachedSubStreams[i].streamId)) {
3677 m_runSubStreamFunc(selfThread, &(selfStreamParms->svcBuffers[selfStreamParms->bufIndex]),
3678 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
3679 }
3680#endif
86646da4 3681 }
c0b6e17e 3682
5506cebf 3683 if (m_requestManager->GetSkipCnt() <= 0) {
5506cebf 3684#ifdef ENABLE_FRAME_SYNC
2f4d175d 3685 if ((currentOutputStreams & STREAM_MASK_PREVIEW) && selfThread->m_index == 0) {
5506cebf 3686 ALOGV("** Display Preview(frameCnt:%d)", frame->rcount);
2f4d175d
SK
3687 res = selfStreamParms->streamOps->enqueue_buffer(selfStreamParms->streamOps,
3688 frameTimeStamp,
3689 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
3690 }
3691 else if ((currentOutputStreams & STREAM_MASK_ZSL) && selfThread->m_index == 1) {
3692 ALOGV("** SCC output (frameCnt:%d), last(%d)", frame->rcount);
3693 res = selfStreamParms->streamOps->enqueue_buffer(selfStreamParms->streamOps,
3694 frameTimeStamp,
3695 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
3696 }
5506cebf 3697#else
2f4d175d 3698 if ((m_currentOutputStreams & STREAM_MASK_PREVIEW) && selfThread->m_index == 0) {
5506cebf 3699 ALOGV("** Display Preview(frameCnt:%d)", m_requestManager->GetFrameIndex());
5506cebf
SK
3700 res = selfStreamParms->streamOps->enqueue_buffer(selfStreamParms->streamOps,
3701 frameTimeStamp,
3702 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
74d78ebe 3703 }
5506cebf 3704 else if ((m_currentOutputStreams & STREAM_MASK_ZSL) && selfThread->m_index == 1) {
5506cebf 3705 ALOGV("** SCC output (frameCnt:%d), last(%d)", m_requestManager->GetFrameIndex());
5506cebf
SK
3706 res = selfStreamParms->streamOps->enqueue_buffer(selfStreamParms->streamOps,
3707 frameTimeStamp,
3708 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
74d78ebe 3709 }
2f4d175d 3710#endif
5506cebf 3711 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer to svc done res(%d)", __FUNCTION__, selfThread->m_index, res);
86646da4
SK
3712 }
3713 else {
3714 res = selfStreamParms->streamOps->cancel_buffer(selfStreamParms->streamOps,
5506cebf
SK
3715 &(selfStreamParms->svcBufHandle[selfStreamParms->bufIndex]));
3716 ALOGV("DEBUG(%s): streamthread[%d] cancel_buffer to svc done res(%d)", __FUNCTION__, selfThread->m_index, res);
86646da4 3717 }
2f4d175d
SK
3718#ifdef ENABLE_FRAME_SYNC
3719 if (!m_nightCaptureFrameCnt)
3720 m_requestManager->NotifyStreamOutput(frame->rcount);
3721#endif
86646da4 3722 if (res == 0) {
5506cebf 3723 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_SERVICE;
86646da4
SK
3724 selfStreamParms->numSvcBufsInHal--;
3725 }
3726 else {
5506cebf 3727 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_HAL;
b5237e6b 3728 }
86646da4 3729
c15a6b00 3730 }
ce8e830a 3731 while(0);
b5237e6b 3732
b55ed664 3733 while (selfStreamParms->numSvcBufsInHal < selfStreamParms->numOwnSvcBuffers - 1) {
86646da4
SK
3734 res = selfStreamParms->streamOps->dequeue_buffer(selfStreamParms->streamOps, &buf);
3735 if (res != NO_ERROR || buf == NULL) {
5506cebf 3736 ALOGV("DEBUG(%s): streamthread[%d] dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
86646da4
SK
3737 break;
3738 }
3739 selfStreamParms->numSvcBufsInHal++;
5506cebf 3740 ALOGV("DEBUG(%s): streamthread[%d] got buf(%x) numInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__,
86646da4
SK
3741 selfThread->m_index, (uint32_t)(*buf), selfStreamParms->numSvcBufsInHal,
3742 ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
3743 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
3744
3745 bool found = false;
3746 int checkingIndex = 0;
3747 for (checkingIndex = 0; checkingIndex < selfStreamParms->numSvcBuffers ; checkingIndex++) {
3748 if (priv_handle->fd == selfStreamParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
3749 found = true;
9dd63e1f
SK
3750 break;
3751 }
86646da4 3752 }
86646da4 3753 if (!found) break;
5506cebf
SK
3754 selfStreamParms->bufIndex = checkingIndex;
3755 if (selfStreamParms->bufIndex < selfStreamParms->numHwBuffers) {
86646da4 3756 uint32_t plane_index = 0;
5506cebf 3757 ExynosBuffer* currentBuf = &(selfStreamParms->svcBuffers[selfStreamParms->bufIndex]);
86646da4
SK
3758 struct v4l2_buffer v4l2_buf;
3759 struct v4l2_plane planes[VIDEO_MAX_PLANES];
13d8c7b4 3760
86646da4
SK
3761 v4l2_buf.m.planes = planes;
3762 v4l2_buf.type = currentNode->type;
3763 v4l2_buf.memory = currentNode->memory;
5506cebf 3764 v4l2_buf.index = selfStreamParms->bufIndex;
86646da4
SK
3765 v4l2_buf.length = currentNode->planes;
3766
5506cebf
SK
3767 v4l2_buf.m.planes[0].m.fd = priv_handle->fd;
3768 v4l2_buf.m.planes[2].m.fd = priv_handle->fd1;
3769 v4l2_buf.m.planes[1].m.fd = priv_handle->fd2;
3770 for (plane_index=0 ; plane_index < v4l2_buf.length ; plane_index++) {
3771 v4l2_buf.m.planes[plane_index].length = currentBuf->size.extS[plane_index];
3772 }
3773#ifdef ENABLE_FRAME_SYNC
3774 /* add plane for metadata*/
3775 v4l2_buf.length += selfStreamParms->metaPlanes;
3776 v4l2_buf.m.planes[v4l2_buf.length-1].m.fd = selfStreamParms->metaBuffers[selfStreamParms->bufIndex].fd.extFd[0];
3777 v4l2_buf.m.planes[v4l2_buf.length-1].length = selfStreamParms->metaBuffers[selfStreamParms->bufIndex].size.extS[0];
3778#endif
3779 if (exynos_v4l2_qbuf(currentNode->fd, &v4l2_buf) < 0) {
3780 ALOGE("ERR(%s): streamthread[%d] exynos_v4l2_qbuf() fail",
3781 __FUNCTION__, selfThread->m_index);
3782 return;
3783 }
3784 selfStreamParms->svcBufStatus[selfStreamParms->bufIndex] = ON_DRIVER;
3785 ALOGV("DEBUG(%s): streamthread[%d] QBUF done index(%d)",
3786 __FUNCTION__, selfThread->m_index, selfStreamParms->bufIndex);
3787 }
3788 }
3789
3790 ALOGV("(%s): streamthread[%d] END SIGNAL_STREAM_DATA_COMING", __FUNCTION__,selfThread->m_index);
3791 }
3792 return;
3793}
3794
3795void ExynosCameraHWInterface2::m_streamFunc_indirect(SignalDrivenThread *self)
3796{
3797 uint32_t currentSignal = self->GetProcessingSignal();
3798 StreamThread * selfThread = ((StreamThread*)self);
3799 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
3800 node_info_t *currentNode = selfStreamParms->node;
3801
3802
3803 if (currentSignal & SIGNAL_THREAD_RELEASE) {
3804 CAM_LOGV("(%s): [%d] START SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
3805
3806 if (selfThread->m_isBufferInit) {
3807 if (currentNode->fd == m_camera_info.capture.fd) {
3808 if (m_camera_info.capture.status == true) {
3809 ALOGV("DEBUG(%s): calling streamthread[%d] streamoff (fd:%d)", __FUNCTION__,
3810 selfThread->m_index, currentNode->fd);
3811 if (cam_int_streamoff(currentNode) < 0 ){
3812 ALOGE("ERR(%s): stream off fail", __FUNCTION__);
3813 } else {
3814 m_camera_info.capture.status = false;
3815 }
3816 }
3817 } else {
3818 ALOGV("DEBUG(%s): calling streamthread[%d] streamoff (fd:%d)", __FUNCTION__,
3819 selfThread->m_index, currentNode->fd);
3820 if (cam_int_streamoff(currentNode) < 0 ){
3821 ALOGE("ERR(%s): stream off fail", __FUNCTION__);
3822 }
3823 }
3824 ALOGV("DEBUG(%s): calling streamthread[%d] streamoff done", __FUNCTION__, selfThread->m_index);
3825 ALOGV("DEBUG(%s): calling streamthread[%d] reqbuf 0 (fd:%d)", __FUNCTION__,
3826 selfThread->m_index, currentNode->fd);
3827 currentNode->buffers = 0;
3828 cam_int_reqbufs(currentNode);
3829 ALOGV("DEBUG(%s): calling streamthread[%d] reqbuf 0 DONE(fd:%d)", __FUNCTION__,
3830 selfThread->m_index, currentNode->fd);
3831 }
3832
3833 selfThread->m_isBufferInit = false;
3834 selfThread->m_releasing = false;
3835 selfThread->m_activated = false;
3836 ALOGV("(%s): [%d] END SIGNAL_THREAD_RELEASE", __FUNCTION__, selfThread->m_index);
3837 return;
3838 }
3839
3840 if (currentSignal & SIGNAL_STREAM_DATA_COMING) {
3841#ifdef ENABLE_FRAME_SYNC
3842 camera2_stream *frame;
2f4d175d 3843 uint8_t currentOutputStreams;
5506cebf
SK
3844#endif
3845 nsecs_t frameTimeStamp;
3846
3847 ALOGV("DEBUG(%s): streamthread[%d] processing SIGNAL_STREAM_DATA_COMING",
3848 __FUNCTION__,selfThread->m_index);
3849
3850 m_streamBufferInit(self);
3851
ed4ad5fe 3852 ALOGV("DEBUG(%s): streamthread[%d] DQBUF START", __FUNCTION__, selfThread->m_index);
5506cebf 3853 selfStreamParms->bufIndex = cam_int_dqbuf(currentNode);
ed4ad5fe 3854 ALOGV("DEBUG(%s): streamthread[%d] DQBUF done index(%d)",__FUNCTION__,
5506cebf
SK
3855 selfThread->m_index, selfStreamParms->bufIndex);
3856
3857#ifdef ENABLE_FRAME_SYNC
3858 frame = (struct camera2_stream *)(currentNode->buffer[selfStreamParms->bufIndex].virt.extP[selfStreamParms->planes -1]);
5506cebf 3859 frameTimeStamp = m_requestManager->GetTimestampByFrameCnt(frame->rcount);
2f4d175d
SK
3860 currentOutputStreams = m_requestManager->GetOutputStreamByFrameCnt(frame->rcount);
3861 ALOGV("frame count(SCC) : %d outputStream(%x)", frame->rcount, currentOutputStreams);
5506cebf
SK
3862#else
3863 frameTimeStamp = m_requestManager->GetTimestamp(m_requestManager->GetFrameIndex());
3864#endif
3865
3866 for (int i = 0 ; i < NUM_MAX_SUBSTREAM ; i++) {
3867 if (selfThread->m_attachedSubStreams[i].streamId == -1)
3868 continue;
feb7df4c 3869#ifdef ENABLE_FRAME_SYNC
2f4d175d 3870 if (currentOutputStreams & (1<<selfThread->m_attachedSubStreams[i].streamId)) {
5506cebf 3871 m_requestManager->NotifyStreamOutput(frame->rcount);
5506cebf
SK
3872 m_runSubStreamFunc(selfThread, &(currentNode->buffer[selfStreamParms->bufIndex]),
3873 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
be494d19 3874 }
2f4d175d
SK
3875#else
3876 if (m_currentOutputStreams & (1<<selfThread->m_attachedSubStreams[i].streamId)) {
3877 m_runSubStreamFunc(selfThread, &(currentNode->buffer[selfStreamParms->bufIndex]),
3878 selfThread->m_attachedSubStreams[i].streamId, frameTimeStamp);
3879 }
3880#endif
be494d19 3881 }
5506cebf
SK
3882 cam_int_qbuf(currentNode, selfStreamParms->bufIndex);
3883 ALOGV("DEBUG(%s): streamthread[%d] QBUF DONE", __FUNCTION__, selfThread->m_index);
86646da4 3884
5506cebf
SK
3885
3886
3887 ALOGV("DEBUG(%s): streamthread[%d] processing SIGNAL_STREAM_DATA_COMING DONE",
3888 __FUNCTION__, selfThread->m_index);
86646da4 3889 }
5506cebf
SK
3890
3891
86646da4
SK
3892 return;
3893}
3894
5506cebf 3895void ExynosCameraHWInterface2::m_streamThreadFunc(SignalDrivenThread * self)
86646da4
SK
3896{
3897 uint32_t currentSignal = self->GetProcessingSignal();
3898 StreamThread * selfThread = ((StreamThread*)self);
3899 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
5506cebf
SK
3900 node_info_t *currentNode = selfStreamParms->node;
3901
3902 ALOGV("DEBUG(%s): m_streamThreadFunc[%d] (%x)", __FUNCTION__, selfThread->m_index, currentSignal);
86646da4 3903
5506cebf
SK
3904 // Do something in Child thread handler
3905 // Should change function to class that inherited StreamThread class to support dynamic stream allocation
3906 if (selfThread->streamType == STREAM_TYPE_DIRECT) {
3907 m_streamFunc_direct(self);
3908 } else if (selfThread->streamType == STREAM_TYPE_INDIRECT) {
3909 m_streamFunc_indirect(self);
3910 }
86646da4 3911
5506cebf
SK
3912 return;
3913}
3914int ExynosCameraHWInterface2::m_jpegCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp)
3915{
3916 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
3917 substream_parameters_t *subParms = &m_subStreams[STREAM_ID_JPEG];
3918 status_t res;
3919 ExynosRect jpegRect;
3920 bool found = false;
3921 int pictureW, pictureH, pictureFramesize = 0;
3922 int pictureFormat;
3923 int cropX, cropY, cropW, cropH = 0;
3924 ExynosBuffer resizeBufInfo;
3925 ExynosRect m_jpegPictureRect;
3926 buffer_handle_t * buf = NULL;
86646da4 3927
5506cebf
SK
3928 ALOGV("DEBUG(%s): index(%d)",__FUNCTION__, subParms->svcBufIndex);
3929 for (int i = 0 ; subParms->numSvcBuffers ; i++) {
3930 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_HAL) {
3931 found = true;
3932 break;
86646da4 3933 }
5506cebf
SK
3934 subParms->svcBufIndex++;
3935 if (subParms->svcBufIndex >= subParms->numSvcBuffers)
3936 subParms->svcBufIndex = 0;
3937 }
3938 if (!found) {
3939 ALOGE("(%s): cannot find free svc buffer", __FUNCTION__);
3940 subParms->svcBufIndex++;
3941 return 1;
86646da4
SK
3942 }
3943
5506cebf
SK
3944 m_jpegPictureRect.w = subParms->width;
3945 m_jpegPictureRect.h = subParms->height;
7d0efb59 3946
5506cebf
SK
3947 ALOGV("DEBUG(%s):w = %d, h = %d, w = %d, h = %d",
3948 __FUNCTION__, selfStreamParms->width, selfStreamParms->height,
3949 m_jpegPictureRect.w, m_jpegPictureRect.h);
7d0efb59 3950
5506cebf
SK
3951 m_getRatioSize(selfStreamParms->width, selfStreamParms->height,
3952 m_jpegPictureRect.w, m_jpegPictureRect.h,
3953 &cropX, &cropY,
3954 &pictureW, &pictureH,
3955 0);
3956 pictureFormat = V4L2_PIX_FMT_YUYV;
3957 pictureFramesize = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat), pictureW, pictureH);
3958
3959 if (m_exynosPictureCSC) {
3960 float zoom_w = 0, zoom_h = 0;
3961 if (m_zoomRatio == 0)
3962 m_zoomRatio = 1;
3963
3964 if (m_jpegPictureRect.w >= m_jpegPictureRect.h) {
3965 zoom_w = pictureW / m_zoomRatio;
3966 zoom_h = zoom_w * m_jpegPictureRect.h / m_jpegPictureRect.w;
3967 } else {
3968 zoom_h = pictureH / m_zoomRatio;
3969 zoom_w = zoom_h * m_jpegPictureRect.w / m_jpegPictureRect.h;
7d0efb59 3970 }
5506cebf
SK
3971 cropX = (pictureW - zoom_w) / 2;
3972 cropY = (pictureH - zoom_h) / 2;
3973 cropW = zoom_w;
3974 cropH = zoom_h;
3975
3976 ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d",
3977 __FUNCTION__, cropX, cropY, cropW, cropH);
3978
3979 csc_set_src_format(m_exynosPictureCSC,
3980 ALIGN(pictureW, 16), ALIGN(pictureH, 16),
3981 cropX, cropY, cropW, cropH,
3982 V4L2_PIX_2_HAL_PIXEL_FORMAT(pictureFormat),
3983 0);
7d0efb59 3984
5506cebf
SK
3985 csc_set_dst_format(m_exynosPictureCSC,
3986 m_jpegPictureRect.w, m_jpegPictureRect.h,
3987 0, 0, m_jpegPictureRect.w, m_jpegPictureRect.h,
3988 V4L2_PIX_2_HAL_PIXEL_FORMAT(V4L2_PIX_FMT_NV16),
3989 0);
3990 for (int i = 0 ; i < 3 ; i++)
3991 ALOGV("DEBUG(%s): m_pictureBuf.fd.extFd[%d]=%d ",
3992 __FUNCTION__, i, srcImageBuf->fd.extFd[i]);
3993 csc_set_src_buffer(m_exynosPictureCSC,
3994 (void **)&srcImageBuf->fd.fd);
7d0efb59 3995
5506cebf
SK
3996 csc_set_dst_buffer(m_exynosPictureCSC,
3997 (void **)&m_resizeBuf.fd.fd);
3998 for (int i = 0 ; i < 3 ; i++)
3999 ALOGV("DEBUG(%s): m_resizeBuf.virt.extP[%d]=%d m_resizeBuf.size.extS[%d]=%d",
4000 __FUNCTION__, i, m_resizeBuf.fd.extFd[i], i, m_resizeBuf.size.extS[i]);
7d0efb59 4001
5506cebf
SK
4002 if (csc_convert(m_exynosPictureCSC) != 0)
4003 ALOGE("ERR(%s): csc_convert() fail", __FUNCTION__);
4004
4005 }
4006 else {
4007 ALOGE("ERR(%s): m_exynosPictureCSC == NULL", __FUNCTION__);
7d0efb59
C
4008 }
4009
5506cebf 4010 resizeBufInfo = m_resizeBuf;
86646da4 4011
5506cebf 4012 m_getAlignedYUVSize(V4L2_PIX_FMT_NV16, m_jpegPictureRect.w, m_jpegPictureRect.h, &m_resizeBuf);
86646da4 4013
5506cebf
SK
4014 for (int i = 1; i < 3; i++) {
4015 if (m_resizeBuf.size.extS[i] != 0)
4016 m_resizeBuf.fd.extFd[i] = m_resizeBuf.fd.extFd[i-1] + m_resizeBuf.size.extS[i-1];
86646da4 4017
5506cebf
SK
4018 ALOGV("(%s): m_resizeBuf.size.extS[%d] = %d", __FUNCTION__, i, m_resizeBuf.size.extS[i]);
4019 }
2adfa429 4020
5506cebf
SK
4021 jpegRect.w = m_jpegPictureRect.w;
4022 jpegRect.h = m_jpegPictureRect.h;
4023 jpegRect.colorFormat = V4L2_PIX_FMT_NV16;
86646da4 4024
5506cebf
SK
4025 for (int j = 0 ; j < 3 ; j++)
4026 ALOGV("DEBUG(%s): dest buf node fd.extFd[%d]=%d size=%d virt=%x ",
4027 __FUNCTION__, j, subParms->svcBuffers[subParms->svcBufIndex].fd.extFd[j],
4028 (unsigned int)subParms->svcBuffers[subParms->svcBufIndex].size.extS[j],
4029 (unsigned int)subParms->svcBuffers[subParms->svcBufIndex].virt.extP[j]);
86646da4 4030
5506cebf
SK
4031 if (yuv2Jpeg(&m_resizeBuf, &subParms->svcBuffers[subParms->svcBufIndex], &jpegRect) == false)
4032 ALOGE("ERR(%s):yuv2Jpeg() fail", __FUNCTION__);
2adfa429 4033
5506cebf 4034 m_resizeBuf = resizeBufInfo;
2adfa429 4035
5506cebf 4036 res = subParms->streamOps->enqueue_buffer(subParms->streamOps, frameTimeStamp, &(subParms->svcBufHandle[subParms->svcBufIndex]));
be494d19 4037
5506cebf
SK
4038 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer index(%d) to svc done res(%d)",
4039 __FUNCTION__, selfThread->m_index, subParms->svcBufIndex, res);
4040 if (res == 0) {
4041 subParms->svcBufStatus[subParms->svcBufIndex] = ON_SERVICE;
4042 subParms->numSvcBufsInHal--;
4043 }
4044 else {
4045 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4046 }
86646da4 4047
5506cebf
SK
4048 while (subParms->numSvcBufsInHal <= subParms->minUndequedBuffer)
4049 {
4050 bool found = false;
4051 int checkingIndex = 0;
86646da4 4052
5506cebf
SK
4053 ALOGV("DEBUG(%s): jpeg currentBuf#(%d)", __FUNCTION__ , subParms->numSvcBufsInHal);
4054
4055 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
4056 if (res != NO_ERROR || buf == NULL) {
4057 ALOGV("DEBUG(%s): jpeg stream(%d) dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
4058 break;
4059 }
4060 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
4061 subParms->numSvcBufsInHal ++;
4062 ALOGV("DEBUG(%s): jpeg got buf(%x) numBufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
4063 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
4064
4065
4066 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
4067 if (priv_handle->fd == subParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
4068 found = true;
4069 break;
86646da4 4070 }
5506cebf
SK
4071 }
4072 ALOGV("DEBUG(%s): jpeg dequeueed_buffer found index(%d)", __FUNCTION__, found);
be494d19 4073
5506cebf
SK
4074 if (!found) {
4075 break;
4076 }
4077
4078 subParms->svcBufIndex = checkingIndex;
4079 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_SERVICE) {
4080 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4081 }
4082 else {
4083 ALOGV("DEBUG(%s): jpeg bufstatus abnormal [%d] status = %d", __FUNCTION__,
4084 subParms->svcBufIndex, subParms->svcBufStatus[subParms->svcBufIndex]);
4085 }
4086 }
4087 return 0;
4088}
86646da4 4089
5506cebf
SK
4090int ExynosCameraHWInterface2::m_recordCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp)
4091{
4092 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
4093 substream_parameters_t *subParms = &m_subStreams[STREAM_ID_RECORD];
4094 status_t res;
4095 ExynosRect jpegRect;
4096 bool found = false;
4097 int cropX, cropY, cropW, cropH = 0;
4098 buffer_handle_t * buf = NULL;
86646da4 4099
5506cebf
SK
4100 ALOGV("DEBUG(%s): index(%d)",__FUNCTION__, subParms->svcBufIndex);
4101 for (int i = 0 ; subParms->numSvcBuffers ; i++) {
4102 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_HAL) {
4103 found = true;
4104 break;
4105 }
4106 subParms->svcBufIndex++;
4107 if (subParms->svcBufIndex >= subParms->numSvcBuffers)
4108 subParms->svcBufIndex = 0;
4109 }
4110 if (!found) {
4111 ALOGE("(%s): cannot find free svc buffer", __FUNCTION__);
4112 subParms->svcBufIndex++;
4113 return 1;
4114 }
86646da4 4115
5506cebf
SK
4116 if (m_exynosVideoCSC) {
4117 int videoW = subParms->width, videoH = subParms->height;
4118 int cropX, cropY, cropW, cropH = 0;
4119 int previewW = selfStreamParms->width, previewH = selfStreamParms->height;
4120 m_getRatioSize(previewW, previewH,
4121 videoW, videoH,
4122 &cropX, &cropY,
4123 &cropW, &cropH,
4124 0);
86646da4 4125
5506cebf
SK
4126 ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d",
4127 __FUNCTION__, cropX, cropY, cropW, cropH);
86646da4 4128
5506cebf
SK
4129 csc_set_src_format(m_exynosVideoCSC,
4130 previewW, previewH,
4131 cropX, cropY, cropW, cropH,
4132 selfStreamParms->format,
4133 0);
86646da4 4134
5506cebf
SK
4135 csc_set_dst_format(m_exynosVideoCSC,
4136 videoW, videoH,
4137 0, 0, videoW, videoH,
4138 subParms->format,
4139 1);
86646da4 4140
5506cebf
SK
4141 csc_set_src_buffer(m_exynosVideoCSC,
4142 (void **)&srcImageBuf->fd.fd);
86646da4 4143
5506cebf
SK
4144 csc_set_dst_buffer(m_exynosVideoCSC,
4145 (void **)(&(subParms->svcBuffers[subParms->svcBufIndex].fd.fd)));
4146
4147 if (csc_convert(m_exynosVideoCSC) != 0) {
4148 ALOGE("ERR(%s):csc_convert() fail", __FUNCTION__);
4149 }
4150 else {
4151 ALOGV("(%s):csc_convert() SUCCESS", __FUNCTION__);
86646da4 4152 }
5506cebf
SK
4153 }
4154 else {
4155 ALOGE("ERR(%s):m_exynosVideoCSC == NULL", __FUNCTION__);
4156 }
86646da4 4157
5506cebf 4158 res = subParms->streamOps->enqueue_buffer(subParms->streamOps, frameTimeStamp, &(subParms->svcBufHandle[subParms->svcBufIndex]));
86646da4 4159
5506cebf
SK
4160 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer index(%d) to svc done res(%d)",
4161 __FUNCTION__, selfThread->m_index, subParms->svcBufIndex, res);
4162 if (res == 0) {
4163 subParms->svcBufStatus[subParms->svcBufIndex] = ON_SERVICE;
4164 subParms->numSvcBufsInHal--;
4165 }
4166 else {
4167 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4168 }
86646da4 4169
5506cebf
SK
4170 while (subParms->numSvcBufsInHal <= subParms->minUndequedBuffer)
4171 {
4172 bool found = false;
4173 int checkingIndex = 0;
86646da4 4174
5506cebf
SK
4175 ALOGV("DEBUG(%s): record currentBuf#(%d)", __FUNCTION__ , subParms->numSvcBufsInHal);
4176
4177 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
4178 if (res != NO_ERROR || buf == NULL) {
4179 ALOGV("DEBUG(%s): record stream(%d) dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
4180 break;
4181 }
4182 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
4183 subParms->numSvcBufsInHal ++;
4184 ALOGV("DEBUG(%s): record got buf(%x) numBufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
4185 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
4186
4187 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
4188 if (priv_handle->fd == subParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
4189 found = true;
4190 break;
86646da4 4191 }
13d8c7b4 4192 }
5506cebf 4193 ALOGV("DEBUG(%s): record dequeueed_buffer found(%d) index = %d", __FUNCTION__, found, checkingIndex);
86646da4 4194
5506cebf
SK
4195 if (!found) {
4196 break;
4197 }
86646da4 4198
5506cebf
SK
4199 subParms->svcBufIndex = checkingIndex;
4200 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_SERVICE) {
4201 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4202 }
4203 else {
4204 ALOGV("DEBUG(%s): record bufstatus abnormal [%d] status = %d", __FUNCTION__,
4205 subParms->svcBufIndex, subParms->svcBufStatus[subParms->svcBufIndex]);
4206 }
4207 }
4208 return 0;
86646da4
SK
4209}
4210
5506cebf 4211int ExynosCameraHWInterface2::m_prvcbCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp)
86646da4 4212{
5506cebf
SK
4213 stream_parameters_t *selfStreamParms = &(selfThread->m_parameters);
4214 substream_parameters_t *subParms = &m_subStreams[STREAM_ID_PRVCB];
4215 status_t res;
4216 bool found = false;
4217 int cropX, cropY, cropW, cropH = 0;
4218 buffer_handle_t * buf = NULL;
86646da4 4219
5506cebf
SK
4220 ALOGV("DEBUG(%s): index(%d)",__FUNCTION__, subParms->svcBufIndex);
4221 for (int i = 0 ; subParms->numSvcBuffers ; i++) {
4222 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_HAL) {
4223 found = true;
4224 break;
4225 }
4226 subParms->svcBufIndex++;
4227 if (subParms->svcBufIndex >= subParms->numSvcBuffers)
4228 subParms->svcBufIndex = 0;
4229 }
4230 if (!found) {
4231 ALOGE("(%s): cannot find free svc buffer", __FUNCTION__);
4232 subParms->svcBufIndex++;
4233 return 1;
4234 }
86646da4 4235
5506cebf
SK
4236 if (subParms->format == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
4237 if (m_exynosVideoCSC) {
4238 int previewCbW = subParms->width, previewCbH = subParms->height;
4239 int cropX, cropY, cropW, cropH = 0;
4240 int previewW = selfStreamParms->width, previewH = selfStreamParms->height;
4241 m_getRatioSize(previewW, previewH,
4242 previewCbW, previewCbH,
4243 &cropX, &cropY,
4244 &cropW, &cropH,
4245 0);
86646da4 4246
5506cebf
SK
4247 ALOGV("DEBUG(%s):cropX = %d, cropY = %d, cropW = %d, cropH = %d",
4248 __FUNCTION__, cropX, cropY, cropW, cropH);
4249 csc_set_src_format(m_exynosVideoCSC,
4250 previewW, previewH,
4251 cropX, cropY, cropW, cropH,
4252 selfStreamParms->format,
4253 0);
86646da4 4254
5506cebf
SK
4255 csc_set_dst_format(m_exynosVideoCSC,
4256 previewCbW, previewCbH,
4257 0, 0, previewCbW, previewCbH,
4258 subParms->internalFormat,
4259 1);
86646da4 4260
5506cebf
SK
4261 csc_set_src_buffer(m_exynosVideoCSC,
4262 (void **)&srcImageBuf->fd.fd);
4263
4264 csc_set_dst_buffer(m_exynosVideoCSC,
4265 (void **)(&(m_previewCbBuf.fd.fd)));
4266
4267 if (csc_convert(m_exynosVideoCSC) != 0) {
4268 ALOGE("ERR(%s):previewcb csc_convert() fail", __FUNCTION__);
4269 }
4270 else {
4271 ALOGV("(%s):previewcb csc_convert() SUCCESS", __FUNCTION__);
4272 }
4273 if (previewCbW == ALIGN(previewCbW, 16)) {
4274 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0],
4275 m_previewCbBuf.virt.extP[0], previewCbW * previewCbH);
4276 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0] + previewCbW * previewCbH,
4277 m_previewCbBuf.virt.extP[1], previewCbW * previewCbH / 2 );
4278 }
4279 else {
4280 // TODO : copy line by line ?
4281 }
4282 }
4283 else {
4284 ALOGE("ERR(%s):m_exynosVideoCSC == NULL", __FUNCTION__);
4285 }
86646da4 4286 }
5506cebf
SK
4287 else if (subParms->format == HAL_PIXEL_FORMAT_YV12) {
4288 int previewCbW = subParms->width, previewCbH = subParms->height;
4289 int stride = ALIGN(previewCbW, 16);
0d220b42 4290 int c_stride = ALIGN(stride / 2, 16);
5506cebf
SK
4291 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0],
4292 srcImageBuf->virt.extP[0], stride * previewCbH);
4293 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0] + stride * previewCbH,
4294 srcImageBuf->virt.extP[1], c_stride * previewCbH / 2 );
4295 memcpy(subParms->svcBuffers[subParms->svcBufIndex].virt.extP[0] + (stride * previewCbH) + (c_stride * previewCbH / 2),
4296 srcImageBuf->virt.extP[2], c_stride * previewCbH / 2 );
4297 }
4298 res = subParms->streamOps->enqueue_buffer(subParms->streamOps, frameTimeStamp, &(subParms->svcBufHandle[subParms->svcBufIndex]));
4299
4300 ALOGV("DEBUG(%s): streamthread[%d] enqueue_buffer index(%d) to svc done res(%d)",
4301 __FUNCTION__, selfThread->m_index, subParms->svcBufIndex, res);
4302 if (res == 0) {
4303 subParms->svcBufStatus[subParms->svcBufIndex] = ON_SERVICE;
4304 subParms->numSvcBufsInHal--;
4305 }
4306 else {
4307 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
86646da4
SK
4308 }
4309
5506cebf
SK
4310 while (subParms->numSvcBufsInHal <= subParms->minUndequedBuffer)
4311 {
4312 bool found = false;
4313 int checkingIndex = 0;
86646da4 4314
5506cebf 4315 ALOGV("DEBUG(%s): prvcb currentBuf#(%d)", __FUNCTION__ , subParms->numSvcBufsInHal);
86646da4 4316
5506cebf
SK
4317 res = subParms->streamOps->dequeue_buffer(subParms->streamOps, &buf);
4318 if (res != NO_ERROR || buf == NULL) {
4319 ALOGV("DEBUG(%s): prvcb stream(%d) dequeue_buffer fail res(%d)",__FUNCTION__ , selfThread->m_index, res);
4320 break;
4321 }
4322 const private_handle_t *priv_handle = reinterpret_cast<const private_handle_t *>(*buf);
4323 subParms->numSvcBufsInHal ++;
4324 ALOGV("DEBUG(%s): prvcb got buf(%x) numBufInHal(%d) version(%d), numFds(%d), numInts(%d)", __FUNCTION__, (uint32_t)(*buf),
4325 subParms->numSvcBufsInHal, ((native_handle_t*)(*buf))->version, ((native_handle_t*)(*buf))->numFds, ((native_handle_t*)(*buf))->numInts);
86646da4 4326
86646da4 4327
5506cebf
SK
4328 for (checkingIndex = 0; checkingIndex < subParms->numSvcBuffers ; checkingIndex++) {
4329 if (priv_handle->fd == subParms->svcBuffers[checkingIndex].fd.extFd[0] ) {
4330 found = true;
4331 break;
4332 }
4333 }
4334 ALOGV("DEBUG(%s): prvcb dequeueed_buffer found(%d) index = %d", __FUNCTION__, found, checkingIndex);
4335
4336 if (!found) {
4337 break;
4338 }
4339
4340 subParms->svcBufIndex = checkingIndex;
4341 if (subParms->svcBufStatus[subParms->svcBufIndex] == ON_SERVICE) {
4342 subParms->svcBufStatus[subParms->svcBufIndex] = ON_HAL;
4343 }
4344 else {
4345 ALOGV("DEBUG(%s): prvcb bufstatus abnormal [%d] status = %d", __FUNCTION__,
4346 subParms->svcBufIndex, subParms->svcBufStatus[subParms->svcBufIndex]);
4347 }
4348 }
4349 return 0;
c15a6b00
JS
4350}
4351
2d5e6ec2
SK
4352bool ExynosCameraHWInterface2::m_checkThumbnailSize(int w, int h)
4353{
4354 int sizeOfSupportList;
4355
4356 //REAR Camera
4357 if(this->getCameraId() == 0) {
4358 sizeOfSupportList = sizeof(SUPPORT_THUMBNAIL_REAR_SIZE) / (sizeof(int)*2);
4359
4360 for(int i = 0; i < sizeOfSupportList; i++) {
4361 if((SUPPORT_THUMBNAIL_REAR_SIZE[i][0] == w) &&(SUPPORT_THUMBNAIL_REAR_SIZE[i][1] == h))
4362 return true;
4363 }
4364
4365 }
4366 else {
4367 sizeOfSupportList = sizeof(SUPPORT_THUMBNAIL_FRONT_SIZE) / (sizeof(int)*2);
4368
4369 for(int i = 0; i < sizeOfSupportList; i++) {
4370 if((SUPPORT_THUMBNAIL_FRONT_SIZE[i][0] == w) &&(SUPPORT_THUMBNAIL_FRONT_SIZE[i][1] == h))
4371 return true;
4372 }
4373 }
4374
4375 return false;
4376}
13d8c7b4
SK
4377bool ExynosCameraHWInterface2::yuv2Jpeg(ExynosBuffer *yuvBuf,
4378 ExynosBuffer *jpegBuf,
4379 ExynosRect *rect)
4380{
4381 unsigned char *addr;
4382
4383 ExynosJpegEncoderForCamera jpegEnc;
4384 bool ret = false;
4385 int res = 0;
4386
4387 unsigned int *yuvSize = yuvBuf->size.extS;
4388
4389 if (jpegEnc.create()) {
9dd63e1f 4390 ALOGE("ERR(%s):jpegEnc.create() fail", __FUNCTION__);
13d8c7b4
SK
4391 goto jpeg_encode_done;
4392 }
4393
4394 if (jpegEnc.setQuality(100)) {
9dd63e1f 4395 ALOGE("ERR(%s):jpegEnc.setQuality() fail", __FUNCTION__);
13d8c7b4
SK
4396 goto jpeg_encode_done;
4397 }
4398
4399 if (jpegEnc.setSize(rect->w, rect->h)) {
9dd63e1f 4400 ALOGE("ERR(%s):jpegEnc.setSize() fail", __FUNCTION__);
13d8c7b4
SK
4401 goto jpeg_encode_done;
4402 }
4403 ALOGV("%s : width = %d , height = %d\n", __FUNCTION__, rect->w, rect->h);
4404
4405 if (jpegEnc.setColorFormat(rect->colorFormat)) {
9dd63e1f 4406 ALOGE("ERR(%s):jpegEnc.setColorFormat() fail", __FUNCTION__);
13d8c7b4
SK
4407 goto jpeg_encode_done;
4408 }
13d8c7b4
SK
4409
4410 if (jpegEnc.setJpegFormat(V4L2_PIX_FMT_JPEG_422)) {
9dd63e1f 4411 ALOGE("ERR(%s):jpegEnc.setJpegFormat() fail", __FUNCTION__);
13d8c7b4
SK
4412 goto jpeg_encode_done;
4413 }
13d8c7b4 4414
2d5e6ec2
SK
4415 if((m_jpegMetadata.ctl.jpeg.thumbnailSize[0] != 0) && (m_jpegMetadata.ctl.jpeg.thumbnailSize[1] != 0)) {
4416 mExifInfo.enableThumb = true;
4417 if(!m_checkThumbnailSize(m_jpegMetadata.ctl.jpeg.thumbnailSize[0], m_jpegMetadata.ctl.jpeg.thumbnailSize[1])) {
4418 //default value
4419 m_thumbNailW = SUPPORT_THUMBNAIL_REAR_SIZE[0][0];
4420 m_thumbNailH = SUPPORT_THUMBNAIL_REAR_SIZE[0][1];
4421 } else {
4422 m_thumbNailW = m_jpegMetadata.ctl.jpeg.thumbnailSize[0];
4423 m_thumbNailH = m_jpegMetadata.ctl.jpeg.thumbnailSize[1];
4424 }
4425
4426 ALOGV("(%s) m_thumbNailW = %d, m_thumbNailH = %d", __FUNCTION__, m_thumbNailW, m_thumbNailH);
4427
4428 } else {
4429 mExifInfo.enableThumb = false;
4430 }
eed7ed1b 4431
2d5e6ec2
SK
4432 if (jpegEnc.setThumbnailSize(m_thumbNailW, m_thumbNailH)) {
4433 ALOGE("ERR(%s):jpegEnc.setThumbnailSize(%d, %d) fail", __FUNCTION__, m_thumbNailH, m_thumbNailH);
eed7ed1b
SK
4434 goto jpeg_encode_done;
4435 }
4436
2d5e6ec2 4437 ALOGV("(%s):jpegEnc.setThumbnailSize(%d, %d) ", __FUNCTION__, m_thumbNailW, m_thumbNailW);
eed7ed1b
SK
4438 if (jpegEnc.setThumbnailQuality(50)) {
4439 ALOGE("ERR(%s):jpegEnc.setThumbnailQuality fail", __FUNCTION__);
4440 goto jpeg_encode_done;
4441 }
13d8c7b4 4442
eed7ed1b 4443 m_setExifChangedAttribute(&mExifInfo, rect, &m_jpegMetadata);
9dd63e1f 4444 ALOGV("DEBUG(%s):calling jpegEnc.setInBuf() yuvSize(%d)", __FUNCTION__, *yuvSize);
eed7ed1b 4445 if (jpegEnc.setInBuf((int *)&(yuvBuf->fd.fd), &(yuvBuf->virt.p), (int *)yuvSize)) {
9dd63e1f 4446 ALOGE("ERR(%s):jpegEnc.setInBuf() fail", __FUNCTION__);
13d8c7b4
SK
4447 goto jpeg_encode_done;
4448 }
eed7ed1b 4449 if (jpegEnc.setOutBuf(jpegBuf->fd.fd, jpegBuf->virt.p, jpegBuf->size.extS[0] + jpegBuf->size.extS[1] + jpegBuf->size.extS[2])) {
9dd63e1f 4450 ALOGE("ERR(%s):jpegEnc.setOutBuf() fail", __FUNCTION__);
13d8c7b4
SK
4451 goto jpeg_encode_done;
4452 }
13d8c7b4
SK
4453
4454 if (jpegEnc.updateConfig()) {
9dd63e1f 4455 ALOGE("ERR(%s):jpegEnc.updateConfig() fail", __FUNCTION__);
13d8c7b4
SK
4456 goto jpeg_encode_done;
4457 }
4458
eed7ed1b 4459 if (res = jpegEnc.encode((int *)&jpegBuf->size.s, &mExifInfo)) {
9dd63e1f 4460 ALOGE("ERR(%s):jpegEnc.encode() fail ret(%d)", __FUNCTION__, res);
13d8c7b4
SK
4461 goto jpeg_encode_done;
4462 }
4463
4464 ret = true;
4465
4466jpeg_encode_done:
4467
4468 if (jpegEnc.flagCreate() == true)
4469 jpegEnc.destroy();
4470
4471 return ret;
4472}
4473
e117f756
YJ
4474void ExynosCameraHWInterface2::OnPrecaptureMeteringTriggerStart(int id)
4475{
4476 m_ctlInfo.flash.m_precaptureTriggerId = id;
73f5ad60 4477 m_ctlInfo.ae.aeStateNoti = AE_STATE_INACTIVE;
e117f756
YJ
4478 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH) && (m_cameraId == 0)) {
4479 // flash is required
4480 switch (m_ctlInfo.flash.m_flashCnt) {
4481 case IS_FLASH_STATE_AUTO_DONE:
d91c0269 4482 case IS_FLASH_STATE_AUTO_OFF:
e117f756
YJ
4483 // Flash capture sequence, AF flash was executed before
4484 break;
4485 default:
4486 // Full flash sequence
4487 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON;
4488 m_ctlInfo.flash.m_flashEnableFlg = true;
4a9565ae 4489 m_ctlInfo.flash.m_flashTimeOut = 3;
e117f756
YJ
4490 }
4491 } else {
73f5ad60
YJ
4492 // Skip pre-capture in case of non-flash.
4493 ALOGV("[PreCap] Flash OFF mode ");
e117f756
YJ
4494 m_ctlInfo.flash.m_flashEnableFlg = false;
4495 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_NONE;
e117f756 4496 }
73f5ad60
YJ
4497 ALOGV("[PreCap] OnPrecaptureMeteringTriggerStart (ID %d) (flag : %d) (cnt : %d)", id, m_ctlInfo.flash.m_flashEnableFlg, m_ctlInfo.flash.m_flashCnt);
4498 OnPrecaptureMeteringNotificationSensor();
e117f756 4499}
8e2c2fdb
SK
4500void ExynosCameraHWInterface2::OnAfTriggerStart(int id)
4501{
4502 m_afPendingTriggerId = id;
7d0efb59 4503 m_afModeWaitingCnt = 6;
8e2c2fdb 4504}
13d8c7b4 4505
0f26b20f
SK
4506void ExynosCameraHWInterface2::OnAfTrigger(int id)
4507{
8e2c2fdb 4508 m_afTriggerId = id;
6f19b6cf 4509
0f26b20f
SK
4510 switch (m_afMode) {
4511 case AA_AFMODE_AUTO:
4512 case AA_AFMODE_MACRO:
8e2c2fdb 4513 case AA_AFMODE_OFF:
73f5ad60 4514 ALOGV("[AF] OnAfTrigger - AUTO,MACRO,OFF (Mode %d) ", m_afMode);
caea49e6
YJ
4515 // If flash is enable, Flash operation is executed before triggering AF
4516 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH)
e117f756 4517 && (m_ctlInfo.flash.m_flashEnableFlg == false)
caea49e6 4518 && (m_cameraId == 0)) {
73f5ad60 4519 ALOGV("[Flash] AF Flash start with Mode (%d)", m_afMode);
e117f756
YJ
4520 m_ctlInfo.flash.m_flashEnableFlg = true;
4521 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON;
caea49e6 4522 m_ctlInfo.flash.m_flashDecisionResult = false;
e117f756 4523 m_ctlInfo.flash.m_afFlashDoneFlg = true;
caea49e6 4524 }
0f26b20f
SK
4525 OnAfTriggerAutoMacro(id);
4526 break;
4527 case AA_AFMODE_CONTINUOUS_VIDEO:
73f5ad60 4528 ALOGV("[AF] OnAfTrigger - AA_AFMODE_CONTINUOUS_VIDEO (Mode %d) ", m_afMode);
0f26b20f
SK
4529 OnAfTriggerCAFVideo(id);
4530 break;
4531 case AA_AFMODE_CONTINUOUS_PICTURE:
73f5ad60 4532 ALOGV("[AF] OnAfTrigger - AA_AFMODE_CONTINUOUS_PICTURE (Mode %d) ", m_afMode);
0f26b20f
SK
4533 OnAfTriggerCAFPicture(id);
4534 break;
8e2c2fdb 4535
0f26b20f
SK
4536 default:
4537 break;
4538 }
4539}
4540
4541void ExynosCameraHWInterface2::OnAfTriggerAutoMacro(int id)
4542{
4543 int nextState = NO_TRANSITION;
0f26b20f
SK
4544
4545 switch (m_afState) {
4546 case HAL_AFSTATE_INACTIVE:
4547 nextState = HAL_AFSTATE_NEEDS_COMMAND;
4548 m_IsAfTriggerRequired = true;
4a9565ae 4549 m_ctlInfo.af.m_afTriggerTimeOut = 4;
0f26b20f
SK
4550 break;
4551 case HAL_AFSTATE_NEEDS_COMMAND:
4552 nextState = NO_TRANSITION;
4553 break;
4554 case HAL_AFSTATE_STARTED:
4555 nextState = NO_TRANSITION;
4556 break;
4557 case HAL_AFSTATE_SCANNING:
4558 nextState = NO_TRANSITION;
4559 break;
4560 case HAL_AFSTATE_LOCKED:
4561 nextState = HAL_AFSTATE_NEEDS_COMMAND;
4562 m_IsAfTriggerRequired = true;
4563 break;
4564 case HAL_AFSTATE_FAILED:
4565 nextState = HAL_AFSTATE_NEEDS_COMMAND;
4566 m_IsAfTriggerRequired = true;
4a9565ae 4567 m_ctlInfo.af.m_afTriggerTimeOut = 4;
0f26b20f
SK
4568 break;
4569 default:
4570 break;
4571 }
4572 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
4573 if (nextState != NO_TRANSITION)
4574 m_afState = nextState;
4575}
4576
4577void ExynosCameraHWInterface2::OnAfTriggerCAFPicture(int id)
4578{
4579 int nextState = NO_TRANSITION;
0f26b20f
SK
4580
4581 switch (m_afState) {
4582 case HAL_AFSTATE_INACTIVE:
4583 nextState = HAL_AFSTATE_FAILED;
4584 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4585 break;
4586 case HAL_AFSTATE_NEEDS_COMMAND:
4587 // not used
4588 break;
4589 case HAL_AFSTATE_STARTED:
4590 nextState = HAL_AFSTATE_NEEDS_DETERMINATION;
36c106c9 4591 m_AfHwStateFailed = false;
0f26b20f
SK
4592 break;
4593 case HAL_AFSTATE_SCANNING:
4594 nextState = HAL_AFSTATE_NEEDS_DETERMINATION;
36c106c9 4595 m_AfHwStateFailed = false;
caea49e6
YJ
4596 // If flash is enable, Flash operation is executed before triggering AF
4597 if ((m_ctlInfo.flash.i_flashMode >= AA_AEMODE_ON_AUTO_FLASH)
e117f756 4598 && (m_ctlInfo.flash.m_flashEnableFlg == false)
caea49e6 4599 && (m_cameraId == 0)) {
73f5ad60 4600 ALOGV("[AF Flash] AF Flash start with Mode (%d) state (%d) id (%d)", m_afMode, m_afState, id);
e117f756
YJ
4601 m_ctlInfo.flash.m_flashEnableFlg = true;
4602 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_ON;
caea49e6 4603 m_ctlInfo.flash.m_flashDecisionResult = false;
e117f756 4604 m_ctlInfo.flash.m_afFlashDoneFlg = true;
caea49e6 4605 }
0f26b20f
SK
4606 break;
4607 case HAL_AFSTATE_NEEDS_DETERMINATION:
4608 nextState = NO_TRANSITION;
4609 break;
4610 case HAL_AFSTATE_PASSIVE_FOCUSED:
4611 m_IsAfLockRequired = true;
36c106c9 4612 if (m_AfHwStateFailed) {
caea49e6 4613 ALOGE("(%s): [CAF] LAST : fail", __FUNCTION__);
36c106c9
SK
4614 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4615 nextState = HAL_AFSTATE_FAILED;
4616 }
4617 else {
caea49e6 4618 ALOGV("(%s): [CAF] LAST : success", __FUNCTION__);
36c106c9
SK
4619 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4620 nextState = HAL_AFSTATE_LOCKED;
4621 }
4622 m_AfHwStateFailed = false;
0f26b20f
SK
4623 break;
4624 case HAL_AFSTATE_LOCKED:
4625 nextState = NO_TRANSITION;
4626 break;
4627 case HAL_AFSTATE_FAILED:
4628 nextState = NO_TRANSITION;
4629 break;
4630 default:
4631 break;
4632 }
4633 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
4634 if (nextState != NO_TRANSITION)
4635 m_afState = nextState;
4636}
4637
4638
4639void ExynosCameraHWInterface2::OnAfTriggerCAFVideo(int id)
4640{
4641 int nextState = NO_TRANSITION;
0f26b20f
SK
4642
4643 switch (m_afState) {
4644 case HAL_AFSTATE_INACTIVE:
4645 nextState = HAL_AFSTATE_FAILED;
4646 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4647 break;
4648 case HAL_AFSTATE_NEEDS_COMMAND:
4649 // not used
4650 break;
4651 case HAL_AFSTATE_STARTED:
4652 m_IsAfLockRequired = true;
4653 nextState = HAL_AFSTATE_FAILED;
4654 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4655 break;
4656 case HAL_AFSTATE_SCANNING:
4657 m_IsAfLockRequired = true;
4658 nextState = HAL_AFSTATE_FAILED;
4659 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4660 break;
4661 case HAL_AFSTATE_NEEDS_DETERMINATION:
4662 // not used
4663 break;
4664 case HAL_AFSTATE_PASSIVE_FOCUSED:
4665 m_IsAfLockRequired = true;
4666 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4667 nextState = HAL_AFSTATE_LOCKED;
4668 break;
4669 case HAL_AFSTATE_LOCKED:
4670 nextState = NO_TRANSITION;
4671 break;
4672 case HAL_AFSTATE_FAILED:
4673 nextState = NO_TRANSITION;
4674 break;
4675 default:
4676 break;
4677 }
4678 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
4679 if (nextState != NO_TRANSITION)
4680 m_afState = nextState;
4681}
4682
73f5ad60
YJ
4683void ExynosCameraHWInterface2::OnPrecaptureMeteringNotificationSensor()
4684{
4685 if (m_ctlInfo.flash.m_precaptureTriggerId > 0) {
4686 // Just noti of pre-capture start
4687 if (m_ctlInfo.ae.aeStateNoti != AE_STATE_PRECAPTURE) {
4688 m_notifyCb(CAMERA2_MSG_AUTOEXPOSURE,
4689 ANDROID_CONTROL_AE_STATE_PRECAPTURE,
4690 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
4691 ALOGV("(%s) ANDROID_CONTROL_AE_STATE_PRECAPTURE (%d)", __FUNCTION__, m_ctlInfo.flash.m_flashCnt);
4692 m_notifyCb(CAMERA2_MSG_AUTOWB,
4693 ANDROID_CONTROL_AWB_STATE_CONVERGED,
4694 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
4695 m_ctlInfo.ae.aeStateNoti = AE_STATE_PRECAPTURE;
4696 }
4697 }
4698}
4699
4700void ExynosCameraHWInterface2::OnPrecaptureMeteringNotificationISP()
e117f756
YJ
4701{
4702 if (m_ctlInfo.flash.m_precaptureTriggerId > 0) {
4703 if (m_ctlInfo.flash.m_flashEnableFlg) {
4704 // flash case
4705 switch (m_ctlInfo.flash.m_flashCnt) {
4706 case IS_FLASH_STATE_AUTO_DONE:
d91c0269 4707 case IS_FLASH_STATE_AUTO_OFF:
73f5ad60
YJ
4708 if (m_ctlInfo.ae.aeStateNoti == AE_STATE_PRECAPTURE) {
4709 // End notification
e117f756
YJ
4710 m_notifyCb(CAMERA2_MSG_AUTOEXPOSURE,
4711 ANDROID_CONTROL_AE_STATE_LOCKED,
4712 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
73f5ad60 4713 ALOGV("(%s) ANDROID_CONTROL_AE_STATE_LOCKED (%d)", __FUNCTION__, m_ctlInfo.flash.m_flashCnt);
e117f756
YJ
4714 m_notifyCb(CAMERA2_MSG_AUTOWB,
4715 ANDROID_CONTROL_AWB_STATE_LOCKED,
4716 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
4717 m_ctlInfo.flash.m_precaptureTriggerId = 0;
4718 } else {
4719 m_notifyCb(CAMERA2_MSG_AUTOEXPOSURE,
4720 ANDROID_CONTROL_AE_STATE_PRECAPTURE,
4721 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
73f5ad60 4722 ALOGV("(%s) ANDROID_CONTROL_AE_STATE_LOCKED (%d)", __FUNCTION__, m_ctlInfo.flash.m_flashCnt);
e117f756
YJ
4723 m_notifyCb(CAMERA2_MSG_AUTOWB,
4724 ANDROID_CONTROL_AWB_STATE_CONVERGED,
4725 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
73f5ad60 4726 m_ctlInfo.ae.aeStateNoti = AE_STATE_PRECAPTURE;
e117f756 4727 }
73f5ad60
YJ
4728 break;
4729 case IS_FLASH_STATE_CAPTURE:
4730 case IS_FLASH_STATE_CAPTURE_WAIT:
4731 case IS_FLASH_STATE_CAPTURE_JPEG:
4732 case IS_FLASH_STATE_CAPTURE_END:
4733 ALOGV("(%s) INVALID flash state count. (%d)", __FUNCTION__, (int)m_ctlInfo.flash.m_flashCnt);
4734 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_DONE;
4735 m_notifyCb(CAMERA2_MSG_AUTOEXPOSURE,
4736 ANDROID_CONTROL_AE_STATE_LOCKED,
4737 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
4738 m_notifyCb(CAMERA2_MSG_AUTOWB,
4739 ANDROID_CONTROL_AWB_STATE_LOCKED,
4740 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
4741 m_ctlInfo.flash.m_precaptureTriggerId = 0;
4742 break;
e117f756
YJ
4743 }
4744 } else {
4745 // non-flash case
73f5ad60 4746 if (m_ctlInfo.ae.aeStateNoti == AE_STATE_PRECAPTURE) {
d91c0269
YJ
4747 m_notifyCb(CAMERA2_MSG_AUTOEXPOSURE,
4748 ANDROID_CONTROL_AE_STATE_LOCKED,
4749 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
73f5ad60 4750 ALOGV("(%s) ANDROID_CONTROL_AE_STATE_LOCKED (%d)", __FUNCTION__, m_ctlInfo.flash.m_flashCnt);
e117f756
YJ
4751 m_notifyCb(CAMERA2_MSG_AUTOWB,
4752 ANDROID_CONTROL_AWB_STATE_LOCKED,
4753 m_ctlInfo.flash.m_precaptureTriggerId, 0, m_callbackCookie);
d91c0269 4754 m_ctlInfo.flash.m_precaptureTriggerId = 0;
e117f756
YJ
4755 }
4756 }
4757 }
4758}
4759
0f26b20f
SK
4760void ExynosCameraHWInterface2::OnAfNotification(enum aa_afstate noti)
4761{
4762 switch (m_afMode) {
4763 case AA_AFMODE_AUTO:
4764 case AA_AFMODE_MACRO:
4765 OnAfNotificationAutoMacro(noti);
4766 break;
4767 case AA_AFMODE_CONTINUOUS_VIDEO:
4768 OnAfNotificationCAFVideo(noti);
4769 break;
4770 case AA_AFMODE_CONTINUOUS_PICTURE:
4771 OnAfNotificationCAFPicture(noti);
4772 break;
4773 case AA_AFMODE_OFF:
4774 default:
4775 break;
4776 }
4777}
4778
4779void ExynosCameraHWInterface2::OnAfNotificationAutoMacro(enum aa_afstate noti)
4780{
4781 int nextState = NO_TRANSITION;
4782 bool bWrongTransition = false;
4783
4784 if (m_afState == HAL_AFSTATE_INACTIVE || m_afState == HAL_AFSTATE_NEEDS_COMMAND) {
4785 switch (noti) {
4786 case AA_AFSTATE_INACTIVE:
4787 case AA_AFSTATE_ACTIVE_SCAN:
4788 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4789 case AA_AFSTATE_AF_FAILED_FOCUS:
4790 default:
4791 nextState = NO_TRANSITION;
4792 break;
4793 }
4794 }
4795 else if (m_afState == HAL_AFSTATE_STARTED) {
4796 switch (noti) {
4797 case AA_AFSTATE_INACTIVE:
4798 nextState = NO_TRANSITION;
4799 break;
4800 case AA_AFSTATE_ACTIVE_SCAN:
4801 nextState = HAL_AFSTATE_SCANNING;
4802 SetAfStateForService(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN);
4803 break;
4804 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4805 nextState = NO_TRANSITION;
4806 break;
4807 case AA_AFSTATE_AF_FAILED_FOCUS:
4808 nextState = NO_TRANSITION;
4809 break;
4810 default:
4811 bWrongTransition = true;
4812 break;
4813 }
4814 }
4815 else if (m_afState == HAL_AFSTATE_SCANNING) {
4816 switch (noti) {
4817 case AA_AFSTATE_INACTIVE:
4818 bWrongTransition = true;
4819 break;
4820 case AA_AFSTATE_ACTIVE_SCAN:
4821 nextState = NO_TRANSITION;
4822 break;
4823 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
9a710a45 4824 // If Flash mode is enable, after AF execute pre-capture metering
e117f756
YJ
4825 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
4826 switch (m_ctlInfo.flash.m_flashCnt) {
4827 case IS_FLASH_STATE_ON_DONE:
4828 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_AE_AWB_LOCK;
4a9565ae 4829 nextState = NO_TRANSITION;
e117f756
YJ
4830 break;
4831 case IS_FLASH_STATE_AUTO_DONE:
4a9565ae 4832 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_OFF;
9a710a45
YJ
4833 nextState = HAL_AFSTATE_LOCKED;
4834 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
e117f756
YJ
4835 break;
4836 default:
9a710a45
YJ
4837 nextState = NO_TRANSITION;
4838 }
4839 } else {
4840 nextState = HAL_AFSTATE_LOCKED;
4841 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
4842 }
0f26b20f
SK
4843 break;
4844 case AA_AFSTATE_AF_FAILED_FOCUS:
9a710a45 4845 // If Flash mode is enable, after AF execute pre-capture metering
e117f756
YJ
4846 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
4847 switch (m_ctlInfo.flash.m_flashCnt) {
4848 case IS_FLASH_STATE_ON_DONE:
4849 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_AE_AWB_LOCK;
4a9565ae 4850 nextState = NO_TRANSITION;
e117f756
YJ
4851 break;
4852 case IS_FLASH_STATE_AUTO_DONE:
4a9565ae 4853 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_OFF;
9a710a45
YJ
4854 nextState = HAL_AFSTATE_FAILED;
4855 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
e117f756
YJ
4856 break;
4857 default:
9a710a45
YJ
4858 nextState = NO_TRANSITION;
4859 }
4860 } else {
4861 nextState = HAL_AFSTATE_FAILED;
4862 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4863 }
0f26b20f
SK
4864 break;
4865 default:
4866 bWrongTransition = true;
4867 break;
4868 }
4869 }
4870 else if (m_afState == HAL_AFSTATE_LOCKED) {
4871 switch (noti) {
4872 case AA_AFSTATE_INACTIVE:
4873 case AA_AFSTATE_ACTIVE_SCAN:
4874 bWrongTransition = true;
4875 break;
4876 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4877 nextState = NO_TRANSITION;
4878 break;
4879 case AA_AFSTATE_AF_FAILED_FOCUS:
4880 default:
4881 bWrongTransition = true;
4882 break;
4883 }
4884 }
4885 else if (m_afState == HAL_AFSTATE_FAILED) {
4886 switch (noti) {
4887 case AA_AFSTATE_INACTIVE:
4888 case AA_AFSTATE_ACTIVE_SCAN:
4889 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4890 bWrongTransition = true;
4891 break;
4892 case AA_AFSTATE_AF_FAILED_FOCUS:
4893 nextState = NO_TRANSITION;
4894 break;
4895 default:
4896 bWrongTransition = true;
4897 break;
4898 }
4899 }
4900 if (bWrongTransition) {
4901 ALOGV("(%s): Wrong Transition state(%d) noti(%d)", __FUNCTION__, m_afState, noti);
4902 return;
4903 }
4904 ALOGV("(%s): State (%d) -> (%d) by (%d)", __FUNCTION__, m_afState, nextState, noti);
4905 if (nextState != NO_TRANSITION)
4906 m_afState = nextState;
4907}
4908
4909void ExynosCameraHWInterface2::OnAfNotificationCAFPicture(enum aa_afstate noti)
4910{
4911 int nextState = NO_TRANSITION;
4912 bool bWrongTransition = false;
4913
4914 if (m_afState == HAL_AFSTATE_INACTIVE) {
4915 switch (noti) {
4916 case AA_AFSTATE_INACTIVE:
4917 case AA_AFSTATE_ACTIVE_SCAN:
4918 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4919 case AA_AFSTATE_AF_FAILED_FOCUS:
4920 default:
4921 nextState = NO_TRANSITION;
4922 break;
4923 }
4924 }
4925 else if (m_afState == HAL_AFSTATE_STARTED) {
4926 switch (noti) {
4927 case AA_AFSTATE_INACTIVE:
4928 nextState = NO_TRANSITION;
4929 break;
4930 case AA_AFSTATE_ACTIVE_SCAN:
4931 nextState = HAL_AFSTATE_SCANNING;
4932 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
4933 break;
4934 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4935 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
4936 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
4937 break;
4938 case AA_AFSTATE_AF_FAILED_FOCUS:
cd13bb78
SK
4939 //nextState = HAL_AFSTATE_FAILED;
4940 //SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
4941 nextState = NO_TRANSITION;
0f26b20f
SK
4942 break;
4943 default:
4944 bWrongTransition = true;
4945 break;
4946 }
4947 }
4948 else if (m_afState == HAL_AFSTATE_SCANNING) {
4949 switch (noti) {
4950 case AA_AFSTATE_INACTIVE:
36c106c9 4951 nextState = NO_TRANSITION;
0f26b20f
SK
4952 break;
4953 case AA_AFSTATE_ACTIVE_SCAN:
4954 nextState = NO_TRANSITION;
36c106c9 4955 m_AfHwStateFailed = false;
0f26b20f
SK
4956 break;
4957 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4958 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
36c106c9 4959 m_AfHwStateFailed = false;
0f26b20f
SK
4960 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
4961 break;
4962 case AA_AFSTATE_AF_FAILED_FOCUS:
36c106c9
SK
4963 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
4964 m_AfHwStateFailed = true;
4965 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
0f26b20f
SK
4966 break;
4967 default:
4968 bWrongTransition = true;
4969 break;
4970 }
4971 }
4972 else if (m_afState == HAL_AFSTATE_PASSIVE_FOCUSED) {
4973 switch (noti) {
4974 case AA_AFSTATE_INACTIVE:
36c106c9 4975 nextState = NO_TRANSITION;
0f26b20f
SK
4976 break;
4977 case AA_AFSTATE_ACTIVE_SCAN:
4978 nextState = HAL_AFSTATE_SCANNING;
36c106c9 4979 m_AfHwStateFailed = false;
0f26b20f
SK
4980 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
4981 break;
4982 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
4983 nextState = NO_TRANSITION;
36c106c9 4984 m_AfHwStateFailed = false;
0f26b20f
SK
4985 break;
4986 case AA_AFSTATE_AF_FAILED_FOCUS:
36c106c9
SK
4987 nextState = NO_TRANSITION;
4988 m_AfHwStateFailed = true;
0f26b20f
SK
4989 break;
4990 default:
4991 bWrongTransition = true;
4992 break;
4993 }
4994 }
4995 else if (m_afState == HAL_AFSTATE_NEEDS_DETERMINATION) {
f7f8d321
YJ
4996 //Skip notification in case of flash, wait the end of flash on
4997 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
4998 if (m_ctlInfo.flash.m_flashCnt < IS_FLASH_STATE_ON_DONE)
4999 return;
5000 }
0f26b20f
SK
5001 switch (noti) {
5002 case AA_AFSTATE_INACTIVE:
36c106c9 5003 nextState = NO_TRANSITION;
0f26b20f
SK
5004 break;
5005 case AA_AFSTATE_ACTIVE_SCAN:
5006 nextState = NO_TRANSITION;
5007 break;
5008 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
caea49e6 5009 // If Flash mode is enable, after AF execute pre-capture metering
e117f756 5010 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
e117f756
YJ
5011 switch (m_ctlInfo.flash.m_flashCnt) {
5012 case IS_FLASH_STATE_ON_DONE:
f7f8d321 5013 ALOGV("[AF Flash] AUTO start with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
e117f756 5014 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_AE_AWB_LOCK;
4a9565ae 5015 nextState = NO_TRANSITION;
e117f756
YJ
5016 break;
5017 case IS_FLASH_STATE_AUTO_DONE:
f7f8d321 5018 ALOGV("[AF Flash] AUTO end with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4a9565ae 5019 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_OFF;
caea49e6
YJ
5020 m_IsAfLockRequired = true;
5021 nextState = HAL_AFSTATE_LOCKED;
5022 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
e117f756
YJ
5023 break;
5024 default:
caea49e6
YJ
5025 nextState = NO_TRANSITION;
5026 }
5027 } else {
5028 m_IsAfLockRequired = true;
5029 nextState = HAL_AFSTATE_LOCKED;
5030 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
5031 }
0f26b20f
SK
5032 break;
5033 case AA_AFSTATE_AF_FAILED_FOCUS:
caea49e6 5034 // If Flash mode is enable, after AF execute pre-capture metering
e117f756 5035 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
e117f756
YJ
5036 switch (m_ctlInfo.flash.m_flashCnt) {
5037 case IS_FLASH_STATE_ON_DONE:
f7f8d321 5038 ALOGV("[AF Flash] AUTO start with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
e117f756 5039 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_AE_AWB_LOCK;
4a9565ae 5040 nextState = NO_TRANSITION;
e117f756
YJ
5041 break;
5042 case IS_FLASH_STATE_AUTO_DONE:
f7f8d321 5043 ALOGV("[AF Flash] AUTO end with Mode (%d) state (%d) noti (%d)", m_afMode, m_afState, (int)noti);
4a9565ae 5044 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_OFF;
caea49e6
YJ
5045 m_IsAfLockRequired = true;
5046 nextState = HAL_AFSTATE_FAILED;
5047 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
e117f756
YJ
5048 break;
5049 default:
caea49e6
YJ
5050 nextState = NO_TRANSITION;
5051 }
5052 } else {
5053 m_IsAfLockRequired = true;
5054 nextState = HAL_AFSTATE_FAILED;
5055 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
5056 }
0f26b20f
SK
5057 break;
5058 default:
5059 bWrongTransition = true;
5060 break;
5061 }
5062 }
5063 else if (m_afState == HAL_AFSTATE_LOCKED) {
5064 switch (noti) {
5065 case AA_AFSTATE_INACTIVE:
5066 nextState = NO_TRANSITION;
5067 break;
5068 case AA_AFSTATE_ACTIVE_SCAN:
5069 bWrongTransition = true;
5070 break;
5071 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5072 nextState = NO_TRANSITION;
5073 break;
5074 case AA_AFSTATE_AF_FAILED_FOCUS:
5075 default:
5076 bWrongTransition = true;
5077 break;
5078 }
5079 }
5080 else if (m_afState == HAL_AFSTATE_FAILED) {
5081 switch (noti) {
5082 case AA_AFSTATE_INACTIVE:
36c106c9
SK
5083 bWrongTransition = true;
5084 break;
0f26b20f 5085 case AA_AFSTATE_ACTIVE_SCAN:
36c106c9
SK
5086 nextState = HAL_AFSTATE_SCANNING;
5087 break;
0f26b20f
SK
5088 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5089 bWrongTransition = true;
5090 break;
5091 case AA_AFSTATE_AF_FAILED_FOCUS:
5092 nextState = NO_TRANSITION;
5093 break;
5094 default:
5095 bWrongTransition = true;
5096 break;
5097 }
5098 }
5099 if (bWrongTransition) {
5100 ALOGV("(%s): Wrong Transition state(%d) noti(%d)", __FUNCTION__, m_afState, noti);
5101 return;
5102 }
5103 ALOGV("(%s): State (%d) -> (%d) by (%d)", __FUNCTION__, m_afState, nextState, noti);
5104 if (nextState != NO_TRANSITION)
5105 m_afState = nextState;
5106}
5107
5108void ExynosCameraHWInterface2::OnAfNotificationCAFVideo(enum aa_afstate noti)
5109{
5110 int nextState = NO_TRANSITION;
5111 bool bWrongTransition = false;
5112
5113 if (m_afState == HAL_AFSTATE_INACTIVE) {
5114 switch (noti) {
5115 case AA_AFSTATE_INACTIVE:
5116 case AA_AFSTATE_ACTIVE_SCAN:
5117 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5118 case AA_AFSTATE_AF_FAILED_FOCUS:
5119 default:
5120 nextState = NO_TRANSITION;
5121 break;
5122 }
5123 }
5124 else if (m_afState == HAL_AFSTATE_STARTED) {
5125 switch (noti) {
5126 case AA_AFSTATE_INACTIVE:
5127 nextState = NO_TRANSITION;
5128 break;
5129 case AA_AFSTATE_ACTIVE_SCAN:
5130 nextState = HAL_AFSTATE_SCANNING;
5131 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
5132 break;
5133 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5134 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
5135 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
5136 break;
5137 case AA_AFSTATE_AF_FAILED_FOCUS:
5138 nextState = HAL_AFSTATE_FAILED;
5139 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
5140 break;
5141 default:
5142 bWrongTransition = true;
5143 break;
5144 }
5145 }
5146 else if (m_afState == HAL_AFSTATE_SCANNING) {
5147 switch (noti) {
5148 case AA_AFSTATE_INACTIVE:
5149 bWrongTransition = true;
5150 break;
5151 case AA_AFSTATE_ACTIVE_SCAN:
5152 nextState = NO_TRANSITION;
5153 break;
5154 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5155 nextState = HAL_AFSTATE_PASSIVE_FOCUSED;
5156 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED);
5157 break;
5158 case AA_AFSTATE_AF_FAILED_FOCUS:
5159 nextState = NO_TRANSITION;
5160 break;
5161 default:
5162 bWrongTransition = true;
5163 break;
5164 }
5165 }
5166 else if (m_afState == HAL_AFSTATE_PASSIVE_FOCUSED) {
5167 switch (noti) {
5168 case AA_AFSTATE_INACTIVE:
5169 bWrongTransition = true;
5170 break;
5171 case AA_AFSTATE_ACTIVE_SCAN:
5172 nextState = HAL_AFSTATE_SCANNING;
5173 SetAfStateForService(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN);
5174 break;
5175 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5176 nextState = NO_TRANSITION;
5177 break;
5178 case AA_AFSTATE_AF_FAILED_FOCUS:
5179 nextState = HAL_AFSTATE_FAILED;
5180 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
8e2c2fdb 5181 // TODO : needs NO_TRANSITION ?
0f26b20f
SK
5182 break;
5183 default:
5184 bWrongTransition = true;
5185 break;
5186 }
5187 }
5188 else if (m_afState == HAL_AFSTATE_NEEDS_DETERMINATION) {
5189 switch (noti) {
5190 case AA_AFSTATE_INACTIVE:
5191 bWrongTransition = true;
5192 break;
5193 case AA_AFSTATE_ACTIVE_SCAN:
5194 nextState = NO_TRANSITION;
5195 break;
5196 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5197 m_IsAfLockRequired = true;
5198 nextState = HAL_AFSTATE_LOCKED;
5199 SetAfStateForService(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED);
5200 break;
5201 case AA_AFSTATE_AF_FAILED_FOCUS:
5202 nextState = HAL_AFSTATE_FAILED;
5203 SetAfStateForService(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
5204 break;
5205 default:
5206 bWrongTransition = true;
5207 break;
5208 }
5209 }
5210 else if (m_afState == HAL_AFSTATE_LOCKED) {
5211 switch (noti) {
5212 case AA_AFSTATE_INACTIVE:
5213 nextState = NO_TRANSITION;
5214 break;
5215 case AA_AFSTATE_ACTIVE_SCAN:
5216 bWrongTransition = true;
5217 break;
5218 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5219 nextState = NO_TRANSITION;
5220 break;
5221 case AA_AFSTATE_AF_FAILED_FOCUS:
5222 default:
5223 bWrongTransition = true;
5224 break;
5225 }
5226 }
5227 else if (m_afState == HAL_AFSTATE_FAILED) {
5228 switch (noti) {
5229 case AA_AFSTATE_INACTIVE:
5230 case AA_AFSTATE_ACTIVE_SCAN:
5231 case AA_AFSTATE_AF_ACQUIRED_FOCUS:
5232 bWrongTransition = true;
5233 break;
5234 case AA_AFSTATE_AF_FAILED_FOCUS:
5235 nextState = NO_TRANSITION;
5236 break;
5237 default:
5238 bWrongTransition = true;
5239 break;
5240 }
5241 }
5242 if (bWrongTransition) {
5243 ALOGV("(%s): Wrong Transition state(%d) noti(%d)", __FUNCTION__, m_afState, noti);
5244 return;
5245 }
5246 ALOGV("(%s): State (%d) -> (%d) by (%d)", __FUNCTION__, m_afState, nextState, noti);
5247 if (nextState != NO_TRANSITION)
5248 m_afState = nextState;
5249}
5250
5251void ExynosCameraHWInterface2::OnAfCancel(int id)
5252{
8e2c2fdb
SK
5253 m_afTriggerId = id;
5254
0f26b20f
SK
5255 switch (m_afMode) {
5256 case AA_AFMODE_AUTO:
5257 case AA_AFMODE_MACRO:
8e2c2fdb 5258 case AA_AFMODE_OFF:
0f26b20f
SK
5259 OnAfCancelAutoMacro(id);
5260 break;
5261 case AA_AFMODE_CONTINUOUS_VIDEO:
5262 OnAfCancelCAFVideo(id);
5263 break;
5264 case AA_AFMODE_CONTINUOUS_PICTURE:
5265 OnAfCancelCAFPicture(id);
5266 break;
0f26b20f
SK
5267 default:
5268 break;
5269 }
5270}
5271
5272void ExynosCameraHWInterface2::OnAfCancelAutoMacro(int id)
5273{
5274 int nextState = NO_TRANSITION;
5275 m_afTriggerId = id;
5276
e117f756
YJ
5277 if (m_ctlInfo.flash.m_flashEnableFlg && m_ctlInfo.flash.m_afFlashDoneFlg) {
5278 m_ctlInfo.flash.m_flashCnt = IS_FLASH_STATE_AUTO_OFF;
6f19b6cf 5279 }
0f26b20f
SK
5280 switch (m_afState) {
5281 case HAL_AFSTATE_INACTIVE:
5282 nextState = NO_TRANSITION;
cd13bb78 5283 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
0f26b20f
SK
5284 break;
5285 case HAL_AFSTATE_NEEDS_COMMAND:
5286 case HAL_AFSTATE_STARTED:
5287 case HAL_AFSTATE_SCANNING:
5288 case HAL_AFSTATE_LOCKED:
5289 case HAL_AFSTATE_FAILED:
5290 SetAfMode(AA_AFMODE_OFF);
5291 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
5292 nextState = HAL_AFSTATE_INACTIVE;
5293 break;
5294 default:
5295 break;
5296 }
5297 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
5298 if (nextState != NO_TRANSITION)
5299 m_afState = nextState;
5300}
5301
5302void ExynosCameraHWInterface2::OnAfCancelCAFPicture(int id)
5303{
5304 int nextState = NO_TRANSITION;
5305 m_afTriggerId = id;
5306
5307 switch (m_afState) {
5308 case HAL_AFSTATE_INACTIVE:
5309 nextState = NO_TRANSITION;
5310 break;
5311 case HAL_AFSTATE_NEEDS_COMMAND:
5312 case HAL_AFSTATE_STARTED:
5313 case HAL_AFSTATE_SCANNING:
5314 case HAL_AFSTATE_LOCKED:
5315 case HAL_AFSTATE_FAILED:
5316 case HAL_AFSTATE_NEEDS_DETERMINATION:
5317 case HAL_AFSTATE_PASSIVE_FOCUSED:
5318 SetAfMode(AA_AFMODE_OFF);
5319 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
5320 SetAfMode(AA_AFMODE_CONTINUOUS_PICTURE);
5321 nextState = HAL_AFSTATE_INACTIVE;
5322 break;
5323 default:
5324 break;
5325 }
5326 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
5327 if (nextState != NO_TRANSITION)
5328 m_afState = nextState;
5329}
5330
5331void ExynosCameraHWInterface2::OnAfCancelCAFVideo(int id)
5332{
5333 int nextState = NO_TRANSITION;
5334 m_afTriggerId = id;
5335
5336 switch (m_afState) {
5337 case HAL_AFSTATE_INACTIVE:
5338 nextState = NO_TRANSITION;
5339 break;
5340 case HAL_AFSTATE_NEEDS_COMMAND:
5341 case HAL_AFSTATE_STARTED:
5342 case HAL_AFSTATE_SCANNING:
5343 case HAL_AFSTATE_LOCKED:
5344 case HAL_AFSTATE_FAILED:
5345 case HAL_AFSTATE_NEEDS_DETERMINATION:
5346 case HAL_AFSTATE_PASSIVE_FOCUSED:
5347 SetAfMode(AA_AFMODE_OFF);
5348 SetAfStateForService(ANDROID_CONTROL_AF_STATE_INACTIVE);
5349 SetAfMode(AA_AFMODE_CONTINUOUS_VIDEO);
5350 nextState = HAL_AFSTATE_INACTIVE;
5351 break;
5352 default:
5353 break;
5354 }
5355 ALOGV("(%s): State (%d) -> (%d)", __FUNCTION__, m_afState, nextState);
5356 if (nextState != NO_TRANSITION)
5357 m_afState = nextState;
5358}
5359
5360void ExynosCameraHWInterface2::SetAfStateForService(int newState)
5361{
8e2c2fdb
SK
5362 if (m_serviceAfState != newState || newState == 0)
5363 m_notifyCb(CAMERA2_MSG_AUTOFOCUS, newState, m_afTriggerId, 0, m_callbackCookie);
0f26b20f 5364 m_serviceAfState = newState;
0f26b20f
SK
5365}
5366
5367int ExynosCameraHWInterface2::GetAfStateForService()
5368{
5369 return m_serviceAfState;
5370}
5371
5372void ExynosCameraHWInterface2::SetAfMode(enum aa_afmode afMode)
5373{
5374 if (m_afMode != afMode) {
5375 if (m_IsAfModeUpdateRequired) {
5376 m_afMode2 = afMode;
5377 ALOGV("(%s): pending(%d) and new(%d)", __FUNCTION__, m_afMode, afMode);
5378 }
5379 else {
5380 ALOGV("(%s): current(%d) new(%d)", __FUNCTION__, m_afMode, afMode);
5381 m_IsAfModeUpdateRequired = true;
5382 m_afMode = afMode;
cd13bb78
SK
5383 if (m_afModeWaitingCnt != 0) {
5384 m_afModeWaitingCnt = 0;
7d0efb59 5385 m_afState = HAL_AFSTATE_INACTIVE;
cd13bb78
SK
5386 OnAfTrigger(m_afPendingTriggerId);
5387 }
8e2c2fdb 5388 }
0f26b20f
SK
5389 }
5390}
5391
eed7ed1b
SK
5392void ExynosCameraHWInterface2::m_setExifFixedAttribute(void)
5393{
5394 char property[PROPERTY_VALUE_MAX];
5395
5396 //2 0th IFD TIFF Tags
1b8ef182 5397#if 0 // STOPSHIP TODO(aray): remove before launch, but for now don't leak product data
eed7ed1b
SK
5398 //3 Maker
5399 property_get("ro.product.brand", property, EXIF_DEF_MAKER);
5400 strncpy((char *)mExifInfo.maker, property,
5401 sizeof(mExifInfo.maker) - 1);
5402 mExifInfo.maker[sizeof(mExifInfo.maker) - 1] = '\0';
5403 //3 Model
5404 property_get("ro.product.model", property, EXIF_DEF_MODEL);
5405 strncpy((char *)mExifInfo.model, property,
5406 sizeof(mExifInfo.model) - 1);
5407 mExifInfo.model[sizeof(mExifInfo.model) - 1] = '\0';
5408 //3 Software
5409 property_get("ro.build.id", property, EXIF_DEF_SOFTWARE);
5410 strncpy((char *)mExifInfo.software, property,
5411 sizeof(mExifInfo.software) - 1);
5412 mExifInfo.software[sizeof(mExifInfo.software) - 1] = '\0';
5a92f77a 5413#endif
eed7ed1b
SK
5414
5415 //3 YCbCr Positioning
5416 mExifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
5417
5418 //2 0th IFD Exif Private Tags
5419 //3 F Number
e00f6591 5420 mExifInfo.fnumber.num = (uint32_t)(m_camera2->m_curCameraInfo->fnumber * EXIF_DEF_FNUMBER_DEN);
eed7ed1b
SK
5421 mExifInfo.fnumber.den = EXIF_DEF_FNUMBER_DEN;
5422 //3 Exposure Program
5423 mExifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
5424 //3 Exif Version
5425 memcpy(mExifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(mExifInfo.exif_version));
5426 //3 Aperture
e00f6591
SK
5427 double av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num/mExifInfo.fnumber.den);
5428 mExifInfo.aperture.num = (uint32_t)(av*EXIF_DEF_APEX_DEN);
eed7ed1b
SK
5429 mExifInfo.aperture.den = EXIF_DEF_APEX_DEN;
5430 //3 Maximum lens aperture
5431 mExifInfo.max_aperture.num = mExifInfo.aperture.num;
5432 mExifInfo.max_aperture.den = mExifInfo.aperture.den;
5433 //3 Lens Focal Length
e00f6591
SK
5434 mExifInfo.focal_length.num = (uint32_t)(m_camera2->m_curCameraInfo->focalLength * 100);
5435
eed7ed1b
SK
5436 mExifInfo.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
5437 //3 User Comments
5438 strcpy((char *)mExifInfo.user_comment, EXIF_DEF_USERCOMMENTS);
5439 //3 Color Space information
5440 mExifInfo.color_space = EXIF_DEF_COLOR_SPACE;
5441 //3 Exposure Mode
5442 mExifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
5443
5444 //2 0th IFD GPS Info Tags
5445 unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
5446 memcpy(mExifInfo.gps_version_id, gps_version, sizeof(gps_version));
5447
5448 //2 1th IFD TIFF Tags
5449 mExifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
5450 mExifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
5451 mExifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
5452 mExifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
5453 mExifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
5454 mExifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
5455}
5456
5457void ExynosCameraHWInterface2::m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
5458 camera2_shot *currentEntry)
5459{
5460 camera2_dm *dm = &(currentEntry->dm);
5461 camera2_ctl *ctl = &(currentEntry->ctl);
5462
5463 ALOGV("(%s): framecnt(%d) exp(%lld) iso(%d)", __FUNCTION__, ctl->request.frameCount, dm->sensor.exposureTime,dm->aa.isoValue );
5464 if (!ctl->request.frameCount)
5465 return;
5466 //2 0th IFD TIFF Tags
5467 //3 Width
5468 exifInfo->width = rect->w;
5469 //3 Height
5470 exifInfo->height = rect->h;
5471 //3 Orientation
5472 switch (ctl->jpeg.orientation) {
5473 case 90:
5474 exifInfo->orientation = EXIF_ORIENTATION_90;
5475 break;
5476 case 180:
5477 exifInfo->orientation = EXIF_ORIENTATION_180;
5478 break;
5479 case 270:
5480 exifInfo->orientation = EXIF_ORIENTATION_270;
5481 break;
5482 case 0:
5483 default:
5484 exifInfo->orientation = EXIF_ORIENTATION_UP;
5485 break;
5486 }
5487
5488 //3 Date time
5489 time_t rawtime;
5490 struct tm *timeinfo;
5491 time(&rawtime);
5492 timeinfo = localtime(&rawtime);
5493 strftime((char *)exifInfo->date_time, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
5494
5495 //2 0th IFD Exif Private Tags
5496 //3 Exposure Time
5497 int shutterSpeed = (dm->sensor.exposureTime/1000);
5498
9a77d67e
SK
5499 // To display exposure time just above 500ms as 1/2sec, not 1 sec.
5500 if (shutterSpeed > 500000)
5501 shutterSpeed -= 100000;
5502
eed7ed1b
SK
5503 if (shutterSpeed < 0) {
5504 shutterSpeed = 100;
5505 }
5506
5507 exifInfo->exposure_time.num = 1;
5508 // x us -> 1/x s */
5509 //exifInfo->exposure_time.den = (uint32_t)(1000000 / shutterSpeed);
5510 exifInfo->exposure_time.den = (uint32_t)((double)1000000 / shutterSpeed);
5511
5512 //3 ISO Speed Rating
5513 exifInfo->iso_speed_rating = dm->aa.isoValue;
5514
5515 uint32_t av, tv, bv, sv, ev;
5516 av = APEX_FNUM_TO_APERTURE((double)exifInfo->fnumber.num / exifInfo->fnumber.den);
5517 tv = APEX_EXPOSURE_TO_SHUTTER((double)exifInfo->exposure_time.num / exifInfo->exposure_time.den);
5518 sv = APEX_ISO_TO_FILMSENSITIVITY(exifInfo->iso_speed_rating);
5519 bv = av + tv - sv;
5520 ev = av + tv;
5521 //ALOGD("Shutter speed=%d us, iso=%d", shutterSpeed, exifInfo->iso_speed_rating);
5522 ALOGD("AV=%d, TV=%d, SV=%d", av, tv, sv);
5523
5524 //3 Shutter Speed
5525 exifInfo->shutter_speed.num = tv * EXIF_DEF_APEX_DEN;
5526 exifInfo->shutter_speed.den = EXIF_DEF_APEX_DEN;
5527 //3 Brightness
5528 exifInfo->brightness.num = bv*EXIF_DEF_APEX_DEN;
5529 exifInfo->brightness.den = EXIF_DEF_APEX_DEN;
5530 //3 Exposure Bias
5531 if (ctl->aa.sceneMode== AA_SCENE_MODE_BEACH||
5532 ctl->aa.sceneMode== AA_SCENE_MODE_SNOW) {
5533 exifInfo->exposure_bias.num = EXIF_DEF_APEX_DEN;
5534 exifInfo->exposure_bias.den = EXIF_DEF_APEX_DEN;
5535 } else {
5536 exifInfo->exposure_bias.num = 0;
5537 exifInfo->exposure_bias.den = 0;
5538 }
5539 //3 Metering Mode
5540 /*switch (m_curCameraInfo->metering) {
5541 case METERING_MODE_CENTER:
5542 exifInfo->metering_mode = EXIF_METERING_CENTER;
5543 break;
5544 case METERING_MODE_MATRIX:
5545 exifInfo->metering_mode = EXIF_METERING_MULTISPOT;
5546 break;
5547 case METERING_MODE_SPOT:
5548 exifInfo->metering_mode = EXIF_METERING_SPOT;
5549 break;
5550 case METERING_MODE_AVERAGE:
5551 default:
5552 exifInfo->metering_mode = EXIF_METERING_AVERAGE;
5553 break;
5554 }*/
5555 exifInfo->metering_mode = EXIF_METERING_CENTER;
5556
5557 //3 Flash
9257e29e
YJ
5558 if (m_ctlInfo.flash.m_flashDecisionResult)
5559 exifInfo->flash = 1;
5560 else
5561 exifInfo->flash = EXIF_DEF_FLASH;
eed7ed1b
SK
5562
5563 //3 White Balance
53f62ad9 5564 if (m_ctlInfo.awb.i_awbMode == AA_AWBMODE_WB_AUTO)
eed7ed1b
SK
5565 exifInfo->white_balance = EXIF_WB_AUTO;
5566 else
5567 exifInfo->white_balance = EXIF_WB_MANUAL;
5568
5569 //3 Scene Capture Type
5570 switch (ctl->aa.sceneMode) {
5571 case AA_SCENE_MODE_PORTRAIT:
5572 exifInfo->scene_capture_type = EXIF_SCENE_PORTRAIT;
5573 break;
5574 case AA_SCENE_MODE_LANDSCAPE:
5575 exifInfo->scene_capture_type = EXIF_SCENE_LANDSCAPE;
5576 break;
5577 case AA_SCENE_MODE_NIGHT_PORTRAIT:
5578 exifInfo->scene_capture_type = EXIF_SCENE_NIGHT;
5579 break;
5580 default:
5581 exifInfo->scene_capture_type = EXIF_SCENE_STANDARD;
5582 break;
5583 }
5584
5585 //2 0th IFD GPS Info Tags
5586 if (ctl->jpeg.gpsCoordinates[0] != 0 && ctl->jpeg.gpsCoordinates[1] != 0) {
5587
5588 if (ctl->jpeg.gpsCoordinates[0] > 0)
5589 strcpy((char *)exifInfo->gps_latitude_ref, "N");
5590 else
5591 strcpy((char *)exifInfo->gps_latitude_ref, "S");
5592
5593 if (ctl->jpeg.gpsCoordinates[1] > 0)
5594 strcpy((char *)exifInfo->gps_longitude_ref, "E");
5595 else
5596 strcpy((char *)exifInfo->gps_longitude_ref, "W");
5597
5598 if (ctl->jpeg.gpsCoordinates[2] > 0)
5599 exifInfo->gps_altitude_ref = 0;
5600 else
5601 exifInfo->gps_altitude_ref = 1;
5602
5603 double latitude = fabs(ctl->jpeg.gpsCoordinates[0] / 10000.0);
5604 double longitude = fabs(ctl->jpeg.gpsCoordinates[1] / 10000.0);
5605 double altitude = fabs(ctl->jpeg.gpsCoordinates[2] / 100.0);
5606
5607 exifInfo->gps_latitude[0].num = (uint32_t)latitude;
5608 exifInfo->gps_latitude[0].den = 1;
5609 exifInfo->gps_latitude[1].num = (uint32_t)((latitude - exifInfo->gps_latitude[0].num) * 60);
5610 exifInfo->gps_latitude[1].den = 1;
5611 exifInfo->gps_latitude[2].num = (uint32_t)((((latitude - exifInfo->gps_latitude[0].num) * 60)
5612 - exifInfo->gps_latitude[1].num) * 60);
5613 exifInfo->gps_latitude[2].den = 1;
5614
5615 exifInfo->gps_longitude[0].num = (uint32_t)longitude;
5616 exifInfo->gps_longitude[0].den = 1;
5617 exifInfo->gps_longitude[1].num = (uint32_t)((longitude - exifInfo->gps_longitude[0].num) * 60);
5618 exifInfo->gps_longitude[1].den = 1;
5619 exifInfo->gps_longitude[2].num = (uint32_t)((((longitude - exifInfo->gps_longitude[0].num) * 60)
5620 - exifInfo->gps_longitude[1].num) * 60);
5621 exifInfo->gps_longitude[2].den = 1;
5622
5623 exifInfo->gps_altitude.num = (uint32_t)altitude;
5624 exifInfo->gps_altitude.den = 1;
5625
5626 struct tm tm_data;
5627 long timestamp;
5628 timestamp = (long)ctl->jpeg.gpsTimestamp;
5629 gmtime_r(&timestamp, &tm_data);
5630 exifInfo->gps_timestamp[0].num = tm_data.tm_hour;
5631 exifInfo->gps_timestamp[0].den = 1;
5632 exifInfo->gps_timestamp[1].num = tm_data.tm_min;
5633 exifInfo->gps_timestamp[1].den = 1;
5634 exifInfo->gps_timestamp[2].num = tm_data.tm_sec;
5635 exifInfo->gps_timestamp[2].den = 1;
5636 snprintf((char*)exifInfo->gps_datestamp, sizeof(exifInfo->gps_datestamp),
5637 "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
5638
5639 exifInfo->enableGps = true;
5640 } else {
5641 exifInfo->enableGps = false;
5642 }
5643
5644 //2 1th IFD TIFF Tags
5645 exifInfo->widthThumb = ctl->jpeg.thumbnailSize[0];
5646 exifInfo->heightThumb = ctl->jpeg.thumbnailSize[1];
5647}
5648
13d8c7b4
SK
5649ExynosCameraHWInterface2::MainThread::~MainThread()
5650{
ad37861e 5651 ALOGV("(%s):", __FUNCTION__);
13d8c7b4
SK
5652}
5653
5654void ExynosCameraHWInterface2::MainThread::release()
5655{
ad37861e 5656 ALOGV("(%s):", __func__);
13d8c7b4 5657 SetSignal(SIGNAL_THREAD_RELEASE);
13d8c7b4
SK
5658}
5659
5660ExynosCameraHWInterface2::SensorThread::~SensorThread()
5661{
ad37861e 5662 ALOGV("(%s):", __FUNCTION__);
13d8c7b4
SK
5663}
5664
5665void ExynosCameraHWInterface2::SensorThread::release()
5666{
ad37861e 5667 ALOGV("(%s):", __func__);
13d8c7b4 5668 SetSignal(SIGNAL_THREAD_RELEASE);
13d8c7b4
SK
5669}
5670
13d8c7b4
SK
5671ExynosCameraHWInterface2::StreamThread::~StreamThread()
5672{
ad37861e 5673 ALOGV("(%s):", __FUNCTION__);
13d8c7b4
SK
5674}
5675
5676void ExynosCameraHWInterface2::StreamThread::setParameter(stream_parameters_t * new_parameters)
5677{
5678 ALOGV("DEBUG(%s):", __FUNCTION__);
5506cebf 5679 memcpy(&m_parameters, new_parameters, sizeof(stream_parameters_t));
c15a6b00
JS
5680}
5681
13d8c7b4 5682void ExynosCameraHWInterface2::StreamThread::release()
c15a6b00 5683{
9dd63e1f 5684 ALOGV("(%s):", __func__);
13d8c7b4 5685 SetSignal(SIGNAL_THREAD_RELEASE);
13d8c7b4
SK
5686}
5687
5688int ExynosCameraHWInterface2::StreamThread::findBufferIndex(void * bufAddr)
5689{
5690 int index;
5691 for (index = 0 ; index < m_parameters.numSvcBuffers ; index++) {
5692 if (m_parameters.svcBuffers[index].virt.extP[0] == bufAddr)
5693 return index;
5694 }
5695 return -1;
c15a6b00
JS
5696}
5697
5506cebf
SK
5698int ExynosCameraHWInterface2::StreamThread::findBufferIndex(buffer_handle_t * bufHandle)
5699{
5700 int index;
5701 for (index = 0 ; index < m_parameters.numSvcBuffers ; index++) {
5702 if (m_parameters.svcBufHandle[index] == *bufHandle)
5703 return index;
5704 }
5705 return -1;
5706}
5707
5708status_t ExynosCameraHWInterface2::StreamThread::attachSubStream(int stream_id, int priority)
9dd63e1f 5709{
5506cebf
SK
5710 ALOGV("(%s): substream_id(%d)", __FUNCTION__, stream_id);
5711 int index, vacantIndex;
5712 bool vacancy = false;
5713
5714 for (index = 0 ; index < NUM_MAX_SUBSTREAM ; index++) {
5715 if (!vacancy && m_attachedSubStreams[index].streamId == -1) {
5716 vacancy = true;
5717 vacantIndex = index;
5718 } else if (m_attachedSubStreams[index].streamId == stream_id) {
5719 return BAD_VALUE;
5720 }
5721 }
5722 if (!vacancy)
5723 return NO_MEMORY;
5724 m_attachedSubStreams[vacantIndex].streamId = stream_id;
5725 m_attachedSubStreams[vacantIndex].priority = priority;
5726 m_numRegisteredStream++;
5727 return NO_ERROR;
9dd63e1f
SK
5728}
5729
5506cebf 5730status_t ExynosCameraHWInterface2::StreamThread::detachSubStream(int stream_id)
74d78ebe 5731{
5506cebf
SK
5732 ALOGV("(%s): substream_id(%d)", __FUNCTION__, stream_id);
5733 int index;
5734 bool found = false;
5735
5736 for (index = 0 ; index < NUM_MAX_SUBSTREAM ; index++) {
5737 if (m_attachedSubStreams[index].streamId == stream_id) {
5738 found = true;
5739 break;
5740 }
5741 }
5742 if (!found)
5743 return BAD_VALUE;
5744 m_attachedSubStreams[index].streamId = -1;
5745 m_attachedSubStreams[index].priority = 0;
5746 m_numRegisteredStream--;
5747 return NO_ERROR;
74d78ebe
SK
5748}
5749
c15a6b00
JS
5750int ExynosCameraHWInterface2::createIonClient(ion_client ionClient)
5751{
5752 if (ionClient == 0) {
5753 ionClient = ion_client_create();
5754 if (ionClient < 0) {
13d8c7b4 5755 ALOGE("[%s]src ion client create failed, value = %d\n", __FUNCTION__, ionClient);
c15a6b00
JS
5756 return 0;
5757 }
5758 }
c15a6b00
JS
5759 return ionClient;
5760}
5761
5762int ExynosCameraHWInterface2::deleteIonClient(ion_client ionClient)
5763{
5764 if (ionClient != 0) {
5765 if (ionClient > 0) {
5766 ion_client_destroy(ionClient);
5767 }
5768 ionClient = 0;
5769 }
c15a6b00
JS
5770 return ionClient;
5771}
5772
13d8c7b4 5773int ExynosCameraHWInterface2::allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum)
181e425e
SK
5774{
5775 return allocCameraMemory(ionClient, buf, iMemoryNum, 0);
5776}
5777
5778int ExynosCameraHWInterface2::allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum, int cacheFlag)
c15a6b00
JS
5779{
5780 int ret = 0;
5781 int i = 0;
181e425e 5782 int flag = 0;
c15a6b00
JS
5783
5784 if (ionClient == 0) {
13d8c7b4 5785 ALOGE("[%s] ionClient is zero (%d)\n", __FUNCTION__, ionClient);
c15a6b00
JS
5786 return -1;
5787 }
5788
181e425e 5789 for (i = 0 ; i < iMemoryNum ; i++) {
13d8c7b4 5790 if (buf->size.extS[i] == 0) {
c15a6b00
JS
5791 break;
5792 }
181e425e
SK
5793 if (1 << i & cacheFlag)
5794 flag = ION_FLAG_CACHED;
5795 else
5796 flag = 0;
13d8c7b4 5797 buf->fd.extFd[i] = ion_alloc(ionClient, \
181e425e 5798 buf->size.extS[i], 0, ION_HEAP_EXYNOS_MASK, flag);
13d8c7b4
SK
5799 if ((buf->fd.extFd[i] == -1) ||(buf->fd.extFd[i] == 0)) {
5800 ALOGE("[%s]ion_alloc(%d) failed\n", __FUNCTION__, buf->size.extS[i]);
5801 buf->fd.extFd[i] = -1;
c15a6b00
JS
5802 freeCameraMemory(buf, iMemoryNum);
5803 return -1;
5804 }
5805
13d8c7b4
SK
5806 buf->virt.extP[i] = (char *)ion_map(buf->fd.extFd[i], \
5807 buf->size.extS[i], 0);
5808 if ((buf->virt.extP[i] == (char *)MAP_FAILED) || (buf->virt.extP[i] == NULL)) {
5809 ALOGE("[%s]src ion map failed(%d)\n", __FUNCTION__, buf->size.extS[i]);
5810 buf->virt.extP[i] = (char *)MAP_FAILED;
c15a6b00
JS
5811 freeCameraMemory(buf, iMemoryNum);
5812 return -1;
5813 }
181e425e 5814 ALOGV("allocCameraMem : [%d][0x%08x] size(%d) flag(%d)", i, (unsigned int)(buf->virt.extP[i]), buf->size.extS[i], flag);
c15a6b00
JS
5815 }
5816
5817 return ret;
5818}
5819
13d8c7b4 5820void ExynosCameraHWInterface2::freeCameraMemory(ExynosBuffer *buf, int iMemoryNum)
c15a6b00 5821{
13d8c7b4 5822
5506cebf 5823 int i = 0 ;
15fd8231 5824 int ret = 0;
c15a6b00
JS
5825
5826 for (i=0;i<iMemoryNum;i++) {
13d8c7b4
SK
5827 if (buf->fd.extFd[i] != -1) {
5828 if (buf->virt.extP[i] != (char *)MAP_FAILED) {
15fd8231
SK
5829 ret = ion_unmap(buf->virt.extP[i], buf->size.extS[i]);
5830 if (ret < 0)
5831 ALOGE("ERR(%s)", __FUNCTION__);
c15a6b00 5832 }
13d8c7b4 5833 ion_free(buf->fd.extFd[i]);
90e439c1 5834 ALOGV("freeCameraMemory : [%d][0x%08x] size(%d)", i, (unsigned int)(buf->virt.extP[i]), buf->size.extS[i]);
c15a6b00 5835 }
13d8c7b4
SK
5836 buf->fd.extFd[i] = -1;
5837 buf->virt.extP[i] = (char *)MAP_FAILED;
5838 buf->size.extS[i] = 0;
c15a6b00
JS
5839 }
5840}
5841
13d8c7b4 5842void ExynosCameraHWInterface2::initCameraMemory(ExynosBuffer *buf, int iMemoryNum)
c15a6b00
JS
5843{
5844 int i =0 ;
5845 for (i=0;i<iMemoryNum;i++) {
13d8c7b4
SK
5846 buf->virt.extP[i] = (char *)MAP_FAILED;
5847 buf->fd.extFd[i] = -1;
5848 buf->size.extS[i] = 0;
c15a6b00
JS
5849 }
5850}
5851
5852
13d8c7b4
SK
5853
5854
9dd63e1f 5855static camera2_device_t *g_cam2_device = NULL;
b5237e6b 5856static bool g_camera_vaild = false;
daa1fcd6 5857ExynosCamera2 * g_camera2[2] = { NULL, NULL };
c15a6b00
JS
5858
5859static int HAL2_camera_device_close(struct hw_device_t* device)
5860{
ed4ad5fe 5861 ALOGD("(%s): ENTER", __FUNCTION__);
c15a6b00 5862 if (device) {
9dd63e1f 5863
c15a6b00 5864 camera2_device_t *cam_device = (camera2_device_t *)device;
ad37861e
SK
5865 ALOGV("cam_device(0x%08x):", (unsigned int)cam_device);
5866 ALOGV("g_cam2_device(0x%08x):", (unsigned int)g_cam2_device);
c15a6b00
JS
5867 delete static_cast<ExynosCameraHWInterface2 *>(cam_device->priv);
5868 free(cam_device);
b5237e6b 5869 g_camera_vaild = false;
053d38cf 5870 g_cam2_device = NULL;
c15a6b00 5871 }
15fd8231 5872
ed4ad5fe 5873 ALOGD("(%s): EXIT", __FUNCTION__);
c15a6b00
JS
5874 return 0;
5875}
5876
5877static inline ExynosCameraHWInterface2 *obj(const struct camera2_device *dev)
5878{
5879 return reinterpret_cast<ExynosCameraHWInterface2 *>(dev->priv);
5880}
5881
5882static int HAL2_device_set_request_queue_src_ops(const struct camera2_device *dev,
5883 const camera2_request_queue_src_ops_t *request_src_ops)
5884{
13d8c7b4 5885 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5886 return obj(dev)->setRequestQueueSrcOps(request_src_ops);
5887}
5888
5889static int HAL2_device_notify_request_queue_not_empty(const struct camera2_device *dev)
5890{
13d8c7b4 5891 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5892 return obj(dev)->notifyRequestQueueNotEmpty();
5893}
5894
5895static int HAL2_device_set_frame_queue_dst_ops(const struct camera2_device *dev,
5896 const camera2_frame_queue_dst_ops_t *frame_dst_ops)
5897{
13d8c7b4 5898 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5899 return obj(dev)->setFrameQueueDstOps(frame_dst_ops);
5900}
5901
5902static int HAL2_device_get_in_progress_count(const struct camera2_device *dev)
5903{
13d8c7b4 5904 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5905 return obj(dev)->getInProgressCount();
5906}
5907
5908static int HAL2_device_flush_captures_in_progress(const struct camera2_device *dev)
5909{
13d8c7b4 5910 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5911 return obj(dev)->flushCapturesInProgress();
5912}
5913
5914static int HAL2_device_construct_default_request(const struct camera2_device *dev,
5915 int request_template, camera_metadata_t **request)
5916{
13d8c7b4 5917 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5918 return obj(dev)->constructDefaultRequest(request_template, request);
5919}
5920
5921static int HAL2_device_allocate_stream(
5922 const struct camera2_device *dev,
5923 // inputs
5924 uint32_t width,
5925 uint32_t height,
5926 int format,
5927 const camera2_stream_ops_t *stream_ops,
5928 // outputs
5929 uint32_t *stream_id,
5930 uint32_t *format_actual,
5931 uint32_t *usage,
5932 uint32_t *max_buffers)
5933{
9dd63e1f 5934 ALOGV("(%s): ", __FUNCTION__);
c15a6b00
JS
5935 return obj(dev)->allocateStream(width, height, format, stream_ops,
5936 stream_id, format_actual, usage, max_buffers);
5937}
5938
c15a6b00
JS
5939static int HAL2_device_register_stream_buffers(const struct camera2_device *dev,
5940 uint32_t stream_id,
5941 int num_buffers,
5942 buffer_handle_t *buffers)
5943{
13d8c7b4 5944 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5945 return obj(dev)->registerStreamBuffers(stream_id, num_buffers, buffers);
5946}
5947
5948static int HAL2_device_release_stream(
5949 const struct camera2_device *dev,
5950 uint32_t stream_id)
5951{
ad37861e 5952 ALOGV("DEBUG(%s)(id: %d):", __FUNCTION__, stream_id);
b5237e6b
SK
5953 if (!g_camera_vaild)
5954 return 0;
c15a6b00
JS
5955 return obj(dev)->releaseStream(stream_id);
5956}
5957
5958static int HAL2_device_allocate_reprocess_stream(
5959 const struct camera2_device *dev,
5960 uint32_t width,
5961 uint32_t height,
5962 uint32_t format,
5963 const camera2_stream_in_ops_t *reprocess_stream_ops,
5964 // outputs
5965 uint32_t *stream_id,
5966 uint32_t *consumer_usage,
5967 uint32_t *max_buffers)
5968{
13d8c7b4 5969 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5970 return obj(dev)->allocateReprocessStream(width, height, format, reprocess_stream_ops,
5971 stream_id, consumer_usage, max_buffers);
5972}
5973
2b0421d1
EVT
5974static int HAL2_device_allocate_reprocess_stream_from_stream(
5975 const struct camera2_device *dev,
5976 uint32_t output_stream_id,
5977 const camera2_stream_in_ops_t *reprocess_stream_ops,
5978 // outputs
5979 uint32_t *stream_id)
5980{
5981 ALOGV("DEBUG(%s):", __FUNCTION__);
5506cebf
SK
5982 return obj(dev)->allocateReprocessStreamFromStream(output_stream_id,
5983 reprocess_stream_ops, stream_id);
2b0421d1
EVT
5984}
5985
c15a6b00
JS
5986static int HAL2_device_release_reprocess_stream(
5987 const struct camera2_device *dev,
5988 uint32_t stream_id)
5989{
13d8c7b4 5990 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
5991 return obj(dev)->releaseReprocessStream(stream_id);
5992}
5993
5994static int HAL2_device_trigger_action(const struct camera2_device *dev,
5995 uint32_t trigger_id,
5996 int ext1,
5997 int ext2)
5998{
13d8c7b4 5999 ALOGV("DEBUG(%s):", __FUNCTION__);
b8d41ae2
SK
6000 if (!g_camera_vaild)
6001 return 0;
c15a6b00
JS
6002 return obj(dev)->triggerAction(trigger_id, ext1, ext2);
6003}
6004
6005static int HAL2_device_set_notify_callback(const struct camera2_device *dev,
6006 camera2_notify_callback notify_cb,
6007 void *user)
6008{
13d8c7b4 6009 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
6010 return obj(dev)->setNotifyCallback(notify_cb, user);
6011}
6012
6013static int HAL2_device_get_metadata_vendor_tag_ops(const struct camera2_device*dev,
6014 vendor_tag_query_ops_t **ops)
6015{
13d8c7b4 6016 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
6017 return obj(dev)->getMetadataVendorTagOps(ops);
6018}
6019
6020static int HAL2_device_dump(const struct camera2_device *dev, int fd)
6021{
13d8c7b4 6022 ALOGV("DEBUG(%s):", __FUNCTION__);
c15a6b00
JS
6023 return obj(dev)->dump(fd);
6024}
6025
6026
6027
6028
6029
6030static int HAL2_getNumberOfCameras()
6031{
9dd63e1f
SK
6032 ALOGV("(%s): returning 2", __FUNCTION__);
6033 return 2;
c15a6b00
JS
6034}
6035
6036
c15a6b00
JS
6037static int HAL2_getCameraInfo(int cameraId, struct camera_info *info)
6038{
ad37861e 6039 ALOGV("DEBUG(%s): cameraID: %d", __FUNCTION__, cameraId);
9dd63e1f 6040 static camera_metadata_t * mCameraInfo[2] = {NULL, NULL};
ad37861e 6041
c15a6b00 6042 status_t res;
13d8c7b4 6043
daa1fcd6 6044 if (cameraId == 0) {
9dd63e1f 6045 info->facing = CAMERA_FACING_BACK;
daa1fcd6
SK
6046 if (!g_camera2[0])
6047 g_camera2[0] = new ExynosCamera2(0);
6048 }
6049 else if (cameraId == 1) {
9dd63e1f 6050 info->facing = CAMERA_FACING_FRONT;
daa1fcd6
SK
6051 if (!g_camera2[1])
6052 g_camera2[1] = new ExynosCamera2(1);
6053 }
6054 else
6055 return BAD_VALUE;
6056
c15a6b00
JS
6057 info->orientation = 0;
6058 info->device_version = HARDWARE_DEVICE_API_VERSION(2, 0);
9dd63e1f 6059 if (mCameraInfo[cameraId] == NULL) {
daa1fcd6 6060 res = g_camera2[cameraId]->constructStaticInfo(&(mCameraInfo[cameraId]), cameraId, true);
c15a6b00
JS
6061 if (res != OK) {
6062 ALOGE("%s: Unable to allocate static info: %s (%d)",
13d8c7b4 6063 __FUNCTION__, strerror(-res), res);
c15a6b00
JS
6064 return res;
6065 }
daa1fcd6 6066 res = g_camera2[cameraId]->constructStaticInfo(&(mCameraInfo[cameraId]), cameraId, false);
c15a6b00
JS
6067 if (res != OK) {
6068 ALOGE("%s: Unable to fill in static info: %s (%d)",
13d8c7b4 6069 __FUNCTION__, strerror(-res), res);
c15a6b00
JS
6070 return res;
6071 }
6072 }
9dd63e1f 6073 info->static_camera_characteristics = mCameraInfo[cameraId];
13d8c7b4 6074 return NO_ERROR;
c15a6b00
JS
6075}
6076
6077#define SET_METHOD(m) m : HAL2_device_##m
6078
6079static camera2_device_ops_t camera2_device_ops = {
6080 SET_METHOD(set_request_queue_src_ops),
6081 SET_METHOD(notify_request_queue_not_empty),
6082 SET_METHOD(set_frame_queue_dst_ops),
6083 SET_METHOD(get_in_progress_count),
6084 SET_METHOD(flush_captures_in_progress),
6085 SET_METHOD(construct_default_request),
6086 SET_METHOD(allocate_stream),
6087 SET_METHOD(register_stream_buffers),
6088 SET_METHOD(release_stream),
6089 SET_METHOD(allocate_reprocess_stream),
2b0421d1 6090 SET_METHOD(allocate_reprocess_stream_from_stream),
c15a6b00
JS
6091 SET_METHOD(release_reprocess_stream),
6092 SET_METHOD(trigger_action),
6093 SET_METHOD(set_notify_callback),
6094 SET_METHOD(get_metadata_vendor_tag_ops),
6095 SET_METHOD(dump),
6096};
6097
6098#undef SET_METHOD
6099
6100
6101static int HAL2_camera_device_open(const struct hw_module_t* module,
6102 const char *id,
6103 struct hw_device_t** device)
6104{
c15a6b00 6105 int cameraId = atoi(id);
6044e509 6106 int openInvalid = 0;
9dd63e1f 6107
b5237e6b 6108 g_camera_vaild = false;
0eb27a9d 6109 ALOGD("\n\n>>> I'm Samsung's CameraHAL_2(ID:%d) <<<\n\n", cameraId);
c15a6b00 6110 if (cameraId < 0 || cameraId >= HAL2_getNumberOfCameras()) {
13d8c7b4 6111 ALOGE("ERR(%s):Invalid camera ID %s", __FUNCTION__, id);
c15a6b00
JS
6112 return -EINVAL;
6113 }
6114
0eb27a9d 6115 ALOGD("g_cam2_device : 0x%08x", (unsigned int)g_cam2_device);
c15a6b00
JS
6116 if (g_cam2_device) {
6117 if (obj(g_cam2_device)->getCameraId() == cameraId) {
0eb27a9d 6118 ALOGD("DEBUG(%s):returning existing camera ID %s", __FUNCTION__, id);
c15a6b00
JS
6119 goto done;
6120 } else {
0eb27a9d 6121 ALOGD("(%s): START waiting for cam device free", __FUNCTION__);
9dd63e1f
SK
6122 while (g_cam2_device)
6123 usleep(10000);
0eb27a9d 6124 ALOGD("(%s): END waiting for cam device free", __FUNCTION__);
c15a6b00
JS
6125 }
6126 }
6127
6128 g_cam2_device = (camera2_device_t *)malloc(sizeof(camera2_device_t));
ad37861e 6129 ALOGV("g_cam2_device : 0x%08x", (unsigned int)g_cam2_device);
9dd63e1f 6130
c15a6b00
JS
6131 if (!g_cam2_device)
6132 return -ENOMEM;
6133
6134 g_cam2_device->common.tag = HARDWARE_DEVICE_TAG;
6135 g_cam2_device->common.version = CAMERA_DEVICE_API_VERSION_2_0;
6136 g_cam2_device->common.module = const_cast<hw_module_t *>(module);
6137 g_cam2_device->common.close = HAL2_camera_device_close;
6138
6139 g_cam2_device->ops = &camera2_device_ops;
6140
13d8c7b4 6141 ALOGV("DEBUG(%s):open camera2 %s", __FUNCTION__, id);
c15a6b00 6142
6044e509
SK
6143 g_cam2_device->priv = new ExynosCameraHWInterface2(cameraId, g_cam2_device, g_camera2[cameraId], &openInvalid);
6144 if (!openInvalid) {
5506cebf 6145 ALOGE("DEBUG(%s): ExynosCameraHWInterface2 creation failed", __FUNCTION__);
6f19b6cf 6146 return -ENODEV;
6044e509 6147 }
c15a6b00
JS
6148done:
6149 *device = (hw_device_t *)g_cam2_device;
13d8c7b4 6150 ALOGV("DEBUG(%s):opened camera2 %s (%p)", __FUNCTION__, id, *device);
b5237e6b 6151 g_camera_vaild = true;
c15a6b00
JS
6152
6153 return 0;
6154}
6155
6156
6157static hw_module_methods_t camera_module_methods = {
6158 open : HAL2_camera_device_open
6159};
6160
6161extern "C" {
6162 struct camera_module HAL_MODULE_INFO_SYM = {
6163 common : {
6164 tag : HARDWARE_MODULE_TAG,
6165 module_api_version : CAMERA_MODULE_API_VERSION_2_0,
6166 hal_api_version : HARDWARE_HAL_API_VERSION,
6167 id : CAMERA_HARDWARE_MODULE_ID,
6168 name : "Exynos Camera HAL2",
6169 author : "Samsung Corporation",
6170 methods : &camera_module_methods,
6171 dso: NULL,
6172 reserved: {0},
6173 },
6174 get_number_of_cameras : HAL2_getNumberOfCameras,
6175 get_camera_info : HAL2_getCameraInfo
6176 };
6177}
6178
6179}; // namespace android