• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above
9 *       copyright notice, this list of conditions and the following
10 *       disclaimer in the documentation and/or other materials provided
11 *       with the distribution.
12 *     * Neither the name of The Linux Foundation nor the names of its
13 *       contributors may be used to endorse or promote products derived
14 *       from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29 
30 #ifndef __QCAMERA3HARDWAREINTERFACE_H__
31 #define __QCAMERA3HARDWAREINTERFACE_H__
32 
33 #include <pthread.h>
34 #include <utils/List.h>
35 #include <utils/KeyedVector.h>
36 #include <hardware/camera3.h>
37 #include <camera/CameraMetadata.h>
38 #include "QCamera3HALHeader.h"
39 #include "QCamera3Channel.h"
40 
41 #include <hardware/power.h>
42 
43 extern "C" {
44 #include <mm_camera_interface.h>
45 #include <mm_jpeg_interface.h>
46 }
47 
48 using namespace android;
49 
50 namespace qcamera {
51 
52 #ifndef TRUE
53 #define TRUE 1
54 #endif
55 
56 #ifndef FALSE
57 #define FALSE 0
58 #endif
59 
60 /* Time related macros */
61 typedef int64_t nsecs_t;
62 #define NSEC_PER_SEC 1000000000LL
63 #define NSEC_PER_USEC 1000
64 #define NSEC_PER_33MSEC 33000000LL
65 
66 class QCamera3MetadataChannel;
67 class QCamera3PicChannel;
68 class QCamera3HeapMemory;
69 class QCamera3Exif;
70 
71 class QCamera3HardwareInterface {
72 public:
73     /* static variable and functions accessed by camera service */
74     static camera3_device_ops_t mCameraOps;
75     static int initialize(const struct camera3_device *,
76                 const camera3_callback_ops_t *callback_ops);
77     static int configure_streams(const struct camera3_device *,
78                 camera3_stream_configuration_t *stream_list);
79     static int register_stream_buffers(const struct camera3_device *,
80                 const camera3_stream_buffer_set_t *buffer_set);
81     static const camera_metadata_t* construct_default_request_settings(
82                                 const struct camera3_device *, int type);
83     static int process_capture_request(const struct camera3_device *,
84                                 camera3_capture_request_t *request);
85     static void get_metadata_vendor_tag_ops(const struct camera3_device *,
86                                                vendor_tag_query_ops_t* ops);
87     static void dump(const struct camera3_device *, int fd);
88     static int flush(const struct camera3_device *);
89     static int close_camera_device(struct hw_device_t* device);
90 public:
91     QCamera3HardwareInterface(int cameraId);
92     virtual ~QCamera3HardwareInterface();
93     int openCamera(struct hw_device_t **hw_device);
94     int getMetadata(int type);
95     camera_metadata_t* translateCapabilityToMetadata(int type);
96 
97     static int getCamInfo(int cameraId, struct camera_info *info);
98     static int initCapabilities(int cameraId);
99     static int initStaticMetadata(int cameraId);
100     static void makeTable(cam_dimension_t* dimTable, uint8_t size, int32_t* sizeTable);
101     static void makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
102                                           int32_t* fpsRangesTable);
103     static void makeOverridesList(cam_scene_mode_overrides_t* overridesTable, uint8_t size,
104                                    uint8_t* overridesList, uint8_t* supported_indexes, int camera_id);
105     static void convertToRegions(cam_rect_t rect, int32_t* region, int weight);
106     static void convertFromRegions(cam_area_t* roi, const camera_metadata_t *settings,
107                                    uint32_t tag);
108     static bool resetIfNeededROI(cam_area_t* roi, const cam_crop_region_t* scalerCropRegion);
109     static void convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks);
110     static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
111                                             void *userdata);
112     static int32_t getScalarFormat(int32_t format);
113     static int32_t getSensorSensitivity(int32_t iso_mode);
114     static void captureResultCb(mm_camera_super_buf_t *metadata,
115                 camera3_stream_buffer_t *buffer, uint32_t frame_number,
116                 void *userdata);
117 
118     int initialize(const camera3_callback_ops_t *callback_ops);
119     int configureStreams(camera3_stream_configuration_t *stream_list);
120     int registerStreamBuffers(const camera3_stream_buffer_set_t *buffer_set);
121     int processCaptureRequest(camera3_capture_request_t *request);
122     void getMetadataVendorTagOps(vendor_tag_query_ops_t* ops);
123     void dump(int fd);
124     int flush();
125 
126     int setFrameParameters(camera3_capture_request_t *request, cam_stream_ID_t streamID);
127     int translateMetadataToParameters(const camera3_capture_request_t *request);
128     camera_metadata_t* translateCbUrgentMetadataToResultMetadata (
129                              metadata_buffer_t *metadata);
130 
131     camera_metadata_t* translateCbMetadataToResultMetadata(metadata_buffer_t *metadata,
132                             nsecs_t timestamp, int32_t request_id, int32_t BlobRequest,
133                             jpeg_settings_t* InputJpegSettings);
134     int getJpegSettings(const camera_metadata_t *settings);
135     int initParameters();
136     void deinitParameters();
137     int getMaxUnmatchedFramesInQueue();
138     QCamera3ReprocessChannel *addOnlineReprocChannel(QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle);
139     bool needRotationReprocess();
140     bool needReprocess();
141     bool isWNREnabled();
142     cam_denoise_process_type_t getWaveletDenoiseProcessPlate();
143 
144     void captureResultCb(mm_camera_super_buf_t *metadata,
145                 camera3_stream_buffer_t *buffer, uint32_t frame_number);
146 
147     typedef struct {
148         uint8_t fwk_name;
149         uint8_t hal_name;
150     } QCameraMap;
151 
152 private:
153 
154     int openCamera();
155     int closeCamera();
156     int AddSetParmEntryToBatch(parm_buffer_t *p_table,
157                                cam_intf_parm_type_t paramType,
158                                uint32_t paramLength,
159                                void *paramValue);
160     static int8_t lookupHalName(const QCameraMap arr[],
161                       int len, int fwk_name);
162     static int8_t lookupFwkName(const QCameraMap arr[],
163                       int len, int hal_name);
164 
165     int validateCaptureRequest(camera3_capture_request_t *request);
166 
167     void deriveMinFrameDuration();
168     int64_t getMinFrameDuration(const camera3_capture_request_t *request);
169 
170     void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf);
171     void handleBufferWithLock(camera3_stream_buffer_t *buffer,
172         uint32_t frame_number);
173     void unblockRequestIfNecessary();
174 public:
175 
176     bool needOnlineRotation();
177     void getThumbnailSize(cam_dimension_t &dim);
178     int getJpegQuality();
179     int calcMaxJpegSize();
180     QCamera3Exif *getExifData();
181 public:
182     static int kMaxInFlight;
183 private:
184     camera3_device_t   mCameraDevice;
185     uint8_t            mCameraId;
186     mm_camera_vtbl_t  *mCameraHandle;
187     bool               mCameraOpened;
188     bool               mCameraInitialized;
189     camera_metadata_t *mDefaultMetadata[CAMERA3_TEMPLATE_COUNT];
190     int mBlobRequest;
191 
192     const camera3_callback_ops_t *mCallbackOps;
193 
194     camera3_stream_t *mInputStream;
195     QCamera3MetadataChannel *mMetadataChannel;
196     QCamera3PicChannel *mPictureChannel;
197 
198      //First request yet to be processed after configureStreams
199     bool mFirstRequest;
200     QCamera3HeapMemory *mParamHeap;
201     parm_buffer_t* mParameters;
202     bool m_bWNROn;
203 
204     /* Data structure to store pending request */
205     typedef struct {
206         camera3_stream_t *stream;
207         camera3_stream_buffer_t *buffer;
208     } RequestedBufferInfo;
209     typedef struct {
210         uint32_t frame_number;
211         uint32_t num_buffers;
212         int32_t request_id;
213         List<RequestedBufferInfo> buffers;
214         int blob_request;
215         jpeg_settings_t input_jpeg_settings;
216         nsecs_t timestamp;
217         uint8_t bNotified;
218         int input_buffer_present;
219     } PendingRequestInfo;
220     typedef struct {
221         uint32_t frame_number;
222         uint32_t stream_ID;
223     } PendingFrameDropInfo;
224     typedef KeyedVector<camera3_stream_t *, uint32_t> PendingBuffersMap;
225     /*Data structure to store metadata information*/
226     typedef struct {
227        mm_camera_super_buf_t* meta_buf;
228        buffer_handle_t*       zsl_buf_hdl;
229        uint32_t               frame_number;
230     }MetadataBufferInfo;
231 
232     List<MetadataBufferInfo> mStoredMetadataList;
233     List<PendingRequestInfo> mPendingRequestsList;
234     List<PendingFrameDropInfo> mPendingFrameDropList;
235     PendingBuffersMap mPendingBuffersMap;
236     pthread_cond_t mRequestCond;
237     int mPendingRequest;
238     int32_t mCurrentRequestId;
239 
240     //mutex for serialized access to camera3_device_ops_t functions
241     pthread_mutex_t mMutex;
242 
243     jpeg_settings_t* mJpegSettings;
244     metadata_response_t mMetadataResponse;
245     List<stream_info_t*> mStreamInfo;
246     bool mIsZslMode;
247 
248     int64_t mMinProcessedFrameDuration;
249     int64_t mMinJpegFrameDuration;
250     int64_t mMinRawFrameDuration;
251 
252     power_module_t *m_pPowerModule;   // power module
253 
254 #ifdef HAS_MULTIMEDIA_HINTS
255     bool mHdrHint;
256 #endif
257     static const QCameraMap EFFECT_MODES_MAP[];
258     static const QCameraMap WHITE_BALANCE_MODES_MAP[];
259     static const QCameraMap SCENE_MODES_MAP[];
260     static const QCameraMap FOCUS_MODES_MAP[];
261     static const QCameraMap ANTIBANDING_MODES_MAP[];
262     static const QCameraMap AE_FLASH_MODE_MAP[];
263     static const QCameraMap FLASH_MODES_MAP[];
264     static const QCameraMap FACEDETECT_MODES_MAP[];
265 
266     static pthread_mutex_t mCameraSessionLock;
267     static unsigned int mCameraSessionActive;
268 };
269 
270 }; // namespace qcamera
271 
272 #endif /* __QCAMERA2HARDWAREINTERFACE_H__ */
273