xref: /aosp_15_r20/external/libgav1/src/dsp/film_grain_common.h (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1*09537850SAkhilesh Sanikop /*
2*09537850SAkhilesh Sanikop  * Copyright 2020 The libgav1 Authors
3*09537850SAkhilesh Sanikop  *
4*09537850SAkhilesh Sanikop  * Licensed under the Apache License, Version 2.0 (the "License");
5*09537850SAkhilesh Sanikop  * you may not use this file except in compliance with the License.
6*09537850SAkhilesh Sanikop  * You may obtain a copy of the License at
7*09537850SAkhilesh Sanikop  *
8*09537850SAkhilesh Sanikop  *      http://www.apache.org/licenses/LICENSE-2.0
9*09537850SAkhilesh Sanikop  *
10*09537850SAkhilesh Sanikop  * Unless required by applicable law or agreed to in writing, software
11*09537850SAkhilesh Sanikop  * distributed under the License is distributed on an "AS IS" BASIS,
12*09537850SAkhilesh Sanikop  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*09537850SAkhilesh Sanikop  * See the License for the specific language governing permissions and
14*09537850SAkhilesh Sanikop  * limitations under the License.
15*09537850SAkhilesh Sanikop  */
16*09537850SAkhilesh Sanikop 
17*09537850SAkhilesh Sanikop #ifndef LIBGAV1_SRC_DSP_FILM_GRAIN_COMMON_H_
18*09537850SAkhilesh Sanikop #define LIBGAV1_SRC_DSP_FILM_GRAIN_COMMON_H_
19*09537850SAkhilesh Sanikop 
20*09537850SAkhilesh Sanikop #include <cstdint>
21*09537850SAkhilesh Sanikop 
22*09537850SAkhilesh Sanikop namespace libgav1 {
23*09537850SAkhilesh Sanikop 
24*09537850SAkhilesh Sanikop template <int bitdepth>
GetGrainMax()25*09537850SAkhilesh Sanikop int GetGrainMax() {
26*09537850SAkhilesh Sanikop   return (1 << (bitdepth - 1)) - 1;
27*09537850SAkhilesh Sanikop }
28*09537850SAkhilesh Sanikop 
29*09537850SAkhilesh Sanikop template <int bitdepth>
GetGrainMin()30*09537850SAkhilesh Sanikop int GetGrainMin() {
31*09537850SAkhilesh Sanikop   return -(1 << (bitdepth - 1));
32*09537850SAkhilesh Sanikop }
33*09537850SAkhilesh Sanikop 
GetFilmGrainRandomNumber(int bits,uint16_t * seed)34*09537850SAkhilesh Sanikop inline int GetFilmGrainRandomNumber(int bits, uint16_t* seed) {
35*09537850SAkhilesh Sanikop   uint16_t s = *seed;
36*09537850SAkhilesh Sanikop   uint16_t bit = (s ^ (s >> 1) ^ (s >> 3) ^ (s >> 12)) & 1;
37*09537850SAkhilesh Sanikop   s = (s >> 1) | (bit << 15);
38*09537850SAkhilesh Sanikop   *seed = s;
39*09537850SAkhilesh Sanikop   return s >> (16 - bits);
40*09537850SAkhilesh Sanikop }
41*09537850SAkhilesh Sanikop 
42*09537850SAkhilesh Sanikop enum {
43*09537850SAkhilesh Sanikop   kAutoRegressionBorder = 3,
44*09537850SAkhilesh Sanikop   // The width of the luma noise array.
45*09537850SAkhilesh Sanikop   kLumaWidth = 82,
46*09537850SAkhilesh Sanikop   // The height of the luma noise array.
47*09537850SAkhilesh Sanikop   kLumaHeight = 73,
48*09537850SAkhilesh Sanikop   // The two possible widths of the chroma noise array.
49*09537850SAkhilesh Sanikop   kMinChromaWidth = 44,
50*09537850SAkhilesh Sanikop   kMaxChromaWidth = 82,
51*09537850SAkhilesh Sanikop   // The two possible heights of the chroma noise array.
52*09537850SAkhilesh Sanikop   kMinChromaHeight = 38,
53*09537850SAkhilesh Sanikop   kMaxChromaHeight = 73,
54*09537850SAkhilesh Sanikop   // The standard scaling lookup table maps bytes to bytes, so only uses 256
55*09537850SAkhilesh Sanikop   // elements, plus one for overflow in 12bpp lookups. The size is scaled up for
56*09537850SAkhilesh Sanikop   // 10bpp.
57*09537850SAkhilesh Sanikop   kScalingLookupTableSize = 257,
58*09537850SAkhilesh Sanikop   // Padding is added to the scaling lookup table to permit overwrites by
59*09537850SAkhilesh Sanikop   // InitializeScalingLookupTable_NEON.
60*09537850SAkhilesh Sanikop   kScalingLookupTablePadding = 6,
61*09537850SAkhilesh Sanikop   // Padding is added to each row of the noise image to permit overreads by
62*09537850SAkhilesh Sanikop   // BlendNoiseWithImageLuma_NEON and overwrites by WriteOverlapLine8bpp_NEON.
63*09537850SAkhilesh Sanikop   kNoiseImagePadding = 15,
64*09537850SAkhilesh Sanikop   // Padding is added to the end of the |noise_stripes_| buffer to permit
65*09537850SAkhilesh Sanikop   // overreads by WriteOverlapLine8bpp_NEON.
66*09537850SAkhilesh Sanikop   kNoiseStripePadding = 7,
67*09537850SAkhilesh Sanikop };  // anonymous enum
68*09537850SAkhilesh Sanikop 
69*09537850SAkhilesh Sanikop }  // namespace libgav1
70*09537850SAkhilesh Sanikop 
71*09537850SAkhilesh Sanikop #endif  // LIBGAV1_SRC_DSP_FILM_GRAIN_COMMON_H_
72