ExynosCameraHWInterface2.h revision daa1fcd6e8861944412e5c77db5eb441512aef38
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"
54c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
55c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinnamespace android {
56c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
57c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
58c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define NODE_PREFIX     "/dev/video"
59c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
60c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define NUM_MAX_STREAM_THREAD       (5)
6113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_MAX_DEQUEUED_REQUEST    (8)
6213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang/* #define NUM_MAX_REQUEST_MGR_ENTRY   NUM_MAX_DEQUEUED_REQUEST */
6313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_MAX_REQUEST_MGR_ENTRY   (10)
64c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define MAX_CAMERA_MEMORY_PLANE_NUM	(4)
6513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_MAX_CAMERA_BUFFERS      (16)
6613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NUM_BAYER_BUFFERS           (8)
679dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang#define NUM_SENSOR_QBUF             (4)
6813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
699dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang#define PREVIEW_GSC_NODE_NUM (1)
7013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define PICTURE_GSC_NODE_NUM (2)
71c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
7213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY             (SIGNAL_THREAD_COMMON_LAST<<1)
7313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_REPROCESS_Q_NOT_EMPTY       (SIGNAL_THREAD_COMMON_LAST<<2)
7413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_MAIN_STREAM_OUTPUT_DONE          (SIGNAL_THREAD_COMMON_LAST<<3)
7513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_SENSOR_START_REQ_PROCESSING      (SIGNAL_THREAD_COMMON_LAST<<4)
76c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_GET_BUFFER                (SIGNAL_THREAD_COMMON_LAST<<5)
77c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_PUT_BUFFER                (SIGNAL_THREAD_COMMON_LAST<<6)
78c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_CHANGE_PARAMETER          (SIGNAL_THREAD_COMMON_LAST<<7)
7913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_THREAD_RELEASE                   (SIGNAL_THREAD_COMMON_LAST<<8)
8013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define SIGNAL_ISP_START_BAYER_INPUT            (SIGNAL_THREAD_COMMON_LAST<<9)
819dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang#define SIGNAL_ISP_START_BAYER_DEQUEUE          (SIGNAL_THREAD_COMMON_LAST<<10)
82c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
83c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define SIGNAL_STREAM_DATA_COMING               (SIGNAL_THREAD_COMMON_LAST<<15)
84c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
85c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
8613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
87c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinenum sensor_name {
88c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K3H2  = 1,
89c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K6A3  = 2,
90c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K4E5  = 3,
91c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_S5K3H7  = 4,
92c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_CUSTOM  = 5,
93c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SENSOR_NAME_END
94c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
95c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
96c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
97c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct node_info {
98c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int fd;
99c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int width;
100c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int height;
101c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int format;
102c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int planes;
103c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int buffers;
104c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    enum v4l2_memory memory;
105c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    enum v4l2_buf_type type;
106be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    ion_client ionClient;
107be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    ExynosBuffer buffer[NUM_MAX_CAMERA_BUFFERS];
108be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    bool streamOn;
109c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} node_info_t;
110c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
111c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
112c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct camera_hw_info {
113c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int sensor_id;
114c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
115c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    node_info_t sensor;
11613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    node_info_t isp;
11713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    node_info_t capture;
11813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
11913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    /*shot*/  // temp
12013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    struct camera2_shot_ext dummy_shot;
121c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
122c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} camera_hw_info_t;
123c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
12413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangtypedef enum request_entry_status {
125c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    EMPTY,
126c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    REGISTERED,
127be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    REQUESTED,
128be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    CAPTURED
129c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} request_entry_status_t;
130c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
131c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shintypedef struct request_manager_entry {
13213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    request_entry_status_t      status;
13313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    camera_metadata_t           *original_request;
134be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang    struct camera2_shot_ext     internal_shot;
13513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                         output_stream_count;
13613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                         dynamic_meta_vaild;
137c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} request_manager_entry_t;
138c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
139c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass RequestManager {
140c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic:
141c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    RequestManager(SignalDrivenThread* main_thread);
142c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    ~RequestManager();
143c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int     GetNumEntries();
144c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    bool    IsRequestQueueFull();
14513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
14613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void    RegisterRequest(camera_metadata_t *new_request);
14713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void    DeregisterRequest(camera_metadata_t **deregistered_request);
14813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool    PrepareFrame(size_t *num_entries, size_t *frame_size,
14913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                camera_metadata_t **prepared_frame);
15013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int   MarkProcessingRequest(ExynosBuffer *buf);
1519dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void      NotifyStreamOutput(int frameCnt, int stream_id);
15213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void    DumpInfoWithIndex(int index);
1539dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void    ApplyDynamicMetadata(struct camera2_shot_ext *shot_ext, int frameCnt);
15413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void    CheckCompleted(int index);
1559dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void    UpdateOutputStreamInfo(struct camera2_shot_ext *shot_ext, int frameCnt);
1569dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void    RegisterTimestamp(int frameCnt, nsecs_t *frameTime);
1579dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    uint64_t  GetTimestamp(int frameCnt);
1589dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     FindFrameCnt(struct camera2_shot_ext * shot_ext);
1599dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     FindEntryIndexByFrameCnt(int frameCnt);
160b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    void    Dump(void);
161b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    int     GetNextIndex(int index);
162b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    void    SetDefaultParameters(int cropX);
163b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    void    SetInitialSkip(int count);
164c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinprivate:
165c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
166c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    MetadataConverter               *m_metadataConverter;
167c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    SignalDrivenThread              *m_mainThread;
168c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_numOfEntries;
169c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_entryInsertionIndex;
170c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_entryProcessingIndex;
171c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                             m_entryFrameOutputIndex;
172c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    request_manager_entry_t         entries[NUM_MAX_REQUEST_MGR_ENTRY];
17313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                             m_completedIndex;
174c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
175c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    Mutex                           m_requestMutex;
176c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
177c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    //TODO : alloc dynamically
178c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    char                            m_tempFrameMetadataBuf[2000];
179c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera_metadata_t               *m_tempFrameMetadata;
1809dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
181b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang    int                             m_sensorPipelineSkipCnt;
1829dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                             m_cropX;
1839dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
184c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
185c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
1869dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
1879dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangtypedef struct bayer_buf_entry {
1889dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     status;
1899dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int     reqFrameCnt;
1909dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    nsecs_t timeStamp;
1919dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang} bayer_buf_entry_t;
1929dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
1939dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
1949dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangclass BayerBufManager {
1959dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangpublic:
1969dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    BayerBufManager();
1979dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    ~BayerBufManager();
1989dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetIndexForSensorEnqueue();
1999dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkSensorEnqueue(int index);
2009dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkSensorDequeue(int index, int reqFrameCnt, nsecs_t *timeStamp);
2019dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetIndexForIspEnqueue(int *reqFrameCnt);
2029dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetIndexForIspDequeue(int *reqFrameCnt);
2039dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkIspEnqueue(int index);
2049dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 MarkIspDequeue(int index);
2059dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNumOnSensor();
2069dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNumOnHalFilled();
2079dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNumOnIsp();
2089dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
2099dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangprivate:
2109dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 GetNextIndex(int index);
2119dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
2129dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 sensorEnqueueHead;
2139dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 sensorDequeueHead;
2149dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 ispEnqueueHead;
2159dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 ispDequeueHead;
2169dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnSensor;
2179dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnIsp;
2189dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnHalFilled;
2199dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 numOnHalEmpty;
2209dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
2219dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bayer_buf_entry_t   entries[NUM_BAYER_BUFFERS];
2229dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang};
2239dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
2249dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
22513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define NOT_AVAILABLE           (0)
22613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define REQUIRES_DQ_FROM_SVC    (1)
22713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_DRIVER               (2)
22813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_HAL                  (3)
22913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define ON_SERVICE              (4)
23013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
23113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_NOT_AVAILABLE     (0)
23213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_SENSOR         (1)
23313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_HAL_FILLED     (2)
23413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_ISP            (3)
23513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_SERVICE        (4)
23613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang#define BAYER_ON_HAL_EMPTY      (5)
23713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
23813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangtypedef struct stream_parameters {
23913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     streamType;
24013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            uint32_t                outputWidth;
24113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            uint32_t                outputHeight;
24213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            uint32_t                nodeWidth;
24313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            uint32_t                nodeHeight;
24413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     outputFormat;
24513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     nodeFormat;
246c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    const   camera2_stream_ops_t*   streamOps;
247c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            uint32_t                usage;
24813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     numHwBuffers;
24913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     numSvcBuffers;
250be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numOwnSvcBuffers;
251c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            int                     fd;
25213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     svcPlanes;
25313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     nodePlanes;
25413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    enum v4l2_memory                memory;
25513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    enum v4l2_buf_type              halBuftype;
256be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numSvcBufsInHal;
25713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            buffer_handle_t         svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
25813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            ExynosBuffer            svcBuffers[NUM_MAX_CAMERA_BUFFERS];
25913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            int                     svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
260be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     svcBufIndex;
261be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            ion_client              ionClient;
26213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            node_info_t             node;
263c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} stream_parameters_t;
264c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
2659dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangtypedef struct record_parameters {
2669dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            uint32_t                outputWidth;
2679dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            uint32_t                outputHeight;
2689dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            int                     outputFormat;
2699dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    const   camera2_stream_ops_t*   streamOps;
2709dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            uint32_t                usage;
2719dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            int                     numSvcBuffers;
272be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numOwnSvcBuffers;
2739dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            int                     svcPlanes;
2749dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            buffer_handle_t         svcBufHandle[NUM_MAX_CAMERA_BUFFERS];
2759dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            ExynosBuffer            svcBuffers[NUM_MAX_CAMERA_BUFFERS];
2769dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang            int                     svcBufStatus[NUM_MAX_CAMERA_BUFFERS];
277be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     svcBufIndex;
278be494d19b61b202bc071ec8f6bc5d395ebf397bbSungjoong Kang            int                     numSvcBufsInHal;
2799dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang} record_parameters_t;
28013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
281c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinclass ExynosCameraHWInterface2 : public virtual RefBase {
282c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinpublic:
283daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev, ExynosCamera2 * camera);
284c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual             ~ExynosCameraHWInterface2();
285c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
286c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual void        release();
28713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
288c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    inline  int         getCameraId() const;
289c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
290c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
291c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         notifyRequestQueueNotEmpty();
292c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
293c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         getInProgressCount();
294c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         flushCapturesInProgress();
295c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         constructDefaultRequest(int request_template, camera_metadata_t **request);
29613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    virtual int         allocateStream(uint32_t width, uint32_t height,
297c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    int format, const camera2_stream_ops_t *stream_ops,
298c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
299c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
300c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         releaseStream(uint32_t stream_id);
301c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         allocateReprocessStream(uint32_t width, uint32_t height,
302c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
303c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin                                    uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
304c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         releaseReprocessStream(uint32_t stream_id);
305c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         triggerAction(uint32_t trigger_id, int ext1, int ext2);
306c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         setNotifyCallback(camera2_notify_callback notify_cb, void *user);
307c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
308c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    virtual int         dump(int fd);
309c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinprivate:
31013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangclass MainThread : public SignalDrivenThread {
31113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ExynosCameraHWInterface2 *mHardware;
31213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    public:
31313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        MainThread(ExynosCameraHWInterface2 *hw):
31413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            SignalDrivenThread(),
31513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware(hw) {
31613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang//            Start("MainThread", PRIORITY_DEFAULT, 0);
31713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        }
31813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~MainThread();
31913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        status_t readyToRunInternal()
32013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	{
32113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            return NO_ERROR;
32213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        }
32313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal()
32413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	{
32513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware->m_mainThreadFunc(this);
32613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            return;
32713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        }
32813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        release(void);
32913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    };
3309dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
331c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    class SensorThread : public SignalDrivenThread {
332c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        ExynosCameraHWInterface2 *mHardware;
333c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    public:
334c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        SensorThread(ExynosCameraHWInterface2 *hw):
335c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0),
336c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware(hw),
337c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            m_isBayerOutputEnabled(false) { }
33813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~SensorThread();
339c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        status_t readyToRunInternal() {
34013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware->m_sensorThreadInitialize(this);
341c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return NO_ERROR;
342c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
34313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal() {
344c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware->m_sensorThreadFunc(this);
345c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return;
346c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
3479dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        void            release(void);
348c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    //private:
349c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        bool            m_isBayerOutputEnabled;
350c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        int             m_sensorFd;
35113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    };
35213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
35313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    class IspThread : public SignalDrivenThread {
35413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ExynosCameraHWInterface2 *mHardware;
35513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    public:
35613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        IspThread(ExynosCameraHWInterface2 *hw):
35713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            SignalDrivenThread("IspThread", PRIORITY_DEFAULT, 0),
35813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware(hw) { }
35913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~IspThread();
36013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        status_t readyToRunInternal() {
36113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware->m_ispThreadInitialize(this);
36213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            return NO_ERROR;
36313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        }
36413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal() {
36513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware->m_ispThreadFunc(this);
36613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            return;
36713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        }
36813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void            release(void);
36913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    //private:
370c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        int             m_ispFd;
371c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    };
372c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
373c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    class StreamThread : public SignalDrivenThread {
374c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        ExynosCameraHWInterface2 *mHardware;
375c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    public:
376c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
377c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0),
378c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware(hw),
379c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            m_index(new_index) { }
38013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        ~StreamThread();
381c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        status_t readyToRunInternal() {
38213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang            mHardware->m_streamThreadInitialize(this);
383c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return NO_ERROR;
384c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
38513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void threadFunctionInternal() {
386c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            mHardware->m_streamThreadFunc(this);
387c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin            return;
388c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin        }
3899dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        void        setRecordingParameter(record_parameters_t * recordParm);
39013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        setParameter(stream_parameters_t * new_parameters);
39113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        applyChange(void);
39213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        void        release(void);
39313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        int         findBufferIndex(void * bufAddr);
394c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
395c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
39613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        uint8_t                         m_index;
3979dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        bool                            m_activated;
39813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    //private:
39913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        stream_parameters_t             m_parameters;
4009dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        stream_parameters_t             *m_tempParameters;
4019dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang        record_parameters_t             m_recordParameters;
40213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang        bool                            m_isBufferInit;
403b5237e6bdb2c87f61ccf5b22cdb922691095fc2fSungjoong Kang        bool                            m_releasing;
40413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang     };
405c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
406c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    sp<MainThread>      m_mainThread;
407c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    sp<SensorThread>    m_sensorThread;
40813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    sp<IspThread>       m_ispThread;
40913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    sp<StreamThread>    m_streamThreads[NUM_MAX_STREAM_THREAD];
41013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
41113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
4129dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
413c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    RequestManager      *m_requestManager;
4149dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    BayerBufManager     *m_BayerManager;
415daa1fcd6e8861944412e5c77db5eb441512aef38Sungjoong Kang    ExynosCamera2       *m_camera2;
416c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
417c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                m_mainThreadFunc(SignalDrivenThread * self);
418c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                m_sensorThreadFunc(SignalDrivenThread * self);
41913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_sensorThreadInitialize(SignalDrivenThread * self);
42013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_ispThreadFunc(SignalDrivenThread * self);
42113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_ispThreadInitialize(SignalDrivenThread * self);
422c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                m_streamThreadFunc(SignalDrivenThread * self);
42313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_streamThreadInitialize(SignalDrivenThread * self);
42413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
42513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void                m_getAlignedYUVSize(int colorFormat, int w, int h,
42613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                                ExynosBuffer *buf);
42713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                m_getRatioSize(int  src_w,  int   src_h,
42813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int  dst_w,  int   dst_h,
42913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int *crop_x, int *crop_y,
43013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int *crop_w, int *crop_h,
43113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                                             int zoom);
43213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	int				createIonClient(ion_client ionClient);
43313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	int					deleteIonClient(ion_client ionClient);
43413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
43513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int				allocCameraMemory(ion_client ionClient, ExynosBuffer *buf, int iMemoryNum);
43613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	void				freeCameraMemory(ExynosBuffer *buf, int iMemoryNum);
43713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang	void				initCameraMemory(ExynosBuffer *buf, int iMemoryNum);
43813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
43913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void            DumpInfoWithShot(struct camera2_shot_ext * shot_ext);
44013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool            yuv2Jpeg(ExynosBuffer *yuvBuf,
44113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                            ExynosBuffer *jpegBuf,
44213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang                            ExynosRect *rect);
44313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    exif_attribute_t    mExifInfo;
44413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    void               *m_exynosPictureCSC;
4459dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    void               *m_exynosVideoCSC;
44613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
4479dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                 m_jpegEncodingFrameCnt;
448c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
449c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera2_request_queue_src_ops_t     *m_requestQueueOps;
450c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera2_frame_queue_dst_ops_t       *m_frameQueueOps;
451c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    camera2_notify_callback             m_notifyCb;
452c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    void                                *m_callbackCookie;
453c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
454c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    int                                 m_numOfRemainingReqInSvc;
455c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin    bool                                m_isRequestQueuePending;
45613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_isRequestQueueNull;
45713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    camera2_device_t                    *m_halDevice;
45813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    static gralloc_module_t const*      m_grallocHal;
459c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
460c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
46113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    camera_hw_info_t                     m_camera_info;
462c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
463c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin	ion_client m_ionCameraClient;
464c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
46513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_isSensorThreadOn;
46613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_isSensorStarted;
46713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
46813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
46913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
47013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_initFlag1;
47113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_initFlag2;
4729dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                                 m_ispProcessingFrameCnt;
47313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
47413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                                 indexToQueue[3+1];
47513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    int                                 m_fd_scp;
47613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang
47713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_scp_flushing;
47813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    bool                                m_closing;
47913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang    ExynosBuffer                        m_resizeBuf;
4809dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bool                                m_recordingEnabled;
4819dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                                 m_previewOutput;
4829dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                                 m_recordOutput;
4839dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bool                                m_needsRecordBufferInit;
4849dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int                                 lastFrameCnt;
4859dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    int             				    m_cameraId;
4869dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bool                                m_scp_closing;
4879dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang    bool                                m_scp_closed;
4889dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang
489c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin};
490c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
491c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; // namespace android
492c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin
493c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#endif
494