/* 
 | 
 *  Copyright (c) 2020 Rockchip Corporation 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 * 
 | 
 */  
 | 
  
 | 
#ifndef __GENMESH_H__  
 | 
#define __GENMESH_H__  
 | 
  
 | 
#define INV_POLY_COEFF_NUM 21                                /* ¶àÏîʽϵÊý¸öÊý, ×î¸ß´ÎÊý(INV_POLY_COEFF_NUM-1)´Î */  
 | 
  
 | 
 /* Ïà»ú²ÎÊý */  
 | 
struct CameraCoeff  
 | 
{  
 | 
    double cx, cy;                                            /* ¾µÍ·µÄ¹âÐÄ */  
 | 
    double a0, a2, a3, a4;                                    /* ¾µÍ·µÄ»û±äϵÊý */  
 | 
    double c, d, e;                                            /* ÄÚ²Î[c d;e 1] */  
 | 
    double sf;                                                /* sf¿ØÖÆÊÓ½Ç, sfÔ½´óÊÓ½ÇÔ½´ó */  
 | 
  
 | 
    /* level = 0ʱµÄrho-tanTheta¶àÏîʽÄâºÏ */  
 | 
    int invPolyTanNum0;                                        /* ÄâºÏºóµÄϵÊý¸öÊý */  
 | 
    double invPolyTanCoeff0[INV_POLY_COEFF_NUM];        /* ¶àÏîʽϵÊý, ×î¸ß´ÎÊý(INV_POLY_COEFF_NUM-1)´Î */  
 | 
    /* level = 0ʱµÄrho-cotTheta¶àÏîʽÄâºÏ */  
 | 
    int invPolyCotNum0;                                        /* ÄâºÏºóµÄϵÊý¸öÊý */  
 | 
    double invPolyCotCoeff0[INV_POLY_COEFF_NUM];        /* ¶àÏîʽϵÊý, ×î¸ß´ÎÊý(INV_POLY_COEFF_NUM-1)´Î */  
 | 
  
 | 
    /* level = 255ʱµÄrho-tanTheta¶àÏîʽÄâºÏ */  
 | 
    int invPolyTanNum255;                                    /* ÄâºÏºóµÄϵÊý¸öÊý */  
 | 
    double invPolyTanCoeff255[INV_POLY_COEFF_NUM];        /* ¶àÏîʽϵÊý, ×î¸ß´ÎÊý(INV_POLY_COEFF_NUM-1)´Î */  
 | 
    /* level = 255ʱµÄrho-cotTheta¶àÏîʽÄâºÏ */  
 | 
    int invPolyCotNum255;                                    /* ÄâºÏºóµÄϵÊý¸öÊý */  
 | 
    double invPolyCotCoeff255[INV_POLY_COEFF_NUM];        /* ¶àÏîʽϵÊý, ×î¸ß´ÎÊý(INV_POLY_COEFF_NUM-1)´Î */  
 | 
};  
 | 
  
 | 
/* Éú³ÉFECÓ³Éä±íÏà¹ØµÄ²ÎÊý */  
 | 
struct FecParams  
 | 
{  
 | 
    int correctX;                                        /* Ë®Æ½x·½ÏòУÕý: 1´ú±íУÕý, 0´ú±í²»Ð£Õý */  
 | 
    int correctY;                                        /* ´¹Ö±y·½ÏòУÕý: 1´ú±íУÕý, 0´ú±í²»Ð£Õý */  
 | 
    int saveMaxFovX;                                    /* ±£Áôˮƽx·½Ïò×î´óFOV: 1´ú±í±£Áô, 0´ú±í²»±£Áô */  
 | 
    int isFecOld;                                        /* ÊÇ·ñ¾É°æFEC: 1´ú±íÊÇ£¬0´ú±í²»ÊÇ */  
 | 
    int saveMesh4bin;                                    /* ÊÇ·ñ±£´æmeshxi,xf,yi,yf4¸öbinÎļþ£º1´ú±í±£´æ, 0´ú±í²»±£´æ */  
 | 
    char mesh4binPath[256];                                /* ±£´æmeshxi,xf,yi,yf4¸öbinÎļþµÄ·¾¶ */  
 | 
    int srcW, srcH, dstW, dstH;                            /* ÊäÈëÊä³öͼÏñµÄ·Ö±æÂÊ */  
 | 
    int srcW_ex, srcH_ex, dstW_ex, dstH_ex;                /* À©Õ¹ºóµÄÊäÈëÊä³ö·Ö±æÂÊ */  
 | 
    double cropStepW[2000], cropStepH[2000];  
 | 
    double cropStartW[2000], cropStartH[2000];  
 | 
    int meshSizeW, meshSizeH;  
 | 
    double meshStepW, meshStepH;  
 | 
    int meshSize1bin;  
 | 
    int meshSize4bin;  
 | 
    unsigned short    SpbNum;  
 | 
    unsigned long    MeshPointNumW;  
 | 
    unsigned short    SpbMeshPNumH;  
 | 
    unsigned short    LastSpbMeshPNumH;  
 | 
  
 | 
    unsigned short    *pMeshXY;  
 | 
  
 | 
};  
 | 
  
 | 
