#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;
|
}
|
|