hi_isp_clut_lut
说明
定义CLUT的查找表。
定义
typedef struct { hi_u32 lut[HI_ISP_CLUT_LUT_LENGTH]; } hi_isp_clut_lut;
成员
成员名称 |
描述 |
---|---|
lut |
查找表取值范围:[0, 1073741823]。 注:lut表中每个元素的有效范围是30bit,若设置超过取值范围的值,实际生效范围仍是30bit #define HI_ISP_CLUT_LUT_LENGTH 5508 |
注意事项
用户需要自行生成3D LUT表,将17x17x17x3的LUT放入8x3的LUT,然后将8x3的LUT紧凑排列填入长度为5508的LUT。
17x17x17x3的LUT每个元素的范围为[-511, 511],使用10bit有符号数表示。将17x17x17x3的LUT取成8x3的LUT的过程为:
三维表的下标为偶数时定义为0,下标为奇数时定义为1。R[i][j][k],G[i][j][k], B[i][j][k]中的i代表r的分格,j代表b的分格,k代表g的分格,即ijk代表三维表的地址坐标,对应的是rbg的排列顺序。R[i][j][k],G[i][j][k],B[i][j][k]的值是deltaR,deltaG,deltaB的值。用C代表RGB,真值表如下所示:
for(k = 0; k < 17; k++) { for(j = 0; j < 17; j++) { for(i = 0; i < 17; i++) { switch((i&1) + ((j&1)<<1) + ((k&1)<<2)) { case 0: R0[n0]=R[i][j][k]; G0[n0]=G[i][j][k]; B0[n0]=B[i][j][k]; case 1: R1[n1]=R[i][j][k]; G1[n1]=G[i][j][k]; B1[n1]=B[i][j][k]; case 2: R2[n2]=R[i][j][k]; G2[n2]=G[i][j][k]; B2[n2]=B[i][j][k]; case 3: R3[n3]=R[i][j][k]; G3[n3]=G[i][j][k]; B3[n3]=B[i][j][k]; case 4: R4[n4]=R[i][j][k]; G4[n4]=G[i][j][k]; B4[n4]=B[i][j][k]; case 5: R5[n5]=R[i][j][k]; G5[n5]=G[i][j][k]; B5[n5]=B[i][j][k]; case 6: R6[n6]=R[i][j][k]; G6[n6]=G[i][j][k]; B6[n6]=B[i][j][k]; case 7: R7[n7]=R[i][j][k]; G7[n7]=G[i][j][k]; B7[n7]=B[i][j][k]; } } } }
用C代表RGB,取成的8个LUT分别为c0[729]、c1[648]、c2[648]、c3[576]、 c4[648]、c5[576]、c6[576]、c7[512]。
下面的描述用_0代表一维数组c0[729]第0个数据,_1代表一维数组c0[729]第1个数据。
8x3的LUT按照每3个数据紧凑排列到1个32bit数据内的格式定义为:
{2’b00,B0_0,G0_0,R0_0},
{2’b00,B1_0,G1_0,R1_0},
{2’b00,B2_0,G2_0,R2_0},
{2’b00,B3_0,G3_0,R3_0},
{2’b00,B0_1,G0_1,R0_1},
{2’b00,B1_1,G1_1,R1_1},
{2’b00,B2_1,G2_1,R2_1},
{2’b00,B3_1,G3_1,R3_1},
{......},
上述格式可视化如下图所示:
整体看如下图所示:
8x3的LUT按照c0[729] 占用空间729 x 4 = 2916和c4[648]占用空间648 x 4 = 2592连续存储成一个长度为5508的一维数组。