154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *
354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * Redistribution and use in source and binary forms, with or without
454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * modification, are permitted provided that the following conditions are
554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * met:
654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *     * Redistributions of source code must retain the above copyright
754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *       notice, this list of conditions and the following disclaimer.
854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *     * Redistributions in binary form must reproduce the above
954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *       copyright notice, this list of conditions and the following
1054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *       disclaimer in the documentation and/or other materials provided
1154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *       with the distribution.
1254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *     * Neither the name of The Linux Foundation nor the names of its
1354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *       contributors may be used to endorse or promote products derived
1454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *       from this software without specific prior written permission.
1554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *
1654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *
2854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel */
2954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
3054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#ifndef __QCAMERA_DUAL_FOV_PP_H__
3154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#define __QCAMERA_DUAL_FOV_PP_H__
3254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
3354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel// Camera dependencies
3454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include "QCameraHALPP.h"
3554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
3654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#define WIDE_TELE_CAMERA_NUMBER 2
3754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelenum halPPInputType {
3854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    WIDE_INPUT = 0,
3954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    TELE_INPUT = 1
4054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel};
4154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
4254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelenum dualfov_af_status_t {
4354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    AF_STATUS_VALID,
4454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    AF_STATUS_INVALID
4554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel};
4654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
4754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudeltypedef struct _cam_frame_size_t {
4854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t width;
4954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t height;
5054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t stride;
5154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t scanline;
5254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t frame_len;
5354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} cam_frame_size_t;
5454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
5554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudeltypedef struct _dualfov_input_params_t {
5654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    cam_frame_size_t wide;
5754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    cam_frame_size_t tele;
5854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
5954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t user_zoom;
6054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
6154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    dualfov_af_status_t af_status;
6254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} dualfov_input_params_t;
6354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
6454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudeltypedef struct _dualfov_output_params_t {
6554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    cam_frame_size_t out;
6654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t result;
6754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} dualfov_output_params_t;
6854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
6954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
7054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelnamespace qcamera {
7154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
7254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelclass QCameraDualFOVPP : public QCameraHALPP
7354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{
7454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelpublic:
7554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    QCameraDualFOVPP();
7654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    ~QCameraDualFOVPP();
7754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t init(halPPBufNotify bufNotifyCb, halPPGetOutput getOutputCb, void *pUserData,
7854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            void *pStaticParam);
7954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t deinit();
8054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t start();
8154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t feedInput(qcamera_hal_pp_data_t *pInputData);
8254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t feedOutput(qcamera_hal_pp_data_t *pOutputData);
8354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t process();
8454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelprotected:
8554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    bool canProcess();
8654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelprivate:
8754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    mm_camera_buf_def_t* getSnapshotBuf(qcamera_hal_pp_data_t* pData,
8854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            QCameraStream* &pSnapshotStream);
8954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    mm_camera_buf_def_t* getMetadataBuf(qcamera_hal_pp_data_t* pData,
9054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            QCameraStream* &pMetadataStream);
9154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    void getInputParams(mm_camera_buf_def_t *pMainMetaBuf, mm_camera_buf_def_t *pAuxMetaBuf,
9254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            QCameraStream* pMainSnapshotStream, QCameraStream* pAuxSnapshotStream,
9354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            dualfov_input_params_t& inParams);
9454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t doDualFovPPInit();
9554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    int32_t doDualFovPPProcess(const uint8_t* pWide, const uint8_t* pTele,
9654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            dualfov_input_params_t inParams, uint8_t* pOut);
9754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    uint32_t getUserZoomRatio(int32_t zoom_level);
9854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    void dumpYUVtoFile(const uint8_t* pBuf, cam_frame_len_offset_t offset, uint32_t idx,
9954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            const char* name_prefix);
10054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    void dumpInputParams(const dualfov_input_params_t& p);
10154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    void dumpOISData(metadata_buffer_t*  pMetadata);
10254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
10354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
10454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelprivate:
10554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    void *m_dlHandle;
10654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    const cam_capability_t *m_pCaps;
10754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel}; // QCameraDualFOVPP class
10854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel}; // namespace qcamera
10954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
11054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#endif /* __QCAMERA_DUAL_FOV_PP_H__ */
11154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
11254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
11354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
114