1/* Copyright (c) 2016-2017, 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 __QCAMERA_DUAL_FOV_PP_H__
31#define __QCAMERA_DUAL_FOV_PP_H__
32
33// Camera dependencies
34#include "QCameraHALPP.h"
35
36#define WIDE_TELE_CAMERA_NUMBER 2
37enum halPPInputType {
38    WIDE_INPUT = 0,
39    TELE_INPUT = 1
40};
41
42enum dualfov_af_status_t {
43    AF_STATUS_VALID,
44    AF_STATUS_INVALID
45};
46
47typedef struct _cam_frame_size_t {
48    uint32_t width;
49    uint32_t height;
50    uint32_t stride;
51    uint32_t scanline;
52    uint32_t frame_len;
53} cam_frame_size_t;
54
55typedef struct _dualfov_input_params_t {
56    cam_frame_size_t wide;
57    cam_frame_size_t tele;
58
59    uint32_t user_zoom;
60
61    dualfov_af_status_t af_status;
62} dualfov_input_params_t;
63
64typedef struct _dualfov_output_params_t {
65    cam_frame_size_t out;
66    uint32_t result;
67} dualfov_output_params_t;
68
69
70namespace qcamera {
71
72class QCameraDualFOVPP : public QCameraHALPP
73{
74public:
75    QCameraDualFOVPP();
76    ~QCameraDualFOVPP();
77    int32_t init(halPPBufNotify bufNotifyCb, halPPGetOutput getOutputCb, void *pUserData,
78            void *pStaticParam);
79    int32_t deinit();
80    int32_t start();
81    int32_t feedInput(qcamera_hal_pp_data_t *pInputData);
82    int32_t feedOutput(qcamera_hal_pp_data_t *pOutputData);
83    int32_t process();
84protected:
85    bool canProcess();
86private:
87    mm_camera_buf_def_t* getSnapshotBuf(qcamera_hal_pp_data_t* pData,
88            QCameraStream* &pSnapshotStream);
89    mm_camera_buf_def_t* getMetadataBuf(qcamera_hal_pp_data_t* pData,
90            QCameraStream* &pMetadataStream);
91    void getInputParams(mm_camera_buf_def_t *pMainMetaBuf, mm_camera_buf_def_t *pAuxMetaBuf,
92            QCameraStream* pMainSnapshotStream, QCameraStream* pAuxSnapshotStream,
93            dualfov_input_params_t& inParams);
94    int32_t doDualFovPPInit();
95    int32_t doDualFovPPProcess(const uint8_t* pWide, const uint8_t* pTele,
96            dualfov_input_params_t inParams, uint8_t* pOut);
97    uint32_t getUserZoomRatio(int32_t zoom_level);
98    void dumpYUVtoFile(const uint8_t* pBuf, cam_frame_len_offset_t offset, uint32_t idx,
99            const char* name_prefix);
100    void dumpInputParams(const dualfov_input_params_t& p);
101    void dumpOISData(metadata_buffer_t*  pMetadata);
102
103
104private:
105    void *m_dlHandle;
106    const cam_capability_t *m_pCaps;
107}; // QCameraDualFOVPP class
108}; // namespace qcamera
109
110#endif /* __QCAMERA_DUAL_FOV_PP_H__ */
111
112
113
114