1c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin/*
2c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin**
3c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Copyright 2008, The Android Open Source Project
4c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Copyright 2012, Samsung Electronics Co. LTD
5c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin**
6c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Licensed under the Apache License, Version 2.0 (the "License");
7c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** you may not use this file except in compliance with the License.
8c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** You may obtain a copy of the License at
9c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin**
10c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin**     http://www.apache.org/licenses/LICENSE-2.0
11c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin**
12c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Unless required by applicable law or agreed to in writing, software
13c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** distributed under the License is distributed on an "AS IS" BASIS,
14c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** See the License for the specific language governing permissions and
16c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** limitations under the License.
17c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin*/
18c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
19c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin/*!
20c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \file      ExynosCameraHWInterface2.h
21c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \brief     header file for Android Camera API 2.0 HAL
22c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \author    Sungjoong Kang(sj3.kang@samsung.com)
2313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang * \date      2012/07/10
24c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin *
25c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * <b>Revision History: </b>
26c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n
27c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin *   Initial Release
2813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang  *
2913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang * - 2012/07/10 : Sungjoong Kang(sj3.kang@samsung.com) \n
3013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang *   2nd Release
3113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang *
32c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin */
3313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
34c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#ifndef EXYNOS_CAMERA_HW_INTERFACE_2_H
35c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define EXYNOS_CAMERA_HW_INTERFACE_2_H
36c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
37c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <hardware/camera2.h>
38c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <camera/Camera.h>
39c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <camera/CameraParameters.h>
4052f543089f42c4d008a4e729ece05676fd644e36Sungjoong Kang#include <utils/List.h>
41c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "SignalDrivenThread.h"
42c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "MetadataConverter.h"
43c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "exynos_v4l2.h"
4413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosRect.h"
4513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosBuffer.h"
46c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "videodev2_exynos_camera.h"
47c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "gralloc_priv.h"
4813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosJpegEncoderForCamera.h"
49c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <fcntl.h>
50c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "fimc-is-metadata.h"
51c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "ion.h"
5213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosExif.h"
5313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "csc.h"
54daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang#include "ExynosCamera2.h"
55eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang#include "cutils/properties.h"
56c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
57c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinnamespace android {
58c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
594aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi//#define EXYNOS_CAMERA_LOG
602adfa429e61241b94e6435b328030df53f27b3b0Jiyoung Shin#define ENABLE_FRAME_SYNC
61c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define NODE_PREFIX     "/dev/video"
62c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
63c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define NUM_MAX_STREAM_THREAD       (5)
641c5e692d86d92906c7bde609fddb4af0742ce896Sungjoong Kang#define NUM_MAX_REQUEST_MGR_ENTRY   (5)
6513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_MAX_CAMERA_BUFFERS      (16)
6613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_BAYER_BUFFERS           (8)
67ac8c20603200744b8be1f15e348614ab60aaafe6Sungjoong Kang#define NUM_SCC_BUFFERS             (8)
68ac8c20603200744b8be1f15e348614ab60aaafe6Sungjoong Kang#define NUM_SCP_BUFFERS             (8)
6952f543089f42c4d008a4e729ece05676fd644e36Sungjoong Kang#define NUM_MIN_SENSOR_QBUF         (3)
705506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define NUM_MAX_SUBSTREAM           (4)
7113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
7213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define PICTURE_GSC_NODE_NUM (2)
7315fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang#define VIDEO_GSC_NODE_NUM (1)
74c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
7537e122d5da65e360abd566114cc30da7295358efSungjoong Kang#define STREAM_TYPE_DIRECT   (0)
7637e122d5da65e360abd566114cc30da7295358efSungjoong Kang#define STREAM_TYPE_INDIRECT (1)
7737e122d5da65e360abd566114cc30da7295358efSungjoong Kang
7813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY             (SIGNAL_THREAD_COMMON_LAST<<1)
795506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
8013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_STREAM_OUTPUT_DONE          (SIGNAL_THREAD_COMMON_LAST<<3)
8113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_SENSOR_START_REQ_PROCESSING      (SIGNAL_THREAD_COMMON_LAST<<4)
825506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
8313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_THREAD_RELEASE                   (SIGNAL_THREAD_COMMON_LAST<<8)
84c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
855506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define SIGNAL_STREAM_REPROCESSING_START        (SIGNAL_THREAD_COMMON_LAST<<14)
86c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_DATA_COMING               (SIGNAL_THREAD_COMMON_LAST<<15)
87c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
880f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define NO_TRANSITION                   (0)
890f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_INACTIVE            (1)
900f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_NEEDS_COMMAND       (2)
910f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_STARTED             (3)
920f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_SCANNING            (4)
930f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_LOCKED              (5)
940f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_FAILED              (6)
950f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_NEEDS_DETERMINATION (7)
960f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang#define HAL_AFSTATE_PASSIVE_FOCUSED     (8)
9713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
985506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_PREVIEW           (0)
995506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_MASK_PREVIEW         (1<<STREAM_ID_PREVIEW)
1005506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_RECORD            (1)
1015506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_MASK_RECORD          (1<<STREAM_ID_RECORD)
1025506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_PRVCB             (2)
1035506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_MASK_PRVCB           (1<<STREAM_ID_PRVCB)
1045506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_JPEG              (4)
1055506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_MASK_JPEG            (1<<STREAM_ID_JPEG)
1065506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_ZSL               (5)
1075506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_MASK_ZSL             (1<<STREAM_ID_ZSL)
1085506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
1095506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_JPEG_REPROCESS    (8)
1105506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define STREAM_ID_LAST              STREAM_ID_JPEG_REPROCESS
1115506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
1125506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define MASK_OUTPUT_SCP             (STREAM_MASK_PREVIEW|STREAM_MASK_RECORD|STREAM_MASK_PRVCB)
1135506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define MASK_OUTPUT_SCC             (STREAM_MASK_JPEG|STREAM_MASK_ZSL)
1145506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
1155506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define SUBSTREAM_TYPE_NONE         (0)
1165506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define SUBSTREAM_TYPE_JPEG         (1)
1175506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define SUBSTREAM_TYPE_RECORD       (2)
1185506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define SUBSTREAM_TYPE_PRVCB        (3)
1195506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang#define FLASH_STABLE_WAIT_TIMEOUT        (10)
1205506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
121041f38de75652a9afb68c03eb5559932ea63ed92Sungjoong Kang#define SIG_WAITING_TICK            (5000)
122041f38de75652a9afb68c03eb5559932ea63ed92Sungjoong Kang
1234aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#ifdef EXYNOS_CAMERA_LOG
1244aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
1254aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
1264aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
1274aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
1284aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#else
1294aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGV(...) ((void)0)
1304aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGD(...) ((void)0)
1314aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGW(...) ((void)0)
1324aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#define CAM_LOGE(...) ((void)0)
1334aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi#endif
1344aa4d73919168b1cd26a22d4b536697937259f80hyeonmyeong Choi
135c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinenum sensor_name {
136c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K3H2  = 1,
137c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K6A3  = 2,
138c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K4E5  = 3,
139c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K3H7  = 4,
140c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_CUSTOM  = 5,
141c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_END
142c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
143c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
14415fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kangenum is_subscenario_id {
14515fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang	ISS_SUB_SCENARIO_STILL,
14615fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang	ISS_SUB_SCENARIO_VIDEO,
14715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang	ISS_SUB_SCENARIO_SCENE1,
14815fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang	ISS_SUB_SCENARIO_SCENE2,
14915fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang	ISS_SUB_SCENARIO_SCENE3,
15015fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang	ISS_SUB_END
15115fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang};
152c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
1532d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kangint SUPPORT_THUMBNAIL_REAR_SIZE[][2] =
1542d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang{
1552d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {160, 120},
1562d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {160, 90},
1572d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {144, 96}
1582d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang};
1592d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang
1602d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kangint SUPPORT_THUMBNAIL_FRONT_SIZE[][2] =
1612d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang{
1622d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {160, 120},
1632d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {160, 160},
1642d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {160, 90},
1652d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    {144, 96}
1662d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang};
1672d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang
168e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Jooenum is_set_flash_command_state {
169e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_NONE = 0,
170e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_ON = 1,
171e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_ON_WAIT,
172e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_ON_DONE,
173e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_AUTO_AE_AWB_LOCK,
174e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_AE_AWB_LOCK_WAIT,
175e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_AUTO_WAIT,
176e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_AUTO_DONE,
177e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_AUTO_OFF,
178e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_CAPTURE,
179e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_CAPTURE_WAIT,
180e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_CAPTURE_JPEG,
181e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FLASH_STATE_CAPTURE_END,
182e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    IS_FALSH_STATE_MAX
1836f19b6cfec2e31a06fb7fc62ee0440e1e52d99fdYounghwan Joo};
1846f19b6cfec2e31a06fb7fc62ee0440e1e52d99fdYounghwan Joo
18553f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Jooenum is_set_command_state {
18653f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo    IS_COMMAND_NONE = 0,
18753f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo    IS_COMMAND_EXECUTION,
18853f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo    IS_COMMAND_CLEAR,
18953f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo    IS_COMMAND_MAX
19053f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo};
19153f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo
192c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct node_info {
193c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int fd;
194c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int width;
195c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int height;
196c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int format;
197c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int planes;
198c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int buffers;
199c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    enum v4l2_memory memory;
200c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    enum v4l2_buf_type type;
201be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
20215fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    int status;
203c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} node_info_t;
204c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
205c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
206c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct camera_hw_info {
207c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int sensor_id;
208c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
209c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    node_info_t sensor;
21013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    node_info_t isp;
21113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    node_info_t capture;
2125506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    node_info_t scp;
21313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
21413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    /*shot*/  // temp
21513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    struct camera2_shot_ext dummy_shot;
216c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
217c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} camera_hw_info_t;
218c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
21913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangtypedef enum request_entry_status {
220c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    EMPTY,
221c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    REGISTERED,
222be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    REQUESTED,
2232adfa429e61241b94e6435b328030df53f27b3b0Jiyoung Shin    CAPTURED,
224f9a066096bec3b4e3dc53d7c245226907ecc3e99Sungjoong Kang    METADONE,
225f9a066096bec3b4e3dc53d7c245226907ecc3e99Sungjoong Kang    COMPLETED
226c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} request_entry_status_t;
227c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
228c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct request_manager_entry {
22913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    request_entry_status_t      status;
23013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    camera_metadata_t           *original_request;
231be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    struct camera2_shot_ext     internal_shot;
23213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                         output_stream_count;
233c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} request_manager_entry_t;
234c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
2359a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo// structure related to a specific function of camera
2364a9565ae8328e47faae2e91c8b9e8eb4f0ff51f6Younghwan Jootypedef struct af_control_info {
2374a9565ae8328e47faae2e91c8b9e8eb4f0ff51f6Younghwan Joo    int    m_afTriggerTimeOut;
2384a9565ae8328e47faae2e91c8b9e8eb4f0ff51f6Younghwan Joo} ctl_af_info_t;
2394a9565ae8328e47faae2e91c8b9e8eb4f0ff51f6Younghwan Joo
2409a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Jootypedef struct flash_control_info {
2419a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    // UI flash mode indicator
2429a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    enum aa_aemode    i_flashMode;
2439a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    // AF flash
2449a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    bool        m_afFlashDoneFlg;
2459a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    // Capture flash
2469a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    bool        m_flashEnableFlg;
2479a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    int         m_flashFrameCount;
2489a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    int         m_flashCnt;
2499a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    int        m_flashTimeOut;
250caea49e60fd81033920e9d923f76d7c5aa8b495cYounghwan Joo    // Flash decision
251caea49e60fd81033920e9d923f76d7c5aa8b495cYounghwan Joo    // At flash auto mode only : 1 -> flash is needed, 0 -> normal case
252caea49e60fd81033920e9d923f76d7c5aa8b495cYounghwan Joo    bool        m_flashDecisionResult;
253caea49e60fd81033920e9d923f76d7c5aa8b495cYounghwan Joo    // torch indicator. this will be replaced by flashMode meta
254caea49e60fd81033920e9d923f76d7c5aa8b495cYounghwan Joo    bool        m_flashTorchMode;
255e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    // for precapture metering
256e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    int        m_precaptureState;
257e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    int        m_precaptureTriggerId;
2589a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo} ctl_flash_info_t;
2599a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo
26073f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Jootypedef struct ae_control_info {
26173f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo    // pre-capture notification state
26273f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo    enum ae_state    aeStateNoti;
26373f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo} ctl_ae_info_t;
26473f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo
265275c974460bee1fdb9fde2713e60dec91c3a551eYounghwan Jootypedef struct scene_control_info {
266275c974460bee1fdb9fde2713e60dec91c3a551eYounghwan Joo    // pre-capture notification state
267275c974460bee1fdb9fde2713e60dec91c3a551eYounghwan Joo    enum aa_scene_mode    prevSceneMode;
268275c974460bee1fdb9fde2713e60dec91c3a551eYounghwan Joo} ctl_scene_info_t;
269275c974460bee1fdb9fde2713e60dec91c3a551eYounghwan Joo
2709a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Jootypedef struct request_control_info {
2719a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    ctl_flash_info_t flash;
27273f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo    ctl_ae_info_t ae;
2734a9565ae8328e47faae2e91c8b9e8eb4f0ff51f6Younghwan Joo    ctl_af_info_t af;
274275c974460bee1fdb9fde2713e60dec91c3a551eYounghwan Joo    ctl_scene_info_t scene;
2759a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo} ctl_request_info_t;
2769a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo
277c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass RequestManager {
278c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic:
279c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    RequestManager(SignalDrivenThread* main_thread);
280c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ~RequestManager();
2812adfa429e61241b94e6435b328030df53f27b3b0Jiyoung Shin    void    ResetEntry();
282c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int     GetNumEntries();
283c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    bool    IsRequestQueueFull();
28413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
285ca714238a7b555c412637d25006c17f1f0ce2751Sungjoong Kang    void    RegisterRequest(camera_metadata_t *new_request, int * afMode, uint32_t * afRegion);
28613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void    DeregisterRequest(camera_metadata_t **deregistered_request);
28713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool    PrepareFrame(size_t *num_entries, size_t *frame_size,
2880f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang                camera_metadata_t **prepared_frame, int afState);
289ca714238a7b555c412637d25006c17f1f0ce2751Sungjoong Kang    int     MarkProcessingRequest(ExynosBuffer * buf);
2902adfa429e61241b94e6435b328030df53f27b3b0Jiyoung Shin    void    NotifyStreamOutput(int frameCnt);
291ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang    void    ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext);
29213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void    CheckCompleted(int index);
29353f62ad92ec5a5d11114420ca83cb122c38c2ef1Younghwan Joo    void    UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt, ctl_request_info_t *ctl_info);
2949dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void    RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
2955506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    nsecs_t  GetTimestampByFrameCnt(int frameCnt);
2965506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    nsecs_t  GetTimestamp(int index);
2972f4d175d9bc927fd7c7fb7d42d8671fe1ba17bdbSungjoong Kang    uint8_t  GetOutputStreamByFrameCnt(int frameCnt);
2982f4d175d9bc927fd7c7fb7d42d8671fe1ba17bdbSungjoong Kang    uint8_t  GetOutputStream(int index);
29969d1e6e9c2036cc231544f61df9ee13e00d1fe0cSungjoong Kang    camera2_shot_ext *  GetInternalShotExtByFrameCnt(int frameCnt);
30069d1e6e9c2036cc231544f61df9ee13e00d1fe0cSungjoong Kang    camera2_shot_ext *  GetInternalShotExt(int index);
3019dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     FindFrameCnt(struct camera2_shot_ext * shot_ext);
3025c88d1f2e176e716cd51df32c6835ec3b89b20e1hyeonmyeong Choi    bool    IsVdisEnable(void);
3039dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     FindEntryIndexByFrameCnt(int frameCnt);
304b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    void    Dump(void);
305b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    int     GetNextIndex(int index);
306f9a066096bec3b4e3dc53d7c245226907ecc3e99Sungjoong Kang    int     GetPrevIndex(int index);
307b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    void    SetDefaultParameters(int cropX);
308b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    void    SetInitialSkip(int count);
309ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang    int     GetSkipCnt();
310f9a066096bec3b4e3dc53d7c245226907ecc3e99Sungjoong Kang    int     GetCompletedIndex();
311041f38de75652a9afb68c03eb5559932ea63ed92Sungjoong Kang    void    pushSensorQ(int index);
312041f38de75652a9afb68c03eb5559932ea63ed92Sungjoong Kang    int     popSensorQ();
313041f38de75652a9afb68c03eb5559932ea63ed92Sungjoong Kang    void    releaseSensorQ();
314a3bcc37bef2d394aaf9651686b72a7d0a74da7b0Alex Ray
315a3bcc37bef2d394aaf9651686b72a7d0a74da7b0Alex Ray    bool    m_vdisEnable;
316a3bcc37bef2d394aaf9651686b72a7d0a74da7b0Alex Ray
317c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinprivate:
318c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
319c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    MetadataConverter               *m_metadataConverter;
320c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SignalDrivenThread              *m_mainThread;
3211264ab1629accf444d13831e209eafe4657d7664Alex Ray    Mutex                           m_numOfEntriesLock;
322c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_numOfEntries;
323c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_entryInsertionIndex;
324c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_entryProcessingIndex;
325c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_entryFrameOutputIndex;
326c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    request_manager_entry_t         entries[NUM_MAX_REQUEST_MGR_ENTRY];
32713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                             m_completedIndex;
328c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
329c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    Mutex                           m_requestMutex;
330c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
331c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    //TODO : alloc dynamically
332c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    char                            m_tempFrameMetadataBuf[2000];
333c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera_metadata_t               *m_tempFrameMetadata;
3349dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
335b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    int                             m_sensorPipelineSkipCnt;
3369dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                             m_cropX;
337041f38de75652a9afb68c03eb5559932ea63ed92Sungjoong Kang    int                             m_lastCompletedFrameCnt;
3382bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang    int                             m_lastAeMode;
3392bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang    int                             m_lastAaMode;
3402bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang    int                             m_lastAwbMode;
3412bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang    int                             m_lastAeComp;
3425c88d1f2e176e716cd51df32c6835ec3b89b20e1hyeonmyeong Choi    bool                            m_vdisBubbleEn;
3435506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    nsecs_t                         m_lastTimeStamp;
34452f543089f42c4d008a4e729ece05676fd644e36Sungjoong Kang    List<int>                   m_sensorQ;
345c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
346c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
3479dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3489dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangtypedef struct bayer_buf_entry {
3499dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     status;
3509dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     reqFrameCnt;
3519dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    nsecs_t timeStamp;
3529dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang} bayer_buf_entry_t;
3539dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3549dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3559dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangclass BayerBufManager {
3569dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangpublic:
3579dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    BayerBufManager();
3589dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    ~BayerBufManager();
3599dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetIndexForSensorEnqueue();
3609dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkSensorEnqueue(int index);
3619dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
3629dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetIndexForIspEnqueue(int *reqFrameCnt);
3639dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetIndexForIspDequeue(int *reqFrameCnt);
3649dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkIspEnqueue(int index);
3659dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkIspDequeue(int index);
3669dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNumOnSensor();
3679dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNumOnHalFilled();
3689dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNumOnIsp();
3699dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3709dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangprivate:
3719dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNextIndex(int index);
3729dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3739dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 sensorEnqueueHead;
3749dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 sensorDequeueHead;
3759dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 ispEnqueueHead;
3769dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 ispDequeueHead;
3779dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnSensor;
3789dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnIsp;
3799dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnHalFilled;
3809dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnHalEmpty;
3819dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3829dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bayer_buf_entry_t   entries[NUM_BAYER_BUFFERS];
3839dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang};
3849dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
3859dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
38613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NOT_AVAILABLE           (0)
38713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define REQUIRES_DQ_FROM_SVC    (1)
38813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_DRIVER               (2)
38913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_HAL                  (3)
39013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_SERVICE              (4)
39113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
39213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_NOT_AVAILABLE     (0)
39313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_SENSOR         (1)
39413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_HAL_FILLED     (2)
39513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_ISP            (3)
39613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_SERVICE        (4)
39713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_HAL_EMPTY      (5)
39813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
39913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangtypedef struct stream_parameters {
4005506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            uint32_t                width;
4015506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            uint32_t                height;
4025506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     format;
403c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    const   camera2_stream_ops_t*   streamOps;
404c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            uint32_t                usage;
40513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     numHwBuffers;
40613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     numSvcBuffers;
407be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numOwnSvcBuffers;
4085506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     planes;
409feb7df4c2d6e953395eef7b4389ab2e142df9613Sungjoong Kang            int                     metaPlanes;
410be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numSvcBufsInHal;
41113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            buffer_handle_t         svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
41213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            ExynosBuffer            svcBuffers[NUM_MAX_CAMERA_BUFFERS];
4135506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            ExynosBuffer            metaBuffers[NUM_MAX_CAMERA_BUFFERS];
41413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
4155506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     bufIndex;
4165506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            node_info_t             *node;
4175506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     minUndequedBuffer;
418bf96172c9e9a71d1c48e619869579002cbbc2268Sungjoong Kang            bool                    needsIonMap;
419c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} stream_parameters_t;
420c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
4215506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kangtypedef struct substream_parameters {
4225506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     type;
4235506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            uint32_t                width;
4245506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            uint32_t                height;
4255506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     format;
4269dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    const   camera2_stream_ops_t*   streamOps;
4279dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            uint32_t                usage;
4289dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            int                     numSvcBuffers;
429be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numOwnSvcBuffers;
43074d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            int                     internalFormat;
43174d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            int                     internalPlanes;
43274d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            int                     svcPlanes;
43374d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            buffer_handle_t         svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
43474d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            ExynosBuffer            svcBuffers[NUM_MAX_CAMERA_BUFFERS];
43574d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            int                     svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
43674d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            int                     svcBufIndex;
43774d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang            int                     numSvcBufsInHal;
4385506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            bool                    needBufferInit;
4395506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            int                     minUndequedBuffer;
4405506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang} substream_parameters_t;
4415506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang
4425506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kangtypedef struct substream_entry {
4435506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                     priority;
4445506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                     streamId;
4455506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang} substream_entry_t;
44674d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang
447c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass ExynosCameraHWInterface2 : public virtual RefBase {
448c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic:
4496044e50955303fde3b50a2758df721b29addbd98Sungjoong Kang    ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid);
450c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual             ~ExynosCameraHWInterface2();
451c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
452c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual void        release();
45313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
454c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    inline  int         getCameraId() const;
455c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
456c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
457c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         notifyRequestQueueNotEmpty();
458c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
459c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         getInProgressCount();
460c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         flushCapturesInProgress();
461c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         constructDefaultRequest(int request_template, camera_metadata_t **request);
46213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    virtual int         allocateStream(uint32_t width, uint32_t height,
463c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    int format, const camera2_stream_ops_t *stream_ops,
464c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
465c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
466c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         releaseStream(uint32_t stream_id);
467c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         allocateReprocessStream(uint32_t width, uint32_t height,
468c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
469c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
4705506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    virtual int         allocateReprocessStreamFromStream(uint32_t output_stream_id,
4715506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang                                const camera2_stream_in_ops_t *reprocess_stream_ops, uint32_t *stream_id);
472c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         releaseReprocessStream(uint32_t stream_id);
473c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         triggerAction(uint32_t trigger_id, int ext1, int ext2);
474c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         setNotifyCallback(camera2_notify_callback notify_cb, void *user);
475c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
476c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         dump(int fd);
477c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinprivate:
47813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangclass MainThread : public SignalDrivenThread {
47913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ExynosCameraHWInterface2 *mHardware;
48013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    public:
48113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        MainThread(ExynosCameraHWInterface2 *hw):
48213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            SignalDrivenThread(),
483053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang            mHardware(hw) { }
48413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~MainThread();
48513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal()
486053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang	    {
48713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware->m_mainThreadFunc(this);
48813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            return;
48913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        }
49013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        release(void);
49115fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang        bool        m_releasing;
49213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    };
4939dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
494c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    class SensorThread : public SignalDrivenThread {
495c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        ExynosCameraHWInterface2 *mHardware;
496c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    public:
497c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        SensorThread(ExynosCameraHWInterface2 *hw):
498053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang            SignalDrivenThread(),
4995506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang            mHardware(hw) { }
50013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~SensorThread();
50113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal() {
502c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware->m_sensorThreadFunc(this);
503c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return;
504c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
5059dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        void            release(void);
506c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    //private:
50715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang        bool            m_releasing;
508c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
509c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
510c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    class StreamThread : public SignalDrivenThread {
511c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        ExynosCameraHWInterface2 *mHardware;
512c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    public:
513c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
514053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang            SignalDrivenThread(),
515c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware(hw),
516c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            m_index(new_index) { }
51713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~StreamThread();
51813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal() {
519c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware->m_streamThreadFunc(this);
520c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return;
521c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
52213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        setParameter(stream_parameters_t * new_parameters);
5235506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang        status_t    attachSubStream(int stream_id, int priority);
5245506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang        status_t    detachSubStream(int stream_id);
52513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        release(void);
52613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        int         findBufferIndex(void * bufAddr);
5275506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang        int         findBufferIndex(buffer_handle_t * bufHandle);
528c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
52913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        uint8_t                         m_index;
5309dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        bool                            m_activated;
53113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    //private:
53213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        stream_parameters_t             m_parameters;
5339dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        stream_parameters_t             *m_tempParameters;
5345506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang        substream_entry_t               m_attachedSubStreams[NUM_MAX_SUBSTREAM];
53513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        bool                            m_isBufferInit;
536b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang        bool                            m_releasing;
5375506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang        int                             streamType;
5385506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang        int                             m_numRegisteredStream;
53913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang     };
540c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
541c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    sp<MainThread>      m_mainThread;
542c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    sp<SensorThread>    m_sensorThread;
54313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    sp<StreamThread>    m_streamThreads[NUM_MAX_STREAM_THREAD];
5445506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    substream_parameters_t  m_subStreams[STREAM_ID_LAST+1];
54513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
54613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
5479dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
548c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    RequestManager      *m_requestManager;
5499dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    BayerBufManager     *m_BayerManager;
550daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ExynosCamera2       *m_camera2;
551c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
552c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                m_mainThreadFunc(SignalDrivenThread * self);
553c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                m_sensorThreadFunc(SignalDrivenThread * self);
554c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                m_streamThreadFunc(SignalDrivenThread * self);
55513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_streamThreadInitialize(SignalDrivenThread * self);
55613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
5575506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    void                m_streamFunc_direct(SignalDrivenThread *self);
5585506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    void                m_streamFunc_indirect(SignalDrivenThread *self);
55986646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang
56086646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang    void                m_streamBufferInit(SignalDrivenThread *self);
56186646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang
5625506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                 m_runSubStreamFunc(StreamThread *selfThread, ExynosBuffer *srcImageBuf,
5635506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang                            int stream_id, nsecs_t frameTimeStamp);
5645506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                 m_jpegCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp);
5655506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                 m_recordCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp);
5665506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                 m_prvcbCreator(StreamThread *selfThread, ExynosBuffer *srcImageBuf, nsecs_t frameTimeStamp);
56713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_getAlignedYUVSize(int colorFormat, int w, int h,
56813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                                ExynosBuffer *buf);
56913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                m_getRatioSize(int  src_w,  int   src_h,
57013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int  dst_w,  int   dst_h,
57113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int *crop_x, int *crop_y,
57213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int *crop_w, int *crop_h,
57313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int zoom);
57413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	int				createIonClient(ion_client ionClient);
57513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	int					deleteIonClient(ion_client ionClient);
57613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
57713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int				allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
578181e425e6d6f304986ad5154f35034c615e94947Sungjoong Kang    int             allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum, int cacheFlag);
57913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	void				freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
58013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	void				initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
58113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
58213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void            DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
5832d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    bool            m_checkThumbnailSize(int w, int h);
58413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool            yuv2Jpeg(ExynosBuffer *yuvBuf,
58513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                            ExynosBuffer *jpegBuf,
58613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                            ExynosRect *rect);
5875506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int             InitializeISPChain();
588ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang    void            StartISP();
5895506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    void            StartSCCThread(bool threadExists);
5900f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    int             GetAfState();
5910f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            SetAfMode(enum aa_afmode afMode);
592ca714238a7b555c412637d25006c17f1f0ce2751Sungjoong Kang    void            SetAfRegion(uint32_t * afRegion);
5930f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfTrigger(int id);
5940f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfTriggerAutoMacro(int id);
5950f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfTriggerCAFPicture(int id);
5960f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfTriggerCAFVideo(int id);
597e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    void            OnPrecaptureMeteringTriggerStart(int id);
5980f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfCancel(int id);
5990f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfCancelAutoMacro(int id);
6000f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfCancelCAFPicture(int id);
6010f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfCancelCAFVideo(int id);
60273f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo    void            OnPrecaptureMeteringNotificationISP();
60373f5ad606f9e59e0442f0b3f06ae0f64836c3c48Younghwan Joo    void            OnPrecaptureMeteringNotificationSensor();
6040f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfNotification(enum aa_afstate noti);
6050f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfNotificationAutoMacro(enum aa_afstate noti);
6060f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfNotificationCAFPicture(enum aa_afstate noti);
6070f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            OnAfNotificationCAFVideo(enum aa_afstate noti);
6080f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    void            SetAfStateForService(int newState);
6090f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    int             GetAfStateForService();
61013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    exif_attribute_t    mExifInfo;
611eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang    void            m_setExifFixedAttribute(void);
612eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang    void            m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect,
61348728d495b8aa54d3c6cc95229f49f3135107aecSungjoong Kang                         camera2_shot_ext *currentEntry);
614e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    void            m_preCaptureSetter(struct camera2_shot_ext * shot_ext);
615e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    void            m_preCaptureListenerSensor(struct camera2_shot_ext * shot_ext);
616e117f7565971e9036b3c5e8dd5dd202ad6208c60Younghwan Joo    void            m_preCaptureListenerISP(struct camera2_shot_ext * shot_ext);
617cdd53a9f3bfbd35a715b9fe56ff7e3e1c3e32a10Younghwan Joo    void            m_preCaptureAeState(struct camera2_shot_ext * shot_ext);
6184a9565ae8328e47faae2e91c8b9e8eb4f0ff51f6Younghwan Joo    void            m_updateAfRegion(struct camera2_shot_ext * shot_ext);
6198a3fc5dddd1aecdc2acd4af9705119a4df12d6b7Younghwan Joo    void            m_afTrigger(struct camera2_shot_ext * shot_ext, int mode);
62013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void               *m_exynosPictureCSC;
6219dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void               *m_exynosVideoCSC;
62213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
623c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
624c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera2_request_queue_src_ops_t     *m_requestQueueOps;
625c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera2_frame_queue_dst_ops_t       *m_frameQueueOps;
626c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera2_notify_callback             m_notifyCb;
627c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                                *m_callbackCookie;
628c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
629c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                                 m_numOfRemainingReqInSvc;
630c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    bool                                m_isRequestQueuePending;
63113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_isRequestQueueNull;
63213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    camera2_device_t                    *m_halDevice;
63313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    static gralloc_module_t const*      m_grallocHal;
634c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
635c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
63613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    camera_hw_info_t                     m_camera_info;
637c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
638c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin	ion_client m_ionCameraClient;
639c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
640ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang    bool                                m_isIspStarted;
64113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
642ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang    int                                 m_need_streamoff;
64390e439c14994b2f82da00c131a5e76646a2e127bSungjoong Kang    ExynosBuffer                        m_sccLocalBuffer[NUM_MAX_CAMERA_BUFFERS];
64490e439c14994b2f82da00c131a5e76646a2e127bSungjoong Kang    bool                                m_sccLocalBufferValid;
64513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
64613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                                 indexToQueue[3+1];
64713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
64813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_scp_flushing;
64913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_closing;
65013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    ExynosBuffer                        m_resizeBuf;
6512f4d175d9bc927fd7c7fb7d42d8671fe1ba17bdbSungjoong Kang#ifndef ENABLE_FRAME_SYNC
6525506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                                 m_currentOutputStreams;
6532f4d175d9bc927fd7c7fb7d42d8671fe1ba17bdbSungjoong Kang#endif
6545506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                                 m_currentReprocessOutStreams;
65574d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang    ExynosBuffer                        m_previewCbBuf;
6569dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int             				    m_cameraId;
6579dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bool                                m_scp_closing;
6589dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bool                                m_scp_closed;
65915fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang    bool                                m_wideAspect;
660ca714238a7b555c412637d25006c17f1f0ce2751Sungjoong Kang    uint32_t                            currentAfRegion[4];
661308291dee65548eccf93232e60da7d8c32ad7f27hyeonmyeong Choi    float                               m_zoomRatio;
662ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang
6635c88d1f2e176e716cd51df32c6835ec3b89b20e1hyeonmyeong Choi    int                                 m_vdisBubbleCnt;
6645c88d1f2e176e716cd51df32c6835ec3b89b20e1hyeonmyeong Choi    int                                 m_vdisDupFrame;
6655c88d1f2e176e716cd51df32c6835ec3b89b20e1hyeonmyeong Choi
6665506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    mutable Mutex                       m_qbufLock;
66732cf94013c9ba94ffaab68f942c7926ed007956fSungjoong Kang    mutable Mutex                       m_jpegEncoderLock;
66832cf94013c9ba94ffaab68f942c7926ed007956fSungjoong Kang    int                                 m_jpegEncodingCount;
669ca714238a7b555c412637d25006c17f1f0ce2751Sungjoong Kang    mutable Mutex                       m_afModeTriggerLock;
670ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang
671f9a066096bec3b4e3dc53d7c245226907ecc3e99Sungjoong Kang    bool                                m_scpForceSuspended;
6720f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    int                                 m_afState;
6730f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    int                                 m_afTriggerId;
6740f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    enum aa_afmode                      m_afMode;
6750f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    enum aa_afmode                      m_afMode2;
6760f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    bool                                m_IsAfModeUpdateRequired;
6770f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    bool                                m_IsAfTriggerRequired;
6780f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    bool                                m_IsAfLockRequired;
6790f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang    int                                 m_serviceAfState;
68036c106c906c67fec0d0b36e2e967312ce99dcc9eSungjoong Kang    bool                                m_AfHwStateFailed;
6818e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang    int                                 m_afPendingTriggerId;
6828e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang    int                                 m_afModeWaitingCnt;
68348728d495b8aa54d3c6cc95229f49f3135107aecSungjoong Kang    struct camera2_shot_ext             m_jpegMetadata;
684b55ed6644478926b4f46307103774e100e167025Sungjoong Kang    int                                 m_scpOutputSignalCnt;
685b55ed6644478926b4f46307103774e100e167025Sungjoong Kang    int                                 m_scpOutputImageCnt;
686a15b4e3ffb3e1822af22ccbfab876c3b0e2dbf08Sungjoong Kang    int                                 m_nightCaptureCnt;
687a15b4e3ffb3e1822af22ccbfab876c3b0e2dbf08Sungjoong Kang    int                                 m_nightCaptureFrameCnt;
688572470e2f220641581282c0d3f199a0faa52f8b7Sungjoong Kang    int                                 m_lastSceneMode;
6892d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    int                                 m_thumbNailW;
6902d5e6ec2fb1a3868f882d058ebd8286be0bb6185Sungjoong Kang    int                                 m_thumbNailH;
6915506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                                 m_reprocessStreamId;
6925506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    const camera2_stream_in_ops_t *     m_reprocessOps;
6935506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                                 m_reprocessOutputStreamId;
6945506cebff05ff1356ae17fe4c30c033d2285d5f5Sungjoong Kang    int                                 m_reprocessingFrameCnt;
6959a710a4598b2ea5b676c2ad8ad40b9088661c366Younghwan Joo    ctl_request_info_t        m_ctlInfo;
696c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
697c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
698c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; // namespace android
699c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
700c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#endif
701