xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/IspFec/src/gen_mesh/genMesh.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "genMesh.h"
2 #include <iostream>
3 #include <math.h>
4 //#include <cmath>
5 
6 /* FEC: ��ʼ��, ����ͼ������ֱ���, ����FECӳ������ز���, ������Ҫ��buffer */
genFecMeshInit(int srcW,int srcH,int dstW,int dstH,FecParams & fecParams,CameraCoeff & camCoeff)7 void genFecMeshInit(int srcW, int srcH, int dstW, int dstH, FecParams &fecParams, CameraCoeff &camCoeff)
8 {
9 	fecParams.srcW = srcW;
10 	fecParams.srcH = srcH;
11 	fecParams.dstW = dstW;
12 	fecParams.dstH = dstH;
13 	/* ��չ���� */
14 	fecParams.srcW_ex = 32 * ((srcW + 31) / 32);
15 	fecParams.srcH_ex = 32 * ((srcH + 31) / 32);
16 	fecParams.dstW_ex = 32 * ((dstW + 31) / 32);
17 	fecParams.dstH_ex = 32 * ((dstH + 31) / 32);
18 	/* ӳ���IJ��� */
19 	int meshStepW, meshStepH;
20 	if (dstW > 1920) { //32x16
21 		meshStepW = 32;
22 		meshStepH = 16;
23 	}
24 	else { //16x8
25 		meshStepW = 16;
26 		meshStepH = 8;
27 	}
28 	/* ӳ���Ŀ�� */
29 	fecParams.meshSizeW = (fecParams.dstW_ex + meshStepW - 1) / meshStepW + 1;//modify to mesh alligned to 32x32
30 	fecParams.meshSizeH = (fecParams.dstH_ex + meshStepH - 1) / meshStepH + 1;//modify to mesh alligned to 32x32
31 
32 	/* mesh�������IJ��� */
33 	fecParams.meshStepW = meshStepW;
34 	fecParams.meshStepH = meshStepH;
35 	//fecParams.meshStepW = double(dstW) / double(fecParams.meshSizeW);
36 	//fecParams.meshStepH = double(dstH) / double(fecParams.meshSizeH);
37 
38 	/* MeshXY�Ĵ�С */
39 	fecParams.meshSize1bin = fecParams.meshSizeW * fecParams.meshSizeH;
40 
41 	/* �����С��MeshXY */
42 	fecParams.pMeshXY = new unsigned short[fecParams.meshSize1bin * 2 * 2];
43 
44 	/* ����4��mesh����ز��� */
45 	unsigned short SpbMeshPNum = 128 / meshStepH * fecParams.meshSizeW;
46 	unsigned long MeshNumW;
47 	int LastSpbH;
48 	fecParams.SpbNum = (dstH + 128 - 1) / 128;
49 	MeshNumW = fecParams.dstW_ex / meshStepW;
50 	fecParams.MeshPointNumW = MeshNumW + 1;
51 	fecParams.SpbMeshPNumH = 128 / meshStepH + 1;//16x8 -> 17, 32x16 -> 9
52 	LastSpbH = (fecParams.dstH_ex % 128 == 0) ? 128 : (fecParams.dstH_ex % 128);//modify to mesh alligned to 32x32
53 	fecParams.LastSpbMeshPNumH = LastSpbH / meshStepH + 1;
54 	/* 4��mesh�Ĵ�С */
55 	fecParams.meshSize4bin = (fecParams.SpbNum - 1) * fecParams.MeshPointNumW * fecParams.SpbMeshPNumH + fecParams.MeshPointNumW * fecParams.LastSpbMeshPNumH;
56 
57 	/* Ԥ�ȼ���IJ���: ����δУ����С���level=0,level=255�Ķ���ʽ���� */
58 	genFecPreCalcPart(fecParams, camCoeff);
59 }
60 
61 /* FEC: ����ʼ�� */
genFecMeshDeInit(FecParams & fecParams)62 void genFecMeshDeInit(FecParams &fecParams)
63 {
64 	delete[] fecParams.pMeshXY;
65 }
66 
67 /* FEC: 4��mesh �ڴ����� */
mallocFecMesh(int meshSize,unsigned short ** pMeshXI,unsigned char ** pMeshXF,unsigned short ** pMeshYI,unsigned char ** pMeshYF)68 void mallocFecMesh(int meshSize, unsigned short **pMeshXI, unsigned char **pMeshXF, unsigned short **pMeshYI, unsigned char **pMeshYF)
69 {
70 	*pMeshXI = new unsigned short[meshSize];
71 	*pMeshXF = new unsigned char[meshSize];
72 	*pMeshYI = new unsigned short[meshSize];
73 	*pMeshYF = new unsigned char[meshSize];
74 }
75 
76 /* FEC: 4��mesh �ڴ��ͷ� */
freeFecMesh(unsigned short * pMeshXI,unsigned char * pMeshXF,unsigned short * pMeshYI,unsigned char * pMeshYF)77 void freeFecMesh(unsigned short *pMeshXI, unsigned char *pMeshXF, unsigned short *pMeshYI, unsigned char *pMeshYF)
78 {
79 	delete[] pMeshXI;
80 	delete[] pMeshXF;
81 	delete[] pMeshYI;
82 	delete[] pMeshYF;
83 }
84 
85 
86 /* =============================================================================================================================================================================== */
87 
88 
89 /* LDCH: ��ʼ��, ����ͼ������ֱ���, ����LDCHӳ������ز���, ������Ҫ��buffer */
genLdchMeshInit(int srcW,int srcH,int dstW,int dstH,LdchParams & ldchParams,CameraCoeff & camCoeff)90 void genLdchMeshInit(int srcW, int srcH, int dstW, int dstH, LdchParams &ldchParams, CameraCoeff &camCoeff)
91 {
92 	ldchParams.srcW = srcW;
93 	ldchParams.srcH = srcH;
94 	ldchParams.dstW = dstW;
95 	ldchParams.dstH = dstH;
96 
97 	int map_scale_bit_X = 4;
98 	int map_scale_bit_Y = 3;
99 	/* ���㻯����λ�� */
100     if (RKALGO_LDCH_VERSION_0 == ldchParams.enLdchVersion) {
101         ldchParams.mapxFixBit = (dstW > 4096) ? 3 : 4;
102     }
103     if (RKALGO_LDCH_VERSION_1 == ldchParams.enLdchVersion) {
104         ldchParams.mapxFixBit = (dstW > 4080) ? 3 : 4;
105     }
106 
107 	// mesh��Ŀ�, ��2688->169
108 	ldchParams.meshSizeW = ((dstW + (1 << map_scale_bit_X) - 1) >> map_scale_bit_X) + 1;
109 	// mesh��ĸ�, ��1520->191
110 	ldchParams.meshSizeH = ((dstH + (1 << map_scale_bit_Y) - 1) >> map_scale_bit_Y) + 1;
111 
112 	/* mesh�������IJ��� */
113 	//ldchParams.meshStepW = double(dstW) / double(ldchParams.meshSizeW - 1);/* �����1��ҪӲ������֤һ�� */
114 	//ldchParams.meshStepH = double(dstH) / double(ldchParams.meshSizeH - 1);
115 	ldchParams.meshStepW = 16;
116 	ldchParams.meshStepH = 8;
117 
118 	/* �����Ŀ� */
119 	int mapWidAlign = ((ldchParams.meshSizeW + 1) >> 1) << 1;//����, �ֱ���2688*1520, 169->170
120 	ldchParams.meshSize = mapWidAlign * ldchParams.meshSizeH;
121 
122 	//ldchParams.meshSizeW = mapWidAlign;
123 
124 	/* �����mesh���� */
125 	ldchParams.mapx = new double[ldchParams.meshSize];
126 	ldchParams.mapy = new double[ldchParams.meshSize];
127 
128 	/* LDCH: Ԥ�ȼ���IJ���: ����δУ����С���level=0,level=255�Ķ���ʽ���� */
129 	genLdchPreCalcPart(ldchParams, camCoeff);
130 
131 	/* LDCH: ����LDCH�ܹ�У�������̶� */
132 	if (RKALGO_LDCH_VERSION_0 == ldchParams.enLdchVersion || RKALGO_LDCH_VERSION_1 == ldchParams.enLdchVersion)
133 	{
134 		calcLdchMaxLevel(ldchParams, camCoeff);
135 	}
136 	else
137 	{
138 		ldchParams.maxLevel = 255;
139 	}
140 }
141 
142 /* LDCH: ����ʼ�� */
genLdchMeshDeInit(LdchParams & ldchParams)143 void genLdchMeshDeInit(LdchParams &ldchParams)
144 {
145 	delete[] ldchParams.mapx;
146 	delete[] ldchParams.mapy;
147 }
148 
149