diff options
author | Prateek Chaubey <chaubeyprateek@gmail.com> | 2018-01-07 20:55:14 +0530 |
---|---|---|
committer | Davide Garberi <dade.garberi@gmail.com> | 2018-01-19 14:09:15 +0100 |
commit | 6616278131edd80a12545085e06ee6b0e0a0a788 (patch) | |
tree | 0aef88ed11809a9d67f6abe4dc2ff782a14737e2 /camera/QCamera2/HAL/QCameraMuxer.h | |
parent | cc4ccf34871da343111bf68d16ba4e4c67cac1dc (diff) |
msm8996-common: zuk: Import OSS Camera HAL
Tag: LA.HB.1.3.2-32600-8x96.0
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
Diffstat (limited to 'camera/QCamera2/HAL/QCameraMuxer.h')
-rw-r--r-- | camera/QCamera2/HAL/QCameraMuxer.h | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/camera/QCamera2/HAL/QCameraMuxer.h b/camera/QCamera2/HAL/QCameraMuxer.h new file mode 100644 index 0000000..a85612e --- /dev/null +++ b/camera/QCamera2/HAL/QCameraMuxer.h @@ -0,0 +1,284 @@ +/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __QCAMERAMUXER_H__ +#define __QCAMERAMUXER_H__ + +#include "camera.h" +#include "QCamera2HWI.h" +#include "QCamera3HWI.h" + +namespace qcamera { + +/* Struct@ qcamera_physical_descriptor_t + * + * Description@ This structure specifies various attributes + * physical cameras enumerated on the device + */ +typedef struct { + // Userspace Physical Camera ID + uint32_t id; + // Server Camera ID + uint32_t camera_server_id; + // Device version + uint32_t device_version; + // Specifies type of camera + cam_sync_type_t type; + // Specifies mode of Camera + cam_sync_mode_t mode; + // Camera Info + camera_info cam_info; + // Reference to HWI + QCamera2HardwareInterface *hwi; + // Reference to camera device structure + camera_device_t* dev; +} qcamera_physical_descriptor_t; + +/* Struct@ qcamera_logical_descriptor_t + * + * Description@ This structure stores information about logical cameras + * and corresponding data of the physical camera that are part of + * this logical camera + */ +typedef struct { + // Camera Device to be shared to Frameworks + camera_device_t dev; + // Device version + uint32_t device_version; + // Logical Camera ID + uint32_t id; + // Logical Camera Facing + int32_t facing; + // Number of Physical camera present in this logical camera + uint32_t numCameras; + // To signify if the LINK/UNLINK established between physical cameras + bool bSyncOn; + // index of the primary physical camera session in the bundle + uint8_t nPrimaryPhyCamIndex; + // Signifies Physical Camera ID of each camera + uint32_t pId[MAX_NUM_CAMERA_PER_BUNDLE]; + // Signifies server camera ID of each camera + uint32_t sId[MAX_NUM_CAMERA_PER_BUNDLE]; + // Signifies type of each camera + cam_sync_type_t type[MAX_NUM_CAMERA_PER_BUNDLE]; + // Signifies mode of each camera + cam_sync_mode_t mode[MAX_NUM_CAMERA_PER_BUNDLE]; +} qcamera_logical_descriptor_t; + +/* Struct@ cam_compose_jpeg_info_t + * + * Description@ This structure stores information about individual Jpeg images + * received from multiple related physical camera instances. These images would then be + * composed together into a single MPO image later. + */ +typedef struct { + // msg_type is same as data callback msg_type + int32_t msg_type; + // ptr to actual data buffer + camera_memory_t *buffer; + // index of the buffer same as received in data callback + unsigned int index; + // metadata associated with the buffer + camera_frame_metadata_t *metadata; + // user contains the caller's identity + // this contains a reference to the physical cam structure + // of the HWI instance which had requested for this data buffer + void *user; + // this indicates validity of the buffer + // this flag is used by multiple threads to check validity of + // Jpegs received by other threads + bool valid; + // frame id of the Jpeg. this is needed for frame sync between aux + // and main camera sessions + uint32_t frame_idx; + // release callback function to release this Jpeg memory later after + // composition is completed + camera_release_callback release_cb; + // cookie for the release callback function + void *release_cookie; + // release data info for what needs to be released + void *release_data; +}cam_compose_jpeg_info_t; + +/* Class@ QCameraMuxer + * + * Description@ Muxer interface + * a) Manages the grouping of the physical cameras into a logical camera + * b) Muxes the operational calls from Frameworks to HWI + * c) Composes MPO from JPEG + */ +class QCameraMuxer { + +public: + /* Public Methods */ + QCameraMuxer(uint32_t num_of_cameras); + virtual ~QCameraMuxer(); + static void getCameraMuxer(QCameraMuxer** pCamMuxer, + uint32_t num_of_cameras); + static int get_number_of_cameras(); + static int get_camera_info(int camera_id, struct camera_info *info); + static int set_callbacks(const camera_module_callbacks_t *callbacks); + static int open_legacy(const struct hw_module_t* module, + const char* id, uint32_t halVersion, struct hw_device_t** device); + + static int camera_device_open(const struct hw_module_t* module, + const char* id, + struct hw_device_t** device); + static int close_camera_device( hw_device_t *); + + /* Operation methods directly accessed by Camera Service */ + static camera_device_ops_t mCameraMuxerOps; + + /* Start of operational methods */ + static int set_preview_window(struct camera_device *, + struct preview_stream_ops *window); + static void set_callBacks(struct camera_device *, + camera_notify_callback notify_cb, + camera_data_callback data_cb, + camera_data_timestamp_callback data_cb_timestamp, + camera_request_memory get_memory, + void *user); + static void enable_msg_type(struct camera_device *, int32_t msg_type); + static void disable_msg_type(struct camera_device *, int32_t msg_type); + static int msg_type_enabled(struct camera_device *, int32_t msg_type); + static int start_preview(struct camera_device *); + static void stop_preview(struct camera_device *); + static int preview_enabled(struct camera_device *); + static int store_meta_data_in_buffers(struct camera_device *, + int enable); + static int start_recording(struct camera_device *); + static void stop_recording(struct camera_device *); + static int recording_enabled(struct camera_device *); + static void release_recording_frame(struct camera_device *, + const void *opaque); + static int auto_focus(struct camera_device *); + static int cancel_auto_focus(struct camera_device *); + static int take_picture(struct camera_device *); + static int cancel_picture(struct camera_device *); + static int set_parameters(struct camera_device *, const char *parms); + static char* get_parameters(struct camera_device *); + static void put_parameters(struct camera_device *, char *); + static int send_command(struct camera_device *, + int32_t cmd, int32_t arg1, int32_t arg2); + static void release(struct camera_device *); + static int dump(struct camera_device *, int fd); + /* End of operational methods */ + + static void jpeg_data_callback(int32_t msg_type, + const camera_memory_t *data, unsigned int index, + camera_frame_metadata_t *metadata, void *user, + uint32_t frame_idx, camera_release_callback release_cb, + void *release_cookie, void *release_data); + // add notify error msgs to the notifer queue of the primary related cam instance + static int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); + // function to compose all JPEG images from all physical related camera instances + void composeMpo(cam_compose_jpeg_info_t* main_Jpeg, + cam_compose_jpeg_info_t* aux_Jpeg); + static void* composeMpoRoutine(void* data); + static bool matchFrameId(void *data, void *user_data, void *match_data); + static bool findPreviousJpegs(void *data, void *user_data, void *match_data); + static void releaseJpegInfo(void *data, void *user_data); + +public: + /* Public Members Variables */ + // Jpeg and Mpo ops need to be shared between 2 HWI instances + // hence these are cached in the muxer alongwith Jpeg handle + mm_jpeg_ops_t mJpegOps; + mm_jpeg_mpo_ops_t mJpegMpoOps; + uint32_t mJpegClientHandle; + // Stores Camera Data Callback function + camera_data_callback mDataCb; + // Stores Camera GetMemory Callback function + camera_request_memory mGetMemoryCb; + +private: + /* Private Member Variables */ + qcamera_physical_descriptor_t *m_pPhyCamera; + qcamera_logical_descriptor_t *m_pLogicalCamera; + const camera_module_callbacks_t *m_pCallbacks; + bool m_bAuxCameraExposed; + uint8_t m_nPhyCameras; + uint8_t m_nLogicalCameras; + + // Main Camera session Jpeg Queue + QCameraQueue m_MainJpegQ; + // Aux Camera session Jpeg Queue + QCameraQueue m_AuxJpegQ; + // thread for mpo composition + QCameraCmdThread m_ComposeMpoTh; + // Final Mpo Jpeg Buffer + camera_memory_t *m_pRelCamMpoJpeg; + // Lock needed to synchronize between multiple composition requests + pthread_mutex_t m_JpegLock; + // this callback cookie would be used for sending Final mpo Jpeg to the framework + void *m_pMpoCallbackCookie; + // this callback cookie would be used for caching main related cam phy instance + // this is needed for error scenarios + // incase of error, we use this cookie to get HWI instance and send errors in notify cb + void *m_pJpegCallbackCookie; + // flag to indicate whether we need to dump dual camera snapshots + bool m_bDumpImages; + // flag to indicate whether MPO is enabled or not + bool m_bMpoEnabled; + // Signifies if frame sync is enabled + bool m_bFrameSyncEnabled; + // flag to indicate whether recording hint is internally set. + bool m_bRecordingHintInternallySet; + + /* Private Member Methods */ + int setupLogicalCameras(); + int cameraDeviceOpen(int camera_id, struct hw_device_t **hw_device); + int getNumberOfCameras(); + int getCameraInfo(int camera_id, struct camera_info *info, + cam_sync_type_t *p_cam_type); + int32_t setCallbacks(const camera_module_callbacks_t *callbacks); + int32_t setDataCallback(camera_data_callback data_cb); + int32_t setMemoryCallback(camera_request_memory get_memory); + qcamera_logical_descriptor_t* getLogicalCamera( + struct camera_device * device); + qcamera_physical_descriptor_t* getPhysicalCamera( + qcamera_logical_descriptor_t* log_cam, uint32_t index); + int32_t getActiveNumOfPhyCam( + qcamera_logical_descriptor_t* log_cam, int& numOfAcitvePhyCam); + int32_t setMpoCallbackCookie(void* mpoCbCookie); + void* getMpoCallbackCookie(); + int32_t setMainJpegCallbackCookie(void* jpegCbCookie); + void* getMainJpegCallbackCookie(); + void setJpegHandle(uint32_t handle) { mJpegClientHandle = handle;}; + // function to store single JPEG from 1 related physical camera instance + int32_t storeJpeg(cam_sync_type_t cam_type, int32_t msg_type, + const camera_memory_t *data, unsigned int index, + camera_frame_metadata_t *metadata, void *user, + uint32_t frame_idx, camera_release_callback release_cb, + void *release_cookie, void *release_data); + +};// End namespace qcamera + +} +#endif /* __QCAMERAMUXER_H__ */ + |