#include "genMesh.h"  
 | 
#include <iostream>  
 | 
#include <math.h>  
 | 
//#include <cmath>  
 | 
  
 | 
/* FEC: ³õʼ»¯, ¸ù¾ÝͼÏñÊä³ö·Ö±æÂÊ, ¼ÆËãFECÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer */  
 | 
void genFecMeshInit(int srcW, int srcH, int dstW, int dstH, FecParams &fecParams, CameraCoeff &camCoeff)  
 | 
{  
 | 
    fecParams.srcW = srcW;  
 | 
    fecParams.srcH = srcH;  
 | 
    fecParams.dstW = dstW;  
 | 
    fecParams.dstH = dstH;  
 | 
    /* À©Õ¹¶ÔÆë */  
 | 
    fecParams.srcW_ex = 32 * ((srcW + 31) / 32);  
 | 
    fecParams.srcH_ex = 32 * ((srcH + 31) / 32);  
 | 
    fecParams.dstW_ex = 32 * ((dstW + 31) / 32);  
 | 
    fecParams.dstH_ex = 32 * ((dstH + 31) / 32);  
 | 
    /* Ó³Éä±íµÄ²½³¤ */  
 | 
    int meshStepW, meshStepH;  
 | 
    if (dstW > 1920) { //32x16  
 | 
        meshStepW = 32;  
 | 
        meshStepH = 16;  
 | 
    }  
 | 
    else { //16x8  
 | 
        meshStepW = 16;  
 | 
        meshStepH = 8;  
 | 
    }  
 | 
    /* Ó³Éä±íµÄ¿í¸ß */  
 | 
    fecParams.meshSizeW = (fecParams.dstW_ex + meshStepW - 1) / meshStepW + 1;//modify to mesh alligned to 32x32  
 | 
    fecParams.meshSizeH = (fecParams.dstH_ex + meshStepH - 1) / meshStepH + 1;//modify to mesh alligned to 32x32  
 | 
  
 | 
    /* mesh±í½µ²ÉÑùµÄ²½³¤ */  
 | 
    fecParams.meshStepW = meshStepW;  
 | 
    fecParams.meshStepH = meshStepH;  
 | 
    //fecParams.meshStepW = double(dstW) / double(fecParams.meshSizeW);  
 | 
    //fecParams.meshStepH = double(dstH) / double(fecParams.meshSizeH);  
 | 
  
 | 
    /* MeshXYµÄ´óС */  
 | 
    fecParams.meshSize1bin = fecParams.meshSizeW * fecParams.meshSizeH;  
 | 
  
 | 
    /* ¶¨µãµÄС±íMeshXY */  
 | 
    fecParams.pMeshXY = new unsigned short[fecParams.meshSize1bin * 2 * 2];  
 | 
  
 | 
    /* ¼ÆËã4¸ömeshµÄÏà¹Ø²ÎÊý */  
 | 
    unsigned short SpbMeshPNum = 128 / meshStepH * fecParams.meshSizeW;  
 | 
    unsigned long MeshNumW;  
 | 
    int LastSpbH;  
 | 
    fecParams.SpbNum = (dstH + 128 - 1) / 128;  
 | 
    MeshNumW = fecParams.dstW_ex / meshStepW;  
 | 
    fecParams.MeshPointNumW = MeshNumW + 1;  
 | 
    fecParams.SpbMeshPNumH = 128 / meshStepH + 1;//16x8 -> 17, 32x16 -> 9  
 | 
    LastSpbH = (fecParams.dstH_ex % 128 == 0) ? 128 : (fecParams.dstH_ex % 128);//modify to mesh alligned to 32x32  
 | 
    fecParams.LastSpbMeshPNumH = LastSpbH / meshStepH + 1;  
 | 
    /* 4¸ömeshµÄ´óС */  
 | 
    fecParams.meshSize4bin = (fecParams.SpbNum - 1) * fecParams.MeshPointNumW * fecParams.SpbMeshPNumH + fecParams.MeshPointNumW * fecParams.LastSpbMeshPNumH;  
 | 
  
 | 
    /* Ô¤ÏȼÆËãµÄ²¿·Ö: ¸¡µãδУÕýµÄС±íºÍlevel=0,level=255µÄ¶àÏîʽ²ÎÊý */  
 | 
    genFecPreCalcPart(fecParams, camCoeff);  
 | 
}  
 | 
  
 | 
/* FEC: ·´³õʼ»¯ */  
 | 
void genFecMeshDeInit(FecParams &fecParams)  
 | 
{  
 | 
    delete[] fecParams.pMeshXY;  
 | 
}  
 | 
  
 | 
/* FEC: 4¸ömesh ÄÚ´æÉêÇë */  
 | 
