xref: /rockchip-linux_mpp/mpp/hal/common/av1/film_grain_noise_table.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2021 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #include "film_grain_noise_table.h"
18*437bfbebSnyanmisaka #include <stdint.h>
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka static const RK_S32 gaussian_sequence[2048] = {
22*437bfbebSnyanmisaka     56,    568,   -180,  172,   124,   -84,   172,   -64,   -900,  24,   820,
23*437bfbebSnyanmisaka     224,   1248,  996,   272,   -8,    -916,  -388,  -732,  -104,  -188, 800,
24*437bfbebSnyanmisaka     112,   -652,  -320,  -376,  140,   -252,  492,   -168,  44,    -788, 588,
25*437bfbebSnyanmisaka     -584,  500,   -228,  12,    680,   272,   -476,  972,   -100,  652,  368,
26*437bfbebSnyanmisaka     432,   -196,  -720,  -192,  1000,  -332,  652,   -136,  -552,  -604, -4,
27*437bfbebSnyanmisaka     192,   -220,  -136,  1000,  -52,   372,   -96,   -624,  124,   -24,  396,
28*437bfbebSnyanmisaka     540,   -12,   -104,  640,   464,   244,   -208,  -84,   368,   -528, -740,
29*437bfbebSnyanmisaka     248,   -968,  -848,  608,   376,   -60,   -292,  -40,   -156,  252,  -292,
30*437bfbebSnyanmisaka     248,   224,   -280,  400,   -244,  244,   -60,   76,    -80,   212,  532,
31*437bfbebSnyanmisaka     340,   128,   -36,   824,   -352,  -60,   -264,  -96,   -612,  416,  -704,
32*437bfbebSnyanmisaka     220,   -204,  640,   -160,  1220,  -408,  900,   336,   20,    -336, -96,
33*437bfbebSnyanmisaka     -792,  304,   48,    -28,   -1232, -1172, -448,  104,   -292,  -520, 244,
34*437bfbebSnyanmisaka     60,    -948,  0,     -708,  268,   108,   356,   -548,  488,   -344, -136,
35*437bfbebSnyanmisaka     488,   -196,  -224,  656,   -236,  -1128, 60,    4,     140,   276,  -676,
36*437bfbebSnyanmisaka     -376,  168,   -108,  464,   8,     564,   64,    240,   308,   -300, -400,
37*437bfbebSnyanmisaka     -456,  -136,  56,    120,   -408,  -116,  436,   504,   -232,  328,  844,
38*437bfbebSnyanmisaka     -164,  -84,   784,   -168,  232,   -224,  348,   -376,  128,   568,  96,
39*437bfbebSnyanmisaka     -1244, -288,  276,   848,   832,   -360,  656,   464,   -384,  -332, -356,
40*437bfbebSnyanmisaka     728,   -388,  160,   -192,  468,   296,   224,   140,   -776,  -100, 280,
41*437bfbebSnyanmisaka     4,     196,   44,    -36,   -648,  932,   16,    1428,  28,    528,  808,
42*437bfbebSnyanmisaka     772,   20,    268,   88,    -332,  -284,  124,   -384,  -448,  208,  -228,
43*437bfbebSnyanmisaka     -1044, -328,  660,   380,   -148,  -300,  588,   240,   540,   28,   136,
44*437bfbebSnyanmisaka     -88,   -436,  256,   296,   -1000, 1400,  0,     -48,   1056,  -136, 264,
45*437bfbebSnyanmisaka     -528,  -1108, 632,   -484,  -592,  -344,  796,   124,   -668,  -768, 388,
46*437bfbebSnyanmisaka     1296,  -232,  -188,  -200,  -288,  -4,    308,   100,   -168,  256,  -500,
47*437bfbebSnyanmisaka     204,   -508,  648,   -136,  372,   -272,  -120,  -1004, -552,  -548, -384,
48*437bfbebSnyanmisaka     548,   -296,  428,   -108,  -8,    -912,  -324,  -224,  -88,   -112, -220,
49*437bfbebSnyanmisaka     -100,  996,   -796,  548,   360,   -216,  180,   428,   -200,  -212, 148,
50*437bfbebSnyanmisaka     96,    148,   284,   216,   -412,  -320,  120,   -300,  -384,  -604, -572,
51*437bfbebSnyanmisaka     -332,  -8,    -180,  -176,  696,   116,   -88,   628,   76,    44,   -516,
52*437bfbebSnyanmisaka     240,   -208,  -40,   100,   -592,  344,   -308,  -452,  -228,  20,   916,
53*437bfbebSnyanmisaka     -1752, -136,  -340,  -804,  140,   40,    512,   340,   248,   184,  -492,
54*437bfbebSnyanmisaka     896,   -156,  932,   -628,  328,   -688,  -448,  -616,  -752,  -100, 560,
55*437bfbebSnyanmisaka     -1020, 180,   -800,  -64,   76,    576,   1068,  396,   660,   552,  -108,
56*437bfbebSnyanmisaka     -28,   320,   -628,  312,   -92,   -92,   -472,  268,   16,    560,  516,
57*437bfbebSnyanmisaka     -672,  -52,   492,   -100,  260,   384,   284,   292,   304,   -148, 88,
58*437bfbebSnyanmisaka     -152,  1012,  1064,  -228,  164,   -376,  -684,  592,   -392,  156,  196,
59*437bfbebSnyanmisaka     -524,  -64,   -884,  160,   -176,  636,   648,   404,   -396,  -436, 864,
60*437bfbebSnyanmisaka     424,   -728,  988,   -604,  904,   -592,  296,   -224,  536,   -176, -920,
61*437bfbebSnyanmisaka     436,   -48,   1176,  -884,  416,   -776,  -824,  -884,  524,   -548, -564,
62*437bfbebSnyanmisaka     -68,   -164,  -96,   692,   364,   -692,  -1012, -68,   260,   -480, 876,
63*437bfbebSnyanmisaka     -1116, 452,   -332,  -352,  892,   -1088, 1220,  -676,  12,    -292, 244,
64*437bfbebSnyanmisaka     496,   372,   -32,   280,   200,   112,   -440,  -96,   24,    -644, -184,
65*437bfbebSnyanmisaka     56,    -432,  224,   -980,  272,   -260,  144,   -436,  420,   356,  364,
66*437bfbebSnyanmisaka     -528,  76,    172,   -744,  -368,  404,   -752,  -416,  684,   -688, 72,
67*437bfbebSnyanmisaka     540,   416,   92,    444,   480,   -72,   -1416, 164,   -1172, -68,  24,
68*437bfbebSnyanmisaka     424,   264,   1040,  128,   -912,  -524,  -356,  64,    876,   -12,  4,
69*437bfbebSnyanmisaka     -88,   532,   272,   -524,  320,   276,   -508,  940,   24,    -400, -120,
70*437bfbebSnyanmisaka     756,   60,    236,   -412,  100,   376,   -484,  400,   -100,  -740, -108,
71*437bfbebSnyanmisaka     -260,  328,   -268,  224,   -200,  -416,  184,   -604,  -564,  -20,  296,
72*437bfbebSnyanmisaka     60,    892,   -888,  60,    164,   68,    -760,  216,   -296,  904,  -336,
73*437bfbebSnyanmisaka     -28,   404,   -356,  -568,  -208,  -1480, -512,  296,   328,   -360, -164,
74*437bfbebSnyanmisaka     -1560, -776,  1156,  -428,  164,   -504,  -112,  120,   -216,  -148, -264,
75*437bfbebSnyanmisaka     308,   32,    64,    -72,   72,    116,   176,   -64,   -272,  460,  -536,
76*437bfbebSnyanmisaka     -784,  -280,  348,   108,   -752,  -132,  524,   -540,  -776,  116,  -296,
77*437bfbebSnyanmisaka     -1196, -288,  -560,  1040,  -472,  116,   -848,  -1116, 116,   636,  696,
78*437bfbebSnyanmisaka     284,   -176,  1016,  204,   -864,  -648,  -248,  356,   972,   -584, -204,
79*437bfbebSnyanmisaka     264,   880,   528,   -24,   -184,  116,   448,   -144,  828,   524,  212,
80*437bfbebSnyanmisaka     -212,  52,    12,    200,   268,   -488,  -404,  -880,  824,   -672, -40,
81*437bfbebSnyanmisaka     908,   -248,  500,   716,   -576,  492,   -576,  16,    720,   -108, 384,
82*437bfbebSnyanmisaka     124,   344,   280,   576,   -500,  252,   104,   -308,  196,   -188, -8,
83*437bfbebSnyanmisaka     1268,  296,   1032,  -1196, 436,   316,   372,   -432,  -200,  -660, 704,
84*437bfbebSnyanmisaka     -224,  596,   -132,  268,   32,    -452,  884,   104,   -1008, 424,  -1348,
85*437bfbebSnyanmisaka     -280,  4,     -1168, 368,   476,   696,   300,   -8,    24,    180,  -592,
86*437bfbebSnyanmisaka     -196,  388,   304,   500,   724,   -160,  244,   -84,   272,   -256, -420,
87*437bfbebSnyanmisaka     320,   208,   -144,  -156,  156,   364,   452,   28,    540,   316,  220,
88*437bfbebSnyanmisaka     -644,  -248,  464,   72,    360,   32,    -388,  496,   -680,  -48,  208,
89*437bfbebSnyanmisaka     -116,  -408,  60,    -604,  -392,  548,   -840,  784,   -460,  656,  -544,
90*437bfbebSnyanmisaka     -388,  -264,  908,   -800,  -628,  -612,  -568,  572,   -220,  164,  288,
91*437bfbebSnyanmisaka     -16,   -308,  308,   -112,  -636,  -760,  280,   -668,  432,   364,  240,
92*437bfbebSnyanmisaka     -196,  604,   340,   384,   196,   592,   -44,   -500,  432,   -580, -132,
93*437bfbebSnyanmisaka     636,   -76,   392,   4,     -412,  540,   508,   328,   -356,  -36,  16,
94*437bfbebSnyanmisaka     -220,  -64,   -248,  -60,   24,    -192,  368,   1040,  92,    -24,  -1044,
95*437bfbebSnyanmisaka     -32,   40,    104,   148,   192,   -136,  -520,  56,    -816,  -224, 732,
96*437bfbebSnyanmisaka     392,   356,   212,   -80,   -424,  -1008, -324,  588,   -1496, 576,  460,
97*437bfbebSnyanmisaka     -816,  -848,  56,    -580,  -92,   -1372, -112,  -496,  200,   364,  52,
98*437bfbebSnyanmisaka     -140,  48,    -48,   -60,   84,    72,    40,    132,   -356,  -268, -104,
99*437bfbebSnyanmisaka     -284,  -404,  732,   -520,  164,   -304,  -540,  120,   328,   -76,  -460,
100*437bfbebSnyanmisaka     756,   388,   588,   236,   -436,  -72,   -176,  -404,  -316,  -148, 716,
101*437bfbebSnyanmisaka     -604,  404,   -72,   -88,   -888,  -68,   944,   88,    -220,  -344, 960,
102*437bfbebSnyanmisaka     472,   460,   -232,  704,   120,   832,   -228,  692,   -508,  132,  -476,
103*437bfbebSnyanmisaka     844,   -748,  -364,  -44,   1116,  -1104, -1056, 76,    428,   552,  -692,
104*437bfbebSnyanmisaka     60,    356,   96,    -384,  -188,  -612,  -576,  736,   508,   892,  352,
105*437bfbebSnyanmisaka     -1132, 504,   -24,   -352,  324,   332,   -600,  -312,  292,   508,  -144,
106*437bfbebSnyanmisaka     -8,    484,   48,    284,   -260,  -240,  256,   -100,  -292,  -204, -44,
107*437bfbebSnyanmisaka     472,   -204,  908,   -188,  -1000, -256,  92,    1164,  -392,  564,  356,
108*437bfbebSnyanmisaka     652,   -28,   -884,  256,   484,   -192,  760,   -176,  376,   -524, -452,
109*437bfbebSnyanmisaka     -436,  860,   -736,  212,   124,   504,   -476,  468,   76,    -472, 552,
110*437bfbebSnyanmisaka     -692,  -944,  -620,  740,   -240,  400,   132,   20,    192,   -196, 264,
111*437bfbebSnyanmisaka     -668,  -1012, -60,   296,   -316,  -828,  76,    -156,  284,   -768, -448,
112*437bfbebSnyanmisaka     -832,  148,   248,   652,   616,   1236,  288,   -328,  -400,  -124, 588,
113*437bfbebSnyanmisaka     220,   520,   -696,  1032,  768,   -740,  -92,   -272,  296,   448,  -464,
114*437bfbebSnyanmisaka     412,   -200,  392,   440,   -200,  264,   -152,  -260,  320,   1032, 216,
115*437bfbebSnyanmisaka     320,   -8,    -64,   156,   -1016, 1084,  1172,  536,   484,   -432, 132,
116*437bfbebSnyanmisaka     372,   -52,   -256,  84,    116,   -352,  48,    116,   304,   -384, 412,
117*437bfbebSnyanmisaka     924,   -300,  528,   628,   180,   648,   44,    -980,  -220,  1320, 48,
118*437bfbebSnyanmisaka     332,   748,   524,   -268,  -720,  540,   -276,  564,   -344,  -208, -196,
119*437bfbebSnyanmisaka     436,   896,   88,    -392,  132,   80,    -964,  -288,  568,   56,   -48,
120*437bfbebSnyanmisaka     -456,  888,   8,     552,   -156,  -292,  948,   288,   128,   -716, -292,
121*437bfbebSnyanmisaka     1192,  -152,  876,   352,   -600,  -260,  -812,  -468,  -28,   -120, -32,
122*437bfbebSnyanmisaka     -44,   1284,  496,   192,   464,   312,   -76,   -516,  -380,  -456, -1012,
123*437bfbebSnyanmisaka     -48,   308,   -156,  36,    492,   -156,  -808,  188,   1652,  68,   -120,
124*437bfbebSnyanmisaka     -116,  316,   160,   -140,  352,   808,   -416,  592,   316,   -480, 56,
125*437bfbebSnyanmisaka     528,   -204,  -568,  372,   -232,  752,   -344,  744,   -4,    324,  -416,
126*437bfbebSnyanmisaka     -600,  768,   268,   -248,  -88,   -132,  -420,  -432,  80,    -288, 404,
127*437bfbebSnyanmisaka     -316,  -1216, -588,  520,   -108,  92,    -320,  368,   -480,  -216, -92,
128*437bfbebSnyanmisaka     1688,  -300,  180,   1020,  -176,  820,   -68,   -228,  -260,  436,  -904,
129*437bfbebSnyanmisaka     20,    40,    -508,  440,   -736,  312,   332,   204,   760,   -372, 728,
130*437bfbebSnyanmisaka     96,    -20,   -632,  -520,  -560,  336,   1076,  -64,   -532,  776,  584,
131*437bfbebSnyanmisaka     192,   396,   -728,  -520,  276,   -188,  80,    -52,   -612,  -252, -48,
132*437bfbebSnyanmisaka     648,   212,   -688,  228,   -52,   -260,  428,   -412,  -272,  -404, 180,
133*437bfbebSnyanmisaka     816,   -796,  48,    152,   484,   -88,   -216,  988,   696,   188,  -528,
134*437bfbebSnyanmisaka     648,   -116,  -180,  316,   476,   12,    -564,  96,    476,   -252, -364,
135*437bfbebSnyanmisaka     -376,  -392,  556,   -256,  -576,  260,   -352,  120,   -16,   -136, -260,
136*437bfbebSnyanmisaka     -492,  72,    556,   660,   580,   616,   772,   436,   424,   -32,  -324,
137*437bfbebSnyanmisaka     -1268, 416,   -324,  -80,   920,   160,   228,   724,   32,    -516, 64,
138*437bfbebSnyanmisaka     384,   68,    -128,  136,   240,   248,   -204,  -68,   252,   -932, -120,
139*437bfbebSnyanmisaka     -480,  -628,  -84,   192,   852,   -404,  -288,  -132,  204,   100,  168,
140*437bfbebSnyanmisaka     -68,   -196,  -868,  460,   1080,  380,   -80,   244,   0,     484,  -888,
141*437bfbebSnyanmisaka     64,    184,   352,   600,   460,   164,   604,   -196,  320,   -64,  588,
142*437bfbebSnyanmisaka     -184,  228,   12,    372,   48,    -848,  -344,  224,   208,   -200, 484,
143*437bfbebSnyanmisaka     128,   -20,   272,   -468,  -840,  384,   256,   -720,  -520,  -464, -580,
144*437bfbebSnyanmisaka     112,   -120,  644,   -356,  -208,  -608,  -528,  704,   560,   -424, 392,
145*437bfbebSnyanmisaka     828,   40,    84,    200,   -152,  0,     -144,  584,   280,   -120, 80,
146*437bfbebSnyanmisaka     -556,  -972,  -196,  -472,  724,   80,    168,   -32,   88,    160,  -688,
147*437bfbebSnyanmisaka     0,     160,   356,   372,   -776,  740,   -128,  676,   -248,  -480, 4,
148*437bfbebSnyanmisaka     -364,  96,    544,   232,   -1032, 956,   236,   356,   20,    -40,  300,
149*437bfbebSnyanmisaka     24,    -676,  -596,  132,   1120,  -104,  532,   -1096, 568,   648,  444,
150*437bfbebSnyanmisaka     508,   380,   188,   -376,  -604,  1488,  424,   24,    756,   -220, -192,
151*437bfbebSnyanmisaka     716,   120,   920,   688,   168,   44,    -460,  568,   284,   1144, 1160,
152*437bfbebSnyanmisaka     600,   424,   888,   656,   -356,  -320,  220,   316,   -176,  -724, -188,
153*437bfbebSnyanmisaka     -816,  -628,  -348,  -228,  -380,  1012,  -452,  -660,  736,   928,  404,
154*437bfbebSnyanmisaka     -696,  -72,   -268,  -892,  128,   184,   -344,  -780,  360,   336,  400,
155*437bfbebSnyanmisaka     344,   428,   548,   -112,  136,   -228,  -216,  -820,  -516,  340,  92,
156*437bfbebSnyanmisaka     -136,  116,   -300,  376,   -244,  100,   -316,  -520,  -284,  -12,  824,
157*437bfbebSnyanmisaka     164,   -548,  -180,  -128,  116,   -924,  -828,  268,   -368,  -580, 620,
158*437bfbebSnyanmisaka     192,   160,   0,     -1676, 1068,  424,   -56,   -360,  468,   -156, 720,
159*437bfbebSnyanmisaka     288,   -528,  556,   -364,  548,   -148,  504,   316,   152,   -648, -620,
160*437bfbebSnyanmisaka     -684,  -24,   -376,  -384,  -108,  -920,  -1032, 768,   180,   -264, -508,
161*437bfbebSnyanmisaka     -1268, -260,  -60,   300,   -240,  988,   724,   -376,  -576,  -212, -736,
162*437bfbebSnyanmisaka     556,   192,   1092,  -620,  -880,  376,   -56,   -4,    -216,  -32,  836,
163*437bfbebSnyanmisaka     268,   396,   1332,  864,   -600,  100,   56,    -412,  -92,   356,  180,
164*437bfbebSnyanmisaka     884,   -468,  -436,  292,   -388,  -804,  -704,  -840,  368,   -348, 140,
165*437bfbebSnyanmisaka     -724,  1536,  940,   372,   112,   -372,  436,   -480,  1136,  296,  -32,
166*437bfbebSnyanmisaka     -228,  132,   -48,   -220,  868,   -1016, -60,   -1044, -464,  328,  916,
167*437bfbebSnyanmisaka     244,   12,    -736,  -296,  360,   468,   -376,  -108,  -92,   788,  368,
168*437bfbebSnyanmisaka     -56,   544,   400,   -672,  -420,  728,   16,    320,   44,    -284, -380,
169*437bfbebSnyanmisaka     -796,  488,   132,   204,   -596,  -372,  88,    -152,  -908,  -636, -572,
170*437bfbebSnyanmisaka     -624,  -116,  -692,  -200,  -56,   276,   -88,   484,   -324,  948,  864,
171*437bfbebSnyanmisaka     1000,  -456,  -184,  -276,  292,   -296,  156,   676,   320,   160,  908,
172*437bfbebSnyanmisaka     -84,   -1236, -288,  -116,  260,   -372,  -644,  732,   -756,  -96,  84,
173*437bfbebSnyanmisaka     344,   -520,  348,   -688,  240,   -84,   216,   -1044, -136,  -676, -396,
174*437bfbebSnyanmisaka     -1500, 960,   -40,   176,   168,   1516,  420,   -504,  -344,  -364, -360,
175*437bfbebSnyanmisaka     1216,  -940,  -380,  -212,  252,   -660,  -708,  484,   -444,  -152, 928,
176*437bfbebSnyanmisaka     -120,  1112,  476,   -260,  560,   -148,  -344,  108,   -196,  228,  -288,
177*437bfbebSnyanmisaka     504,   560,   -328,  -88,   288,   -1008, 460,   -228,  468,   -836, -196,
178*437bfbebSnyanmisaka     76,    388,   232,   412,   -1168, -716,  -644,  756,   -172,  -356, -504,
179*437bfbebSnyanmisaka     116,   432,   528,   48,    476,   -168,  -608,  448,   160,   -532, -272,
180*437bfbebSnyanmisaka     28,    -676,  -12,   828,   980,   456,   520,   104,   -104,  256,  -344,
181*437bfbebSnyanmisaka     -4,    -28,   -368,  -52,   -524,  -572,  -556,  -200,  768,   1124, -208,
182*437bfbebSnyanmisaka     -512,  176,   232,   248,   -148,  -888,  604,   -600,  -304,  804,  -156,
183*437bfbebSnyanmisaka     -212,  488,   -192,  -804,  -256,  368,   -360,  -916,  -328,  228,  -240,
184*437bfbebSnyanmisaka     -448,  -472,  856,   -556,  -364,  572,   -12,   -156,  -368,  -340, 432,
185*437bfbebSnyanmisaka     252,   -752,  -152,  288,   268,   -580,  -848,  -592,  108,   -76,  244,
186*437bfbebSnyanmisaka     312,   -716,  592,   -80,   436,   360,   4,     -248,  160,   516,  584,
187*437bfbebSnyanmisaka     732,   44,    -468,  -280,  -292,  -156,  -588,  28,    308,   912,  24,
188*437bfbebSnyanmisaka     124,   156,   180,   -252,  944,   -924,  -772,  -520,  -428,  -624, 300,
189*437bfbebSnyanmisaka     -212,  -1144, 32,    -724,  800,   -1128, -212,  -1288, -848,  180,  -416,
190*437bfbebSnyanmisaka     440,   192,   -576,  -792,  -76,   -1080, 80,    -532,  -352,  -132, 380,
191*437bfbebSnyanmisaka     -820,  148,   1112,  128,   164,   456,   700,   -924,  144,   -668, -384,
192*437bfbebSnyanmisaka     648,   -832,  508,   552,   -52,   -100,  -656,  208,   -568,  748,  -88,
193*437bfbebSnyanmisaka     680,   232,   300,   192,   -408,  -1012, -152,  -252,  -268,  272,  -876,
194*437bfbebSnyanmisaka     -664,  -648,  -332,  -136,  16,    12,    1152,  -28,   332,   -536, 320,
195*437bfbebSnyanmisaka     -672,  -460,  -316,  532,   -260,  228,   -40,   1052,  -816,  180,  88,
196*437bfbebSnyanmisaka     -496,  -556,  -672,  -368,  428,   92,    356,   404,   -408,  252,  196,
197*437bfbebSnyanmisaka     -176,  -556,  792,   268,   32,    372,   40,    96,    -332,  328,  120,
198*437bfbebSnyanmisaka     372,   -900,  -40,   472,   -264,  -592,  952,   128,   656,   112,  664,
199*437bfbebSnyanmisaka     -232,  420,   4,     -344,  -464,  556,   244,   -416,  -32,   252,  0,
200*437bfbebSnyanmisaka     -412,  188,   -696,  508,   -476,  324,   -1096, 656,   -312,  560,  264,
201*437bfbebSnyanmisaka     -136,  304,   160,   -64,   -580,  248,   336,   -720,  560,   -348, -288,
202*437bfbebSnyanmisaka     -276,  -196,  -500,  852,   -544,  -236,  -1128, -992,  -776,  116,  56,
203*437bfbebSnyanmisaka     52,    860,   884,   212,   -12,   168,   1020,  512,   -552,  924,  -148,
204*437bfbebSnyanmisaka     716,   188,   164,   -340,  -520,  -184,  880,   -152,  -680,  -208, -1156,
205*437bfbebSnyanmisaka     -300,  -528,  -472,  364,   100,   -744,  -1056, -32,   540,   280,  144,
206*437bfbebSnyanmisaka     -676,  -32,   -232,  -280,  -224,  96,    568,   -76,   172,   148,  148,
207*437bfbebSnyanmisaka     104,   32,    -296,  -32,   788,   -80,   32,    -16,   280,   288,  944,
208*437bfbebSnyanmisaka     428,   -484
209*437bfbebSnyanmisaka };
210*437bfbebSnyanmisaka 
Clamp(RK_S32 value,RK_S32 low,RK_S32 high)211*437bfbebSnyanmisaka static inline RK_S32 Clamp(RK_S32 value, RK_S32 low, RK_S32 high)
212*437bfbebSnyanmisaka {
213*437bfbebSnyanmisaka     return value < low ? low : (value > high ? high : value);
214*437bfbebSnyanmisaka }
215*437bfbebSnyanmisaka 
RoundPowerOfTwo(const RK_S32 val,RK_S32 n)216*437bfbebSnyanmisaka static inline RK_S32 RoundPowerOfTwo(const RK_S32 val, RK_S32 n)
217*437bfbebSnyanmisaka {
218*437bfbebSnyanmisaka     const RK_S32 a = (RK_S32)1 << (n - 1);
219*437bfbebSnyanmisaka     return (val + a) >> n;
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka // Reset random_register
InitRandomGenerator(RK_U8 luma_num,RK_U16 seed,RK_U16 * random_register)223*437bfbebSnyanmisaka static void InitRandomGenerator(RK_U8 luma_num, RK_U16 seed, RK_U16 *random_register)
224*437bfbebSnyanmisaka {
225*437bfbebSnyanmisaka     RK_U16 random_reg = seed;
226*437bfbebSnyanmisaka     random_reg ^= ((luma_num * 37 + 178) & 255) << 8;
227*437bfbebSnyanmisaka     random_reg ^= ((luma_num * 173 + 105) & 255);
228*437bfbebSnyanmisaka     *random_register = random_reg;
229*437bfbebSnyanmisaka }
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka // Update random_register as LFSR
UpdateRandomRegister(RK_U16 * random_register)232*437bfbebSnyanmisaka static inline void UpdateRandomRegister(RK_U16 *random_register)
233*437bfbebSnyanmisaka {
234*437bfbebSnyanmisaka     RK_U16 bit;
235*437bfbebSnyanmisaka     RK_U16 random_reg = *random_register;
236*437bfbebSnyanmisaka     bit = ((random_reg >> 0) ^ (random_reg >> 1) ^ (random_reg >> 3) ^
237*437bfbebSnyanmisaka            (random_reg >> 12)) &
238*437bfbebSnyanmisaka           1;
239*437bfbebSnyanmisaka     *random_register = (random_reg >> 1) | (bit << 15);
240*437bfbebSnyanmisaka }
241*437bfbebSnyanmisaka 
GetRandomNumber(RK_U16 random_register)242*437bfbebSnyanmisaka static inline RK_S32 GetRandomNumber(RK_U16 random_register)
243*437bfbebSnyanmisaka {
244*437bfbebSnyanmisaka     return (random_register >> 5) & ((1 << 11) - 1);
245*437bfbebSnyanmisaka }
246*437bfbebSnyanmisaka 
GenerateLumaGrainBlock(RK_S32 luma_grain_block[][82],RK_S32 bitdepth,RK_U8 num_y_points,RK_S32 grain_scale_shift,RK_S32 ar_coeff_lag,RK_S32 ar_coeffs_y[],RK_S32 ar_coeff_shift,RK_S32 grain_min,RK_S32 grain_max,RK_U16 random_seed)247*437bfbebSnyanmisaka void GenerateLumaGrainBlock(RK_S32 luma_grain_block[][82], RK_S32 bitdepth,
248*437bfbebSnyanmisaka                             RK_U8 num_y_points, RK_S32 grain_scale_shift,
249*437bfbebSnyanmisaka                             RK_S32 ar_coeff_lag, RK_S32 ar_coeffs_y[],
250*437bfbebSnyanmisaka                             RK_S32 ar_coeff_shift, RK_S32 grain_min, RK_S32 grain_max,
251*437bfbebSnyanmisaka                             RK_U16 random_seed)
252*437bfbebSnyanmisaka {
253*437bfbebSnyanmisaka     RK_S32 gauss_sec_shift = 12 - bitdepth + grain_scale_shift;
254*437bfbebSnyanmisaka     RK_U16 grain_random_register = random_seed;
255*437bfbebSnyanmisaka     RK_S32 i, j;
256*437bfbebSnyanmisaka     for (i = 0; i < 73; i++) {
257*437bfbebSnyanmisaka         for (j = 0; j < 82; j++) {
258*437bfbebSnyanmisaka             if (num_y_points > 0) {
259*437bfbebSnyanmisaka                 UpdateRandomRegister(&grain_random_register);
260*437bfbebSnyanmisaka                 luma_grain_block[i][j] = RoundPowerOfTwo(
261*437bfbebSnyanmisaka                                              gaussian_sequence[GetRandomNumber(grain_random_register)],
262*437bfbebSnyanmisaka                                              gauss_sec_shift);
263*437bfbebSnyanmisaka             } else {
264*437bfbebSnyanmisaka                 luma_grain_block[i][j] = 0;
265*437bfbebSnyanmisaka             }
266*437bfbebSnyanmisaka         }
267*437bfbebSnyanmisaka     }
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka     for (i = 3; i < 73; i++)
270*437bfbebSnyanmisaka         for (j = 3; j < 82 - 3; j++) {
271*437bfbebSnyanmisaka             RK_S32 pos = 0;
272*437bfbebSnyanmisaka             RK_S32 wsum = 0;
273*437bfbebSnyanmisaka             RK_S32 deltaRow, deltaCol;
274*437bfbebSnyanmisaka             for (deltaRow = -ar_coeff_lag; deltaRow <= 0; deltaRow++) {
275*437bfbebSnyanmisaka                 for (deltaCol = -ar_coeff_lag; deltaCol <= ar_coeff_lag;
276*437bfbebSnyanmisaka                      deltaCol++) {
277*437bfbebSnyanmisaka                     if (deltaRow == 0 && deltaCol == 0) break;
278*437bfbebSnyanmisaka                     wsum = wsum + ar_coeffs_y[pos] *
279*437bfbebSnyanmisaka                            luma_grain_block[i + deltaRow][j + deltaCol];
280*437bfbebSnyanmisaka                     ++pos;
281*437bfbebSnyanmisaka                 }
282*437bfbebSnyanmisaka             }
283*437bfbebSnyanmisaka             luma_grain_block[i][j] =
284*437bfbebSnyanmisaka                 Clamp(luma_grain_block[i][j] + RoundPowerOfTwo(wsum, ar_coeff_shift),
285*437bfbebSnyanmisaka                       grain_min, grain_max);
286*437bfbebSnyanmisaka         }
287*437bfbebSnyanmisaka }
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka // Calculate chroma grain noise once per frame
GenerateChromaGrainBlock(RK_S32 luma_grain_block[][82],RK_S32 cb_grain_block[][44],RK_S32 cr_grain_block[][44],RK_S32 bitdepth,RK_U8 num_y_points,RK_U8 num_cb_points,RK_U8 num_cr_points,RK_S32 grain_scale_shift,RK_S32 ar_coeff_lag,RK_S32 ar_coeffs_cb[],RK_S32 ar_coeffs_cr[],RK_S32 ar_coeff_shift,RK_S32 grain_min,RK_S32 grain_max,RK_U8 chroma_scaling_from_luma,RK_U16 random_seed)290*437bfbebSnyanmisaka void GenerateChromaGrainBlock(
291*437bfbebSnyanmisaka     RK_S32 luma_grain_block[][82], RK_S32 cb_grain_block[][44],
292*437bfbebSnyanmisaka     RK_S32 cr_grain_block[][44], RK_S32 bitdepth, RK_U8 num_y_points, RK_U8 num_cb_points,
293*437bfbebSnyanmisaka     RK_U8 num_cr_points, RK_S32 grain_scale_shift, RK_S32 ar_coeff_lag,
294*437bfbebSnyanmisaka     RK_S32 ar_coeffs_cb[], RK_S32 ar_coeffs_cr[], RK_S32 ar_coeff_shift, RK_S32 grain_min,
295*437bfbebSnyanmisaka     RK_S32 grain_max, RK_U8 chroma_scaling_from_luma, RK_U16 random_seed)
296*437bfbebSnyanmisaka {
297*437bfbebSnyanmisaka     RK_S32 gauss_sec_shift = 12 - bitdepth + grain_scale_shift;
298*437bfbebSnyanmisaka     RK_U16 grain_random_register = 0;
299*437bfbebSnyanmisaka     RK_S32 i, j;
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka     InitRandomGenerator(7, random_seed, &grain_random_register);
302*437bfbebSnyanmisaka     for ( i = 0; i < 38; i++) {
303*437bfbebSnyanmisaka         for (j = 0; j < 44; j++) {
304*437bfbebSnyanmisaka             if (num_cb_points || chroma_scaling_from_luma) {
305*437bfbebSnyanmisaka                 UpdateRandomRegister(&grain_random_register);
306*437bfbebSnyanmisaka                 cb_grain_block[i][j] = RoundPowerOfTwo(
307*437bfbebSnyanmisaka                                            gaussian_sequence[GetRandomNumber(grain_random_register)],
308*437bfbebSnyanmisaka                                            gauss_sec_shift);
309*437bfbebSnyanmisaka             } else {
310*437bfbebSnyanmisaka                 cb_grain_block[i][j] = 0;
311*437bfbebSnyanmisaka             }
312*437bfbebSnyanmisaka         }
313*437bfbebSnyanmisaka     }
314*437bfbebSnyanmisaka 
315*437bfbebSnyanmisaka     InitRandomGenerator(11, random_seed, &grain_random_register);
316*437bfbebSnyanmisaka     for (i = 0; i < 38; i++) {
317*437bfbebSnyanmisaka         for (j = 0; j < 44; j++) {
318*437bfbebSnyanmisaka             if (num_cr_points || chroma_scaling_from_luma) {
319*437bfbebSnyanmisaka                 UpdateRandomRegister(&grain_random_register);
320*437bfbebSnyanmisaka                 cr_grain_block[i][j] = RoundPowerOfTwo(
321*437bfbebSnyanmisaka                                            gaussian_sequence[GetRandomNumber(grain_random_register)],
322*437bfbebSnyanmisaka                                            gauss_sec_shift);
323*437bfbebSnyanmisaka             } else {
324*437bfbebSnyanmisaka                 cr_grain_block[i][j] = 0;
325*437bfbebSnyanmisaka             }
326*437bfbebSnyanmisaka         }
327*437bfbebSnyanmisaka     }
328*437bfbebSnyanmisaka 
329*437bfbebSnyanmisaka     for (i = 3; i < 38; i++)
330*437bfbebSnyanmisaka         for (j = 3; j < 44 - 3; j++) {
331*437bfbebSnyanmisaka             RK_S32 wsum_cb = 0;
332*437bfbebSnyanmisaka             RK_S32 wsum_cr = 0;
333*437bfbebSnyanmisaka             RK_S32 pos = 0;
334*437bfbebSnyanmisaka             RK_S32 deltaRow, deltaCol;
335*437bfbebSnyanmisaka 
336*437bfbebSnyanmisaka             for ( deltaRow = -ar_coeff_lag; deltaRow <= 0; deltaRow++) {
337*437bfbebSnyanmisaka                 for ( deltaCol = -ar_coeff_lag; deltaCol <= ar_coeff_lag;
338*437bfbebSnyanmisaka                       deltaCol++) {
339*437bfbebSnyanmisaka                     if (deltaRow == 0 && deltaCol == 0) break;
340*437bfbebSnyanmisaka                     wsum_cb = wsum_cb + ar_coeffs_cb[pos] *
341*437bfbebSnyanmisaka                               cb_grain_block[i + deltaRow][j + deltaCol];
342*437bfbebSnyanmisaka                     wsum_cr = wsum_cr + ar_coeffs_cr[pos] *
343*437bfbebSnyanmisaka                               cr_grain_block[i + deltaRow][j + deltaCol];
344*437bfbebSnyanmisaka                     ++pos;
345*437bfbebSnyanmisaka                 }
346*437bfbebSnyanmisaka             }
347*437bfbebSnyanmisaka 
348*437bfbebSnyanmisaka             if (num_y_points > 0) {
349*437bfbebSnyanmisaka                 RK_S32 av_luma = 0;
350*437bfbebSnyanmisaka                 RK_S32 luma_coord_y = (i << 1) - 3;
351*437bfbebSnyanmisaka                 RK_S32 luma_coord_x = (j << 1) - 3;
352*437bfbebSnyanmisaka 
353*437bfbebSnyanmisaka                 av_luma += luma_grain_block[luma_coord_y][luma_coord_x];
354*437bfbebSnyanmisaka                 av_luma += luma_grain_block[luma_coord_y][luma_coord_x + 1];
355*437bfbebSnyanmisaka                 av_luma += luma_grain_block[luma_coord_y + 1][luma_coord_x];
356*437bfbebSnyanmisaka                 av_luma += luma_grain_block[luma_coord_y + 1][luma_coord_x + 1];
357*437bfbebSnyanmisaka                 av_luma = RoundPowerOfTwo(av_luma, 2);
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka                 wsum_cb = wsum_cb + ar_coeffs_cb[pos] * av_luma;
360*437bfbebSnyanmisaka                 wsum_cr = wsum_cr + ar_coeffs_cr[pos] * av_luma;
361*437bfbebSnyanmisaka             }
362*437bfbebSnyanmisaka 
363*437bfbebSnyanmisaka             if (num_cb_points || chroma_scaling_from_luma) {
364*437bfbebSnyanmisaka                 cb_grain_block[i][j] = Clamp(
365*437bfbebSnyanmisaka                                            cb_grain_block[i][j] + RoundPowerOfTwo(wsum_cb, ar_coeff_shift),
366*437bfbebSnyanmisaka                                            grain_min, grain_max);
367*437bfbebSnyanmisaka             }
368*437bfbebSnyanmisaka             if (num_cr_points || chroma_scaling_from_luma) {
369*437bfbebSnyanmisaka                 cr_grain_block[i][j] = Clamp(
370*437bfbebSnyanmisaka                                            cr_grain_block[i][j] + RoundPowerOfTwo(wsum_cr, ar_coeff_shift),
371*437bfbebSnyanmisaka                                            grain_min, grain_max);
372*437bfbebSnyanmisaka             }
373*437bfbebSnyanmisaka         }
374*437bfbebSnyanmisaka }
375