1 /* Copyright (c) 2012-2014, 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 typedef struct { 72 camera3_stream_t *stream; 73 stream_status_t status; 74 QCamera3Channel *channel; 75 } stream_info_t; 76 77 class QCamera3HardwareInterface { 78 public: 79 /* static variable and functions accessed by camera service */ 80 static camera3_device_ops_t mCameraOps; 81 static int initialize(const struct camera3_device *, 82 const camera3_callback_ops_t *callback_ops); 83 static int configure_streams(const struct camera3_device *, 84 camera3_stream_configuration_t *stream_list); 85 static int register_stream_buffers(const struct camera3_device *, 86 const camera3_stream_buffer_set_t *buffer_set); 87 static const camera_metadata_t* construct_default_request_settings( 88 const struct camera3_device *, int type); 89 static int process_capture_request(const struct camera3_device *, 90 camera3_capture_request_t *request); 91 92 static void dump(const struct camera3_device *, int fd); 93 static int flush(const struct camera3_device *); 94 static int close_camera_device(struct hw_device_t* device); 95 96 public: 97 QCamera3HardwareInterface(int cameraId, 98 const camera_module_callbacks_t *callbacks); 99 virtual ~QCamera3HardwareInterface(); 100 int openCamera(struct hw_device_t **hw_device); 101 int getMetadata(int type); 102 camera_metadata_t* translateCapabilityToMetadata(int type); 103 104 static int getCamInfo(int cameraId, struct camera_info *info); 105 static int initCapabilities(int cameraId); 106 static int initStaticMetadata(int cameraId); 107 static void makeTable(cam_dimension_t* dimTable, uint8_t size, int32_t* sizeTable); 108 static void makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 109 int32_t* fpsRangesTable); 110 static void makeOverridesList(cam_scene_mode_overrides_t* overridesTable, uint8_t size, 111 uint8_t* overridesList, uint8_t* supported_indexes, int camera_id); 112 static void convertToRegions(cam_rect_t rect, int32_t* region, int weight); 113 static void convertFromRegions(cam_area_t* roi, const camera_metadata_t *settings, 114 uint32_t tag); 115 static bool resetIfNeededROI(cam_area_t* roi, const cam_crop_region_t* scalerCropRegion); 116 static void convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks); 117 static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 118 void *userdata); 119 static int32_t getScalarFormat(int32_t format); 120 static int32_t getSensorSensitivity(int32_t iso_mode); 121 122 static double computeNoiseModelEntryS(int32_t sensitivity); 123 static double computeNoiseModelEntryO(int32_t sensitivity); 124 125 static void captureResultCb(mm_camera_super_buf_t *metadata, 126 camera3_stream_buffer_t *buffer, uint32_t frame_number, 127 void *userdata); 128 129 int initialize(const camera3_callback_ops_t *callback_ops); 130 int configureStreams(camera3_stream_configuration_t *stream_list); 131 int registerStreamBuffers(const camera3_stream_buffer_set_t *buffer_set); 132 int processCaptureRequest(camera3_capture_request_t *request); 133 void dump(int fd); 134 int flush(); 135 136 int setFrameParameters(camera3_capture_request_t *request, 137 cam_stream_ID_t streamID); 138 int setReprocParameters(camera3_capture_request_t *request); 139 int translateToHalMetadata(const camera3_capture_request_t *request, 140 metadata_buffer_t *parm); 141 camera_metadata_t* translateCbUrgentMetadataToResultMetadata ( 142 metadata_buffer_t *metadata); 143 144 camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata, 145 nsecs_t timestamp, int32_t request_id, 146 const CameraMetadata& jpegMetadata, uint8_t pipeline_depth); 147 int getJpegSettings(const camera_metadata_t *settings); 148 int initParameters(); 149 void deinitParameters(); 150 QCamera3ReprocessChannel *addOfflineReprocChannel(QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle, metadata_buffer_t *metadata); 151 bool needRotationReprocess(); 152 bool needReprocess(); 153 bool isWNREnabled(); 154 cam_denoise_process_type_t getWaveletDenoiseProcessPlate(); 155 156 void captureResultCb(mm_camera_super_buf_t *metadata, 157 camera3_stream_buffer_t *buffer, uint32_t frame_number); 158 159 typedef struct { 160 uint32_t fwk_name; 161 uint8_t hal_name; 162 } QCameraMap; 163 164 private: 165 166 int openCamera(); 167 int closeCamera(); 168 int AddSetMetaEntryToBatch(metadata_buffer_t *p_table, 169 unsigned int paramType, 170 uint32_t paramLength, 171 void *paramValue); 172 static int8_t lookupHalName(const QCameraMap arr[], 173 int len, unsigned int fwk_name); 174 static int32_t lookupFwkName(const QCameraMap arr[], 175 int len, int hal_name); 176 177 int validateCaptureRequest(camera3_capture_request_t *request); 178 int validateStreamDimensions(camera3_stream_configuration_t *streamList); 179 void deriveMinFrameDuration(); 180 int64_t getMinFrameDuration(const camera3_capture_request_t *request); 181 182 void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf); 183 void handleBufferWithLock(camera3_stream_buffer_t *buffer, 184 uint32_t frame_number); 185 void unblockRequestIfNecessary(); 186 void dumpMetadataToFile(tuning_params_t &meta, 187 uint32_t &dumpFrameCount, 188 int32_t enabled, 189 const char *type, 190 uint32_t frameNumber); 191 192 void cleanAndSortStreamInfo(); 193 void extractJpegMetadata(CameraMetadata& jpegMetadata, 194 const camera3_capture_request_t *request); 195 public: 196 197 bool needOnlineRotation(); 198 int getJpegQuality(); 199 int calcMaxJpegSize(); 200 QCamera3Exif *getExifData(); 201 public: 202 static int kMaxInFlight; 203 private: 204 camera3_device_t mCameraDevice; 205 uint8_t mCameraId; 206 mm_camera_vtbl_t *mCameraHandle; 207 bool mCameraOpened; 208 bool mCameraInitialized; 209 camera_metadata_t *mDefaultMetadata[CAMERA3_TEMPLATE_COUNT]; 210 int mBlobRequest; 211 212 const camera3_callback_ops_t *mCallbackOps; 213 214 camera3_stream_t *mInputStream; 215 QCamera3MetadataChannel *mMetadataChannel; 216 QCamera3PicChannel *mPictureChannel; 217 QCamera3RawChannel *mRawChannel; 218 QCamera3SupportChannel *mSupportChannel; 219 220 //First request yet to be processed after configureStreams 221 bool mFirstRequest; 222 bool mRepeatingRequest; 223 QCamera3HeapMemory *mParamHeap; 224 metadata_buffer_t* mParameters; 225 metadata_buffer_t* mPrevParameters; 226 bool m_bWNROn; 227 228 /* Data structure to store pending request */ 229 typedef struct { 230 camera3_stream_t *stream; 231 camera3_stream_buffer_t *buffer; 232 } RequestedBufferInfo; 233 typedef struct { 234 uint32_t frame_number; 235 uint32_t num_buffers; 236 int32_t request_id; 237 List<RequestedBufferInfo> buffers; 238 int blob_request; 239 nsecs_t timestamp; 240 uint8_t bNotified; 241 int input_buffer_present; 242 CameraMetadata jpegMetadata; 243 uint8_t pipeline_depth; 244 uint32_t partial_result_cnt; 245 } PendingRequestInfo; 246 typedef struct { 247 uint32_t frame_number; 248 uint32_t stream_ID; 249 } PendingFrameDropInfo; 250 251 // Store the Pending buffers for Flushing 252 typedef struct { 253 // Frame number pertaining to the buffer 254 uint32_t frame_number; 255 camera3_stream_t *stream; 256 // Buffer handle 257 buffer_handle_t *buffer; 258 } PendingBufferInfo; 259 260 typedef struct { 261 // Total number of buffer requests pending 262 uint32_t num_buffers; 263 // List of pending buffers 264 List<PendingBufferInfo> mPendingBufferList; 265 } PendingBuffersMap; 266 267 typedef KeyedVector<uint32_t, Vector<PendingBufferInfo> > FlushMap; 268 269 List<PendingRequestInfo> mPendingRequestsList; 270 List<PendingFrameDropInfo> mPendingFrameDropList; 271 PendingBuffersMap mPendingBuffersMap; 272 pthread_cond_t mRequestCond; 273 int mPendingRequest; 274 int32_t mCurrentRequestId; 275 camera3_capture_result_t *mLoopBackResult; 276 nsecs_t mLoopBackTimestamp; 277 278 //mutex for serialized access to camera3_device_ops_t functions 279 pthread_mutex_t mMutex; 280 281 List<stream_info_t*> mStreamInfo; 282 283 int64_t mMinProcessedFrameDuration; 284 int64_t mMinJpegFrameDuration; 285 int64_t mMinRawFrameDuration; 286 287 power_module_t *m_pPowerModule; // power module 288 289 #ifdef HAS_MULTIMEDIA_HINTS 290 bool mHdrHint; 291 #endif 292 uint32_t mMetaFrameCount; 293 const camera_module_callbacks_t *mCallbacks; 294 295 static const QCameraMap EFFECT_MODES_MAP[]; 296 static const QCameraMap WHITE_BALANCE_MODES_MAP[]; 297 static const QCameraMap SCENE_MODES_MAP[]; 298 static const QCameraMap FOCUS_MODES_MAP[]; 299 static const QCameraMap ANTIBANDING_MODES_MAP[]; 300 static const QCameraMap AE_FLASH_MODE_MAP[]; 301 static const QCameraMap FLASH_MODES_MAP[]; 302 static const QCameraMap FACEDETECT_MODES_MAP[]; 303 static const QCameraMap FOCUS_CALIBRATION_MAP[]; 304 static const QCameraMap TEST_PATTERN_MAP[]; 305 static const QCameraMap REFERENCE_ILLUMINANT_MAP[]; 306 307 static pthread_mutex_t mCameraSessionLock; 308 static unsigned int mCameraSessionActive; 309 }; 310 311 }; // namespace qcamera 312 313 #endif /* __QCAMERA2HARDWAREINTERFACE_H__ */ 314