void mallocFecMesh(int meshSize, unsigned short **pMeshXI, unsigned char **pMeshXF, unsigned short **pMeshYI, unsigned char **pMeshYF)  
 | 
{  
 | 
    *pMeshXI = new unsigned short[meshSize];  
 | 
    *pMeshXF = new unsigned char[meshSize];  
 | 
    *pMeshYI = new unsigned short[meshSize];  
 | 
    *pMeshYF = new unsigned char[meshSize];  
 | 
}  
 | 
  
 | 
/* FEC: 4¸ömesh ÄÚ´æÊÍ·Å */  
 | 
void freeFecMesh(unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF)  
 | 
{  
 | 
    delete[] pMeshXI;  
 | 
    delete[] pMeshXF;  
 | 
    delete[] pMeshYI;  
 | 
    delete[] pMeshYF;  
 | 
}  
 | 
  
 | 
  
 | 
/* =============================================================================================================================================================================== */  
 | 
  
 | 
  
 | 
/* LDCH: ³õʼ»¯, ¸ù¾ÝͼÏñÊä³ö·Ö±æÂÊ, ¼ÆËãLDCHÓ³Éä±íµÄÏà¹Ø²ÎÊý, ÉêÇëÐèÒªµÄbuffer */  
 | 
void genLdchMeshInit(int srcW, int srcH, int dstW, int dstH, LdchParams &ldchParams, CameraCoeff &camCoeff)  
 | 
{  
 | 
    ldchParams.srcW = srcW;  
 | 
    ldchParams.srcH = srcH;  
 | 
    ldchParams.dstW = dstW;  
 | 
    ldchParams.dstH = dstH;  
 | 
  
 | 
    int map_scale_bit_X = 4;  
 | 
    int map_scale_bit_Y = 3;  
 | 
    /* ¶¨µã»¯×óÒÆÎ»Êý */  
 | 
    ldchParams.mapxFixBit = 4;  
 | 
    if (dstW > 4096)  
 | 
    {  
 | 
        ldchParams.mapxFixBit = 3;  
 | 
    }  
 | 
    // mesh±íµÄ¿í, Èç2688->169  
 | 
    ldchParams.meshSizeW = ((dstW + (1 << map_scale_bit_X) - 1) >> map_scale_bit_X) + 1;  
 | 
    // mesh±íµÄ¸ß, Èç1520->191  
 | 
    ldchParams.meshSizeH = ((dstH + (1 << map_scale_bit_Y) - 1) >> map_scale_bit_Y) + 1;  
 | 
  
 | 
    /* mesh±í½µ²ÉÑùµÄ²½³¤ */  
 | 
    //ldchParams.meshStepW = double(dstW) / double(ldchParams.meshSizeW - 1);/* ÕâÀï¼õ1ÐèÒªÓ²¼þÉÏÑé֤һϠ*/  
 | 
    //ldchParams.meshStepH = double(dstH) / double(ldchParams.meshSizeH - 1);  
 | 
    ldchParams.meshStepW = 16;  
 | 
    ldchParams.meshStepH = 8;  
 | 
  
 | 
    /* ¶ÔÆëºóµÄ¿í */  
 | 
    int mapWidAlign = ((ldchParams.meshSizeW + 1) >> 1) << 1;//ÀýÈç, ·Ö±æÂÊ2688*1520, 169->170  
 | 
    ldchParams.meshSize = mapWidAlign * ldchParams.meshSizeH;  
 | 
  
 | 
    //ldchParams.meshSizeW = mapWidAlign;  
 | 
  
 | 
    /* ¸¡µãµÄmeshÍø¸ñ */  
 | 
    ldchParams.mapx = new double[ldchParams.meshSize];  
 | 
    ldchParams.mapy = new double[ldchParams.meshSize];  
 | 
  
 | 
    /* LDCH: Ô¤ÏȼÆËãµÄ²¿·Ö: ¸¡µãδУÕýµÄС±íºÍlevel=0,level=255µÄ¶àÏîʽ²ÎÊý */  
 | 
    genLdchPreCalcPart(ldchParams, camCoeff);  
 | 
  
 | 
    /* LDCH: ¼ÆËãLDCHÄܹ»Ð£ÕýµÄ×î´ó³Ì¶È */  
 | 
    if (ldchParams.isLdchOld)  
 | 
    {  
 | 
        calcLdchMaxLevel(ldchParams, camCoeff);  
 | 
    }  
 | 
    else  
 | 
    {  
 | 
        ldchParams.maxLevel = 255;  
 | 
    }  
 | 
}  
 | 
  
 | 
/* LDCH: ·´³õʼ»¯ */  
 | 
void genLdchMeshDeInit(LdchParams &ldchParams)  
 | 
{  
 | 
    delete[] ldchParams.mapx;  
 | 
    delete[] ldchParams.mapy;  
 | 
}  
 |