#include "genMesh.h" #include #include //#include /* 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; }