Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2015-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 #ifndef __QCAMERAMUXER_H__
     30 #define __QCAMERAMUXER_H__
     31 
     32 #include "camera.h"
     33 #include "QCamera2HWI.h"
     34 #include "QCamera3HWI.h"
     35 
     36 namespace qcamera {
     37 
     38 /* Struct@ qcamera_physical_descriptor_t
     39  *
     40  *  Description@ This structure specifies various attributes
     41  *      physical cameras enumerated on the device
     42  */
     43 typedef struct {
     44     // Userspace Physical Camera ID
     45     uint32_t id;
     46     // Server Camera ID
     47     uint32_t camera_server_id;
     48     // Device version
     49     uint32_t device_version;
     50     // Specifies type of camera
     51     cam_sync_type_t type;
     52     // Specifies mode of Camera
     53     cam_sync_mode_t mode;
     54     // Camera Info
     55     camera_info cam_info;
     56     // Reference to HWI
     57     QCamera2HardwareInterface *hwi;
     58     // Reference to camera device structure
     59     camera_device_t* dev;
     60 } qcamera_physical_descriptor_t;
     61 
     62 /* Struct@ qcamera_logical_descriptor_t
     63  *
     64  *  Description@ This structure stores information about logical cameras
     65  *      and corresponding data of the physical camera that are part of
     66  *      this logical camera
     67  */
     68 typedef struct {
     69     // Camera Device to be shared to Frameworks
     70     camera_device_t dev;
     71     // Device version
     72     uint32_t device_version;
     73     // Logical Camera ID
     74     uint32_t id;
     75     // Logical Camera Facing
     76     int32_t facing;
     77     // Number of Physical camera present in this logical camera
     78     uint32_t numCameras;
     79     // To signify if the LINK/UNLINK established between physical cameras
     80     bool bSyncOn;
     81     // index of the primary physical camera session in the bundle
     82     uint8_t nPrimaryPhyCamIndex;
     83     // Signifies Physical Camera ID of each camera
     84     uint32_t pId[MAX_NUM_CAMERA_PER_BUNDLE];
     85     // Signifies server camera ID of each camera
     86     uint32_t sId[MAX_NUM_CAMERA_PER_BUNDLE];
     87     // Signifies type of each camera
     88     cam_sync_type_t type[MAX_NUM_CAMERA_PER_BUNDLE];
     89     // Signifies mode of each camera
     90     cam_sync_mode_t mode[MAX_NUM_CAMERA_PER_BUNDLE];
     91     // Signifies mode of each 3a used by the camera
     92     cam_3a_sync_mode_t sync_3a[MAX_NUM_CAMERA_PER_BUNDLE];
     93 } qcamera_logical_descriptor_t;
     94 
     95 /* Struct@ cam_compose_jpeg_info_t
     96  *
     97  *  Description@ This structure stores information about individual Jpeg images
     98  *  received from multiple related physical camera instances. These images would then be
     99  *  composed together into a single MPO image later.
    100  */
    101 typedef struct {
    102     // msg_type is same as data callback msg_type
    103     int32_t msg_type;
    104     // ptr to actual data buffer
    105     camera_memory_t *buffer;
    106     // index of the buffer same as received in data callback
    107     unsigned int index;
    108     // metadata associated with the buffer
    109     camera_frame_metadata_t *metadata;
    110     // user contains the caller's identity
    111     // this contains a reference to the physical cam structure
    112     // of the HWI instance which had requested for this data buffer
    113     void *user;
    114     // this indicates validity of the buffer
    115     // this flag is used by multiple threads to check validity of
    116     // Jpegs received by other threads
    117     bool valid;
    118     // frame id of the Jpeg. this is needed for frame sync between aux
    119     // and main camera sessions
    120     uint32_t frame_idx;
    121     // release callback function to release this Jpeg memory later after
    122     // composition is completed
    123     camera_release_callback release_cb;
    124     // cookie for the release callback function
    125     void *release_cookie;
    126     // release data info for what needs to be released
    127     void *release_data;
    128 }cam_compose_jpeg_info_t;
    129 
    130 /* Class@ QCameraMuxer
    131  *
    132  * Description@ Muxer interface
    133  *    a) Manages the grouping of the physical cameras into a logical camera
    134  *    b) Muxes the operational calls from Frameworks to HWI
    135  *    c) Composes MPO from JPEG
    136  */
    137 class QCameraMuxer {
    138 
    139 public:
    140     /* Public Methods   */
    141     QCameraMuxer(uint32_t num_of_cameras);
    142     virtual ~QCameraMuxer();
    143     static void getCameraMuxer(QCameraMuxer** pCamMuxer,
    144             uint32_t num_of_cameras);
    145     static int get_number_of_cameras();
    146     static int get_camera_info(int camera_id, struct camera_info *info);
    147     static int set_callbacks(const camera_module_callbacks_t *callbacks);
    148     static int open_legacy(const struct hw_module_t* module,
    149             const char* id, uint32_t halVersion, struct hw_device_t** device);
    150 
    151     static int camera_device_open(const struct hw_module_t* module,
    152             const char* id,
    153             struct hw_device_t** device);
    154     static int close_camera_device( hw_device_t *);
    155 
    156     /* Operation methods directly accessed by Camera Service */
    157     static camera_device_ops_t mCameraMuxerOps;
    158 
    159     /* Start of operational methods */
    160     static int set_preview_window(struct camera_device *,
    161             struct preview_stream_ops *window);
    162     static void set_callBacks(struct camera_device *,
    163             camera_notify_callback notify_cb,
    164             camera_data_callback data_cb,
    165             camera_data_timestamp_callback data_cb_timestamp,
    166             camera_request_memory get_memory,
    167             void *user);
    168     static void enable_msg_type(struct camera_device *, int32_t msg_type);
    169     static void disable_msg_type(struct camera_device *, int32_t msg_type);
    170     static int msg_type_enabled(struct camera_device *, int32_t msg_type);
    171     static int start_preview(struct camera_device *);
    172     static void stop_preview(struct camera_device *);
    173     static int preview_enabled(struct camera_device *);
    174     static int store_meta_data_in_buffers(struct camera_device *,
    175             int enable);
    176     static int start_recording(struct camera_device *);
    177     static void stop_recording(struct camera_device *);
    178     static int recording_enabled(struct camera_device *);
    179     static void release_recording_frame(struct camera_device *,
    180               const void *opaque);
    181     static int auto_focus(struct camera_device *);
    182     static int cancel_auto_focus(struct camera_device *);
    183     static int take_picture(struct camera_device *);
    184     static int cancel_picture(struct camera_device *);
    185     static int set_parameters(struct camera_device *, const char *parms);
    186     static char* get_parameters(struct camera_device *);
    187     static void put_parameters(struct camera_device *, char *);
    188     static int send_command(struct camera_device *,
    189           int32_t cmd, int32_t arg1, int32_t arg2);
    190     static void release(struct camera_device *);
    191     static int dump(struct camera_device *, int fd);
    192     /* End of operational methods */
    193 
    194     static void jpeg_data_callback(int32_t msg_type,
    195             const camera_memory_t *data, unsigned int index,
    196             camera_frame_metadata_t *metadata, void *user,
    197             uint32_t frame_idx, camera_release_callback release_cb,
    198             void *release_cookie, void *release_data);
    199     // add notify error msgs to the notifer queue of the primary related cam instance
    200     static int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
    201     // function to compose all JPEG images from all physical related camera instances
    202     void composeMpo(cam_compose_jpeg_info_t* main_Jpeg,
    203         cam_compose_jpeg_info_t* aux_Jpeg);
    204     static void* composeMpoRoutine(void* data);
    205     static bool matchFrameId(void *data, void *user_data, void *match_data);
    206     static bool findPreviousJpegs(void *data, void *user_data, void *match_data);
    207     static void releaseJpegInfo(void *data, void *user_data);
    208 
    209 public:
    210     /* Public Members  Variables   */
    211     // Jpeg and Mpo ops need to be shared between 2 HWI instances
    212     // hence these are cached in the muxer alongwith Jpeg handle
    213     mm_jpeg_ops_t mJpegOps;
    214     mm_jpeg_mpo_ops_t mJpegMpoOps;
    215     uint32_t mJpegClientHandle;
    216     // Stores Camera Data Callback function
    217     camera_data_callback mDataCb;
    218     // Stores Camera GetMemory Callback function
    219     camera_request_memory mGetMemoryCb;
    220 
    221 private:
    222     /* Private Member Variables  */
    223     qcamera_physical_descriptor_t *m_pPhyCamera;
    224     qcamera_logical_descriptor_t *m_pLogicalCamera;
    225     const camera_module_callbacks_t *m_pCallbacks;
    226     bool m_bAuxCameraExposed;
    227     uint8_t m_nPhyCameras;
    228     uint8_t m_nLogicalCameras;
    229 
    230     // Main Camera session Jpeg Queue
    231     QCameraQueue m_MainJpegQ;
    232     // Aux Camera session Jpeg Queue
    233     QCameraQueue m_AuxJpegQ;
    234     // thread for mpo composition
    235     QCameraCmdThread m_ComposeMpoTh;
    236     // Final Mpo Jpeg Buffer
    237     camera_memory_t *m_pRelCamMpoJpeg;
    238     // Lock needed to synchronize between multiple composition requests
    239     pthread_mutex_t m_JpegLock;
    240     // this callback cookie would be used for sending Final mpo Jpeg to the framework
    241     void *m_pMpoCallbackCookie;
    242     // this callback cookie would be used for caching main related cam phy instance
    243     // this is needed for error scenarios
    244     // incase of error, we use this cookie to get HWI instance and send errors in notify cb
    245     void *m_pJpegCallbackCookie;
    246     // flag to indicate whether we need to dump dual camera snapshots
    247     bool m_bDumpImages;
    248     // flag to indicate whether MPO is enabled or not
    249     bool m_bMpoEnabled;
    250     // Signifies if frame sync is enabled
    251     bool m_bFrameSyncEnabled;
    252     // flag to indicate whether recording hint is internally set.
    253     bool m_bRecordingHintInternallySet;
    254 
    255     /* Private Member Methods */
    256     int setupLogicalCameras();
    257     int cameraDeviceOpen(int camera_id, struct hw_device_t **hw_device);
    258     int getNumberOfCameras();
    259     int getCameraInfo(int camera_id, struct camera_info *info,
    260             cam_sync_type_t *p_cam_type);
    261     int32_t setCallbacks(const camera_module_callbacks_t *callbacks);
    262     int32_t setDataCallback(camera_data_callback data_cb);
    263     int32_t setMemoryCallback(camera_request_memory get_memory);
    264     qcamera_logical_descriptor_t* getLogicalCamera(
    265             struct camera_device * device);
    266     qcamera_physical_descriptor_t* getPhysicalCamera(
    267             qcamera_logical_descriptor_t* log_cam, uint32_t index);
    268     int32_t getActiveNumOfPhyCam(
    269             qcamera_logical_descriptor_t* log_cam, int& numOfAcitvePhyCam);
    270     int32_t setMpoCallbackCookie(void* mpoCbCookie);
    271     void* getMpoCallbackCookie();
    272     int32_t setMainJpegCallbackCookie(void* jpegCbCookie);
    273     void* getMainJpegCallbackCookie();
    274     void setJpegHandle(uint32_t handle) { mJpegClientHandle = handle;};
    275     // function to store single JPEG from 1 related physical camera instance
    276     int32_t storeJpeg(cam_sync_type_t cam_type, int32_t msg_type,
    277             const camera_memory_t *data, unsigned int index,
    278             camera_frame_metadata_t *metadata, void *user,
    279             uint32_t frame_idx, camera_release_callback release_cb,
    280             void *release_cookie, void *release_data);
    281 
    282 };// End namespace qcamera
    283 
    284 }
    285 #endif /* __QCAMERAMUXER_H__ */
    286 
    287