ExynosCameraHWInterface2.h revision c15a6b003394494149ef7d65ae35c38755cb8b93
1/*
2**
3** Copyright 2008, The Android Open Source Project
4** Copyright 2012, Samsung Electronics Co. LTD
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10**     http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19/*!
20 * \file      ExynosCameraHWInterface2.h
21 * \brief     header file for Android Camera API 2.0 HAL
22 * \author    Sungjoong Kang(sj3.kang@samsung.com)
23 * \date      2012/05/31
24 *
25 * <b>Revision History: </b>
26 * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n
27 *   Initial Release
28 */
29
30#ifndef EXYNOS_CAMERA_HW_INTERFACE_2_H
31#define EXYNOS_CAMERA_HW_INTERFACE_2_H
32
33#include <hardware/camera2.h>
34#include <camera/Camera.h>
35#include <camera/CameraParameters.h>
36#include "SignalDrivenThread.h"
37#include "MetadataConverter.h"
38#include "exynos_v4l2.h"
39#include "videodev2_exynos_camera.h"
40#include "gralloc_priv.h"
41
42#include <fcntl.h>
43#include "fimc-is-metadata.h"
44#include "ion.h"
45
46namespace android {
47
48
49#define NODE_PREFIX     "/dev/video"
50
51#define NUM_MAX_STREAM_THREAD       (5)
52#define NUM_MAX_DEQUEUED_REQUEST    (4)
53#define NUM_MAX_REQUEST_MGR_ENTRY   NUM_MAX_DEQUEUED_REQUEST
54#define NUM_OF_STREAM_BUF           (15)
55#define MAX_CAMERA_MEMORY_PLANE_NUM	(4)
56
57#define SIGNAL_MAIN_REQ_Q_NOT_EMPTY             (SIGNAL_THREAD_COMMON_LAST<<1)
58#define SIGNAL_MAIN_REPROCESS_Q_NOT_EMPTY       (SIGNAL_THREAD_COMMON_LAST<<2)
59#define SIGNAL_MAIN_STREAM_OUTPUT_DONE          (SIGNAL_THREAD_COMMON_LAST<<3)
60#define SIGNAL_SENSOR_START_REQ_PROCESSING      (SIGNAL_THREAD_COMMON_LAST<<4)
61#define SIGNAL_STREAM_GET_BUFFER                (SIGNAL_THREAD_COMMON_LAST<<5)
62#define SIGNAL_STREAM_PUT_BUFFER                (SIGNAL_THREAD_COMMON_LAST<<6)
63#define SIGNAL_STREAM_CHANGE_PARAMETER          (SIGNAL_THREAD_COMMON_LAST<<7)
64
65
66#define SIGNAL_STREAM_DATA_COMING               (SIGNAL_THREAD_COMMON_LAST<<15)
67
68
69#define MAX_NUM_CAMERA_BUFFERS (16)
70enum sensor_name {
71    SENSOR_NAME_S5K3H2  = 1,
72    SENSOR_NAME_S5K6A3  = 2,
73    SENSOR_NAME_S5K4E5  = 3,
74    SENSOR_NAME_S5K3H7  = 4,
75    SENSOR_NAME_CUSTOM  = 5,
76    SENSOR_NAME_END
77};
78
79typedef struct exynos_camera_memory {
80	ion_buffer ionBuffer[MAX_CAMERA_MEMORY_PLANE_NUM];
81	char *virBuffer[MAX_CAMERA_MEMORY_PLANE_NUM];
82	int size[MAX_CAMERA_MEMORY_PLANE_NUM];
83} exynos_camera_memory_t;
84
85typedef struct node_info {
86    int fd;
87    int width;
88    int height;
89    int format;
90    int planes;
91    int buffers;
92    int currentBufferIndex;
93    enum v4l2_memory memory;
94    enum v4l2_buf_type type;
95	ion_client ionClient;
96	exynos_camera_memory_t	buffer[MAX_NUM_CAMERA_BUFFERS];
97} node_info_t;
98
99
100typedef struct camera_hw_info {
101    int sensor_id;
102
103    node_info_t sensor;
104    node_info_t isp;
105    node_info_t capture;
106    node_info_t preview;
107
108
109    /*shot*/
110    camera2_shot_t current_shot;
111} camera_hw_info_t;
112
113typedef enum request_entry_status
114{
115    EMPTY,
116    REGISTERED,
117    PROCESSING
118} request_entry_status_t;
119
120typedef struct request_manager_entry {
121    request_entry_status_t  status;
122    int                     id;
123    camera_metadata_t       *original_request;
124    // TODO : allocate memory dynamically
125    // camera2_ctl_metadata_t  *internal_request;
126    camera2_ctl_metadata_NEW_t  internal_request;
127    int                     output_stream_count;
128} request_manager_entry_t;
129
130class RequestManager {
131public:
132    RequestManager(SignalDrivenThread* main_thread);
133    ~RequestManager();
134    int     GetNumEntries();
135    bool    IsRequestQueueFull();
136
137    void    RegisterRequest(camera_metadata_t * new_request);
138    void    DeregisterRequest(camera_metadata_t ** deregistered_request);
139    void    PrepareFrame(size_t* num_entries, size_t* frame_size,
140                camera_metadata_t ** prepared_frame);
141    void    MarkProcessingRequest(exynos_camera_memory_t* buf);
142    void    NotifyStreamOutput(uint32_t stream_id);
143
144private:
145
146    MetadataConverter               *m_metadataConverter;
147    SignalDrivenThread              *m_mainThread;
148    int                             m_numOfEntries;
149    int                             m_entryInsertionIndex;
150    int                             m_entryProcessingIndex;
151    int                             m_entryFrameOutputIndex;
152    request_manager_entry_t         entries[NUM_MAX_REQUEST_MGR_ENTRY];
153
154    Mutex                           m_requestMutex;
155
156    //TODO : alloc dynamically
157    char                            m_tempFrameMetadataBuf[2000];
158    camera_metadata_t               *m_tempFrameMetadata;
159    int32_t             frame_seq_number;
160};
161
162typedef struct stream_parameters
163{
164            uint32_t                id;
165            uint32_t                width;
166            uint32_t                height;
167            int                     format;
168    const   camera2_stream_ops_t*   streamOps;
169            uint32_t                usage;
170            uint32_t                max_buffers;
171            int                     fd;
172            void                    *grallocVirtAddr[NUM_OF_STREAM_BUF];
173            bool                    availableBufHandle[NUM_OF_STREAM_BUF];
174            buffer_handle_t         *bufHandle[NUM_OF_STREAM_BUF];
175            node_info_t             *node;
176} stream_parameters_t;
177
178
179class ExynosCameraHWInterface2 : public virtual RefBase {
180public:
181    ExynosCameraHWInterface2(int cameraId, camera2_device_t *dev);
182    virtual             ~ExynosCameraHWInterface2();
183
184    virtual void        release();
185
186    inline  int         getCameraId() const;
187
188    virtual int         setRequestQueueSrcOps(const camera2_request_queue_src_ops_t *request_src_ops);
189    virtual int         notifyRequestQueueNotEmpty();
190    virtual int         setFrameQueueDstOps(const camera2_frame_queue_dst_ops_t *frame_dst_ops);
191    virtual int         getInProgressCount();
192    virtual int         flushCapturesInProgress();
193    virtual int         constructDefaultRequest(int request_template, camera_metadata_t **request);
194    virtual int         allocateStream(uint32_t width, uint32_t height,
195                                    int format, const camera2_stream_ops_t *stream_ops,
196                                    uint32_t *stream_id, uint32_t *format_actual, uint32_t *usage, uint32_t *max_buffers);
197    virtual int         registerStreamBuffers(uint32_t stream_id, int num_buffers, buffer_handle_t *buffers);
198    virtual int         releaseStream(uint32_t stream_id);
199    virtual int         allocateReprocessStream(uint32_t width, uint32_t height,
200                                    uint32_t format, const camera2_stream_in_ops_t *reprocess_stream_ops,
201                                    uint32_t *stream_id, uint32_t *consumer_usage, uint32_t *max_buffers);
202    virtual int         releaseReprocessStream(uint32_t stream_id);
203    virtual int         triggerAction(uint32_t trigger_id, int ext1, int ext2);
204    virtual int         setNotifyCallback(camera2_notify_callback notify_cb, void *user);
205    virtual int         getMetadataVendorTagOps(vendor_tag_query_ops_t **ops);
206    virtual int         dump(int fd);
207private:
208
209    class MainThread : public SignalDrivenThread {
210        ExynosCameraHWInterface2 *mHardware;
211    public:
212        MainThread(ExynosCameraHWInterface2 *hw):
213            SignalDrivenThread("MainThread", PRIORITY_DEFAULT, 0),
214            mHardware(hw) { }
215        virtual void onFirstRef() {
216        }
217        status_t readyToRunInternal() {
218            return NO_ERROR;
219        }
220        void threadLoopInternal() {
221            mHardware->m_mainThreadFunc(this);
222            return;
223        }
224    };
225
226    class SensorThread : public SignalDrivenThread {
227        ExynosCameraHWInterface2 *mHardware;
228    public:
229        SensorThread(ExynosCameraHWInterface2 *hw):
230            SignalDrivenThread("SensorThread", PRIORITY_DEFAULT, 0),
231            mHardware(hw),
232            m_isBayerOutputEnabled(false) { }
233        virtual void onFirstRef() {
234            mHardware->m_sensorThreadInitialize(this);
235        }
236        status_t readyToRunInternal() {
237            mHardware->m_sensorThreadInitialize(this);
238            return NO_ERROR;
239        }
240        void threadLoopInternal() {
241            mHardware->m_sensorThreadFunc(this);
242            return;
243        }
244    //private:
245        bool            m_isBayerOutputEnabled;
246        int             m_sensorFd;
247        int             m_ispFd;
248    };
249
250    class StreamThread : public SignalDrivenThread {
251        ExynosCameraHWInterface2 *mHardware;
252    public:
253        StreamThread(ExynosCameraHWInterface2 *hw, uint8_t new_index):
254            SignalDrivenThread("StreamThread", PRIORITY_DEFAULT, 0),
255            mHardware(hw),
256            m_index(new_index) { }
257        virtual void onFirstRef() {
258            mHardware->m_streamThreadInitialize(this);
259        }
260        status_t readyToRunInternal() {
261            mHardware->m_streamThreadInitialize(this);
262            return NO_ERROR;
263        }
264        void threadLoopInternal() {
265            mHardware->m_streamThreadFunc(this);
266            return;
267        }
268        void SetParameter(uint32_t id, uint32_t width, uint32_t height, int format,
269                    const camera2_stream_ops_t* stream_ops, uint32_t usage, int fd, node_info_t * node);
270        void ApplyChange(void);
271
272                uint8_t                 m_index;
273    //private:
274        stream_parameters_t             m_parameters;
275        stream_parameters_t             m_tempParameters;
276
277    };
278
279    sp<MainThread>      m_mainThread;
280    sp<SensorThread>    m_sensorThread;
281    sp<StreamThread>    m_streamThread;
282
283
284
285    RequestManager      *m_requestManager;
286
287    void                m_mainThreadFunc(SignalDrivenThread * self);
288    void                m_sensorThreadFunc(SignalDrivenThread * self);
289    void                m_sensorThreadInitialize(SignalDrivenThread * self);
290    void                m_streamThreadFunc(SignalDrivenThread * self);
291    void                m_streamThreadInitialize(SignalDrivenThread * self);
292
293	int                 createIonClient(ion_client ionClient);
294	int                 deleteIonClient(ion_client ionClient);
295    int                 allocCameraMemory(ion_client ionClient, exynos_camera_memory_t *buf, int iMemoryNum);
296	void                freeCameraMemory(exynos_camera_memory_t *buf, int iMemoryNum);
297	void                initCameraMemory(exynos_camera_memory_t *buf, int iMemoryNum);
298
299    camera2_request_queue_src_ops_t     *m_requestQueueOps;
300    camera2_frame_queue_dst_ops_t       *m_frameQueueOps;
301    camera2_notify_callback             m_notifyCb;
302    void                                *m_callbackCookie;
303
304    int                                 m_numOfRemainingReqInSvc;
305    bool                                m_isRequestQueuePending;
306
307    camera2_device_t *m_halDevice;
308    static gralloc_module_t const* m_grallocHal;
309
310
311    camera_hw_info_t m_camera_info;
312
313	ion_client m_ionCameraClient;
314
315    bool        m_isSensorThreadOn;
316    bool        m_isStreamStarted;
317    int         matchBuffer(void * bufAddr);
318    bool        m_isBufferInit;
319};
320
321}; // namespace android
322
323#endif
324