/* Éú³ÉLDCHÓ³Éä±íÏà¹ØµÄ²ÎÊý */  
 | 
struct LdchParams  
 | 
{  
 | 
    int saveMaxFovX;                                    /* ±£Áôˮƽx·½Ïò×î´óFOV: 1´ú±í±£Áô, 0´ú±í²»±£Áô */  
 | 
    int isLdchOld;                                        /* ÊÇ·ñ¾É°æLDCH: 1´ú±íÊÇ£¬0´ú±í²»ÊÇ */  
 | 
    int saveMeshX;                                        /* ÊÇ·ñ±£´æMeshX.binÎļþ: 1´ú±í±£´æ, 0´ú±í²»±£´æ */  
 | 
    char meshPath[256];                                    /* ±£´æMeshX.binÎļþµÄ·¾¶ */  
 | 
    int srcW, srcH, dstW, dstH;                            /* ÊäÈëÊä³öͼÏñµÄ·Ö±æÂÊ */  
 | 
    int meshSizeW, meshSizeH;  
 | 
    double meshStepW, meshStepH;  
 | 
    int mapxFixBit;                                        /* ¶¨µã»¯×óÒÆÎ»Êý */  
 | 
    int meshSize;  
 | 
    int maxLevel;  
 | 
    double *mapx;  
 | 
    double *mapy;  
 | 
};  
 | 
  
 | 
  
 | 
/* =============================================================================================================================================================================== */  
 | 
  
 | 
/* FEC: ³õʼ»¯, ¸ù¾ÝͼÏñÊä³ö·Ö±æÂÊ, ¼ÆËãFECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer */  
 | 
void genFecMeshInit(int srcW, int srcH, int dstW, int dstH, FecParams &fecParams, CameraCoeff &camCoeff);  
 | 
  
 | 
/* FEC: ·´³õʼ»¯ */  
 | 
void genFecMeshDeInit(FecParams &fecParams);  
 | 
  
 | 
/* FEC: Ô¤ÏȼÆËãµÄ²¿·Ö: ¸¡µãδУÕýµÄС±íºÍlevel=0,level=255µÄ¶àÏîʽ²ÎÊý */  
 | 
void genFecPreCalcPart(FecParams &fecParams, CameraCoeff &camCoeff);  
 | 
  
 | 
/* FEC: 4¸ömesh ÄÚ´æÉêÇë */  
 | 
void mallocFecMesh(int meshSize, unsigned short **pMeshXI, unsigned char **pMeshXF, unsigned short **pMeshYI, unsigned char **pMeshYF);  
 | 
  
 | 
/* FEC: 4¸ömesh ÄÚ´æÊÍ·Å */  
 | 
void freeFecMesh(unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF);  
 | 
  
 | 
/*  
 | 
º¯Êý¹¦ÄÜ: Éú³É²»Í¬Ð£Õý³Ì¶ÈµÄmeshÓ³Éä±í, ÓÃÓÚISPµÄFECÄ£¿é  
 | 
    ÊäÈë:  
 | 
    1£©FECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer: FecParams &fecParams  
 | 
    2£©Ïà»ú±ê¶¨²ÎÊý: CameraCoeff &camCoeff  
 | 
    3£©ÐèҪУÕýµÄ³Ì¶È: level(0-255: 0±íʾУÕý³Ì¶ÈΪ0%, 255±íʾУÕý³Ì¶ÈΪ100%)  
 | 
    Êä³ö:  
 | 
    1£©bool ÊÇ·ñ³É¹¦Éú³É  
 | 
    2£©pMeshXI, pMeshXF, pMeshYI, pMeshYF  
 | 
*/  
 | 
