ExynosCameraHWInterface2.h revision 74d78ebea3d2d2bbcf46e7156d42f5e0450e3a9b
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> 40c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "SignalDrivenThread.h" 41c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "MetadataConverter.h" 42c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "exynos_v4l2.h" 4313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosRect.h" 4413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosBuffer.h" 45c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "videodev2_exynos_camera.h" 46c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "gralloc_priv.h" 4713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosJpegEncoderForCamera.h" 48c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <fcntl.h> 49c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "fimc-is-metadata.h" 50c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "ion.h" 5113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "ExynosExif.h" 5213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#include "csc.h" 53daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang#include "ExynosCamera2.h" 54eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang#include "cutils/properties.h" 55c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 56c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinnamespace android { 57c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 58feb7df4c2d6e953395eef7b4389ab2e142df9613Sungjoong Kang//#define ENABLE_FRAME_SYNC 59c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define NODE_PREFIX "/dev/video" 60c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 61c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define NUM_MAX_STREAM_THREAD (5) 6213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_MAX_REQUEST_MGR_ENTRY (10) 63ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang#define NUM_MAX_DEQUEUED_REQUEST NUM_MAX_REQUEST_MGR_ENTRY 64c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define MAX_CAMERA_MEMORY_PLANE_NUM (4) 6513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_MAX_CAMERA_BUFFERS (16) 6613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_BAYER_BUFFERS (8) 67b56dcc00a5e081efd036c714e0693f5e27ebc820Sungjoong Kang#define NUM_SENSOR_QBUF (3) 6813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 6913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define PICTURE_GSC_NODE_NUM (2) 7015fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang#define VIDEO_GSC_NODE_NUM (1) 71c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 7237e122d5da65e360abd566114cc30da7295358efSungjoong Kang#define STREAM_TYPE_DIRECT (0) 7337e122d5da65e360abd566114cc30da7295358efSungjoong Kang#define STREAM_TYPE_INDIRECT (1) 7437e122d5da65e360abd566114cc30da7295358efSungjoong Kang 7513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<1) 7613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_REPROCESS_Q_NOT_EMPTY (SIGNAL_THREAD_COMMON_LAST<<2) 7713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_STREAM_OUTPUT_DONE (SIGNAL_THREAD_COMMON_LAST<<3) 7813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_SENSOR_START_REQ_PROCESSING (SIGNAL_THREAD_COMMON_LAST<<4) 79c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_GET_BUFFER (SIGNAL_THREAD_COMMON_LAST<<5) 80c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_PUT_BUFFER (SIGNAL_THREAD_COMMON_LAST<<6) 81c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_CHANGE_PARAMETER (SIGNAL_THREAD_COMMON_LAST<<7) 8213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_THREAD_RELEASE (SIGNAL_THREAD_COMMON_LAST<<8) 8313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_ISP_START_BAYER_INPUT (SIGNAL_THREAD_COMMON_LAST<<9) 849dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang#define SIGNAL_ISP_START_BAYER_DEQUEUE (SIGNAL_THREAD_COMMON_LAST<<10) 85c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 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 98c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinenum sensor_name { 99c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SENSOR_NAME_S5K3H2 = 1, 100c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SENSOR_NAME_S5K6A3 = 2, 101c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SENSOR_NAME_S5K4E5 = 3, 102c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SENSOR_NAME_S5K3H7 = 4, 103c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SENSOR_NAME_CUSTOM = 5, 104c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SENSOR_NAME_END 105c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; 106c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 10715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kangenum is_subscenario_id { 10815fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang ISS_SUB_SCENARIO_STILL, 10915fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang ISS_SUB_SCENARIO_VIDEO, 11015fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang ISS_SUB_SCENARIO_SCENE1, 11115fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang ISS_SUB_SCENARIO_SCENE2, 11215fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang ISS_SUB_SCENARIO_SCENE3, 11315fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang ISS_SUB_END 11415fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang}; 115c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 116c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct node_info { 117c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int fd; 118c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int width; 119c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int height; 120c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int format; 121c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int planes; 122c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int buffers; 123c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin enum v4l2_memory memory; 124c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin enum v4l2_buf_type type; 125be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang ion_client ionClient; 126be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS]; 12715fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang int status; 128c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} node_info_t; 129c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 130c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 131c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct camera_hw_info { 132c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int sensor_id; 133c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 134c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin node_info_t sensor; 13513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang node_info_t isp; 13613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang node_info_t capture; 13713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 13813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang /*shot*/ // temp 13913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang struct camera2_shot_ext dummy_shot; 140c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 141c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} camera_hw_info_t; 142c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 14313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangtypedef enum request_entry_status { 144c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin EMPTY, 145c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin REGISTERED, 146be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang REQUESTED, 147be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang CAPTURED 148c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} request_entry_status_t; 149c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 150c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct request_manager_entry { 15113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang request_entry_status_t status; 15213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang camera_metadata_t *original_request; 153be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang struct camera2_shot_ext internal_shot; 15413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int output_stream_count; 15513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool dynamic_meta_vaild; 156c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} request_manager_entry_t; 157c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 158c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass RequestManager { 159c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic: 160c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin RequestManager(SignalDrivenThread* main_thread); 161c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin ~RequestManager(); 162c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int GetNumEntries(); 163c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin bool IsRequestQueueFull(); 16413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 16513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void RegisterRequest(camera_metadata_t *new_request); 16613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void DeregisterRequest(camera_metadata_t **deregistered_request); 16713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool PrepareFrame(size_t *num_entries, size_t *frame_size, 1680f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang camera_metadata_t **prepared_frame, int afState); 1690f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang int MarkProcessingRequest(ExynosBuffer * buf, int *afMode); 1709dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang void NotifyStreamOutput(int frameCnt, int stream_id); 17113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void DumpInfoWithIndex(int index); 172ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang void ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext); 17313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void CheckCompleted(int index); 174ef6f83cab5a08acda2584cfbff2751325b5e435eSungjoong Kang void UpdateIspParameters(struct camera2_shot_ext *shot_ext, int frameCnt); 1759dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang void RegisterTimestamp(int frameCnt, nsecs_t *frameTime); 1769dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang uint64_t GetTimestamp(int frameCnt); 1779dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int FindFrameCnt(struct camera2_shot_ext * shot_ext); 1789dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int FindEntryIndexByFrameCnt(int frameCnt); 179b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang void Dump(void); 180b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang int GetNextIndex(int index); 181b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang void SetDefaultParameters(int cropX); 182b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang void SetInitialSkip(int count); 183ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang int GetSkipCnt(); 184ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang void SetFrameIndex(int index); 185ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang int GetFrameIndex(); 186c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinprivate: 187c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 188c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin MetadataConverter *m_metadataConverter; 189c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SignalDrivenThread *m_mainThread; 190c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_numOfEntries; 191c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_entryInsertionIndex; 192c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_entryProcessingIndex; 193c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_entryFrameOutputIndex; 194c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin request_manager_entry_t entries[NUM_MAX_REQUEST_MGR_ENTRY]; 19513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int m_completedIndex; 196c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 197c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin Mutex m_requestMutex; 198c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 199c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin //TODO : alloc dynamically 200c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin char m_tempFrameMetadataBuf[2000]; 201c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin camera_metadata_t *m_tempFrameMetadata; 2029dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 203b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang int m_sensorPipelineSkipCnt; 2049dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int m_cropX; 205ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang int m_frameIndex; 2062bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang int m_lastAeMode; 2072bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang int m_lastAaMode; 2082bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang int m_lastAwbMode; 2092bdec0603559f57a420e8926da22cc437e1336ecSungjoong Kang int m_lastAeComp; 210c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; 211c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 2129dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2139dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangtypedef struct bayer_buf_entry { 2149dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int status; 2159dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int reqFrameCnt; 2169dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang nsecs_t timeStamp; 2179dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang} bayer_buf_entry_t; 2189dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2199dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2209dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangclass BayerBufManager { 2219dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangpublic: 2229dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang BayerBufManager(); 2239dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ~BayerBufManager(); 2249dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetIndexForSensorEnqueue(); 2259dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int MarkSensorEnqueue(int index); 2269dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp); 2279dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetIndexForIspEnqueue(int *reqFrameCnt); 2289dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetIndexForIspDequeue(int *reqFrameCnt); 2299dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int MarkIspEnqueue(int index); 2309dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int MarkIspDequeue(int index); 2319dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetNumOnSensor(); 2329dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetNumOnHalFilled(); 2339dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetNumOnIsp(); 2349dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2359dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangprivate: 2369dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int GetNextIndex(int index); 2379dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2389dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int sensorEnqueueHead; 2399dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int sensorDequeueHead; 2409dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int ispEnqueueHead; 2419dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int ispDequeueHead; 2429dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int numOnSensor; 2439dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int numOnIsp; 2449dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int numOnHalFilled; 2459dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int numOnHalEmpty; 2469dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2479dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang bayer_buf_entry_t entries[NUM_BAYER_BUFFERS]; 2489dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang}; 2499dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 2509dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 25113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NOT_AVAILABLE (0) 25213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define REQUIRES_DQ_FROM_SVC (1) 25313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_DRIVER (2) 25413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_HAL (3) 25513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_SERVICE (4) 25613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 25713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_NOT_AVAILABLE (0) 25813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_SENSOR (1) 25913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_HAL_FILLED (2) 26013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_ISP (3) 26113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_SERVICE (4) 26213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_HAL_EMPTY (5) 26313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 26413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangtypedef struct stream_parameters { 26513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int streamType; 26613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang uint32_t outputWidth; 26713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang uint32_t outputHeight; 26813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang uint32_t nodeWidth; 26913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang uint32_t nodeHeight; 27013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int outputFormat; 27113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int nodeFormat; 272c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin const camera2_stream_ops_t* streamOps; 273c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin uint32_t usage; 27413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int numHwBuffers; 27513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int numSvcBuffers; 276be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang int numOwnSvcBuffers; 277c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int fd; 27813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int svcPlanes; 27913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int nodePlanes; 280feb7df4c2d6e953395eef7b4389ab2e142df9613Sungjoong Kang int metaPlanes; 28113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang enum v4l2_memory memory; 28213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang enum v4l2_buf_type halBuftype; 283be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang int numSvcBufsInHal; 28413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS]; 28513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS]; 286feb7df4c2d6e953395eef7b4389ab2e142df9613Sungjoong Kang ExynosBuffer metaBuffers[NUM_MAX_CAMERA_BUFFERS]; 28713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int svcBufStatus[NUM_MAX_CAMERA_BUFFERS]; 288be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang int svcBufIndex; 289be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang ion_client ionClient; 29013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang node_info_t node; 291c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} stream_parameters_t; 292c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 2939dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangtypedef struct record_parameters { 2949dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang uint32_t outputWidth; 2959dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang uint32_t outputHeight; 2969dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int outputFormat; 2979dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang const camera2_stream_ops_t* streamOps; 2989dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang uint32_t usage; 2999dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int numSvcBuffers; 300be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang int numOwnSvcBuffers; 3019dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int svcPlanes; 3029dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS]; 3039dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS]; 3049dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int svcBufStatus[NUM_MAX_CAMERA_BUFFERS]; 305be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang int svcBufIndex; 306be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang int numSvcBufsInHal; 3079dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang} record_parameters_t; 30813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 30974d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kangtypedef struct callback_parameters { 31074d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang uint32_t outputWidth; 31174d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang uint32_t outputHeight; 31274d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int outputFormat; 31374d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int internalFormat; 31474d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int internalPlanes; 31574d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang const camera2_stream_ops_t* streamOps; 31674d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang uint32_t usage; 31774d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int numSvcBuffers; 31874d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int numOwnSvcBuffers; 31974d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int svcPlanes; 32074d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang buffer_handle_t svcBufHandle[NUM_MAX_CAMERA_BUFFERS]; 32174d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang ExynosBuffer svcBuffers[NUM_MAX_CAMERA_BUFFERS]; 32274d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int svcBufStatus[NUM_MAX_CAMERA_BUFFERS]; 32374d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int svcBufIndex; 32474d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int numSvcBufsInHal; 32574d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang} callback_parameters_t; 32674d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang 327c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass ExynosCameraHWInterface2 : public virtual RefBase { 328c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic: 3296044e50955303fde3b50a2758df721b29addbd98Sungjoong Kang ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera, int *openInvalid); 330c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual ~ExynosCameraHWInterface2(); 331c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 332c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual void release(); 33313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 334c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin inline int getCameraId() const; 335c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 336c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops); 337c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int notifyRequestQueueNotEmpty(); 338c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops); 339c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int getInProgressCount(); 340c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int flushCapturesInProgress(); 341c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int constructDefaultRequest(int request_template, camera_metadata_t **request); 34213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang virtual int allocateStream(uint32_t width, uint32_t height, 343c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int format, const camera2_stream_ops_t *stream_ops, 344c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers); 345c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers); 346c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int releaseStream(uint32_t stream_id); 347c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int allocateReprocessStream(uint32_t width, uint32_t height, 348c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops, 349c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers); 350c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int releaseReprocessStream(uint32_t stream_id); 351c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int triggerAction(uint32_t trigger_id, int ext1, int ext2); 352c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int setNotifyCallback(camera2_notify_callback notify_cb, void *user); 353c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int getMetadataVendorTagOps(vendor_tag_query_ops_t **ops); 354c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin virtual int dump(int fd); 355c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinprivate: 35613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangclass MainThread : public SignalDrivenThread { 35713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosCameraHWInterface2 *mHardware; 35813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang public: 35913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang MainThread(ExynosCameraHWInterface2 *hw): 36013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang SignalDrivenThread(), 36113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware(hw) { 36213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang// Start("MainThread", PRIORITY_DEFAULT, 0); 36313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang } 36413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ~MainThread(); 36513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang status_t readyToRunInternal() 36613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang { 36713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang return NO_ERROR; 36813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang } 36913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void threadFunctionInternal() 37013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang { 37113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware->m_mainThreadFunc(this); 37213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang return; 37313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang } 37413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void release(void); 37515fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang bool m_releasing; 37613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang }; 3779dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 378c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin class SensorThread : public SignalDrivenThread { 379c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin ExynosCameraHWInterface2 *mHardware; 380c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin public: 381c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SensorThread(ExynosCameraHWInterface2 *hw): 382c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0), 383c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin mHardware(hw), 384c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_isBayerOutputEnabled(false) { } 38513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ~SensorThread(); 386c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin status_t readyToRunInternal() { 38713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware->m_sensorThreadInitialize(this); 388c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return NO_ERROR; 389c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 39013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void threadFunctionInternal() { 391c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin mHardware->m_sensorThreadFunc(this); 392c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return; 393c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 3949dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang void release(void); 395c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin //private: 396c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin bool m_isBayerOutputEnabled; 397c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_sensorFd; 39815fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang bool m_releasing; 39913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang }; 40013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 40113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang class IspThread : public SignalDrivenThread { 40213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosCameraHWInterface2 *mHardware; 40313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang public: 40413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang IspThread(ExynosCameraHWInterface2 *hw): 40513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang SignalDrivenThread("IspThread", PRIORITY_DEFAULT, 0), 40613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware(hw) { } 40713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ~IspThread(); 40813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang status_t readyToRunInternal() { 40913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware->m_ispThreadInitialize(this); 41013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang return NO_ERROR; 41113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang } 41213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void threadFunctionInternal() { 41313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware->m_ispThreadFunc(this); 41413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang return; 41513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang } 41613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void release(void); 41713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang //private: 418c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_ispFd; 41915fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang bool m_releasing; 420c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin }; 421c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 422c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin class StreamThread : public SignalDrivenThread { 423c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin ExynosCameraHWInterface2 *mHardware; 424c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin public: 425c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index): 426c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0), 427c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin mHardware(hw), 428c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_index(new_index) { } 42913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ~StreamThread(); 430c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin status_t readyToRunInternal() { 43113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang mHardware->m_streamThreadInitialize(this); 432c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return NO_ERROR; 433c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 43413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void threadFunctionInternal() { 435c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin mHardware->m_streamThreadFunc(this); 436c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return; 437c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 4389dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang void setRecordingParameter(record_parameters_t * recordParm); 43974d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang void setCallbackParameter(callback_parameters_t * callbackParm); 44013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void setParameter(stream_parameters_t * new_parameters); 44113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void applyChange(void); 44213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void release(void); 44313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int findBufferIndex(void * bufAddr); 444c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 445c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 44613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang uint8_t m_index; 4479dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang bool m_activated; 44813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang //private: 44913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang stream_parameters_t m_parameters; 4509dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang stream_parameters_t *m_tempParameters; 4519dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang record_parameters_t m_recordParameters; 45274d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang callback_parameters_t m_previewCbParameters; 45313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_isBufferInit; 454b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang bool m_releasing; 45513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang }; 456c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 457c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin sp<MainThread> m_mainThread; 458c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin sp<SensorThread> m_sensorThread; 45913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang sp<IspThread> m_ispThread; 46013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang sp<StreamThread> m_streamThreads[NUM_MAX_STREAM_THREAD]; 46113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 46213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 4639dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang 464c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin RequestManager *m_requestManager; 4659dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang BayerBufManager *m_BayerManager; 466daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang ExynosCamera2 *m_camera2; 467c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 468c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin void m_mainThreadFunc(SignalDrivenThread * self); 469c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin void m_sensorThreadFunc(SignalDrivenThread * self); 47013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void m_sensorThreadInitialize(SignalDrivenThread * self); 47113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void m_ispThreadFunc(SignalDrivenThread * self); 47213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void m_ispThreadInitialize(SignalDrivenThread * self); 473c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin void m_streamThreadFunc(SignalDrivenThread * self); 47413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void m_streamThreadInitialize(SignalDrivenThread * self); 47513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 47686646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang void m_streamFunc0(SignalDrivenThread *self); 47786646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang void m_streamFunc1(SignalDrivenThread *self); 47886646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang 47986646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang void m_streamBufferInit(SignalDrivenThread *self); 48086646da4ec54337c658278271ee5cbfcde9165d6Sungjoong Kang 48113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void m_getAlignedYUVSize(int colorFormat, int w, int h, 48213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosBuffer *buf); 48313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_getRatioSize(int src_w, int src_h, 48413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int dst_w, int dst_h, 48513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int *crop_x, int *crop_y, 48613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int *crop_w, int *crop_h, 48713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int zoom); 48813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int createIonClient(ion_client ionClient); 48913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int deleteIonClient(ion_client ionClient); 49013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 49113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum); 49213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void freeCameraMemory(ExynosBuffer *buf, int iMemoryNum); 49313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void initCameraMemory(ExynosBuffer *buf, int iMemoryNum); 49413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 49513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void DumpInfoWithShot(struct camera2_shot_ext * shot_ext); 49613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool yuv2Jpeg(ExynosBuffer *yuvBuf, 49713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosBuffer *jpegBuf, 49813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosRect *rect); 4996044e50955303fde3b50a2758df721b29addbd98Sungjoong Kang int InitializeISPChain(); 500ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang void StartISP(); 5010f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang int GetAfState(); 5020f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void SetAfMode(enum aa_afmode afMode); 5038e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang void OnAfTriggerStart(int id); 5040f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfTrigger(int id); 5050f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfTriggerAutoMacro(int id); 5060f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfTriggerCAFPicture(int id); 5070f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfTriggerCAFVideo(int id); 5080f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfCancel(int id); 5090f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfCancelAutoMacro(int id); 5100f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfCancelCAFPicture(int id); 5110f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfCancelCAFVideo(int id); 5120f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfNotification(enum aa_afstate noti); 5130f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfNotificationAutoMacro(enum aa_afstate noti); 5140f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfNotificationCAFPicture(enum aa_afstate noti); 5150f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void OnAfNotificationCAFVideo(enum aa_afstate noti); 5160f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang void SetAfStateForService(int newState); 5170f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang int GetAfStateForService(); 51813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang exif_attribute_t mExifInfo; 519eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang void m_setExifFixedAttribute(void); 520eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect, 521eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang camera2_shot *currentEntry); 52213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang void *m_exynosPictureCSC; 5239dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang void *m_exynosVideoCSC; 52413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 5259dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int m_jpegEncodingFrameCnt; 526c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 527c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin camera2_request_queue_src_ops_t *m_requestQueueOps; 528c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin camera2_frame_queue_dst_ops_t *m_frameQueueOps; 529c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin camera2_notify_callback m_notifyCb; 530c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin void *m_callbackCookie; 531c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 532c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int m_numOfRemainingReqInSvc; 533c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin bool m_isRequestQueuePending; 53413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_isRequestQueueNull; 53513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang camera2_device_t *m_halDevice; 53613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang static gralloc_module_t const* m_grallocHal; 537c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 538c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 53913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang camera_hw_info_t m_camera_info; 540c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 541c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin ion_client m_ionCameraClient; 542c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 54313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_isSensorThreadOn; 54413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_isSensorStarted; 545ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang bool m_isIspStarted; 54613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 547ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang int m_need_streamoff; 54813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 54913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_initFlag1; 55013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_initFlag2; 55113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 55213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int indexToQueue[3+1]; 55313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int m_fd_scp; 55413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 55513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_scp_flushing; 55613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang bool m_closing; 55713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ExynosBuffer m_resizeBuf; 5589dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang bool m_recordingEnabled; 5599dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int m_previewOutput; 5609dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int m_recordOutput; 5619dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang bool m_needsRecordBufferInit; 56274d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang ExynosBuffer m_previewCbBuf; 56374d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int m_previewCbEnabled; 56474d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang int m_previewCbOutput; 56574d78ebea3d2d2bbcf46e7156d42f5e0450e3a9bSungjoong Kang bool m_needsPreviewCbBufferInit; 5669dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int lastFrameCnt; 5679dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang int m_cameraId; 5689dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang bool m_scp_closing; 5699dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang bool m_scp_closed; 57015fd82319b9d931a31f40c504d3acbc7e62d4cedSungjoong Kang bool m_wideAspect; 5718e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang uint32_t lastAfRegion[4]; 572ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang 573ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang mutable Mutex m_qbufLock; 574ad37861e56882dcb5fa42beb9dba60637d6e3c0fSungjoong Kang 5750f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang int m_afState; 5760f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang int m_afTriggerId; 5770f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang enum aa_afmode m_afMode; 5780f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang enum aa_afmode m_afMode2; 5790f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang bool m_IsAfModeUpdateRequired; 5800f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang bool m_IsAfTriggerRequired; 5810f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang bool m_IsAfLockRequired; 5820f26b20fd328df0ad1cfed28eb456217b22d7780Sungjoong Kang int m_serviceAfState; 58336c106c906c67fec0d0b36e2e967312ce99dcc9eSungjoong Kang bool m_AfHwStateFailed; 5848e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang int m_afPendingTriggerId; 5858e2c2fdbd940265e8413d512c3a0549bbc53c8a2Sungjoong Kang int m_afModeWaitingCnt; 586eed7ed1bffb083b112a3366e740ebdc186203afaSungjoong Kang struct camera2_shot m_jpegMetadata; 587a15b4e3ffb3e1822af22ccbfab876c3b0e2dbf08Sungjoong Kang int m_nightCaptureCnt; 588a15b4e3ffb3e1822af22ccbfab876c3b0e2dbf08Sungjoong Kang int m_nightCaptureFrameCnt; 589c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; 590c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 591c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; // namespace android 592c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 593c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#endif 594