blob: 97dcae81c7942f77ce1d2a9210a6760927ce076f [file] [log] [blame]
Thierry Strudel3d639192016-09-09 11:52:26 -07001/* Copyright (c) 2012-2016, The Linux Foundation. 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// System dependencies
34#include <camera/CameraMetadata.h>
35#include <pthread.h>
36#include <utils/KeyedVector.h>
37#include <utils/List.h>
Thierry Strudele80ad7c2016-12-06 10:16:27 -080038#include <map>
Thierry Strudel3d639192016-09-09 11:52:26 -070039// Camera dependencies
40#include "hardware/camera3.h"
41#include "QCamera3Channel.h"
42#include "QCamera3CropRegionMapper.h"
43#include "QCamera3HALHeader.h"
44#include "QCamera3Mem.h"
45#include "QCameraPerf.h"
46#include "QCameraCommon.h"
Thierry Strudel04e026f2016-10-10 11:27:36 -070047#include "QCamera3VendorTags.h"
Thierry Strudel3d639192016-09-09 11:52:26 -070048
Chien-Yu Chen8e599492016-11-01 13:37:46 -070049#include "HdrPlusClient.h"
50
Thierry Strudel3d639192016-09-09 11:52:26 -070051extern "C" {
52#include "mm_camera_interface.h"
53#include "mm_jpeg_interface.h"
54}
55
56using namespace android;
57
58namespace qcamera {
59
60#ifndef TRUE
61#define TRUE 1
62#endif
63
64#ifndef FALSE
65#define FALSE 0
66#endif
67
68/* Time related macros */
69typedef int64_t nsecs_t;
70#define NSEC_PER_SEC 1000000000LLU
71#define NSEC_PER_USEC 1000LLU
72#define NSEC_PER_33MSEC 33000000LLU
73
Thierry Strudele80ad7c2016-12-06 10:16:27 -080074/*Orchestrate Macros */
75#define EV_COMP_SETTLE_DELAY 2
76#define GB_HDR_HALF_STEP_EV -6
77#define GB_HDR_2X_STEP_EV 6
78
79#define FRAME_REGISTER_LRU_SIZE 256
80#define INTERNAL_FRAME_STARTING_NUMBER 800
81#define EMPTY_FRAMEWORK_FRAME_NUMBER 0xFFFFFFFF
82
Thierry Strudel3d639192016-09-09 11:52:26 -070083typedef enum {
84 SET_ENABLE,
85 SET_CONTROLENABLE,
86 SET_RELOAD_CHROMATIX,
87 SET_STATUS,
88} optype_t;
89
90#define MODULE_ALL 0
91
92extern volatile uint32_t gCamHal3LogLevel;
93
94class QCamera3MetadataChannel;
95class QCamera3PicChannel;
96class QCamera3HeapMemory;
97class QCamera3Exif;
98
99typedef struct {
100 camera3_stream_t *stream;
101 camera3_stream_buffer_set_t buffer_set;
102 stream_status_t status;
103 int registered;
104 QCamera3ProcessingChannel *channel;
105} stream_info_t;
106
107typedef struct {
108 // Stream handle
109 camera3_stream_t *stream;
110 // Buffer handle
111 buffer_handle_t *buffer;
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800112 // Buffer status
113 camera3_buffer_status_t bufStatus = CAMERA3_BUFFER_STATUS_OK;
Thierry Strudel3d639192016-09-09 11:52:26 -0700114} PendingBufferInfo;
115
116typedef struct {
117 // Frame number corresponding to request
118 uint32_t frame_number;
119 // Time when request queued into system
120 nsecs_t timestamp;
121 List<PendingBufferInfo> mPendingBufferList;
Chien-Yu Chene687bd02016-12-07 18:30:26 -0800122 bool hdrplus;
Thierry Strudel3d639192016-09-09 11:52:26 -0700123} PendingBuffersInRequest;
124
125class PendingBuffersMap {
126public:
127 // Number of outstanding buffers at flush
128 uint32_t numPendingBufsAtFlush;
129 // List of pending buffers per request
130 List<PendingBuffersInRequest> mPendingBuffersInRequest;
131 uint32_t get_num_overall_buffers();
132 void removeBuf(buffer_handle_t *buffer);
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800133 int32_t getBufErrStatus(buffer_handle_t *buffer);
Thierry Strudel3d639192016-09-09 11:52:26 -0700134};
135
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800136class FrameNumberRegistry {
137public:
138
139 FrameNumberRegistry();
140 ~FrameNumberRegistry();
141 int32_t allocStoreInternalFrameNumber(uint32_t frameworkFrameNumber,
142 uint32_t &internalFrameNumber);
143 int32_t generateStoreInternalFrameNumber(uint32_t &internalFrameNumber);
144 int32_t freeInternalFrameNumber(uint32_t internalFrameNumber);
145 int32_t getFrameworkFrameNumber(uint32_t internalFrameNumber, uint32_t &frameworkFrameNumber);
146 void purgeOldEntriesLocked();
147
148private:
149 std::map<uint32_t, uint32_t> _register;
150 uint32_t _nextFreeInternalNumber;
151 Mutex mRegistryLock;
152};
Thierry Strudel3d639192016-09-09 11:52:26 -0700153
Chien-Yu Chen8e599492016-11-01 13:37:46 -0700154class QCamera3HardwareInterface : HdrPlusClientListener {
Thierry Strudel3d639192016-09-09 11:52:26 -0700155public:
156 /* static variable and functions accessed by camera service */
157 static camera3_device_ops_t mCameraOps;
158 //Id of each session in bundle/link
159 static uint32_t sessionId[MM_CAMERA_MAX_NUM_SENSORS];
160 static int initialize(const struct camera3_device *,
161 const camera3_callback_ops_t *callback_ops);
162 static int configure_streams(const struct camera3_device *,
163 camera3_stream_configuration_t *stream_list);
164 static const camera_metadata_t* construct_default_request_settings(
165 const struct camera3_device *, int type);
166 static int process_capture_request(const struct camera3_device *,
167 camera3_capture_request_t *request);
168
169 static void dump(const struct camera3_device *, int fd);
170 static int flush(const struct camera3_device *);
171 static int close_camera_device(struct hw_device_t* device);
172
173public:
174 QCamera3HardwareInterface(uint32_t cameraId,
175 const camera_module_callbacks_t *callbacks);
176 virtual ~QCamera3HardwareInterface();
177 static void camEvtHandle(uint32_t camera_handle, mm_camera_event_t *evt,
178 void *user_data);
179 int openCamera(struct hw_device_t **hw_device);
180 camera_metadata_t* translateCapabilityToMetadata(int type);
181
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800182 typedef struct {
183 camera3_stream_t *stream;
184 bool need_metadata;
185 bool meteringOnly;
186 } InternalRequest;
187
Thierry Strudel3d639192016-09-09 11:52:26 -0700188 static int getCamInfo(uint32_t cameraId, struct camera_info *info);
Thierry Strudelcca4d9c2016-10-20 08:25:53 -0700189 static cam_capability_t *getCapabilities(mm_camera_ops_t *ops,
190 uint32_t cam_handle);
Thierry Strudel3d639192016-09-09 11:52:26 -0700191 static int initCapabilities(uint32_t cameraId);
192 static int initStaticMetadata(uint32_t cameraId);
193 static void makeTable(cam_dimension_t *dimTable, size_t size,
194 size_t max_size, int32_t *sizeTable);
195 static void makeFPSTable(cam_fps_range_t *fpsTable, size_t size,
196 size_t max_size, int32_t *fpsRangesTable);
197 static void makeOverridesList(cam_scene_mode_overrides_t *overridesTable,
198 size_t size, size_t max_size, uint8_t *overridesList,
199 uint8_t *supported_indexes, uint32_t camera_id);
200 static size_t filterJpegSizes(int32_t *jpegSizes, int32_t *processedSizes,
201 size_t processedSizesCnt, size_t maxCount, cam_rect_t active_array_size,
202 uint8_t downscale_factor);
203 static void convertToRegions(cam_rect_t rect, int32_t* region, int weight);
Chien-Yu Chen92724a82017-01-06 11:50:30 -0800204 static void convertFromRegions(cam_area_t &roi, const CameraMetadata &frame_settings,
Thierry Strudel3d639192016-09-09 11:52:26 -0700205 uint32_t tag);
206 static bool resetIfNeededROI(cam_area_t* roi, const cam_crop_region_t* scalerCropRegion);
Thierry Strudel3d639192016-09-09 11:52:26 -0700207 static int32_t getSensorSensitivity(int32_t iso_mode);
208
209 double computeNoiseModelEntryS(int32_t sensitivity);
210 double computeNoiseModelEntryO(int32_t sensitivity);
211
212 static void captureResultCb(mm_camera_super_buf_t *metadata,
213 camera3_stream_buffer_t *buffer, uint32_t frame_number,
214 bool isInputBuffer, void *userdata);
215
216 int initialize(const camera3_callback_ops_t *callback_ops);
217 int configureStreams(camera3_stream_configuration_t *stream_list);
218 int configureStreamsPerfLocked(camera3_stream_configuration_t *stream_list);
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800219 int processCaptureRequest(camera3_capture_request_t *request,
220 List<InternalRequest> &internalReqs);
221 int orchestrateRequest(camera3_capture_request_t *request);
222 void orchestrateResult(camera3_capture_result_t *result);
223 void orchestrateNotify(camera3_notify_msg_t *notify_msg);
224
Thierry Strudel3d639192016-09-09 11:52:26 -0700225 void dump(int fd);
226 int flushPerf();
227
228 int setFrameParameters(camera3_capture_request_t *request,
229 cam_stream_ID_t streamID, int blob_request, uint32_t snapshotStreamId);
230 int32_t setReprocParameters(camera3_capture_request_t *request,
231 metadata_buffer_t *reprocParam, uint32_t snapshotStreamId);
232 int translateToHalMetadata(const camera3_capture_request_t *request,
233 metadata_buffer_t *parm, uint32_t snapshotStreamId);
Chien-Yu Chen92724a82017-01-06 11:50:30 -0800234 int translateFwkMetadataToHalMetadata(const camera_metadata_t *frameworkMetadata,
235 metadata_buffer_t *hal_metadata, uint32_t snapshotStreamId, int64_t minFrameDuration);
Thierry Strudel3d639192016-09-09 11:52:26 -0700236 camera_metadata_t* translateCbUrgentMetadataToResultMetadata (
237 metadata_buffer_t *metadata);
238 camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
239 nsecs_t timestamp, int32_t request_id,
240 const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
Samuel Ha68ba5172016-12-15 18:41:12 -0800241 uint8_t capture_intent,
242 /* DevCamDebug metadata translateFromHalMetadata augment .h */
243 uint8_t DevCamDebug_meta_enable,
244 /* DevCamDebug metadata end */
245 bool pprocDone, uint8_t fwk_cacMode,
Thierry Strudel9e74aae2016-09-22 17:10:18 -0700246 bool firstMetadataInBatch);
Thierry Strudel3d639192016-09-09 11:52:26 -0700247 camera_metadata_t* saveRequestSettings(const CameraMetadata& jpegMetadata,
248 camera3_capture_request_t *request);
249 int initParameters();
250 void deinitParameters();
251 QCamera3ReprocessChannel *addOfflineReprocChannel(const reprocess_config_t &config,
252 QCamera3ProcessingChannel *inputChHandle);
253 bool needRotationReprocess();
254 bool needJpegExifRotation();
255 bool needReprocess(cam_feature_mask_t postprocess_mask);
256 bool needJpegRotation();
257 cam_denoise_process_type_t getWaveletDenoiseProcessPlate();
258 cam_denoise_process_type_t getTemporalDenoiseProcessPlate();
259
260 void captureResultCb(mm_camera_super_buf_t *metadata,
261 camera3_stream_buffer_t *buffer, uint32_t frame_number,
262 bool isInputBuffer);
263 cam_dimension_t calcMaxJpegDim();
264 bool needOnlineRotation();
265 uint32_t getJpegQuality();
266 QCamera3Exif *getExifData();
267 mm_jpeg_exif_params_t get3AExifParams();
268 uint8_t getMobicatMask();
269 static void getFlashInfo(const int cameraId,
270 bool& hasFlash,
271 char (&flashNode)[QCAMERA_MAX_FILEPATH_LENGTH]);
272 const char *getEepromVersionInfo();
273 const uint32_t *getLdafCalib();
274 void get3AVersion(cam_q3a_version_t &swVersion);
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800275 static void setBufferErrorStatus(QCamera3Channel*, uint32_t frameNumber,
276 camera3_buffer_status_t err, void *userdata);
277 void setBufferErrorStatus(QCamera3Channel*, uint32_t frameNumber,
278 camera3_buffer_status_t err);
Shuzhen Wangf6890e02016-08-12 14:28:54 -0700279 bool is60HzZone();
Thierry Strudel3d639192016-09-09 11:52:26 -0700280
281 // Get dual camera related info
282 bool isDeviceLinked() {return mIsDeviceLinked;}
283 bool isMainCamera() {return mIsMainCamera;}
284 uint32_t getSensorMountAngle();
285 const cam_related_system_calibration_data_t *getRelatedCalibrationData();
286
287 template <typename fwkType, typename halType> struct QCameraMap {
288 fwkType fwk_name;
289 halType hal_name;
290 };
291
292 typedef struct {
293 const char *const desc;
294 cam_cds_mode_type_t val;
295 } QCameraPropMap;
296
Thierry Strudel3d639192016-09-09 11:52:26 -0700297private:
298
299 // State transition conditions:
300 // "\" means not applicable
301 // "x" means not valid
302 // +------------+----------+----------+-------------+------------+---------+-------+--------+
303 // | | CLOSED | OPENED | INITIALIZED | CONFIGURED | STARTED | ERROR | DEINIT |
304 // +------------+----------+----------+-------------+------------+---------+-------+--------+
305 // | CLOSED | \ | open | x | x | x | x | x |
306 // +------------+----------+----------+-------------+------------+---------+-------+--------+
307 // | OPENED | close | \ | initialize | x | x | error | x |
308 // +------------+----------+----------+-------------+------------+---------+-------+--------+
309 // |INITIALIZED | close | x | \ | configure | x | error | x |
310 // +------------+----------+----------+-------------+------------+---------+-------+--------+
311 // | CONFIGURED | close | x | x | configure | request | error | x |
312 // +------------+----------+----------+-------------+------------+---------+-------+--------+
313 // | STARTED | close | x | x | configure | \ | error | x |
314 // +------------+----------+----------+-------------+------------+---------+-------+--------+
315 // | ERROR | close | x | x | x | x | \ | any |
316 // +------------+----------+----------+-------------+------------+---------+-------+--------+
317 // | DEINIT | close | x | x | x | x | x | \ |
318 // +------------+----------+----------+-------------+------------+---------+-------+--------+
319
320 typedef enum {
321 CLOSED,
322 OPENED,
323 INITIALIZED,
324 CONFIGURED,
325 STARTED,
326 ERROR,
327 DEINIT
328 } State;
329
330 int openCamera();
331 int closeCamera();
332 int flush(bool restartChannels);
333 static size_t calcMaxJpegSize(uint32_t camera_id);
334 cam_dimension_t getMaxRawSize(uint32_t camera_id);
335 static void addStreamConfig(Vector<int32_t> &available_stream_configs,
336 int32_t scalar_format, const cam_dimension_t &dim,
337 int32_t config_type);
338
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800339 int validateCaptureRequest(camera3_capture_request_t *request,
340 List<InternalRequest> &internallyRequestedStreams);
Thierry Strudel3d639192016-09-09 11:52:26 -0700341 int validateStreamDimensions(camera3_stream_configuration_t *streamList);
342 int validateStreamRotations(camera3_stream_configuration_t *streamList);
343 void deriveMinFrameDuration();
344 void handleBuffersDuringFlushLock(camera3_stream_buffer_t *buffer);
Thierry Strudel3d639192016-09-09 11:52:26 -0700345 int64_t getMinFrameDuration(const camera3_capture_request_t *request);
346 void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf,
Thierry Strudel9e74aae2016-09-22 17:10:18 -0700347 bool free_and_bufdone_meta_buf,
348 bool firstMetadataInBatch);
Thierry Strudel3d639192016-09-09 11:52:26 -0700349 void handleBatchMetadata(mm_camera_super_buf_t *metadata_buf,
350 bool free_and_bufdone_meta_buf);
351 void handleBufferWithLock(camera3_stream_buffer_t *buffer,
352 uint32_t frame_number);
353 void handleInputBufferWithLock(uint32_t frame_number);
Chien-Yu Chene687bd02016-12-07 18:30:26 -0800354 // Handle pending results when a new result metadata of a frame is received.
355 // Shutter and metadata callbacks are invoked in the order of frame number.
356 void handlePendingResultsWithLock(uint32_t frameNumber,
357 const camera_metadata_t *resultMetadata);
Thierry Strudel3d639192016-09-09 11:52:26 -0700358 void unblockRequestIfNecessary();
359 void dumpMetadataToFile(tuning_params_t &meta, uint32_t &dumpFrameCount,
360 bool enabled, const char *type, uint32_t frameNumber);
361 static void getLogLevel();
362
363 void cleanAndSortStreamInfo();
364 void extractJpegMetadata(CameraMetadata& jpegMetadata,
365 const camera3_capture_request_t *request);
366
367 bool isSupportChannelNeeded(camera3_stream_configuration_t *streamList,
368 cam_stream_size_info_t stream_config_info);
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800369 bool isHdrSnapshotRequest(camera3_capture_request *request);
Thierry Strudel3d639192016-09-09 11:52:26 -0700370 int32_t setMobicat();
371
Chien-Yu Chen8e599492016-11-01 13:37:46 -0700372 int32_t getSensorModeInfo(cam_sensor_mode_info_t &sensorModeInfo);
Thierry Strudel3d639192016-09-09 11:52:26 -0700373 int32_t setHalFpsRange(const CameraMetadata &settings,
374 metadata_buffer_t *hal_metadata);
375 int32_t extractSceneMode(const CameraMetadata &frame_settings, uint8_t metaMode,
376 metadata_buffer_t *hal_metadata);
Thierry Strudel04e026f2016-10-10 11:27:36 -0700377 int32_t setVideoHdrMode(metadata_buffer_t *hal_metadata,
378 cam_video_hdr_mode_t vhdr);
Thierry Strudel3d639192016-09-09 11:52:26 -0700379 int32_t numOfSizesOnEncoder(const camera3_stream_configuration_t *streamList,
380 const cam_dimension_t &maxViewfinderSize);
381
382 void addToPPFeatureMask(int stream_format, uint32_t stream_idx);
383 void updateFpsInPreviewBuffer(metadata_buffer_t *metadata, uint32_t frame_number);
Thierry Strudelcca4d9c2016-10-20 08:25:53 -0700384 void updateTimeStampInPendingBuffers(uint32_t frameNumber, nsecs_t timestamp);
Thierry Strudel3d639192016-09-09 11:52:26 -0700385
386 void enablePowerHint();
387 void disablePowerHint();
388 int32_t dynamicUpdateMetaStreamInfo();
389 int32_t startAllChannels();
390 int32_t stopAllChannels();
391 int32_t notifyErrorForPendingRequests();
Thierry Strudel9e74aae2016-09-22 17:10:18 -0700392 void notifyError(uint32_t frameNumber,
393 camera3_error_msg_code_t errorCode);
Thierry Strudel3d639192016-09-09 11:52:26 -0700394 int32_t getReprocessibleOutputStreamId(uint32_t &id);
395 int32_t handleCameraDeviceError();
396
397 bool isOnEncoder(const cam_dimension_t max_viewfinder_size,
398 uint32_t width, uint32_t height);
399 void hdrPlusPerfLock(mm_camera_super_buf_t *metadata_buf);
400
401 static bool supportBurstCapture(uint32_t cameraId);
402 int32_t setBundleInfo();
Thierry Strudel295a0ca2016-11-03 18:38:47 -0700403 int32_t setInstantAEC(const CameraMetadata &meta);
Thierry Strudel3d639192016-09-09 11:52:26 -0700404
Thierry Strudel04e026f2016-10-10 11:27:36 -0700405 static void convertLandmarks(cam_face_landmarks_info_t face, int32_t* landmarks);
406 static void setInvalidLandmarks(int32_t* landmarks);
407
Thierry Strudel3d639192016-09-09 11:52:26 -0700408 static void setPAAFSupport(cam_feature_mask_t& feature_mask,
409 cam_stream_type_t stream_type,
410 cam_color_filter_arrangement_t filter_arrangement);
Mansoor Aftab58465fa2017-01-26 15:02:44 -0800411 int32_t setSensorHDR(metadata_buffer_t *hal_metadata, bool enable,
412 bool isVideoHdrEnable = false);
Thierry Strudel3d639192016-09-09 11:52:26 -0700413
Shuzhen Wanga5da1022016-07-13 20:18:42 -0700414 template <typename T>
415 static void adjustBlackLevelForCFA(T input[BLACK_LEVEL_PATTERN_CNT],
416 T output[BLACK_LEVEL_PATTERN_CNT],
417 cam_color_filter_arrangement_t color_arrangement);
418
Thierry Strudel3d639192016-09-09 11:52:26 -0700419 camera3_device_t mCameraDevice;
420 uint32_t mCameraId;
421 mm_camera_vtbl_t *mCameraHandle;
422 bool mCameraInitialized;
423 camera_metadata_t *mDefaultMetadata[CAMERA3_TEMPLATE_COUNT];
424 const camera3_callback_ops_t *mCallbackOps;
425
426 QCamera3MetadataChannel *mMetadataChannel;
427 QCamera3PicChannel *mPictureChannel;
428 QCamera3RawChannel *mRawChannel;
429 QCamera3SupportChannel *mSupportChannel;
430 QCamera3SupportChannel *mAnalysisChannel;
431 QCamera3RawDumpChannel *mRawDumpChannel;
Chien-Yu Chen8e599492016-11-01 13:37:46 -0700432 QCamera3HdrPlusRawSrcChannel *mHdrPlusRawSrcChannel;
Thierry Strudel3d639192016-09-09 11:52:26 -0700433 QCamera3RegularChannel *mDummyBatchChannel;
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800434 QCameraPerfLockMgr mPerfLockMgr;
Thierry Strudel3d639192016-09-09 11:52:26 -0700435 QCameraCommon mCommon;
436
437 uint32_t mChannelHandle;
438
439 void saveExifParams(metadata_buffer_t *metadata);
440 mm_jpeg_exif_params_t mExifParams;
441
442 //First request yet to be processed after configureStreams
443 bool mFirstConfiguration;
444 bool mFlush;
445 bool mFlushPerf;
446 bool mEnableRawDump;
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800447 bool mForceHdrSnapshot;
Thierry Strudel3d639192016-09-09 11:52:26 -0700448 QCamera3HeapMemory *mParamHeap;
449 metadata_buffer_t* mParameters;
450 metadata_buffer_t* mPrevParameters;
451 CameraMetadata mCurJpegMeta;
452 bool m_bIsVideo;
453 bool m_bIs4KVideo;
454 bool m_bEisSupportedSize;
455 bool m_bEisEnable;
Thierry Strudel9e74aae2016-09-22 17:10:18 -0700456 bool m_bEisSupported;
Thierry Strudel3d639192016-09-09 11:52:26 -0700457 typedef struct {
458 cam_dimension_t dim;
459 int format;
460 uint32_t usage;
461 } InputStreamInfo;
462
463 InputStreamInfo mInputStreamInfo;
464 uint8_t m_MobicatMask;
465 uint8_t m_bTnrEnabled;
466 int8_t mSupportedFaceDetectMode;
467 uint8_t m_bTnrPreview;
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800468 uint8_t m_bSwTnrPreview;
Thierry Strudel3d639192016-09-09 11:52:26 -0700469 uint8_t m_bTnrVideo;
470 uint8_t m_debug_avtimer;
471
472 /* Data structure to store pending request */
473 typedef struct {
474 camera3_stream_t *stream;
475 camera3_stream_buffer_t *buffer;
476 // metadata needs to be consumed by the corresponding stream
477 // in order to generate the buffer.
478 bool need_metadata;
479 } RequestedBufferInfo;
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800480
Thierry Strudel3d639192016-09-09 11:52:26 -0700481 typedef struct {
482 uint32_t frame_number;
483 uint32_t num_buffers;
484 int32_t request_id;
485 List<RequestedBufferInfo> buffers;
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800486 List<InternalRequest> internalRequestList;
Thierry Strudel3d639192016-09-09 11:52:26 -0700487 int blob_request;
488 uint8_t bUrgentReceived;
489 nsecs_t timestamp;
490 camera3_stream_buffer_t *input_buffer;
491 const camera_metadata_t *settings;
Chien-Yu Chene687bd02016-12-07 18:30:26 -0800492 const camera_metadata_t *resultMetadata; // Result metadata for this request.
Thierry Strudel3d639192016-09-09 11:52:26 -0700493 CameraMetadata jpegMetadata;
494 uint8_t pipeline_depth;
495 uint32_t partial_result_cnt;
496 uint8_t capture_intent;
497 uint8_t fwkCacMode;
498 bool shutter_notified;
Samuel Ha68ba5172016-12-15 18:41:12 -0800499 /* DevCamDebug metadata PendingRequestInfo */
500 uint8_t DevCamDebug_meta_enable;
501 /* DevCamDebug metadata end */
Chien-Yu Chene687bd02016-12-07 18:30:26 -0800502
503 bool hdrplus; // If this is an HDR+ request.
Thierry Strudel3d639192016-09-09 11:52:26 -0700504 } PendingRequestInfo;
505 typedef struct {
506 uint32_t frame_number;
507 uint32_t stream_ID;
508 } PendingFrameDropInfo;
509
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800510 class FrameNumberRegistry _orchestrationDb;
Thierry Strudel3d639192016-09-09 11:52:26 -0700511 typedef KeyedVector<uint32_t, Vector<PendingBufferInfo> > FlushMap;
512 typedef List<QCamera3HardwareInterface::PendingRequestInfo>::iterator
513 pendingRequestIterator;
514 typedef List<QCamera3HardwareInterface::RequestedBufferInfo>::iterator
515 pendingBufferIterator;
516
Thierry Strudel3d639192016-09-09 11:52:26 -0700517 List<PendingRequestInfo> mPendingRequestsList;
518 List<PendingFrameDropInfo> mPendingFrameDropList;
519 /* Use last frame number of the batch as key and first frame number of the
520 * batch as value for that key */
521 KeyedVector<uint32_t, uint32_t> mPendingBatchMap;
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800522 cam_stream_ID_t mBatchedStreamsArray;
Thierry Strudel3d639192016-09-09 11:52:26 -0700523
524 PendingBuffersMap mPendingBuffersMap;
525 pthread_cond_t mRequestCond;
526 uint32_t mPendingLiveRequest;
527 bool mWokenUpByDaemon;
528 int32_t mCurrentRequestId;
529 cam_stream_size_info_t mStreamConfigInfo;
530
531 //mutex for serialized access to camera3_device_ops_t functions
532 pthread_mutex_t mMutex;
533
534 //condition used to signal flush after buffers have returned
535 pthread_cond_t mBuffersCond;
536
537 List<stream_info_t*> mStreamInfo;
538
539 int64_t mMinProcessedFrameDuration;
540 int64_t mMinJpegFrameDuration;
541 int64_t mMinRawFrameDuration;
542
543 uint32_t mMetaFrameCount;
544 bool mUpdateDebugLevel;
545 const camera_module_callbacks_t *mCallbacks;
546
547 uint8_t mCaptureIntent;
548 uint8_t mCacMode;
Samuel Ha68ba5172016-12-15 18:41:12 -0800549 // DevCamDebug metadata internal variable
550 uint8_t mDevCamDebugMetaEnable;
551 /* DevCamDebug metadata end */
552
Thierry Strudel3d639192016-09-09 11:52:26 -0700553 metadata_buffer_t mReprocMeta; //scratch meta buffer
554 /* 0: Not batch, non-zero: Number of image buffers in a batch */
555 uint8_t mBatchSize;
556 // Used only in batch mode
557 uint8_t mToBeQueuedVidBufs;
558 // Fixed video fps
559 float mHFRVideoFps;
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800560public:
Thierry Strudel3d639192016-09-09 11:52:26 -0700561 uint8_t mOpMode;
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800562private:
Thierry Strudel3d639192016-09-09 11:52:26 -0700563 uint32_t mFirstFrameNumberInBatch;
564 camera3_stream_t mDummyBatchStream;
565 bool mNeedSensorRestart;
Thierry Strudelc2ee3302016-11-17 12:33:12 -0800566 bool mPreviewStarted;
Thierry Strudel9e74aae2016-09-22 17:10:18 -0700567 uint32_t mMinInFlightRequests;
568 uint32_t mMaxInFlightRequests;
Thierry Strudel295a0ca2016-11-03 18:38:47 -0700569 // Param to trigger instant AEC.
570 bool mInstantAEC;
571 // Param to know when to reset AEC
572 bool mResetInstantAEC;
573 // Frame number, untill which we need to drop the frames.
574 uint32_t mInstantAECSettledFrameNumber;
575 // Max number of frames, that HAL will hold without displaying, for instant AEC mode.
576 uint8_t mAecSkipDisplayFrameBound;
577 // Counter to keep track of number of frames that took for AEC convergence.
578 uint8_t mInstantAecFrameIdxCount;
Thierry Strudel3d639192016-09-09 11:52:26 -0700579 /* sensor output size with current stream configuration */
580 QCamera3CropRegionMapper mCropRegionMapper;
581
582 /* Ldaf calibration data */
583 bool mLdafCalibExist;
584 uint32_t mLdafCalib[2];
Thierry Strudel3d639192016-09-09 11:52:26 -0700585 int32_t mLastCustIntentFrmNum;
Thierry Strudel9e74aae2016-09-22 17:10:18 -0700586 CameraMetadata mCachedMetadata;
Thierry Strudel3d639192016-09-09 11:52:26 -0700587
588 static const QCameraMap<camera_metadata_enum_android_control_effect_mode_t,
589 cam_effect_mode_type> EFFECT_MODES_MAP[];
590 static const QCameraMap<camera_metadata_enum_android_control_awb_mode_t,
591 cam_wb_mode_type> WHITE_BALANCE_MODES_MAP[];
592 static const QCameraMap<camera_metadata_enum_android_control_scene_mode_t,
593 cam_scene_mode_type> SCENE_MODES_MAP[];
594 static const QCameraMap<camera_metadata_enum_android_control_af_mode_t,
595 cam_focus_mode_type> FOCUS_MODES_MAP[];
596 static const QCameraMap<camera_metadata_enum_android_color_correction_aberration_mode_t,
597 cam_aberration_mode_t> COLOR_ABERRATION_MAP[];
598 static const QCameraMap<camera_metadata_enum_android_control_ae_antibanding_mode_t,
599 cam_antibanding_mode_type> ANTIBANDING_MODES_MAP[];
600 static const QCameraMap<camera_metadata_enum_android_lens_state_t,
601 cam_af_lens_state_t> LENS_STATE_MAP[];
602 static const QCameraMap<camera_metadata_enum_android_control_ae_mode_t,
603 cam_flash_mode_t> AE_FLASH_MODE_MAP[];
604 static const QCameraMap<camera_metadata_enum_android_flash_mode_t,
605 cam_flash_mode_t> FLASH_MODES_MAP[];
606 static const QCameraMap<camera_metadata_enum_android_statistics_face_detect_mode_t,
607 cam_face_detect_mode_t> FACEDETECT_MODES_MAP[];
608 static const QCameraMap<camera_metadata_enum_android_lens_info_focus_distance_calibration_t,
609 cam_focus_calibration_t> FOCUS_CALIBRATION_MAP[];
610 static const QCameraMap<camera_metadata_enum_android_sensor_test_pattern_mode_t,
611 cam_test_pattern_mode_t> TEST_PATTERN_MAP[];
Thierry Strudel04e026f2016-10-10 11:27:36 -0700612 static const QCameraMap<camera_metadata_enum_android_video_hdr_mode_t,
613 cam_video_hdr_mode_t> VIDEO_HDR_MODES_MAP[];
Thierry Strudel3d639192016-09-09 11:52:26 -0700614 static const QCameraMap<camera_metadata_enum_android_sensor_reference_illuminant1_t,
615 cam_illuminat_t> REFERENCE_ILLUMINANT_MAP[];
616 static const QCameraMap<int32_t,
617 cam_hfr_mode_t> HFR_MODE_MAP[];
Thierry Strudel04e026f2016-10-10 11:27:36 -0700618 static const QCameraMap<camera_metadata_enum_android_ir_mode_t,
619 cam_ir_mode_type_t> IR_MODES_MAP[];
Thierry Strudel295a0ca2016-11-03 18:38:47 -0700620 static const QCameraMap<qcamera3_ext_instant_aec_mode_t,
621 cam_aec_convergence_type> INSTANT_AEC_MODES_MAP[];
Thierry Strudel3d639192016-09-09 11:52:26 -0700622 static const QCameraPropMap CDS_MAP[];
623
624 pendingRequestIterator erasePendingRequest(pendingRequestIterator i);
625 //GPU library to read buffer padding details.
626 void *lib_surface_utils;
627 int (*LINK_get_surface_pixel_alignment)();
628 uint32_t mSurfaceStridePadding;
629
630 State mState;
631 //Dual camera related params
632 bool mIsDeviceLinked;
633 bool mIsMainCamera;
634 uint8_t mLinkedCameraId;
Thierry Strudel295a0ca2016-11-03 18:38:47 -0700635 QCamera3HeapMemory *m_pDualCamCmdHeap;
636 cam_dual_camera_cmd_info_t *m_pDualCamCmdPtr;
Thierry Strudel3d639192016-09-09 11:52:26 -0700637 cam_sync_related_sensors_event_info_t m_relCamSyncInfo;
Thierry Strudele80ad7c2016-12-06 10:16:27 -0800638 Mutex mFlushLock;
Shuzhen Wangf6890e02016-08-12 14:28:54 -0700639 bool m60HzZone;
640
Chien-Yu Chen8e599492016-11-01 13:37:46 -0700641 // Stream IDs used in stream configuration with HDR+ client.
642 const static uint32_t kPbRaw10InputStreamId = 0;
643 const static uint32_t kPbYuvOutputStreamId = 1;
644 const static uint32_t kPbRaw16OutputStreamId = 2;
645
Chien-Yu Chene687bd02016-12-07 18:30:26 -0800646 // Issue an additional RAW for every 10 requests to control RAW capture rate. Requesting RAW
647 // too often will cause frame drops due to latency of sending RAW to HDR+ service.
648 const static uint32_t kHdrPlusRawPeriod = 10;
649
650 // Define a pending HDR+ request submitted to HDR+ service and not yet received by HAL.
651 struct HdrPlusPendingRequest {
652 // YUV buffer from QCamera3PicChannel to be filled by HDR+ client with an HDR+ processed
653 // frame.
654 std::shared_ptr<mm_camera_buf_def_t> yuvBuffer;
655
656 // Output buffers in camera framework's request.
657 std::vector<camera3_stream_buffer_t> frameworkOutputBuffers;
658
659 // Settings in camera framework's request.
660 std::shared_ptr<metadata_buffer_t> settings;
661 };
662
Chien-Yu Chen8e599492016-11-01 13:37:46 -0700663 // Fill pbcamera::StreamConfiguration based on the channel stream.
664 status_t fillPbStreamConfig(pbcamera::StreamConfiguration *config, uint32_t pbStreamId,
665 int pbStreamFormat, QCamera3Channel *channel, uint32_t streamIndex);
666
Chien-Yu Chen200b2ce2017-02-01 15:03:02 -0800667 // Configure streams for HDR+.
668 status_t configureHdrPlusStreamsLocked(const cam_sensor_mode_info_t &sensor_mode_info);
669
670 // Try to submit an HDR+ request. Returning true if an HDR+ request was submitted. Returning
671 // false if it is not an HDR+ request or submitting an HDR+ request failed.
672 bool trySubmittingHdrPlusRequest(HdrPlusPendingRequest *hdrPlusRequest,
673 const camera3_capture_request_t &request, const CameraMetadata &metadata);
674
Chien-Yu Chen92724a82017-01-06 11:50:30 -0800675 // Update HDR+ result metadata with the still capture's request settings.
676 void updateHdrPlusResultMetadata(CameraMetadata &resultMetadata,
677 std::shared_ptr<metadata_buffer_t> settings);
678
Chien-Yu Chen8e599492016-11-01 13:37:46 -0700679 // HDR+ client callbacks.
680 void onCaptureResult(pbcamera::CaptureResult *result,
681 const camera_metadata_t &resultMetadata) override;
682 void onFailedCaptureResult(pbcamera::CaptureResult *failedResult) override;
683
684 std::shared_ptr<HdrPlusClient> mHdrPlusClient;
Chien-Yu Chene687bd02016-12-07 18:30:26 -0800685
686 // Map from frame number to frame. Must be protected by mHdrPlusPendingRequestsLock.
687 std::map<uint32_t, HdrPlusPendingRequest> mHdrPlusPendingRequests;
688 Mutex mHdrPlusPendingRequestsLock;
Mansoor Aftab58465fa2017-01-26 15:02:44 -0800689 bool m_bSensorHDREnabled;
Thierry Strudel3d639192016-09-09 11:52:26 -0700690};
691
692}; // namespace qcamera
693
694#endif /* __QCAMERA2HARDWAREINTERFACE_H__ */