bool genFECMeshNLevel(FecParams &fecParams, CameraCoeff &camCoeff, int level, unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF);  
 | 
  
 | 
  
 | 
/* =============================================================================================================================================================================== */  
 | 
  
 | 
/* LDCH: ³õʼ»¯, ¸ù¾ÝͼÏñÊä³ö·Ö±æÂÊ, ¼ÆËãLDCHÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer */  
 | 
void genLdchMeshInit(int srcW, int srcH, int dstW, int dstH, LdchParams &ldchParams, CameraCoeff &camCoeff);  
 | 
  
 | 
/* LDCH: ·´³õʼ»¯ */  
 | 
void genLdchMeshDeInit(LdchParams &ldchParams);  
 | 
  
 | 
/* LDCH: Ô¤ÏȼÆËãµÄ²¿·Ö: ¸¡µãδУÕýµÄС±íºÍlevel=0,level=255µÄ¶àÏîʽ²ÎÊý */  
 | 
void genLdchPreCalcPart(LdchParams &ldchParams, CameraCoeff &camCoeff);  
 | 
  
 | 
/* LDCH: ¼ÆËãLDCHÄܹ»Ð£ÕýµÄ×î´ó³Ì¶È */  
 | 
void calcLdchMaxLevel(LdchParams &ldchParams, CameraCoeff &camCoeff);  
 | 
  
 | 
/*  
 | 
º¯Êý¹¦ÄÜ: Éú³É²»Í¬Ð£Õý³Ì¶ÈµÄmeshÓ³Éä±í, ÓÃÓÚISPµÄLDCHÄ£¿é  
 | 
  
 | 
    ÊäÈë:  
 | 
    1£©LDCHÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer: LdchParams &ldchParams  
 | 
    2£©Ïà»ú±ê¶¨²ÎÊý: CameraCoeff &camCoeff  
 | 
    3£©ÐèҪУÕýµÄ³Ì¶È: level(0-255: 0±íʾУÕý³Ì¶ÈΪ0%, 255±íʾУÕý³Ì¶ÈΪ100%)  
 | 
    Êä³ö:  
 | 
    1£©bool ÊÇ·ñ³É¹¦Éú³É  
 | 
    2£©pMeshX  
 | 
*/  
 | 
bool genLDCMeshNLevel(LdchParams &ldchParams, CameraCoeff &camCoeff, int level, unsigned short *pMeshX);  
 | 
  
 | 
  
 | 
/* =============================================================================================================================================================================== */  
 | 
  
 | 
/* LDCH + FEC(scale)--³õʼ»¯:  
 | 
    1£©LDCHµÄͼÏñ¿í¸ß: ldchW, ldchH, Èç: 3840*2160  
 | 
    2£©¶ÔÊäÈëFECµÄͼÏñ×öËõ·Å, Èç: 3840*2160 --> Ëõ·Åµ½1920*1080  
 | 
       i)×öËõ·ÅºóµÄFECµÄͼÏñ¿í¸ß: fecW, fecH  
 | 
*/  
 | 
void genScaleMeshInit(int ldchW, int ldchH, int fecW, int fecH, LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2);  
 | 
  
 | 
/* LDCH + FEC(scale)--·´³õʼ»¯ */  
 | 
void genScaleMeshDeInit(LdchParams &ldchParams, FecParams &fecParams);  
 | 
  
 | 
/* LDCH + FEC(scale)--mesh ÄÚ´æÉêÇë */  
 | 
void mallocScaleMesh(int ldchMeshSize, unsigned short **pLdchMeshX,  
 | 
    int fecMeshSize, unsigned short **pFecMeshXI, unsigned char **pFecMeshXF, unsigned short **pFecMeshYI, unsigned char **pFecMeshYF);  
 | 
  
 | 
/* LDCH + FEC(scale)--mesh ÄÚ´æÊÍ·Å */  
 | 
void freeScaleMesh(unsigned short *pLdchMeshX, unsigned short *pFecMeshXI, unsigned char *pFecMeshXF, unsigned short *pFecMeshYI, unsigned char *pFecMeshYF);  
 | 
  
 | 
