153 lines
4.9 KiB
C++
Raw Normal View History

2025-05-10 21:58:58 +08:00
#include "genMesh.h"
#include <iostream>
#include <math.h>
//#include <cmath>
/* FEC: <20><>ʼ<EFBFBD><CABC>, <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>, <20><><EFBFBD><EFBFBD>FECӳ<43><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>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;
/* <20><>չ<EFBFBD><D5B9><EFBFBD><EFBFBD> */
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);
/* ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD> */
int meshStepW, meshStepH;
if (dstW > 1920) { //32x16
meshStepW = 32;
meshStepH = 16;
}
else { //16x8
meshStepW = 16;
meshStepH = 8;
}
/* ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD> */
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<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD> */
fecParams.meshStepW = meshStepW;
fecParams.meshStepH = meshStepH;
//fecParams.meshStepW = double(dstW) / double(fecParams.meshSizeW);
//fecParams.meshStepH = double(dstH) / double(fecParams.meshSizeH);
/* MeshXY<58>Ĵ<EFBFBD>С */
fecParams.meshSize1bin = fecParams.meshSizeW * fecParams.meshSizeH;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>MeshXY */
fecParams.pMeshXY = new unsigned short[fecParams.meshSize1bin * 2 * 2];
/* <20><><EFBFBD><EFBFBD>4<EFBFBD><34>mesh<73><68><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> */
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<><34>mesh<73>Ĵ<EFBFBD>С */
fecParams.meshSize4bin = (fecParams.SpbNum - 1) * fecParams.MeshPointNumW * fecParams.SpbMeshPNumH + fecParams.MeshPointNumW * fecParams.LastSpbMeshPNumH;
/* Ԥ<>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>: <20><><EFBFBD><EFBFBD>δУ<CEB4><D0A3><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>level=0,level=255<35>Ķ<EFBFBD><C4B6><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> */
genFecPreCalcPart(fecParams, camCoeff);
}
/* FEC: <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
void genFecMeshDeInit(FecParams &fecParams)
{
delete[] fecParams.pMeshXY;
}
/* FEC: 4<><34>mesh <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD> */
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<><34>mesh <20>ڴ<EFBFBD><DAB4>ͷ<EFBFBD> */
void freeFecMesh(unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF)
{
delete[] pMeshXI;
delete[] pMeshXF;
delete[] pMeshYI;
delete[] pMeshYF;
}
/* =============================================================================================================================================================================== */
/* LDCH: <20><>ʼ<EFBFBD><CABC>, <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>, <20><><EFBFBD><EFBFBD>LDCHӳ<48><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>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;
/* <20><><EFBFBD><EFBFBD><E3BBAF><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> */
ldchParams.mapxFixBit = 4;
if (dstW > 4096)
{
ldchParams.mapxFixBit = 3;
}
// mesh<73><68><EFBFBD>Ŀ<EFBFBD>, <20><>2688->169
ldchParams.meshSizeW = ((dstW + (1 << map_scale_bit_X) - 1) >> map_scale_bit_X) + 1;
// mesh<73><68><EFBFBD>ĸ<EFBFBD>, <20><>1520->191
ldchParams.meshSizeH = ((dstH + (1 << map_scale_bit_Y) - 1) >> map_scale_bit_Y) + 1;
/* mesh<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD> */
//ldchParams.meshStepW = double(dstW) / double(ldchParams.meshSizeW - 1);/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ҪӲ<D2AA><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤һ<D6A4><D2BB> */
//ldchParams.meshStepH = double(dstH) / double(ldchParams.meshSizeH - 1);
ldchParams.meshStepW = 16;
ldchParams.meshStepH = 8;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD> */
int mapWidAlign = ((ldchParams.meshSizeW + 1) >> 1) << 1;//<2F><><EFBFBD><EFBFBD>, <20>ֱ<EFBFBD><D6B1><EFBFBD>2688*1520, 169->170
ldchParams.meshSize = mapWidAlign * ldchParams.meshSizeH;
//ldchParams.meshSizeW = mapWidAlign;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mesh<73><68><EFBFBD><EFBFBD> */
ldchParams.mapx = new double[ldchParams.meshSize];
ldchParams.mapy = new double[ldchParams.meshSize];
/* LDCH: Ԥ<>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>: <20><><EFBFBD><EFBFBD>δУ<CEB4><D0A3><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>level=0,level=255<35>Ķ<EFBFBD><C4B6><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> */
genLdchPreCalcPart(ldchParams, camCoeff);
/* LDCH: <20><><EFBFBD><EFBFBD>LDCH<43>ܹ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> */
if (ldchParams.isLdchOld)
{
calcLdchMaxLevel(ldchParams, camCoeff);
}
else
{
ldchParams.maxLevel = 255;
}
}
/* LDCH: <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
void genLdchMeshDeInit(LdchParams &ldchParams)
{
if (ldchParams.mapx) {
delete[] ldchParams.mapx;
ldchParams.mapx = nullptr;
}
if (ldchParams.mapy) {
delete[] ldchParams.mapy;
ldchParams.mapy = nullptr;
}
}