Home | History | Annotate | Download | only in HAL3
      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 #ifdef CDBG
     48 #undef CDBG
     49 #endif //#ifdef CDBG
     50 #define CDBG(fmt, args...) ALOGD_IF(gCamHal3LogLevel >= 2, fmt, ##args)
     51 
     52 #ifdef CDBG_HIGH
     53 #undef CDBG_HIGH
     54 #endif //#ifdef CDBG_HIGH
     55 #define CDBG_HIGH(fmt, args...) ALOGD_IF(gCamHal3LogLevel >= 1, fmt, ##args)
     56 
     57 using namespace android;
     58 
     59 namespace qcamera {
     60 
     61 #ifndef TRUE
     62 #define TRUE 1
     63 #endif
     64 
     65 #ifndef FALSE
     66 #define FALSE 0
     67 #endif
     68 
     69 /* Time related macros */
     70 typedef int64_t nsecs_t;
     71 #define NSEC_PER_SEC 1000000000LL
     72 #define NSEC_PER_USEC 1000
     73 #define NSEC_PER_33MSEC 33000000LL
     74 
     75 extern volatile uint32_t gCamHal3LogLevel;
     76 
     77 class QCamera3MetadataChannel;
     78 class QCamera3PicChannel;
     79 class QCamera3HeapMemory;
     80 class QCamera3Exif;
     81 
     82 typedef struct {
     83     camera3_stream_t *stream;
     84     camera3_stream_buffer_set_t buffer_set;
     85     stream_status_t status;
     86     int registered;
     87     QCamera3Channel *channel;
     88 } stream_info_t;
     89 
     90 class QCamera3HardwareInterface {
     91 public:
     92     /* static variable and functions accessed by camera service */
     93     static camera3_device_ops_t mCameraOps;
     94     static int initialize(const struct camera3_device *,
     95                 const camera3_callback_ops_t *callback_ops);
     96     static int configure_streams(const struct camera3_device *,
     97                 camera3_stream_configuration_t *stream_list);
     98     static const camera_metadata_t* construct_default_request_settings(
     99                                 const struct camera3_device *, int type);
    100     static int process_capture_request(const struct camera3_device *,
    101                                 camera3_capture_request_t *request);
    102 
    103     static void dump(const struct camera3_device *, int fd);
    104     static int flush(const struct camera3_device *);
    105     static int close_camera_device(struct hw_device_t* device);
    106 
    107 public:
    108     QCamera3HardwareInterface(int cameraId,
    109             const camera_module_callbacks_t *callbacks);
    110     virtual ~QCamera3HardwareInterface();
    111     static void camEvtHandle(uint32_t camera_handle, mm_camera_event_t *evt,
    112                                           void *user_data);
    113     int openCamera(struct hw_device_t **hw_device);
    114     int getMetadata(int type);
    115     camera_metadata_t* translateCapabilityToMetadata(int type);
    116 
    117     static int getCamInfo(int cameraId, struct camera_info *info);
    118     static int initCapabilities(int cameraId);
    119     static int initStaticMetadata(int cameraId);
    120     static void makeTable(cam_dimension_t* dimTable, uint8_t size, int32_t* sizeTable);
    121     static void makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
    122                                           int32_t* fpsRangesTable);
    123     static void makeOverridesList(cam_scene_mode_overrides_t* overridesTable, uint8_t size,
    124                                    uint8_t* overridesList, uint8_t* supported_indexes, int camera_id);
    125     static uint8_t filterJpegSizes(int32_t* jpegSizes, int32_t* processedSizes,
    126                                    uint8_t processedSizesCnt, uint8_t maxCount,
    127                                    cam_rect_t active_array_size, uint8_t downscale_factor);
    128     static void convertToRegions(cam_rect_t rect, int32_t* region, int weight);
    129     static void convertFromRegions(cam_area_t* roi, const camera_metadata_t *settings,
    130                                    uint32_t tag);
    131     static bool resetIfNeededROI(cam_area_t* roi, const cam_crop_region_t* scalerCropRegion);
    132     static void convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks);
    133     static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
    134                                             void *userdata);
    135     static int32_t getScalarFormat(int32_t format);
    136     static int32_t getSensorSensitivity(int32_t iso_mode);
    137 
    138     static double computeNoiseModelEntryS(int32_t sensitivity);
    139     static double computeNoiseModelEntryO(int32_t sensitivity);
    140 
    141     static void captureResultCb(mm_camera_super_buf_t *metadata,
    142                 camera3_stream_buffer_t *buffer, uint32_t frame_number,
    143                 void *userdata);
    144 
    145     int initialize(const camera3_callback_ops_t *callback_ops);
    146     int configureStreams(camera3_stream_configuration_t *stream_list);
    147     int processCaptureRequest(camera3_capture_request_t *request);
    148     void dump(int fd);
    149     int flush();
    150 
    151     int setFrameParameters(camera3_capture_request_t *request,
    152             cam_stream_ID_t streamID, uint32_t snapshotStreamId);
    153     int32_t setReprocParameters(camera3_capture_request_t *request,
    154             metadata_buffer_t *reprocParam, uint32_t snapshotStreamId);
    155     int translateToHalMetadata(const camera3_capture_request_t *request,
    156             metadata_buffer_t *parm, uint32_t snapshotStreamId);
    157     camera_metadata_t* translateCbUrgentMetadataToResultMetadata (
    158                              metadata_buffer_t *metadata);
    159 
    160     camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
    161                             nsecs_t timestamp, int32_t request_id,
    162                             const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
    163                             uint8_t capture_intent);
    164     int getJpegSettings(const camera_metadata_t *settings);
    165     int initParameters();
    166     void deinitParameters();
    167     QCamera3ReprocessChannel *addOfflineReprocChannel(const reprocess_config_t &config,
    168             QCamera3PicChannel *picChHandle, metadata_buffer_t *metadata);
    169     bool needRotationReprocess();
    170     bool needReprocess(uint32_t postprocess_mask);
    171     bool needJpegRotation();
    172     bool isWNREnabled();
    173     bool isCACEnabled();
    174     cam_denoise_process_type_t getWaveletDenoiseProcessPlate();
    175 
    176     void captureResultCb(mm_camera_super_buf_t *metadata,
    177                 camera3_stream_buffer_t *buffer, uint32_t frame_number);
    178 
    179     typedef struct {
    180         uint32_t fwk_name;
    181         uint8_t hal_name;
    182     } QCameraMap;
    183 
    184     typedef struct {
    185         const char *const desc;
    186         cam_cds_mode_type_t val;
    187     } QCameraPropMap;
    188 
    189 private:
    190 
    191     int openCamera();
    192     int closeCamera();
    193     int AddSetParmEntryToBatch(parm_buffer_t *p_table,
    194                                cam_intf_parm_type_t paramType,
    195                                uint32_t paramLength,
    196                                void *paramValue);
    197     static int8_t lookupHalName(const QCameraMap arr[],
    198                       int len, unsigned int fwk_name);
    199     static int32_t lookupFwkName(const QCameraMap arr[],
    200                       int len, int hal_name);
    201     static cam_cds_mode_type_t lookupProp(const QCameraPropMap arr[],
    202             int len, const char *name);
    203     static int calcMaxJpegSize(uint8_t camera_id);
    204     cam_dimension_t getMaxRawSize(uint8_t camera_id);
    205 
    206     int validateCaptureRequest(camera3_capture_request_t *request);
    207     int validateStreamDimensions(camera3_stream_configuration_t *streamList);
    208     void deriveMinFrameDuration();
    209     int32_t handlePendingReprocResults(uint32_t frame_number);
    210     int64_t getMinFrameDuration(const camera3_capture_request_t *request);
    211     void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf);
    212     void handleBufferWithLock(camera3_stream_buffer_t *buffer,
    213         uint32_t frame_number);
    214     void unblockRequestIfNecessary();
    215     void dumpMetadataToFile(tuning_params_t &meta,
    216                             uint32_t &dumpFrameCount,
    217                             int32_t enabled,
    218                             const char *type,
    219                             uint32_t frameNumber);
    220     static void getLogLevel();
    221 
    222     void cleanAndSortStreamInfo();
    223     int queueReprocMetadata(metadata_buffer_t *metadata);
    224     void extractJpegMetadata(CameraMetadata& jpegMetadata,
    225             const camera3_capture_request_t *request);
    226     bool isSupportChannelNeeded(camera3_stream_configuration_t *streamList);
    227 public:
    228     cam_dimension_t calcMaxJpegDim();
    229     bool needOnlineRotation();
    230     int getJpegQuality();
    231     QCamera3Exif *getExifData();
    232 private:
    233     camera3_device_t   mCameraDevice;
    234     uint8_t            mCameraId;
    235     mm_camera_vtbl_t  *mCameraHandle;
    236     bool               mCameraOpened;
    237     bool               mCameraInitialized;
    238     camera_metadata_t *mDefaultMetadata[CAMERA3_TEMPLATE_COUNT];
    239     int mBlobRequest;
    240 
    241     const camera3_callback_ops_t *mCallbackOps;
    242 
    243     camera3_stream_t *mInputStream;
    244     QCamera3MetadataChannel *mMetadataChannel;
    245     QCamera3PicChannel *mPictureChannel;
    246     QCamera3RawChannel *mRawChannel;
    247     QCamera3SupportChannel *mSupportChannel;
    248     QCamera3RawDumpChannel *mRawDumpChannel;
    249 
    250      //First request yet to be processed after configureStreams
    251     bool mFirstRequest;
    252     bool mFlush;
    253     bool mEnableRawDump;
    254     QCamera3HeapMemory *mParamHeap;
    255     metadata_buffer_t* mParameters;
    256     bool m_bWNROn;
    257     bool m_bIsVideo;
    258     bool m_bIs4KVideo;
    259     uint8_t mEisEnable;
    260 
    261     /* Data structure to store pending request */
    262     typedef struct {
    263         camera3_stream_t *stream;
    264         camera3_stream_buffer_t *buffer;
    265     } RequestedBufferInfo;
    266     typedef struct {
    267         uint32_t frame_number;
    268         uint32_t num_buffers;
    269         int32_t request_id;
    270         List<RequestedBufferInfo> buffers;
    271         int blob_request;
    272         uint8_t bUrgentReceived;
    273         nsecs_t timestamp;
    274         camera3_stream_buffer_t *input_buffer;
    275         const camera_metadata_t *settings;
    276         CameraMetadata jpegMetadata;
    277         uint8_t pipeline_depth;
    278         uint32_t partial_result_cnt;
    279         uint8_t capture_intent;
    280     } PendingRequestInfo;
    281     typedef struct {
    282         uint32_t frame_number;
    283         uint32_t stream_ID;
    284     } PendingFrameDropInfo;
    285 
    286     // Store the Pending buffers for Flushing
    287     typedef struct {
    288         // Frame number pertaining to the buffer
    289         uint32_t frame_number;
    290         camera3_stream_t *stream;
    291         // Buffer handle
    292         buffer_handle_t *buffer;
    293     } PendingBufferInfo;
    294 
    295     typedef struct {
    296         // Total number of buffer requests pending
    297         uint32_t num_buffers;
    298         // List of pending buffers
    299         List<PendingBufferInfo> mPendingBufferList;
    300     } PendingBuffersMap;
    301 
    302     typedef struct {
    303         camera3_notify_msg_t notify_msg;
    304         camera3_stream_buffer_t buffer;
    305         uint32_t frame_number;
    306     } PendingReprocessResult;
    307 
    308     typedef KeyedVector<uint32_t, Vector<PendingBufferInfo> > FlushMap;
    309 
    310     List<PendingReprocessResult> mPendingReprocessResultList;
    311     List<PendingRequestInfo> mPendingRequestsList;
    312     List<PendingFrameDropInfo> mPendingFrameDropList;
    313     PendingBuffersMap mPendingBuffersMap;
    314     pthread_cond_t mRequestCond;
    315     int mPendingRequest;
    316     bool mWokenUpByDaemon;
    317     int32_t mCurrentRequestId;
    318     camera3_capture_result_t *mLoopBackResult;
    319     nsecs_t mLoopBackTimestamp;
    320 
    321     //mutex for serialized access to camera3_device_ops_t functions
    322     pthread_mutex_t mMutex;
    323 
    324     List<stream_info_t*> mStreamInfo;
    325 
    326     int64_t mMinProcessedFrameDuration;
    327     int64_t mMinJpegFrameDuration;
    328     int64_t mMinRawFrameDuration;
    329     power_module_t *m_pPowerModule;   // power module
    330 
    331     uint32_t mMetaFrameCount;
    332     const camera_module_callbacks_t *mCallbacks;
    333 
    334     uint8_t mCaptureIntent;
    335 
    336     static const QCameraMap EFFECT_MODES_MAP[];
    337     static const QCameraMap WHITE_BALANCE_MODES_MAP[];
    338     static const QCameraMap SCENE_MODES_MAP[];
    339     static const QCameraMap FOCUS_MODES_MAP[];
    340     static const QCameraMap COLOR_ABERRATION_MAP[];
    341     static const QCameraMap ANTIBANDING_MODES_MAP[];
    342     static const QCameraMap AE_FLASH_MODE_MAP[];
    343     static const QCameraMap FLASH_MODES_MAP[];
    344     static const QCameraMap FACEDETECT_MODES_MAP[];
    345     static const QCameraMap FOCUS_CALIBRATION_MAP[];
    346     static const QCameraMap TEST_PATTERN_MAP[];
    347     static const QCameraMap REFERENCE_ILLUMINANT_MAP[];
    348     static const QCameraPropMap CDS_MAP[];
    349 };
    350 
    351 }; // namespace qcamera
    352 
    353 #endif /* __QCAMERA2HARDWAREINTERFACE_H__ */
    354