/* LDCH + FEC(scale):  
 | 
º¯Êý¹¦ÄÜ: Éú³ÉmeshÓ³Éä±í, ÓÃÓÚISPµÄLDCH(x·½Ïò)ºÍFEC(y·½Ïò)  
 | 
    ÊäÈë:  
 | 
    1£©LDCH&FECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer: LdchParams &ldchParams, FecParams &fecParams  
 | 
    2£©Ïà»ú±ê¶¨²ÎÊý: CameraCoeff &camCoeff  
 | 
    3£©ÐèҪУÕýµÄ³Ì¶È: level(0-255: 0±íʾУÕý³Ì¶ÈΪ0%, 255±íʾУÕý³Ì¶ÈΪ100%)  
 | 
    Êä³ö:  
 | 
    1£©bool ÊÇ·ñ³É¹¦Éú³É  
 | 
    2£©LDCHÓ³Éä±í: pMeshX  
 | 
    3£©FECÓ³Éä±í: pMeshXI, pMeshXF, pMeshYI, pMeshYF  
 | 
*/  
 | 
bool genScaleMeshNLevel(LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2, int level,  
 | 
    unsigned short *pMeshX, unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF);  
 | 
  
 | 
/* =============================================================================================================================================================================== */  
 | 
  
 | 
/* LDCH + FEC(crop + scale)--³õʼ»¯:  
 | 
    ÊäÈë:  
 | 
    1£©LDCHµÄͼÏñ¿í¸ß: ldchW, ldchH, Èç: 3840*2160  
 | 
    2£©¶ÔÊäÈëFECµÄͼÏñÏÈÔÚÈÎÒâλÖÃ(pW,pH)cropµÃµ½ÈÎÒâsize(roiW*roiH), ÔÙ×öËõ·Å, Èç: 3840*2160 --> ÔÚ(100,100)µã´¦½øÐÐcropµÃµ½(1600*900) --> Ëõ·Åµ½1920*1080  
 | 
       i)  cropµÄÆðʼµãλÖÃ: pW, pH  
 | 
       ii) cropÇøÓòµÄ¿í¸ß: roiW, roiH  
 | 
       iii)×öËõ·ÅºóµÄFECµÄͼÏñ¿í¸ß: fecW, fecH  
 | 
*/  
 | 
void genCropScaleMeshInit(int ldchW, int ldchH, double pW, double pH, int roiW, int roiH, int fecW, int fecH,  
 | 
    LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2);  
 | 
  
 | 
/* LDCH + FEC(crop + scale)--·´³õʼ»¯ */  
 | 
void genCropScaleMeshDeInit(LdchParams &ldchParams, FecParams &fecParams);  
 | 
  
 | 
/* LDCH + FEC(crop + scale)--mesh ÄÚ´æÉêÇë */  
 | 
void mallocCropScaleMesh(int ldchMeshSize, unsigned short **pLdchMeshX,  
 | 
    int fecMeshSize, unsigned short **pFecMeshXI, unsigned char **pFecMeshXF, unsigned short **pFecMeshYI, unsigned char **pFecMeshYF);  
 | 
  
 | 
/* LDCH + FEC(crop + scale)--mesh ÄÚ´æÊÍ·Å */  
 | 
void freeCropScaleMesh(unsigned short *pLdchMeshX, unsigned short *pFecMeshXI, unsigned char *pFecMeshXF, unsigned short *pFecMeshYI, unsigned char *pFecMeshYF);  
 | 
  
 | 
/* LDCH + FEC(crop + scale):  
 | 
º¯Êý¹¦ÄÜ: Éú³ÉmeshÓ³Éä±í, ÓÃÓÚISPµÄLDCH(x·½Ïò)ºÍFEC(y·½Ïò)  
 | 
    ÊäÈë:  
 | 
    1£©LDCH&FECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer: LdchParams &ldchParams, FecParams &fecParams  
 | 
    2£©Ïà»ú±ê¶¨²ÎÊý: CameraCoeff &camCoeff  
 | 
    3£©ÐèҪУÕýµÄ³Ì¶È: level(0-255: 0±íʾУÕý³Ì¶ÈΪ0%, 255±íʾУÕý³Ì¶ÈΪ100%)  
 | 
    Êä³ö:  
 | 
    1£©bool ÊÇ·ñ³É¹¦Éú³É  
 | 
    2£©LDCHÓ³Éä±í: pMeshX  
 | 
    3£©FECÓ³Éä±í: pMeshXI, pMeshXF, pMeshYI, pMeshYF  
 | 
*/  
 | 
bool genCropScaleMeshNLevel(LdchParams &ldchParams, FecParams &fecParams, CameraCoeff &camCoeff1, CameraCoeff &camCoeff2, int level,  
 | 
    unsigned short *pMeshX, unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF);  
 | 
  
 | 
#endif // !__GENMESH_H__  
 |