166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without
466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are
566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met:
666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*     * Redistributions of source code must retain the above copyright
766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       notice, this list of conditions and the following disclaimer.
866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*     * Redistributions in binary form must reproduce the above
966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       copyright notice, this list of conditions and the following
1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       disclaimer in the documentation and/or other materials provided
1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       with the distribution.
1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*     * Neither the name of The Linux Foundation nor the names of its
1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       contributors may be used to endorse or promote products derived
1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       from this software without specific prior written permission.
1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/
2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef __QCAMERA3HARDWAREINTERFACE_H__
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define __QCAMERA3HARDWAREINTERFACE_H__
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <camera/CameraMetadata.h>
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <pthread.h>
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/KeyedVector.h>
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/List.h>
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "camera3.h"
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera3Channel.h"
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera3CropRegionMapper.h"
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera3HALHeader.h"
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera3Mem.h"
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraPerf.h"
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" {
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_interface.h"
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_interface.h"
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace android;
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera {
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef TRUE
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define TRUE 1
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef FALSE
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define FALSE 0
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Time related macros */
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef int64_t nsecs_t;
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define NSEC_PER_SEC 1000000000LLU
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define NSEC_PER_USEC 1000LLU
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define NSEC_PER_33MSEC 33000000LLU
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef enum {
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    SET_ENABLE,
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    SET_CONTROLENABLE,
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    SET_RELOAD_CHROMATIX,
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    SET_STATUS,
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} optype_t;
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MODULE_ALL 0
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern volatile uint32_t gCamHal3LogLevel;
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCamera3MetadataChannel;
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCamera3PicChannel;
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCamera3HeapMemory;
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCamera3Exif;
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef struct {
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_stream_t *stream;
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_stream_buffer_set_t buffer_set;
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream_status_t status;
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int registered;
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3ProcessingChannel *channel;
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} stream_info_t;
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschtypedef struct {
95d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Stream handle
96d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    camera3_stream_t *stream;
97d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Buffer handle
98d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    buffer_handle_t *buffer;
99d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch} PendingBufferInfo;
100d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
101d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschtypedef struct {
102d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Frame number corresponding to request
103d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint32_t frame_number;
104d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Time when request queued into system
105d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    nsecs_t timestamp;
106d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    List<PendingBufferInfo> mPendingBufferList;
107d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch} PendingBuffersInRequest;
108d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
109d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschclass PendingBuffersMap {
110d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetschpublic:
111d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // Number of outstanding buffers at flush
112d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint32_t numPendingBufsAtFlush;
113d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    // List of pending buffers per request
114d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    List<PendingBuffersInRequest> mPendingBuffersInRequest;
115d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint32_t get_num_overall_buffers();
116d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    void removeBuf(buffer_handle_t *buffer);
117d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch};
118d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
119d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCamera3HardwareInterface {
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpublic:
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* static variable and functions accessed by camera service */
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static camera3_device_ops_t mCameraOps;
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int initialize(const struct camera3_device *,
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                const camera3_callback_ops_t *callback_ops);
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int configure_streams(const struct camera3_device *,
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                camera3_stream_configuration_t *stream_list);
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const camera_metadata_t* construct_default_request_settings(
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                const struct camera3_device *, int type);
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int process_capture_request(const struct camera3_device *,
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                camera3_capture_request_t *request);
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void dump(const struct camera3_device *, int fd);
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int flush(const struct camera3_device *);
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int close_camera_device(struct hw_device_t* device);
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpublic:
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3HardwareInterface(uint32_t cameraId,
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const camera_module_callbacks_t *callbacks);
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual ~QCamera3HardwareInterface();
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void camEvtHandle(uint32_t camera_handle, mm_camera_event_t *evt,
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                          void *user_data);
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int openCamera(struct hw_device_t **hw_device);
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_metadata_t* translateCapabilityToMetadata(int type);
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int getCamInfo(uint32_t cameraId, struct camera_info *info);
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int initCapabilities(uint32_t cameraId);
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int initStaticMetadata(uint32_t cameraId);
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void makeTable(cam_dimension_t *dimTable, size_t size,
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            size_t max_size, int32_t *sizeTable);
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void makeFPSTable(cam_fps_range_t *fpsTable, size_t size,
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            size_t max_size, int32_t *fpsRangesTable);
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void makeOverridesList(cam_scene_mode_overrides_t *overridesTable,
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            size_t size, size_t max_size, uint8_t *overridesList,
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint8_t *supported_indexes, uint32_t camera_id);
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static size_t filterJpegSizes(int32_t *jpegSizes, int32_t *processedSizes,
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            size_t processedSizesCnt, size_t maxCount, cam_rect_t active_array_size,
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint8_t downscale_factor);
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void convertToRegions(cam_rect_t rect, int32_t* region, int weight);
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void convertFromRegions(cam_area_t &roi, const camera_metadata_t *settings,
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                   uint32_t tag);
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static bool resetIfNeededROI(cam_area_t* roi, const cam_crop_region_t* scalerCropRegion);
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void convertLandmarks(cam_face_landmarks_info_t face, int32_t* landmarks);
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int32_t getSensorSensitivity(int32_t iso_mode);
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    double computeNoiseModelEntryS(int32_t sensitivity);
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    double computeNoiseModelEntryO(int32_t sensitivity);
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void captureResultCb(mm_camera_super_buf_t *metadata,
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                camera3_stream_buffer_t *buffer, uint32_t frame_number,
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                bool isInputBuffer, void *userdata);
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int initialize(const camera3_callback_ops_t *callback_ops);
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int configureStreams(camera3_stream_configuration_t *stream_list);
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int configureStreamsPerfLocked(camera3_stream_configuration_t *stream_list);
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int processCaptureRequest(camera3_capture_request_t *request);
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void dump(int fd);
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int flushPerf();
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int setFrameParameters(camera3_capture_request_t *request,
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_ID_t streamID, int blob_request, uint32_t snapshotStreamId);
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setReprocParameters(camera3_capture_request_t *request,
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            metadata_buffer_t *reprocParam, uint32_t snapshotStreamId);
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int translateToHalMetadata(const camera3_capture_request_t *request,
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            metadata_buffer_t *parm, uint32_t snapshotStreamId);
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_metadata_t* translateCbUrgentMetadataToResultMetadata (
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                             metadata_buffer_t *metadata);
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            nsecs_t timestamp, int32_t request_id,
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            uint8_t capture_intent, bool pprocDone, uint8_t fwk_cacMode);
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_metadata_t* saveRequestSettings(const CameraMetadata& jpegMetadata,
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            camera3_capture_request_t *request);
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int initParameters();
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void deinitParameters();
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3ReprocessChannel *addOfflineReprocChannel(const reprocess_config_t &config,
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera3ProcessingChannel *inputChHandle);
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needRotationReprocess();
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needReprocess(uint32_t postprocess_mask);
200d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    bool needJpegExifRotation();
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_denoise_process_type_t getWaveletDenoiseProcessPlate();
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_denoise_process_type_t getTemporalDenoiseProcessPlate();
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void captureResultCb(mm_camera_super_buf_t *metadata,
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                camera3_stream_buffer_t *buffer, uint32_t frame_number,
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                bool isInputBuffer);
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t calcMaxJpegDim();
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needOnlineRotation();
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t getJpegQuality();
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Exif *getExifData();
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_exif_params_t get3AExifParams();
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t getMobicatMask();
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void getFlashInfo(const int cameraId,
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bool& hasFlash,
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            char (&flashNode)[QCAMERA_MAX_FILEPATH_LENGTH]);
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const char *getEepromVersionInfo();
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const uint32_t *getLdafCalib();
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void get3AVersion(cam_q3a_version_t &swVersion);
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    template <typename fwkType, typename halType> struct QCameraMap {
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        fwkType fwk_name;
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        halType hal_name;
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    };
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        const char *const desc;
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_cds_mode_type_t val;
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } QCameraPropMap;
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinprivate:
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // State transition conditions:
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // "\" means not applicable
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // "x" means not valid
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |            |  CLOSED  |  OPENED  | INITIALIZED | CONFIGURED | STARTED | ERROR | DEINIT |
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |  CLOSED    |    \     |   open   |     x       |    x       |    x    |   x   |   x    |
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |  OPENED    |  close   |    \     | initialize  |    x       |    x    | error |   x    |
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |INITIALIZED |  close   |    x     |     \       | configure  |   x     | error |   x    |
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // | CONFIGURED |  close   |    x     |     x       | configure  | request | error |   x    |
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |  STARTED   |  close   |    x     |     x       | configure  |    \    | error |   x    |
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |   ERROR    |  close   |    x     |     x       |     x      |    x    |   \   |  any   |
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // |   DEINIT   |  close   |    x     |     x       |     x      |    x    |   x   |   \    |
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // +------------+----------+----------+-------------+------------+---------+-------+--------+
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef enum {
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CLOSED,
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        OPENED,
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        INITIALIZED,
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CONFIGURED,
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        STARTED,
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ERROR,
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DEINIT
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } State;
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int openCamera();
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int closeCamera();
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int flush(bool restartChannels);
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static size_t calcMaxJpegSize(uint32_t camera_id);
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t getMaxRawSize(uint32_t camera_id);
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void addStreamConfig(Vector<int32_t> &available_stream_configs,
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t scalar_format, const cam_dimension_t &dim,
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t config_type);
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int validateCaptureRequest(camera3_capture_request_t *request);
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int validateStreamDimensions(camera3_stream_configuration_t *streamList);
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int validateStreamRotations(camera3_stream_configuration_t *streamList);
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void deriveMinFrameDuration();
277d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    void handleBuffersDuringFlushLock(camera3_stream_buffer_t *buffer);
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t handlePendingReprocResults(uint32_t frame_number);
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int64_t getMinFrameDuration(const camera3_capture_request_t *request);
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf,
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bool free_and_bufdone_meta_buf);
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void handleBatchMetadata(mm_camera_super_buf_t *metadata_buf,
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bool free_and_bufdone_meta_buf);
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void handleBufferWithLock(camera3_stream_buffer_t *buffer,
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t frame_number);
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void handleInputBufferWithLock(uint32_t frame_number);
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void unblockRequestIfNecessary();
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void dumpMetadataToFile(tuning_params_t &meta, uint32_t &dumpFrameCount,
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bool enabled, const char *type, uint32_t frameNumber);
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void getLogLevel();
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void cleanAndSortStreamInfo();
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void extractJpegMetadata(CameraMetadata& jpegMetadata,
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const camera3_capture_request_t *request);
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isSupportChannelNeeded(camera3_stream_configuration_t *streamList,
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_size_info_t stream_config_info);
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setMobicat();
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t getSensorOutputSize(cam_dimension_t &sensor_dim);
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setHalFpsRange(const CameraMetadata &settings,
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            metadata_buffer_t *hal_metadata);
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t extractSceneMode(const CameraMetadata &frame_settings, uint8_t metaMode,
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            metadata_buffer_t *hal_metadata);
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t numOfSizesOnEncoder(const camera3_stream_configuration_t *streamList,
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const cam_dimension_t &maxViewfinderSize);
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void addToPPFeatureMask(int stream_format, uint32_t stream_idx);
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void updateFpsInPreviewBuffer(metadata_buffer_t *metadata, uint32_t frame_number);
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void enablePowerHint();
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void disablePowerHint();
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t dynamicUpdateMetaStreamInfo();
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t startAllChannels();
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t stopAllChannels();
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t notifyErrorForPendingRequests();
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t getReprocessibleOutputStreamId(uint32_t &id);
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t handleCameraDeviceError();
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isOnEncoder(const cam_dimension_t max_viewfinder_size,
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t width, uint32_t height);
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void hdrPlusPerfLock(mm_camera_super_buf_t *metadata_buf);
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static bool supportBurstCapture(uint32_t cameraId);
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setBundleInfo();
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_device_t   mCameraDevice;
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t           mCameraId;
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_vtbl_t  *mCameraHandle;
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool               mCameraInitialized;
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_metadata_t *mDefaultMetadata[CAMERA3_TEMPLATE_COUNT];
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const camera3_callback_ops_t *mCallbackOps;
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3MetadataChannel *mMetadataChannel;
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3PicChannel *mPictureChannel;
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3RawChannel *mRawChannel;
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3SupportChannel *mSupportChannel;
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3SupportChannel *mAnalysisChannel;
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3RawDumpChannel *mRawDumpChannel;
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3RegularChannel *mDummyBatchChannel;
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraPerfLock m_perfLock;
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mChannelHandle;
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void saveExifParams(metadata_buffer_t *metadata);
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_exif_params_t mExifParams;
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     //First request yet to be processed after configureStreams
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mFirstConfiguration;
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mFlush;
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mFlushPerf;
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mEnableRawDump;
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3HeapMemory *mParamHeap;
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    metadata_buffer_t* mParameters;
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    metadata_buffer_t* mPrevParameters;
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    CameraMetadata mCurJpegMeta;
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bIsVideo;
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bIs4KVideo;
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bEisSupportedSize;
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bEisEnable;
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_dimension_t dim;
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int format;
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t usage;
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } InputStreamInfo;
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    InputStreamInfo mInputStreamInfo;
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t m_MobicatMask;
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t m_bTnrEnabled;
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int8_t  mSupportedFaceDetectMode;
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t m_bTnrPreview;
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t m_bTnrVideo;
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Data structure to store pending request */
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_t *stream;
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t *buffer;
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // metadata needs to be consumed by the corresponding stream
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // in order to generate the buffer.
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        bool need_metadata;
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } RequestedBufferInfo;
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frame_number;
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t num_buffers;
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t request_id;
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        List<RequestedBufferInfo> buffers;
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int blob_request;
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t bUrgentReceived;
38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        nsecs_t timestamp;
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t *input_buffer;
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        const camera_metadata_t *settings;
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CameraMetadata jpegMetadata;
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t pipeline_depth;
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t partial_result_cnt;
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t capture_intent;
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t fwkCacMode;
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        bool shutter_notified;
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } PendingRequestInfo;
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frame_number;
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t stream_ID;
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } PendingFrameDropInfo;
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_notify_msg_t notify_msg;
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t buffer;
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frame_number;
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } PendingReprocessResult;
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef KeyedVector<uint32_t, Vector<PendingBufferInfo> > FlushMap;
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef List<QCamera3HardwareInterface::PendingRequestInfo>::iterator
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pendingRequestIterator;
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef List<QCamera3HardwareInterface::RequestedBufferInfo>::iterator
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pendingBufferIterator;
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    List<PendingReprocessResult> mPendingReprocessResultList;
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    List<PendingRequestInfo> mPendingRequestsList;
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    List<PendingFrameDropInfo> mPendingFrameDropList;
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Use last frame number of the batch as key and first frame number of the
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     * batch as value for that key */
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    KeyedVector<uint32_t, uint32_t> mPendingBatchMap;
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    PendingBuffersMap mPendingBuffersMap;
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_t mRequestCond;
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mPendingLiveRequest;
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mWokenUpByDaemon;
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t mCurrentRequestId;
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_size_info_t mStreamConfigInfo;
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //mutex for serialized access to camera3_device_ops_t functions
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_t mMutex;
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //condition used to signal flush after buffers have returned
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_t mBuffersCond;
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    List<stream_info_t*> mStreamInfo;
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int64_t mMinProcessedFrameDuration;
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int64_t mMinJpegFrameDuration;
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int64_t mMinRawFrameDuration;
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mMetaFrameCount;
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool    mUpdateDebugLevel;
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const camera_module_callbacks_t *mCallbacks;
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t mCaptureIntent;
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t mCacMode;
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    metadata_buffer_t mReprocMeta; //scratch meta buffer
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* 0: Not batch, non-zero: Number of image buffers in a batch */
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t mBatchSize;
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Used only in batch mode
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t mToBeQueuedVidBufs;
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Fixed video fps
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    float mHFRVideoFps;
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t mOpMode;
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mFirstFrameNumberInBatch;
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_stream_t mDummyBatchStream;
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mNeedSensorRestart;
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* sensor output size with current stream configuration */
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3CropRegionMapper mCropRegionMapper;
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Ldaf calibration data */
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mLdafCalibExist;
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mLdafCalib[2];
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mPowerHintEnabled;
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t mLastCustIntentFrmNum;
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_control_effect_mode_t,
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_effect_mode_type> EFFECT_MODES_MAP[];
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_control_awb_mode_t,
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_wb_mode_type> WHITE_BALANCE_MODES_MAP[];
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_control_scene_mode_t,
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_scene_mode_type> SCENE_MODES_MAP[];
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_control_af_mode_t,
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_focus_mode_type> FOCUS_MODES_MAP[];
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_color_correction_aberration_mode_t,
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_aberration_mode_t> COLOR_ABERRATION_MAP[];
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_control_ae_antibanding_mode_t,
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_antibanding_mode_type> ANTIBANDING_MODES_MAP[];
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_lens_state_t,
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_af_lens_state_t> LENS_STATE_MAP[];
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_control_ae_mode_t,
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_flash_mode_t> AE_FLASH_MODE_MAP[];
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_flash_mode_t,
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_flash_mode_t> FLASH_MODES_MAP[];
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_statistics_face_detect_mode_t,
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_face_detect_mode_t> FACEDETECT_MODES_MAP[];
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_lens_info_focus_distance_calibration_t,
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_focus_calibration_t> FOCUS_CALIBRATION_MAP[];
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_sensor_test_pattern_mode_t,
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_test_pattern_mode_t> TEST_PATTERN_MAP[];
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<camera_metadata_enum_android_sensor_reference_illuminant1_t,
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_illuminat_t> REFERENCE_ILLUMINANT_MAP[];
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraMap<int32_t,
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_hfr_mode_t> HFR_MODE_MAP[];
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static const QCameraPropMap CDS_MAP[];
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pendingRequestIterator erasePendingRequest(pendingRequestIterator i);
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //GPU library to read buffer padding details.
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void *lib_surface_utils;
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int (*LINK_get_surface_pixel_alignment)();
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mSurfaceStridePadding;
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    State mState;
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif /* __QCAMERA2HARDWAREINTERFACE_H__ */
512