LCOV - code coverage report
Current view: top level - Codec - grainSynthesis.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 629 0.0 %
Date: 2019-11-25 17:12:20 Functions: 0 16 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016, Alliance for Open Media. All rights reserved
       3             :  *
       4             :  * This source code is subject to the terms of the BSD 2 Clause License and
       5             :  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
       6             :  * was not distributed with this source code in the LICENSE file, you can
       7             :  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
       8             :  * Media Patent License 1.0 was not distributed with this source code in the
       9             :  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
      10             :  */
      11             : 
      12             :  /*!\file
      13             :   * \brief Describes film grain parameters and film grain synthesis
      14             :   *
      15             :   */
      16             : 
      17             : #include <stdio.h>
      18             : #include <string.h>
      19             : #include <stdlib.h>
      20             : #include "EbDefinitions.h"
      21             : #include "grainSynthesis.h"
      22             : 
      23             :   // Samples with Gaussian distribution in the range of [-2048, 2047] (12 bits)
      24             :   // with zero mean and standard deviation of about 512.
      25             :   // should be divided by 4 for 10-bit range and 16 for 8-bit range.
      26             : static const int32_t gaussian_sequence[2048] = {
      27             :   56,    568,   -180,  172,   124,   -84,   172,   -64,   -900,  24,   820,
      28             :   224,   1248,  996,   272,   -8,    -916,  -388,  -732,  -104,  -188, 800,
      29             :   112,   -652,  -320,  -376,  140,   -252,  492,   -168,  44,    -788, 588,
      30             :   -584,  500,   -228,  12,    680,   272,   -476,  972,   -100,  652,  368,
      31             :   432,   -196,  -720,  -192,  1000,  -332,  652,   -136,  -552,  -604, -4,
      32             :   192,   -220,  -136,  1000,  -52,   372,   -96,   -624,  124,   -24,  396,
      33             :   540,   -12,   -104,  640,   464,   244,   -208,  -84,   368,   -528, -740,
      34             :   248,   -968,  -848,  608,   376,   -60,   -292,  -40,   -156,  252,  -292,
      35             :   248,   224,   -280,  400,   -244,  244,   -60,   76,    -80,   212,  532,
      36             :   340,   128,   -36,   824,   -352,  -60,   -264,  -96,   -612,  416,  -704,
      37             :   220,   -204,  640,   -160,  1220,  -408,  900,   336,   20,    -336, -96,
      38             :   -792,  304,   48,    -28,   -1232, -1172, -448,  104,   -292,  -520, 244,
      39             :   60,    -948,  0,     -708,  268,   108,   356,   -548,  488,   -344, -136,
      40             :   488,   -196,  -224,  656,   -236,  -1128, 60,    4,     140,   276,  -676,
      41             :   -376,  168,   -108,  464,   8,     564,   64,    240,   308,   -300, -400,
      42             :   -456,  -136,  56,    120,   -408,  -116,  436,   504,   -232,  328,  844,
      43             :   -164,  -84,   784,   -168,  232,   -224,  348,   -376,  128,   568,  96,
      44             :   -1244, -288,  276,   848,   832,   -360,  656,   464,   -384,  -332, -356,
      45             :   728,   -388,  160,   -192,  468,   296,   224,   140,   -776,  -100, 280,
      46             :   4,     196,   44,    -36,   -648,  932,   16,    1428,  28,    528,  808,
      47             :   772,   20,    268,   88,    -332,  -284,  124,   -384,  -448,  208,  -228,
      48             :   -1044, -328,  660,   380,   -148,  -300,  588,   240,   540,   28,   136,
      49             :   -88,   -436,  256,   296,   -1000, 1400,  0,     -48,   1056,  -136, 264,
      50             :   -528,  -1108, 632,   -484,  -592,  -344,  796,   124,   -668,  -768, 388,
      51             :   1296,  -232,  -188,  -200,  -288,  -4,    308,   100,   -168,  256,  -500,
      52             :   204,   -508,  648,   -136,  372,   -272,  -120,  -1004, -552,  -548, -384,
      53             :   548,   -296,  428,   -108,  -8,    -912,  -324,  -224,  -88,   -112, -220,
      54             :   -100,  996,   -796,  548,   360,   -216,  180,   428,   -200,  -212, 148,
      55             :   96,    148,   284,   216,   -412,  -320,  120,   -300,  -384,  -604, -572,
      56             :   -332,  -8,    -180,  -176,  696,   116,   -88,   628,   76,    44,   -516,
      57             :   240,   -208,  -40,   100,   -592,  344,   -308,  -452,  -228,  20,   916,
      58             :   -1752, -136,  -340,  -804,  140,   40,    512,   340,   248,   184,  -492,
      59             :   896,   -156,  932,   -628,  328,   -688,  -448,  -616,  -752,  -100, 560,
      60             :   -1020, 180,   -800,  -64,   76,    576,   1068,  396,   660,   552,  -108,
      61             :   -28,   320,   -628,  312,   -92,   -92,   -472,  268,   16,    560,  516,
      62             :   -672,  -52,   492,   -100,  260,   384,   284,   292,   304,   -148, 88,
      63             :   -152,  1012,  1064,  -228,  164,   -376,  -684,  592,   -392,  156,  196,
      64             :   -524,  -64,   -884,  160,   -176,  636,   648,   404,   -396,  -436, 864,
      65             :   424,   -728,  988,   -604,  904,   -592,  296,   -224,  536,   -176, -920,
      66             :   436,   -48,   1176,  -884,  416,   -776,  -824,  -884,  524,   -548, -564,
      67             :   -68,   -164,  -96,   692,   364,   -692,  -1012, -68,   260,   -480, 876,
      68             :   -1116, 452,   -332,  -352,  892,   -1088, 1220,  -676,  12,    -292, 244,
      69             :   496,   372,   -32,   280,   200,   112,   -440,  -96,   24,    -644, -184,
      70             :   56,    -432,  224,   -980,  272,   -260,  144,   -436,  420,   356,  364,
      71             :   -528,  76,    172,   -744,  -368,  404,   -752,  -416,  684,   -688, 72,
      72             :   540,   416,   92,    444,   480,   -72,   -1416, 164,   -1172, -68,  24,
      73             :   424,   264,   1040,  128,   -912,  -524,  -356,  64,    876,   -12,  4,
      74             :   -88,   532,   272,   -524,  320,   276,   -508,  940,   24,    -400, -120,
      75             :   756,   60,    236,   -412,  100,   376,   -484,  400,   -100,  -740, -108,
      76             :   -260,  328,   -268,  224,   -200,  -416,  184,   -604,  -564,  -20,  296,
      77             :   60,    892,   -888,  60,    164,   68,    -760,  216,   -296,  904,  -336,
      78             :   -28,   404,   -356,  -568,  -208,  -1480, -512,  296,   328,   -360, -164,
      79             :   -1560, -776,  1156,  -428,  164,   -504,  -112,  120,   -216,  -148, -264,
      80             :   308,   32,    64,    -72,   72,    116,   176,   -64,   -272,  460,  -536,
      81             :   -784,  -280,  348,   108,   -752,  -132,  524,   -540,  -776,  116,  -296,
      82             :   -1196, -288,  -560,  1040,  -472,  116,   -848,  -1116, 116,   636,  696,
      83             :   284,   -176,  1016,  204,   -864,  -648,  -248,  356,   972,   -584, -204,
      84             :   264,   880,   528,   -24,   -184,  116,   448,   -144,  828,   524,  212,
      85             :   -212,  52,    12,    200,   268,   -488,  -404,  -880,  824,   -672, -40,
      86             :   908,   -248,  500,   716,   -576,  492,   -576,  16,    720,   -108, 384,
      87             :   124,   344,   280,   576,   -500,  252,   104,   -308,  196,   -188, -8,
      88             :   1268,  296,   1032,  -1196, 436,   316,   372,   -432,  -200,  -660, 704,
      89             :   -224,  596,   -132,  268,   32,    -452,  884,   104,   -1008, 424,  -1348,
      90             :   -280,  4,     -1168, 368,   476,   696,   300,   -8,    24,    180,  -592,
      91             :   -196,  388,   304,   500,   724,   -160,  244,   -84,   272,   -256, -420,
      92             :   320,   208,   -144,  -156,  156,   364,   452,   28,    540,   316,  220,
      93             :   -644,  -248,  464,   72,    360,   32,    -388,  496,   -680,  -48,  208,
      94             :   -116,  -408,  60,    -604,  -392,  548,   -840,  784,   -460,  656,  -544,
      95             :   -388,  -264,  908,   -800,  -628,  -612,  -568,  572,   -220,  164,  288,
      96             :   -16,   -308,  308,   -112,  -636,  -760,  280,   -668,  432,   364,  240,
      97             :   -196,  604,   340,   384,   196,   592,   -44,   -500,  432,   -580, -132,
      98             :   636,   -76,   392,   4,     -412,  540,   508,   328,   -356,  -36,  16,
      99             :   -220,  -64,   -248,  -60,   24,    -192,  368,   1040,  92,    -24,  -1044,
     100             :   -32,   40,    104,   148,   192,   -136,  -520,  56,    -816,  -224, 732,
     101             :   392,   356,   212,   -80,   -424,  -1008, -324,  588,   -1496, 576,  460,
     102             :   -816,  -848,  56,    -580,  -92,   -1372, -112,  -496,  200,   364,  52,
     103             :   -140,  48,    -48,   -60,   84,    72,    40,    132,   -356,  -268, -104,
     104             :   -284,  -404,  732,   -520,  164,   -304,  -540,  120,   328,   -76,  -460,
     105             :   756,   388,   588,   236,   -436,  -72,   -176,  -404,  -316,  -148, 716,
     106             :   -604,  404,   -72,   -88,   -888,  -68,   944,   88,    -220,  -344, 960,
     107             :   472,   460,   -232,  704,   120,   832,   -228,  692,   -508,  132,  -476,
     108             :   844,   -748,  -364,  -44,   1116,  -1104, -1056, 76,    428,   552,  -692,
     109             :   60,    356,   96,    -384,  -188,  -612,  -576,  736,   508,   892,  352,
     110             :   -1132, 504,   -24,   -352,  324,   332,   -600,  -312,  292,   508,  -144,
     111             :   -8,    484,   48,    284,   -260,  -240,  256,   -100,  -292,  -204, -44,
     112             :   472,   -204,  908,   -188,  -1000, -256,  92,    1164,  -392,  564,  356,
     113             :   652,   -28,   -884,  256,   484,   -192,  760,   -176,  376,   -524, -452,
     114             :   -436,  860,   -736,  212,   124,   504,   -476,  468,   76,    -472, 552,
     115             :   -692,  -944,  -620,  740,   -240,  400,   132,   20,    192,   -196, 264,
     116             :   -668,  -1012, -60,   296,   -316,  -828,  76,    -156,  284,   -768, -448,
     117             :   -832,  148,   248,   652,   616,   1236,  288,   -328,  -400,  -124, 588,
     118             :   220,   520,   -696,  1032,  768,   -740,  -92,   -272,  296,   448,  -464,
     119             :   412,   -200,  392,   440,   -200,  264,   -152,  -260,  320,   1032, 216,
     120             :   320,   -8,    -64,   156,   -1016, 1084,  1172,  536,   484,   -432, 132,
     121             :   372,   -52,   -256,  84,    116,   -352,  48,    116,   304,   -384, 412,
     122             :   924,   -300,  528,   628,   180,   648,   44,    -980,  -220,  1320, 48,
     123             :   332,   748,   524,   -268,  -720,  540,   -276,  564,   -344,  -208, -196,
     124             :   436,   896,   88,    -392,  132,   80,    -964,  -288,  568,   56,   -48,
     125             :   -456,  888,   8,     552,   -156,  -292,  948,   288,   128,   -716, -292,
     126             :   1192,  -152,  876,   352,   -600,  -260,  -812,  -468,  -28,   -120, -32,
     127             :   -44,   1284,  496,   192,   464,   312,   -76,   -516,  -380,  -456, -1012,
     128             :   -48,   308,   -156,  36,    492,   -156,  -808,  188,   1652,  68,   -120,
     129             :   -116,  316,   160,   -140,  352,   808,   -416,  592,   316,   -480, 56,
     130             :   528,   -204,  -568,  372,   -232,  752,   -344,  744,   -4,    324,  -416,
     131             :   -600,  768,   268,   -248,  -88,   -132,  -420,  -432,  80,    -288, 404,
     132             :   -316,  -1216, -588,  520,   -108,  92,    -320,  368,   -480,  -216, -92,
     133             :   1688,  -300,  180,   1020,  -176,  820,   -68,   -228,  -260,  436,  -904,
     134             :   20,    40,    -508,  440,   -736,  312,   332,   204,   760,   -372, 728,
     135             :   96,    -20,   -632,  -520,  -560,  336,   1076,  -64,   -532,  776,  584,
     136             :   192,   396,   -728,  -520,  276,   -188,  80,    -52,   -612,  -252, -48,
     137             :   648,   212,   -688,  228,   -52,   -260,  428,   -412,  -272,  -404, 180,
     138             :   816,   -796,  48,    152,   484,   -88,   -216,  988,   696,   188,  -528,
     139             :   648,   -116,  -180,  316,   476,   12,    -564,  96,    476,   -252, -364,
     140             :   -376,  -392,  556,   -256,  -576,  260,   -352,  120,   -16,   -136, -260,
     141             :   -492,  72,    556,   660,   580,   616,   772,   436,   424,   -32,  -324,
     142             :   -1268, 416,   -324,  -80,   920,   160,   228,   724,   32,    -516, 64,
     143             :   384,   68,    -128,  136,   240,   248,   -204,  -68,   252,   -932, -120,
     144             :   -480,  -628,  -84,   192,   852,   -404,  -288,  -132,  204,   100,  168,
     145             :   -68,   -196,  -868,  460,   1080,  380,   -80,   244,   0,     484,  -888,
     146             :   64,    184,   352,   600,   460,   164,   604,   -196,  320,   -64,  588,
     147             :   -184,  228,   12,    372,   48,    -848,  -344,  224,   208,   -200, 484,
     148             :   128,   -20,   272,   -468,  -840,  384,   256,   -720,  -520,  -464, -580,
     149             :   112,   -120,  644,   -356,  -208,  -608,  -528,  704,   560,   -424, 392,
     150             :   828,   40,    84,    200,   -152,  0,     -144,  584,   280,   -120, 80,
     151             :   -556,  -972,  -196,  -472,  724,   80,    168,   -32,   88,    160,  -688,
     152             :   0,     160,   356,   372,   -776,  740,   -128,  676,   -248,  -480, 4,
     153             :   -364,  96,    544,   232,   -1032, 956,   236,   356,   20,    -40,  300,
     154             :   24,    -676,  -596,  132,   1120,  -104,  532,   -1096, 568,   648,  444,
     155             :   508,   380,   188,   -376,  -604,  1488,  424,   24,    756,   -220, -192,
     156             :   716,   120,   920,   688,   168,   44,    -460,  568,   284,   1144, 1160,
     157             :   600,   424,   888,   656,   -356,  -320,  220,   316,   -176,  -724, -188,
     158             :   -816,  -628,  -348,  -228,  -380,  1012,  -452,  -660,  736,   928,  404,
     159             :   -696,  -72,   -268,  -892,  128,   184,   -344,  -780,  360,   336,  400,
     160             :   344,   428,   548,   -112,  136,   -228,  -216,  -820,  -516,  340,  92,
     161             :   -136,  116,   -300,  376,   -244,  100,   -316,  -520,  -284,  -12,  824,
     162             :   164,   -548,  -180,  -128,  116,   -924,  -828,  268,   -368,  -580, 620,
     163             :   192,   160,   0,     -1676, 1068,  424,   -56,   -360,  468,   -156, 720,
     164             :   288,   -528,  556,   -364,  548,   -148,  504,   316,   152,   -648, -620,
     165             :   -684,  -24,   -376,  -384,  -108,  -920,  -1032, 768,   180,   -264, -508,
     166             :   -1268, -260,  -60,   300,   -240,  988,   724,   -376,  -576,  -212, -736,
     167             :   556,   192,   1092,  -620,  -880,  376,   -56,   -4,    -216,  -32,  836,
     168             :   268,   396,   1332,  864,   -600,  100,   56,    -412,  -92,   356,  180,
     169             :   884,   -468,  -436,  292,   -388,  -804,  -704,  -840,  368,   -348, 140,
     170             :   -724,  1536,  940,   372,   112,   -372,  436,   -480,  1136,  296,  -32,
     171             :   -228,  132,   -48,   -220,  868,   -1016, -60,   -1044, -464,  328,  916,
     172             :   244,   12,    -736,  -296,  360,   468,   -376,  -108,  -92,   788,  368,
     173             :   -56,   544,   400,   -672,  -420,  728,   16,    320,   44,    -284, -380,
     174             :   -796,  488,   132,   204,   -596,  -372,  88,    -152,  -908,  -636, -572,
     175             :   -624,  -116,  -692,  -200,  -56,   276,   -88,   484,   -324,  948,  864,
     176             :   1000,  -456,  -184,  -276,  292,   -296,  156,   676,   320,   160,  908,
     177             :   -84,   -1236, -288,  -116,  260,   -372,  -644,  732,   -756,  -96,  84,
     178             :   344,   -520,  348,   -688,  240,   -84,   216,   -1044, -136,  -676, -396,
     179             :   -1500, 960,   -40,   176,   168,   1516,  420,   -504,  -344,  -364, -360,
     180             :   1216,  -940,  -380,  -212,  252,   -660,  -708,  484,   -444,  -152, 928,
     181             :   -120,  1112,  476,   -260,  560,   -148,  -344,  108,   -196,  228,  -288,
     182             :   504,   560,   -328,  -88,   288,   -1008, 460,   -228,  468,   -836, -196,
     183             :   76,    388,   232,   412,   -1168, -716,  -644,  756,   -172,  -356, -504,
     184             :   116,   432,   528,   48,    476,   -168,  -608,  448,   160,   -532, -272,
     185             :   28,    -676,  -12,   828,   980,   456,   520,   104,   -104,  256,  -344,
     186             :   -4,    -28,   -368,  -52,   -524,  -572,  -556,  -200,  768,   1124, -208,
     187             :   -512,  176,   232,   248,   -148,  -888,  604,   -600,  -304,  804,  -156,
     188             :   -212,  488,   -192,  -804,  -256,  368,   -360,  -916,  -328,  228,  -240,
     189             :   -448,  -472,  856,   -556,  -364,  572,   -12,   -156,  -368,  -340, 432,
     190             :   252,   -752,  -152,  288,   268,   -580,  -848,  -592,  108,   -76,  244,
     191             :   312,   -716,  592,   -80,   436,   360,   4,     -248,  160,   516,  584,
     192             :   732,   44,    -468,  -280,  -292,  -156,  -588,  28,    308,   912,  24,
     193             :   124,   156,   180,   -252,  944,   -924,  -772,  -520,  -428,  -624, 300,
     194             :   -212,  -1144, 32,    -724,  800,   -1128, -212,  -1288, -848,  180,  -416,
     195             :   440,   192,   -576,  -792,  -76,   -1080, 80,    -532,  -352,  -132, 380,
     196             :   -820,  148,   1112,  128,   164,   456,   700,   -924,  144,   -668, -384,
     197             :   648,   -832,  508,   552,   -52,   -100,  -656,  208,   -568,  748,  -88,
     198             :   680,   232,   300,   192,   -408,  -1012, -152,  -252,  -268,  272,  -876,
     199             :   -664,  -648,  -332,  -136,  16,    12,    1152,  -28,   332,   -536, 320,
     200             :   -672,  -460,  -316,  532,   -260,  228,   -40,   1052,  -816,  180,  88,
     201             :   -496,  -556,  -672,  -368,  428,   92,    356,   404,   -408,  252,  196,
     202             :   -176,  -556,  792,   268,   32,    372,   40,    96,    -332,  328,  120,
     203             :   372,   -900,  -40,   472,   -264,  -592,  952,   128,   656,   112,  664,
     204             :   -232,  420,   4,     -344,  -464,  556,   244,   -416,  -32,   252,  0,
     205             :   -412,  188,   -696,  508,   -476,  324,   -1096, 656,   -312,  560,  264,
     206             :   -136,  304,   160,   -64,   -580,  248,   336,   -720,  560,   -348, -288,
     207             :   -276,  -196,  -500,  852,   -544,  -236,  -1128, -992,  -776,  116,  56,
     208             :   52,    860,   884,   212,   -12,   168,   1020,  512,   -552,  924,  -148,
     209             :   716,   188,   164,   -340,  -520,  -184,  880,   -152,  -680,  -208, -1156,
     210             :   -300,  -528,  -472,  364,   100,   -744,  -1056, -32,   540,   280,  144,
     211             :   -676,  -32,   -232,  -280,  -224,  96,    568,   -76,   172,   148,  148,
     212             :   104,   32,    -296,  -32,   788,   -80,   32,    -16,   280,   288,  944,
     213             :   428,   -484
     214             : };
     215             : 
     216             : static const int32_t gauss_bits = 11;
     217             : 
     218             : static int32_t luma_subblock_size_y = 32;
     219             : static int32_t luma_subblock_size_x = 32;
     220             : 
     221             : static int32_t chroma_subblock_size_y = 16;
     222             : static int32_t chroma_subblock_size_x = 16;
     223             : 
     224             : static const int32_t min_luma_legal_range = 16;
     225             : static const int32_t max_luma_legal_range = 235;
     226             : 
     227             : static const int32_t min_chroma_legal_range = 16;
     228             : static const int32_t max_chroma_legal_range = 240;
     229             : 
     230             : static int32_t scaling_lut_y[256];
     231             : static int32_t scaling_lut_cb[256];
     232             : static int32_t scaling_lut_cr[256];
     233             : 
     234             : static int32_t grain_center;
     235             : static int32_t grain_min;
     236             : static int32_t grain_max;
     237             : 
     238             : static uint16_t random_register = 0;  // random number generator register
     239             : 
     240             : //----------------------------------------------------------------------
     241             : // todo: aomlib memory functions (to be replaced by Eb functions)
     242             : /*
     243             : #define ADDRESS_STORAGE_SIZE sizeof(size_t)
     244             : #define DEFAULT_ALIGNMENT (2 * sizeof(void *))
     245             : #define AOM_MAX_ALLOCABLE_MEMORY 8589934592  // 8 GB
     246             : //returns an addr aligned to the byte boundary specified by align
     247             : #define align_addr(addr, align) \
     248             :   (void *)(((size_t)(addr) + ((align)-1)) & ~(size_t)((align)-1))
     249             : 
     250             : // Returns 0 in case of overflow of nmemb * size.
     251             : static int32_t check_size_argument_overflow(uint64_t nmemb, uint64_t size) {
     252             :     const uint64_t total_size = nmemb * size;
     253             :     if (nmemb == 0) return 1;
     254             :     if (size > AOM_MAX_ALLOCABLE_MEMORY / nmemb) return 0;
     255             :     if (total_size != (size_t)total_size) return 0;
     256             :     return 1;
     257             : }
     258             : 
     259             : static size_t GetAlignedMallocSize(size_t size, size_t align) {
     260             :     return size + align - 1 + ADDRESS_STORAGE_SIZE;
     261             : }
     262             : 
     263             : static size_t *GetMallocAddressLocation(void *const mem) {
     264             :     return ((size_t *)mem) - 1;
     265             : }
     266             : 
     267             : static void SetActualMallocAddress(void *const mem,
     268             :     const void *const malloc_addr) {
     269             :     size_t *const malloc_addr_location = GetMallocAddressLocation(mem);
     270             :     *malloc_addr_location = (size_t)malloc_addr;
     271             : }
     272             : 
     273             : static void *GetActualMallocAddress(void *const mem) {
     274             :     const size_t *const malloc_addr_location = GetMallocAddressLocation(mem);
     275             :     return (void *)(*malloc_addr_location);
     276             : }
     277             : 
     278             : void *eb_aom_memalign(size_t align, size_t size) {
     279             :     void *x = NULL;
     280             :     const size_t aligned_size = GetAlignedMallocSize(size, align);
     281             : #if defined(AOM_MAX_ALLOCABLE_MEMORY)
     282             :     if (!check_size_argument_overflow(1, aligned_size)) return NULL;
     283             : #endif
     284             :     void *const addr = malloc(aligned_size);
     285             :     if (addr) {
     286             :         x = align_addr((uint8_t *)addr + ADDRESS_STORAGE_SIZE, align);
     287             :         SetActualMallocAddress(x, addr);
     288             :     }
     289             :     return x;
     290             : }
     291             : 
     292             : void *eb_aom_malloc(size_t size) { return eb_aom_memalign(DEFAULT_ALIGNMENT, size); }
     293             : 
     294             : void eb_aom_free(void *memblk) {
     295             :     if (memblk) {
     296             :         void *addr = GetActualMallocAddress(memblk);
     297             :         free(addr);
     298             :     }
     299             : }
     300             : */
     301             : //--------------------------------------------------------------------
     302             : 
     303           0 : static void init_arrays(aom_film_grain_t *params, int32_t luma_stride,
     304             :     int32_t chroma_stride, int32_t ***pred_pos_luma_p,
     305             :     int32_t ***pred_pos_chroma_p, int32_t **luma_grain_block,
     306             :     int32_t **cb_grain_block, int32_t **cr_grain_block,
     307             :     int32_t **y_line_buf, int32_t **cb_line_buf, int32_t **cr_line_buf,
     308             :     int32_t **y_col_buf, int32_t **cb_col_buf, int32_t **cr_col_buf,
     309             :     int32_t luma_grain_samples, int32_t chroma_grain_samples,
     310             :     int32_t chroma_subsamp_y, int32_t chroma_subsamp_x) {
     311           0 :     memset(scaling_lut_y, 0, sizeof(*scaling_lut_y) * 256);
     312           0 :     memset(scaling_lut_cb, 0, sizeof(*scaling_lut_cb) * 256);
     313           0 :     memset(scaling_lut_cr, 0, sizeof(*scaling_lut_cr) * 256);
     314             : 
     315           0 :     int32_t num_pos_luma = 2 * params->ar_coeff_lag * (params->ar_coeff_lag + 1);
     316           0 :     int32_t num_pos_chroma = num_pos_luma;
     317           0 :     if (params->num_y_points > 0) ++num_pos_chroma;
     318             : 
     319             :     int32_t **pred_pos_luma;
     320             :     int32_t **pred_pos_chroma;
     321             : 
     322           0 :     pred_pos_luma = (int32_t**)malloc(sizeof(*pred_pos_luma) * num_pos_luma);
     323             :     ASSERT(pred_pos_luma != NULL);
     324           0 :     for (int32_t row = 0; row < num_pos_luma; row++) {
     325           0 :         pred_pos_luma[row] = (int32_t *)malloc(sizeof(**pred_pos_luma) * 3);
     326             :         ASSERT(pred_pos_luma[row]);
     327             :     }
     328             : 
     329             :     pred_pos_chroma =
     330           0 :         (int32_t **)malloc(sizeof(*pred_pos_chroma) * num_pos_chroma);
     331             :     ASSERT(pred_pos_chroma != NULL);
     332           0 :     for (int32_t row = 0; row < num_pos_chroma; row++) {
     333           0 :         pred_pos_chroma[row] = (int32_t *)malloc(sizeof(**pred_pos_chroma) * 3);
     334             :         ASSERT(pred_pos_chroma[row]);
     335             :     }
     336             : 
     337           0 :     int32_t pos_ar_index = 0;
     338             : 
     339           0 :     for (int32_t row = -params->ar_coeff_lag; row < 0; row++) {
     340           0 :         for (int32_t col = -params->ar_coeff_lag; col < params->ar_coeff_lag + 1;
     341           0 :             col++) {
     342           0 :             pred_pos_luma[pos_ar_index][0] = row;
     343           0 :             pred_pos_luma[pos_ar_index][1] = col;
     344           0 :             pred_pos_luma[pos_ar_index][2] = 0;
     345             : 
     346           0 :             pred_pos_chroma[pos_ar_index][0] = row;
     347           0 :             pred_pos_chroma[pos_ar_index][1] = col;
     348           0 :             pred_pos_chroma[pos_ar_index][2] = 0;
     349           0 :             ++pos_ar_index;
     350             :         }
     351             :     }
     352             : 
     353           0 :     for (int32_t col = -params->ar_coeff_lag; col < 0; col++) {
     354           0 :         pred_pos_luma[pos_ar_index][0] = 0;
     355           0 :         pred_pos_luma[pos_ar_index][1] = col;
     356           0 :         pred_pos_luma[pos_ar_index][2] = 0;
     357             : 
     358           0 :         pred_pos_chroma[pos_ar_index][0] = 0;
     359           0 :         pred_pos_chroma[pos_ar_index][1] = col;
     360           0 :         pred_pos_chroma[pos_ar_index][2] = 0;
     361             : 
     362           0 :         ++pos_ar_index;
     363             :     }
     364             : 
     365           0 :     if (params->num_y_points > 0) {
     366           0 :         pred_pos_chroma[pos_ar_index][0] = 0;
     367           0 :         pred_pos_chroma[pos_ar_index][1] = 0;
     368           0 :         pred_pos_chroma[pos_ar_index][2] = 1;
     369             :     }
     370             : 
     371           0 :     *pred_pos_luma_p = pred_pos_luma;
     372           0 :     *pred_pos_chroma_p = pred_pos_chroma;
     373             : 
     374           0 :     *y_line_buf = (int32_t *)malloc(sizeof(**y_line_buf) * luma_stride * 2);
     375           0 :     *cb_line_buf = (int32_t *)malloc(sizeof(**cb_line_buf) * chroma_stride *
     376           0 :         (2 >> chroma_subsamp_y));
     377           0 :     *cr_line_buf = (int32_t *)malloc(sizeof(**cr_line_buf) * chroma_stride *
     378           0 :         (2 >> chroma_subsamp_y));
     379             : 
     380           0 :     *y_col_buf =
     381           0 :         (int32_t *)malloc(sizeof(**y_col_buf) * (luma_subblock_size_y + 2) * 2);
     382           0 :     *cb_col_buf =
     383           0 :         (int32_t *)malloc(sizeof(**cb_col_buf) *
     384           0 :         (chroma_subblock_size_y + (2 >> chroma_subsamp_y)) *
     385           0 :             (2 >> chroma_subsamp_x));
     386           0 :     *cr_col_buf =
     387           0 :         (int32_t *)malloc(sizeof(**cr_col_buf) *
     388           0 :         (chroma_subblock_size_y + (2 >> chroma_subsamp_y)) *
     389           0 :             (2 >> chroma_subsamp_x));
     390             : 
     391           0 :     *luma_grain_block =
     392           0 :         (int32_t *)malloc(sizeof(**luma_grain_block) * luma_grain_samples);
     393           0 :     *cb_grain_block =
     394           0 :         (int32_t *)malloc(sizeof(**cb_grain_block) * chroma_grain_samples);
     395           0 :     *cr_grain_block =
     396           0 :         (int32_t *)malloc(sizeof(**cr_grain_block) * chroma_grain_samples);
     397           0 : }
     398             : 
     399           0 : static void dealloc_arrays(aom_film_grain_t *params, int32_t ***pred_pos_luma,
     400             :     int32_t ***pred_pos_chroma, int32_t **luma_grain_block,
     401             :     int32_t **cb_grain_block, int32_t **cr_grain_block,
     402             :     int32_t **y_line_buf, int32_t **cb_line_buf,
     403             :     int32_t **cr_line_buf, int32_t **y_col_buf, int32_t **cb_col_buf,
     404             :     int32_t **cr_col_buf) {
     405           0 :     int32_t num_pos_luma = 2 * params->ar_coeff_lag * (params->ar_coeff_lag + 1);
     406           0 :     int32_t num_pos_chroma = num_pos_luma + 1;
     407             : 
     408           0 :     for (int32_t row = 0; row < num_pos_luma; row++)
     409           0 :         free((*pred_pos_luma)[row]);
     410           0 :     free(*pred_pos_luma);
     411             : 
     412           0 :     for (int32_t row = 0; row < num_pos_chroma; row++)
     413           0 :         free((*pred_pos_chroma)[row]);
     414           0 :     free((*pred_pos_chroma));
     415             : 
     416           0 :     free(*y_line_buf);
     417             : 
     418           0 :     free(*cb_line_buf);
     419             : 
     420           0 :     free(*cr_line_buf);
     421             : 
     422           0 :     free(*y_col_buf);
     423             : 
     424           0 :     free(*cb_col_buf);
     425             : 
     426           0 :     free(*cr_col_buf);
     427             : 
     428           0 :     free(*luma_grain_block);
     429             : 
     430           0 :     free(*cb_grain_block);
     431             : 
     432           0 :     free(*cr_grain_block);
     433           0 : }
     434             : 
     435             : // get a number between 0 and 2^bits - 1
     436           0 : static INLINE int32_t get_random_number(int32_t bits) {
     437             :     uint16_t bit;
     438           0 :     bit = ((random_register >> 0) ^ (random_register >> 1) ^
     439           0 :         (random_register >> 3) ^ (random_register >> 12)) &
     440             :         1;
     441           0 :     random_register = (random_register >> 1) | (bit << 15);
     442           0 :     return (random_register >> (16 - bits)) & ((1 << bits) - 1);
     443             : }
     444             : 
     445           0 : static void init_random_generator(int32_t luma_line, uint16_t seed) {
     446             :     // same for the picture
     447             : 
     448           0 :     uint16_t msb = (seed >> 8) & 255;
     449           0 :     uint16_t lsb = seed & 255;
     450             : 
     451           0 :     random_register = (msb << 8) + lsb;
     452             : 
     453             :     //  changes for each row
     454           0 :     int32_t luma_num = luma_line >> 5;
     455             : 
     456           0 :     random_register ^= ((luma_num * 37 + 178) & 255) << 8;
     457           0 :     random_register ^= ((luma_num * 173 + 105) & 255);
     458           0 : }
     459             : 
     460           0 : static void generate_luma_grain_block(
     461             :     aom_film_grain_t *params, int32_t **pred_pos_luma, int32_t *luma_grain_block,
     462             :     int32_t luma_block_size_y, int32_t luma_block_size_x, int32_t luma_grain_stride,
     463             :     int32_t left_pad, int32_t top_pad, int32_t right_pad, int32_t bottom_pad) {
     464           0 :     if (params->num_y_points == 0) return;
     465             : 
     466           0 :     int32_t bit_depth = params->bit_depth;
     467           0 :     int32_t gauss_sec_shift = 12 - bit_depth + params->grain_scale_shift;
     468             : 
     469           0 :     int32_t num_pos_luma = 2 * params->ar_coeff_lag * (params->ar_coeff_lag + 1);
     470           0 :     int32_t rounding_offset = (1 << (params->ar_coeff_shift - 1));
     471             : 
     472           0 :     for (int32_t i = 0; i < luma_block_size_y; i++)
     473           0 :         for (int32_t j = 0; j < luma_block_size_x; j++)
     474           0 :             luma_grain_block[i * luma_grain_stride + j] =
     475           0 :             (gaussian_sequence[get_random_number(gauss_bits)] +
     476           0 :             ((1 << gauss_sec_shift) >> 1)) >>
     477             :             gauss_sec_shift;
     478             : 
     479           0 :     for (int32_t i = top_pad; i < luma_block_size_y - bottom_pad; i++)
     480           0 :         for (int32_t j = left_pad; j < luma_block_size_x - right_pad; j++) {
     481           0 :             int32_t wsum = 0;
     482           0 :             for (int32_t pos = 0; pos < num_pos_luma; pos++) {
     483           0 :                 wsum = wsum + params->ar_coeffs_y[pos] *
     484           0 :                     luma_grain_block[(i + pred_pos_luma[pos][0]) *
     485           0 :                     luma_grain_stride +
     486           0 :                     j + pred_pos_luma[pos][1]];
     487             :             }
     488           0 :             luma_grain_block[i * luma_grain_stride + j] =
     489           0 :                 clamp(luma_grain_block[i * luma_grain_stride + j] +
     490           0 :                 ((wsum + rounding_offset) >> params->ar_coeff_shift),
     491             :                     grain_min, grain_max);
     492             :         }
     493             : }
     494             : 
     495           0 : static void generate_chroma_grain_blocks(
     496             :     aom_film_grain_t *params,
     497             :     //                                  int32_t** pred_pos_luma,
     498             :     int32_t **pred_pos_chroma, int32_t *luma_grain_block, int32_t *cb_grain_block,
     499             :     int32_t *cr_grain_block, int32_t luma_grain_stride, int32_t chroma_block_size_y,
     500             :     int32_t chroma_block_size_x, int32_t chroma_grain_stride, int32_t left_pad, int32_t top_pad,
     501             :     int32_t right_pad, int32_t bottom_pad, int32_t chroma_subsamp_y, int32_t chroma_subsamp_x) {
     502           0 :     int32_t bit_depth = params->bit_depth;
     503           0 :     int32_t gauss_sec_shift = 12 - bit_depth + params->grain_scale_shift;
     504             : 
     505           0 :     int32_t num_pos_chroma = 2 * params->ar_coeff_lag * (params->ar_coeff_lag + 1);
     506           0 :     if (params->num_y_points > 0) ++num_pos_chroma;
     507           0 :     int32_t rounding_offset = (1 << (params->ar_coeff_shift - 1));
     508             : 
     509           0 :     if (params->num_cb_points) {
     510           0 :         init_random_generator(7 << 5, params->random_seed);
     511             : 
     512           0 :         for (int32_t i = 0; i < chroma_block_size_y; i++)
     513           0 :             for (int32_t j = 0; j < chroma_block_size_x; j++)
     514           0 :                 cb_grain_block[i * chroma_grain_stride + j] =
     515           0 :                 (gaussian_sequence[get_random_number(gauss_bits)] +
     516           0 :                 ((1 << gauss_sec_shift) >> 1)) >>
     517             :                 gauss_sec_shift;
     518             :     }
     519           0 :     if (params->num_cr_points) {
     520           0 :         init_random_generator(11 << 5, params->random_seed);
     521             : 
     522           0 :         for (int32_t i = 0; i < chroma_block_size_y; i++)
     523           0 :             for (int32_t j = 0; j < chroma_block_size_x; j++)
     524           0 :                 cr_grain_block[i * chroma_grain_stride + j] =
     525           0 :                 (gaussian_sequence[get_random_number(gauss_bits)] +
     526           0 :                 ((1 << gauss_sec_shift) >> 1)) >>
     527             :                 gauss_sec_shift;
     528             :     }
     529             : 
     530           0 :     for (int32_t i = top_pad; i < chroma_block_size_y - bottom_pad; i++)
     531           0 :         for (int32_t j = left_pad; j < chroma_block_size_x - right_pad; j++) {
     532           0 :             int32_t wsum_cb = 0;
     533           0 :             int32_t wsum_cr = 0;
     534           0 :             for (int32_t pos = 0; pos < num_pos_chroma; pos++) {
     535           0 :                 if (pred_pos_chroma[pos][2] == 0) {
     536           0 :                     wsum_cb = wsum_cb + params->ar_coeffs_cb[pos] *
     537           0 :                         cb_grain_block[(i + pred_pos_chroma[pos][0]) *
     538           0 :                         chroma_grain_stride +
     539           0 :                         j + pred_pos_chroma[pos][1]];
     540           0 :                     wsum_cr = wsum_cr + params->ar_coeffs_cr[pos] *
     541           0 :                         cr_grain_block[(i + pred_pos_chroma[pos][0]) *
     542           0 :                         chroma_grain_stride +
     543           0 :                         j + pred_pos_chroma[pos][1]];
     544             :                 }
     545           0 :                 else if (pred_pos_chroma[pos][2] == 1) {
     546           0 :                     int32_t av_luma = 0;
     547           0 :                     int32_t luma_coord_y = ((i - top_pad) << chroma_subsamp_y) + top_pad;
     548           0 :                     int32_t luma_coord_x = ((j - left_pad) << chroma_subsamp_x) + left_pad;
     549             : 
     550           0 :                     for (int32_t k = luma_coord_y; k < luma_coord_y + chroma_subsamp_y + 1;
     551           0 :                         k++)
     552           0 :                         for (int32_t l = luma_coord_x; l < luma_coord_x + chroma_subsamp_x + 1;
     553           0 :                             l++)
     554           0 :                             av_luma += luma_grain_block[k * luma_grain_stride + l];
     555             : 
     556           0 :                     av_luma =
     557           0 :                         (av_luma + ((1 << (chroma_subsamp_y + chroma_subsamp_x)) >> 1)) >>
     558           0 :                         (chroma_subsamp_y + chroma_subsamp_x);
     559             : 
     560           0 :                     wsum_cb = wsum_cb + params->ar_coeffs_cb[pos] * av_luma;
     561           0 :                     wsum_cr = wsum_cr + params->ar_coeffs_cr[pos] * av_luma;
     562             :                 }
     563             :                 else {
     564           0 :                     printf(
     565             :                         "Grain synthesis: prediction between two chroma components is "
     566             :                         "not supported!");
     567           0 :                     exit(1);
     568             :                 }
     569             :             }
     570           0 :             if (params->num_cb_points)
     571           0 :                 cb_grain_block[i * chroma_grain_stride + j] =
     572           0 :                 clamp(cb_grain_block[i * chroma_grain_stride + j] +
     573           0 :                 ((wsum_cb + rounding_offset) >> params->ar_coeff_shift),
     574             :                     grain_min, grain_max);
     575           0 :             if (params->num_cr_points)
     576           0 :                 cr_grain_block[i * chroma_grain_stride + j] =
     577           0 :                 clamp(cr_grain_block[i * chroma_grain_stride + j] +
     578           0 :                 ((wsum_cr + rounding_offset) >> params->ar_coeff_shift),
     579             :                     grain_min, grain_max);
     580             :         }
     581           0 : }
     582             : 
     583           0 : static void init_scaling_function(int32_t scaling_points[][2], int32_t num_points,
     584             :     int32_t scaling_lut[]) {
     585           0 :     if (num_points == 0) return;
     586             : 
     587           0 :     for (int32_t i = 0; i < scaling_points[0][0]; i++)
     588           0 :         scaling_lut[i] = scaling_points[0][1];
     589             : 
     590           0 :     for (int32_t point = 0; point < num_points - 1; point++) {
     591           0 :         int32_t delta_y = scaling_points[point + 1][1] - scaling_points[point][1];
     592           0 :         int32_t delta_x = scaling_points[point + 1][0] - scaling_points[point][0];
     593             : 
     594           0 :         int64_t delta = delta_y * ((65536 + (delta_x >> 1)) / delta_x);
     595             : 
     596           0 :         for (int32_t x = 0; x < delta_x; x++) {
     597           0 :             scaling_lut[scaling_points[point][0] + x] =
     598           0 :                 scaling_points[point][1] + (int32_t)((x * delta + 32768) >> 16);
     599             :         }
     600             :     }
     601             : 
     602           0 :     for (int32_t i = scaling_points[num_points - 1][0]; i < 256; i++)
     603           0 :         scaling_lut[i] = scaling_points[num_points - 1][1];
     604             : }
     605             : 
     606             : // function that extracts samples from a LUT (and interpolates intemediate
     607             : // frames for 10- and 12-bit video)
     608           0 : static int32_t scale_LUT(int32_t *scaling_lut, int32_t index, int32_t bit_depth) {
     609           0 :     int32_t x = index >> (bit_depth - 8);
     610             : 
     611           0 :     if (!(bit_depth - 8) || x == 255)
     612           0 :         return scaling_lut[x];
     613             :     else
     614           0 :         return scaling_lut[x] + (((scaling_lut[x + 1] - scaling_lut[x]) *
     615           0 :         (index & ((1 << (bit_depth - 8)) - 1)) +
     616           0 :             (1 << (bit_depth - 9))) >>
     617           0 :             (bit_depth - 8));
     618             : }
     619             : 
     620           0 : static void add_noise_to_block(aom_film_grain_t *params, uint8_t *luma,
     621             :     uint8_t *cb, uint8_t *cr, int32_t luma_stride,
     622             :     int32_t chroma_stride, int32_t *luma_grain,
     623             :     int32_t *cb_grain, int32_t *cr_grain,
     624             :     int32_t luma_grain_stride, int32_t chroma_grain_stride,
     625             :     int32_t half_luma_height, int32_t half_luma_width,
     626             :     int32_t bit_depth, int32_t chroma_subsamp_y,
     627             :     int32_t chroma_subsamp_x) {
     628           0 :     int32_t cb_mult = params->cb_mult - 128;            // fixed scale
     629           0 :     int32_t cb_luma_mult = params->cb_luma_mult - 128;  // fixed scale
     630           0 :     int32_t cb_offset = params->cb_offset - 256;
     631             : 
     632           0 :     int32_t cr_mult = params->cr_mult - 128;            // fixed scale
     633           0 :     int32_t cr_luma_mult = params->cr_luma_mult - 128;  // fixed scale
     634           0 :     int32_t cr_offset = params->cr_offset - 256;
     635             : 
     636           0 :     int32_t rounding_offset = (1 << (params->scaling_shift - 1));
     637             : 
     638           0 :     int32_t apply_y = params->num_y_points > 0 ? 1 : 0;
     639           0 :     int32_t apply_cb = params->num_cb_points > 0 ? 1 : 0;
     640           0 :     int32_t apply_cr = params->num_cr_points > 0 ? 1 : 0;
     641             : 
     642           0 :     if (params->chroma_scaling_from_luma) {
     643           0 :         cb_mult = 0;        // fixed scale
     644           0 :         cb_luma_mult = 64;  // fixed scale
     645           0 :         cb_offset = 0;
     646             : 
     647           0 :         cr_mult = 0;        // fixed scale
     648           0 :         cr_luma_mult = 64;  // fixed scale
     649           0 :         cr_offset = 0;
     650             :     }
     651             : 
     652             :     int32_t min_luma, max_luma, min_chroma, max_chroma;
     653             : 
     654           0 :     if (params->clip_to_restricted_range) {
     655           0 :         min_luma = min_luma_legal_range;
     656           0 :         max_luma = max_luma_legal_range;
     657             : 
     658           0 :         min_chroma = min_chroma_legal_range;
     659           0 :         max_chroma = max_chroma_legal_range;
     660             :     }
     661             :     else {
     662           0 :         min_luma = min_chroma = 0;
     663           0 :         max_luma = max_chroma = 255;
     664             :     }
     665             : 
     666           0 :     for (int32_t i = 0; i < (half_luma_height << (1 - chroma_subsamp_y)); i++) {
     667           0 :         for (int32_t j = 0; j < (half_luma_width << (1 - chroma_subsamp_x)); j++) {
     668           0 :             int32_t average_luma = 0;
     669           0 :             if (chroma_subsamp_x) {
     670           0 :                 average_luma = (luma[(i << chroma_subsamp_y) * luma_stride +
     671           0 :                     (j << chroma_subsamp_x)] +
     672           0 :                     luma[(i << chroma_subsamp_y) * luma_stride +
     673           0 :                     (j << chroma_subsamp_x) + 1] +
     674             :                     1) >>
     675             :                     1;
     676             :             }
     677             :             else
     678           0 :                 average_luma = luma[(i << chroma_subsamp_y) * luma_stride + j];
     679           0 :             if (apply_cb) {
     680           0 :                 cb[i * chroma_stride + j] = clamp(
     681           0 :                     cb[i * chroma_stride + j] +
     682           0 :                     ((scale_LUT(scaling_lut_cb,
     683           0 :                         clamp(((average_luma * cb_luma_mult +
     684           0 :                             cb_mult * cb[i * chroma_stride + j]) >>
     685             :                             6) +
     686             :                             cb_offset,
     687           0 :                             0, (256 << (bit_depth - 8)) - 1),
     688           0 :                         8) *
     689           0 :                         cb_grain[i * chroma_grain_stride + j] +
     690           0 :                         rounding_offset) >>
     691           0 :                         params->scaling_shift),
     692             :                     min_chroma, max_chroma);
     693             :             }
     694             : 
     695           0 :             if (apply_cr) {
     696           0 :                 cr[i * chroma_stride + j] = clamp(
     697           0 :                     cr[i * chroma_stride + j] +
     698           0 :                     ((scale_LUT(scaling_lut_cr,
     699           0 :                         clamp(((average_luma * cr_luma_mult +
     700           0 :                             cr_mult * cr[i * chroma_stride + j]) >>
     701             :                             6) +
     702             :                             cr_offset,
     703           0 :                             0, (256 << (bit_depth - 8)) - 1),
     704           0 :                         8) *
     705           0 :                         cr_grain[i * chroma_grain_stride + j] +
     706           0 :                         rounding_offset) >>
     707           0 :                         params->scaling_shift),
     708             :                     min_chroma, max_chroma);
     709             :             }
     710             :         }
     711             :     }
     712             : 
     713           0 :     if (apply_y) {
     714           0 :         for (int32_t i = 0; i < (half_luma_height << 1); i++) {
     715           0 :             for (int32_t j = 0; j < (half_luma_width << 1); j++) {
     716           0 :                 luma[i * luma_stride + j] =
     717           0 :                     clamp(luma[i * luma_stride + j] +
     718           0 :                     ((scale_LUT(scaling_lut_y, luma[i * luma_stride + j], 8) *
     719           0 :                         luma_grain[i * luma_grain_stride + j] +
     720           0 :                         rounding_offset) >>
     721           0 :                         params->scaling_shift),
     722             :                         min_luma, max_luma);
     723             :             }
     724             :         }
     725             :     }
     726           0 : }
     727             : 
     728           0 : static void add_noise_to_block_hbd(
     729             :     aom_film_grain_t *params, uint16_t *luma, uint16_t *cb, uint16_t *cr,
     730             :     int32_t luma_stride, int32_t chroma_stride, int32_t *luma_grain, int32_t *cb_grain,
     731             :     int32_t *cr_grain, int32_t luma_grain_stride, int32_t chroma_grain_stride,
     732             :     int32_t half_luma_height, int32_t half_luma_width, int32_t bit_depth,
     733             :     int32_t chroma_subsamp_y, int32_t chroma_subsamp_x) {
     734           0 :     int32_t cb_mult = params->cb_mult - 128;            // fixed scale
     735           0 :     int32_t cb_luma_mult = params->cb_luma_mult - 128;  // fixed scale
     736             :     // offset value depends on the bit depth
     737           0 :     int32_t cb_offset = (params->cb_offset << (bit_depth - 8)) - (1 << bit_depth);
     738             : 
     739           0 :     int32_t cr_mult = params->cr_mult - 128;            // fixed scale
     740           0 :     int32_t cr_luma_mult = params->cr_luma_mult - 128;  // fixed scale
     741             :     // offset value depends on the bit depth
     742           0 :     int32_t cr_offset = (params->cr_offset << (bit_depth - 8)) - (1 << bit_depth);
     743             : 
     744           0 :     int32_t rounding_offset = (1 << (params->scaling_shift - 1));
     745             : 
     746           0 :     int32_t apply_y = params->num_y_points > 0 ? 1 : 0;
     747           0 :     int32_t apply_cb = params->num_cb_points > 0 ? 1 : 0;
     748           0 :     int32_t apply_cr = params->num_cr_points > 0 ? 1 : 0;
     749             : 
     750           0 :     if (params->chroma_scaling_from_luma) {
     751           0 :         cb_mult = 0;        // fixed scale
     752           0 :         cb_luma_mult = 64;  // fixed scale
     753           0 :         cb_offset = 0;
     754             : 
     755           0 :         cr_mult = 0;        // fixed scale
     756           0 :         cr_luma_mult = 64;  // fixed scale
     757           0 :         cr_offset = 0;
     758             :     }
     759             : 
     760             :     int32_t min_luma, max_luma, min_chroma, max_chroma;
     761             : 
     762           0 :     if (params->clip_to_restricted_range) {
     763           0 :         min_luma = min_luma_legal_range << (bit_depth - 8);
     764           0 :         max_luma = max_luma_legal_range << (bit_depth - 8);
     765             : 
     766           0 :         min_chroma = min_chroma_legal_range << (bit_depth - 8);
     767           0 :         max_chroma = max_chroma_legal_range << (bit_depth - 8);
     768             :     }
     769             :     else {
     770           0 :         min_luma = min_chroma = 0;
     771           0 :         max_luma = max_chroma = (256 << (bit_depth - 8)) - 1;
     772             :     }
     773             : 
     774           0 :     for (int32_t i = 0; i < (half_luma_height << (1 - chroma_subsamp_y)); i++) {
     775           0 :         for (int32_t j = 0; j < (half_luma_width << (1 - chroma_subsamp_x)); j++) {
     776           0 :             int32_t average_luma = 0;
     777           0 :             if (chroma_subsamp_x) {
     778           0 :                 average_luma = (luma[(i << chroma_subsamp_y) * luma_stride +
     779           0 :                     (j << chroma_subsamp_x)] +
     780           0 :                     luma[(i << chroma_subsamp_y) * luma_stride +
     781           0 :                     (j << chroma_subsamp_x) + 1] +
     782             :                     1) >>
     783             :                     1;
     784             :             }
     785             :             else
     786           0 :                 average_luma = luma[(i << chroma_subsamp_y) * luma_stride + j];
     787           0 :             if (apply_cb) {
     788           0 :                 cb[i * chroma_stride + j] = clamp(
     789           0 :                     cb[i * chroma_stride + j] +
     790           0 :                     ((scale_LUT(scaling_lut_cb,
     791           0 :                         clamp(((average_luma * cb_luma_mult +
     792           0 :                             cb_mult * cb[i * chroma_stride + j]) >>
     793             :                             6) +
     794             :                             cb_offset,
     795           0 :                             0, (256 << (bit_depth - 8)) - 1),
     796           0 :                         bit_depth) *
     797           0 :                         cb_grain[i * chroma_grain_stride + j] +
     798           0 :                         rounding_offset) >>
     799           0 :                         params->scaling_shift),
     800             :                     min_chroma, max_chroma);
     801             :             }
     802           0 :             if (apply_cr) {
     803           0 :                 cr[i * chroma_stride + j] = clamp(
     804           0 :                     cr[i * chroma_stride + j] +
     805           0 :                     ((scale_LUT(scaling_lut_cr,
     806           0 :                         clamp(((average_luma * cr_luma_mult +
     807           0 :                             cr_mult * cr[i * chroma_stride + j]) >>
     808             :                             6) +
     809             :                             cr_offset,
     810           0 :                             0, (256 << (bit_depth - 8)) - 1),
     811           0 :                         bit_depth) *
     812           0 :                         cr_grain[i * chroma_grain_stride + j] +
     813           0 :                         rounding_offset) >>
     814           0 :                         params->scaling_shift),
     815             :                     min_chroma, max_chroma);
     816             :             }
     817             :         }
     818             :     }
     819             : 
     820           0 :     if (apply_y) {
     821           0 :         for (int32_t i = 0; i < (half_luma_height << 1); i++) {
     822           0 :             for (int32_t j = 0; j < (half_luma_width << 1); j++) {
     823           0 :                 luma[i * luma_stride + j] =
     824           0 :                     clamp(luma[i * luma_stride + j] +
     825           0 :                     ((scale_LUT(scaling_lut_y, luma[i * luma_stride + j],
     826           0 :                         bit_depth) *
     827           0 :                         luma_grain[i * luma_grain_stride + j] +
     828           0 :                         rounding_offset) >>
     829           0 :                         params->scaling_shift),
     830             :                         min_luma, max_luma);
     831             :             }
     832             :         }
     833             :     }
     834           0 : }
     835             : 
     836           0 : int32_t film_grain_params_equal(aom_film_grain_t *pars_a, aom_film_grain_t *pars_b) {
     837           0 :     if (pars_a->apply_grain != pars_b->apply_grain)
     838           0 :         return 0;
     839           0 :     if (pars_a->overlap_flag != pars_b->overlap_flag)
     840           0 :         return 0;
     841           0 :     if (pars_a->clip_to_restricted_range != pars_b->clip_to_restricted_range)
     842           0 :         return 0;
     843           0 :     if (pars_a->chroma_scaling_from_luma != pars_b->chroma_scaling_from_luma)
     844           0 :         return 0;
     845           0 :     if (pars_a->grain_scale_shift != pars_b->grain_scale_shift)
     846           0 :         return 0;
     847           0 :     if (pars_a->ar_coeff_shift != pars_b->ar_coeff_shift)
     848           0 :         return 0;
     849           0 :     if (pars_a->cb_mult != pars_b->cb_mult)
     850           0 :         return 0;
     851           0 :     if (pars_a->cb_luma_mult != pars_b->cb_luma_mult)
     852           0 :         return 0;
     853           0 :     if (pars_a->cb_offset != pars_b->cb_offset)
     854           0 :         return 0;
     855           0 :     if (pars_a->cr_mult != pars_b->cr_mult)
     856           0 :         return 0;
     857           0 :     if (pars_a->cr_luma_mult != pars_b->cr_luma_mult)
     858           0 :         return 0;
     859           0 :     if (pars_a->cr_offset != pars_b->cr_offset)
     860           0 :         return 0;
     861             : 
     862           0 :     if (pars_a->scaling_shift != pars_b->scaling_shift)
     863           0 :         return 0;
     864           0 :     if (pars_a->ar_coeff_lag != pars_b->ar_coeff_lag)
     865           0 :         return 0;
     866             : 
     867           0 :     if (pars_a->num_y_points != pars_b->num_y_points)
     868           0 :         return 0;
     869             : 
     870           0 :     if (pars_a->num_cb_points != pars_b->num_cb_points)
     871           0 :         return 0;
     872             : 
     873           0 :     if (pars_a->num_cr_points != pars_b->num_cr_points)
     874           0 :         return 0;
     875             : 
     876           0 :     if (memcmp(pars_a->scaling_points_y, pars_b->scaling_points_y, sizeof(pars_b->scaling_points_y)))
     877           0 :         return 0;
     878             : 
     879           0 :     if (memcmp(pars_a->scaling_points_cb, pars_b->scaling_points_cb, sizeof(pars_b->scaling_points_cb)))
     880           0 :         return 0;
     881             : 
     882           0 :     if (memcmp(pars_a->scaling_points_cr, pars_b->scaling_points_cr, sizeof(pars_b->scaling_points_cr)))
     883           0 :         return 0;
     884             : 
     885           0 :     if (memcmp(pars_a->ar_coeffs_y, pars_b->ar_coeffs_y, sizeof(pars_b->ar_coeffs_y)))
     886           0 :         return 0;
     887             : 
     888           0 :     if (memcmp(pars_a->ar_coeffs_cb, pars_b->ar_coeffs_cb, sizeof(pars_b->ar_coeffs_cb)))
     889           0 :         return 0;
     890             : 
     891           0 :     if (memcmp(pars_a->ar_coeffs_cr, pars_b->ar_coeffs_cr, sizeof(pars_b->ar_coeffs_cr)))
     892           0 :         return 0;
     893             : 
     894           0 :     return 1;
     895             : }
     896             : 
     897           0 : void fgn_copy_rect(uint8_t *src, int32_t src_stride, uint8_t *dst,
     898             :     int32_t dst_stride, int32_t width, int32_t height,
     899             :     int32_t use_high_bit_depth) {
     900           0 :     int32_t hbd_coeff = use_high_bit_depth ? 2 : 1;
     901           0 :     while (height) {
     902           0 :         memcpy(dst, src, width * sizeof(uint8_t) * hbd_coeff);
     903           0 :         src += src_stride * hbd_coeff;
     904           0 :         dst += dst_stride * hbd_coeff;
     905           0 :         --height;
     906             :     }
     907           0 :     return;
     908             : }
     909             : 
     910           0 : static void copy_area(int32_t *src, int32_t src_stride, int32_t *dst, int32_t dst_stride,
     911             :     int32_t width, int32_t height) {
     912           0 :     while (height) {
     913           0 :         memcpy(dst, src, width * sizeof(*src));
     914           0 :         src += src_stride;
     915           0 :         dst += dst_stride;
     916           0 :         --height;
     917             :     }
     918           0 :     return;
     919             : }
     920             : 
     921           0 : static void ver_boundary_overlap(int32_t *left_block, int32_t left_stride,
     922             :     int32_t *right_block, int32_t right_stride,
     923             :     int32_t *dst_block, int32_t dst_stride, int32_t width,
     924             :     int32_t height) {
     925           0 :     if (width == 1) {
     926           0 :         while (height) {
     927           0 :             *dst_block = clamp((*left_block * 23 + *right_block * 22 + 16) >> 5,
     928             :                 grain_min, grain_max);
     929           0 :             left_block += left_stride;
     930           0 :             right_block += right_stride;
     931           0 :             dst_block += dst_stride;
     932           0 :             --height;
     933             :         }
     934           0 :         return;
     935             :     }
     936           0 :     else if (width == 2) {
     937           0 :         while (height) {
     938           0 :             dst_block[0] = clamp((27 * left_block[0] + 17 * right_block[0] + 16) >> 5,
     939             :                 grain_min, grain_max);
     940           0 :             dst_block[1] = clamp((17 * left_block[1] + 27 * right_block[1] + 16) >> 5,
     941             :                 grain_min, grain_max);
     942           0 :             left_block += left_stride;
     943           0 :             right_block += right_stride;
     944           0 :             dst_block += dst_stride;
     945           0 :             --height;
     946             :         }
     947           0 :         return;
     948             :     }
     949             : }
     950             : 
     951           0 : static void hor_boundary_overlap(int32_t *top_block, int32_t top_stride,
     952             :     int32_t *bottom_block, int32_t bottom_stride,
     953             :     int32_t *dst_block, int32_t dst_stride, int32_t width,
     954             :     int32_t height) {
     955           0 :     if (height == 1) {
     956           0 :         while (width) {
     957           0 :             *dst_block = clamp((*top_block * 23 + *bottom_block * 22 + 16) >> 5,
     958             :                 grain_min, grain_max);
     959           0 :             ++top_block;
     960           0 :             ++bottom_block;
     961           0 :             ++dst_block;
     962           0 :             --width;
     963             :         }
     964           0 :         return;
     965             :     }
     966           0 :     else if (height == 2) {
     967           0 :         while (width) {
     968           0 :             dst_block[0] = clamp((27 * top_block[0] + 17 * bottom_block[0] + 16) >> 5,
     969             :                 grain_min, grain_max);
     970           0 :             dst_block[dst_stride] = clamp((17 * top_block[top_stride] +
     971           0 :                 27 * bottom_block[bottom_stride] + 16) >>
     972             :                 5,
     973             :                 grain_min, grain_max);
     974           0 :             ++top_block;
     975           0 :             ++bottom_block;
     976           0 :             ++dst_block;
     977           0 :             --width;
     978             :         }
     979           0 :         return;
     980             :     }
     981             : }
     982             : 
     983           0 : void eb_av1_add_film_grain_run(aom_film_grain_t *params, uint8_t *luma,
     984             :     uint8_t *cb, uint8_t *cr, int32_t height, int32_t width,
     985             :     int32_t luma_stride, int32_t chroma_stride,
     986             :     int32_t use_high_bit_depth, int32_t chroma_subsamp_y,
     987             :     int32_t chroma_subsamp_x) {
     988             :     int32_t **pred_pos_luma;
     989             :     int32_t **pred_pos_chroma;
     990             :     int32_t *luma_grain_block;
     991             :     int32_t *cb_grain_block;
     992             :     int32_t *cr_grain_block;
     993             : 
     994             :     int32_t *y_line_buf;
     995             :     int32_t *cb_line_buf;
     996             :     int32_t *cr_line_buf;
     997             : 
     998             :     int32_t *y_col_buf;
     999             :     int32_t *cb_col_buf;
    1000             :     int32_t *cr_col_buf;
    1001             : 
    1002           0 :     random_register = params->random_seed;
    1003             : 
    1004           0 :     int32_t left_pad = 3;
    1005           0 :     int32_t right_pad = 3;  // padding to offset for AR coefficients
    1006           0 :     int32_t top_pad = 3;
    1007           0 :     int32_t bottom_pad = 0;
    1008             : 
    1009           0 :     int32_t ar_padding = 3;  // maximum lag used for stabilization of AR coefficients
    1010             : 
    1011           0 :     luma_subblock_size_y = 32;
    1012           0 :     luma_subblock_size_x = 32;
    1013             : 
    1014           0 :     chroma_subblock_size_y = luma_subblock_size_y >> chroma_subsamp_y;
    1015           0 :     chroma_subblock_size_x = luma_subblock_size_x >> chroma_subsamp_x;
    1016             : 
    1017             :     // Initial padding is only needed for generation of
    1018             :     // film grain templates (to stabilize the AR process)
    1019             :     // Only a 64x64 luma and 32x32 chroma part of a template
    1020             :     // is used later for adding grain, padding can be discarded
    1021             : 
    1022           0 :     int32_t luma_block_size_y =
    1023           0 :         top_pad + 2 * ar_padding + luma_subblock_size_y * 2 + bottom_pad;
    1024           0 :     int32_t luma_block_size_x = left_pad + 2 * ar_padding + luma_subblock_size_x * 2 +
    1025           0 :         2 * ar_padding + right_pad;
    1026             : 
    1027           0 :     int32_t chroma_block_size_y = top_pad + (2 >> chroma_subsamp_y) * ar_padding +
    1028           0 :         chroma_subblock_size_y * 2 + bottom_pad;
    1029           0 :     int32_t chroma_block_size_x = left_pad + (2 >> chroma_subsamp_x) * ar_padding +
    1030           0 :         chroma_subblock_size_x * 2 +
    1031           0 :         (2 >> chroma_subsamp_x) * ar_padding + right_pad;
    1032             : 
    1033           0 :     int32_t luma_grain_stride = luma_block_size_x;
    1034           0 :     int32_t chroma_grain_stride = chroma_block_size_x;
    1035             : 
    1036           0 :     int32_t overlap = params->overlap_flag;
    1037           0 :     int32_t bit_depth = params->bit_depth;
    1038             : 
    1039           0 :     grain_center = 128 << (bit_depth - 8);
    1040           0 :     grain_min = 0 - grain_center;
    1041           0 :     grain_max = (256 << (bit_depth - 8)) - 1 - grain_center;
    1042             : 
    1043           0 :     init_arrays(params, luma_stride, chroma_stride, &pred_pos_luma,
    1044             :         &pred_pos_chroma, &luma_grain_block, &cb_grain_block,
    1045             :         &cr_grain_block, &y_line_buf, &cb_line_buf, &cr_line_buf,
    1046             :         &y_col_buf, &cb_col_buf, &cr_col_buf,
    1047             :         luma_block_size_y * luma_block_size_x,
    1048             :         chroma_block_size_y * chroma_block_size_x, chroma_subsamp_y,
    1049             :         chroma_subsamp_x);
    1050             : 
    1051           0 :     generate_luma_grain_block(params, pred_pos_luma, luma_grain_block,
    1052             :         luma_block_size_y, luma_block_size_x,
    1053             :         luma_grain_stride, left_pad, top_pad, right_pad,
    1054             :         bottom_pad);
    1055             : 
    1056           0 :     generate_chroma_grain_blocks(
    1057             :         params,
    1058             :         //                               pred_pos_luma,
    1059             :         pred_pos_chroma, luma_grain_block, cb_grain_block, cr_grain_block,
    1060             :         luma_grain_stride, chroma_block_size_y, chroma_block_size_x,
    1061             :         chroma_grain_stride, left_pad, top_pad, right_pad, bottom_pad,
    1062             :         chroma_subsamp_y, chroma_subsamp_x);
    1063             : 
    1064           0 :     init_scaling_function(params->scaling_points_y, params->num_y_points,
    1065             :         scaling_lut_y);
    1066             : 
    1067           0 :     if (params->chroma_scaling_from_luma) {
    1068           0 :         memcpy(scaling_lut_cb, scaling_lut_y, sizeof(*scaling_lut_y) * 256);
    1069           0 :         memcpy(scaling_lut_cr, scaling_lut_y, sizeof(*scaling_lut_y) * 256);
    1070             :     }
    1071             :     else {
    1072           0 :         init_scaling_function(params->scaling_points_cb, params->num_cb_points,
    1073             :             scaling_lut_cb);
    1074           0 :         init_scaling_function(params->scaling_points_cr, params->num_cr_points,
    1075             :             scaling_lut_cr);
    1076             :     }
    1077           0 :     for (int32_t y = 0; y < height / 2; y += (luma_subblock_size_y >> 1)) {
    1078           0 :         init_random_generator(y * 2, params->random_seed);
    1079             : 
    1080           0 :         for (int32_t x = 0; x < width / 2; x += (luma_subblock_size_x >> 1)) {
    1081           0 :             int32_t offset_y = get_random_number(8);
    1082           0 :             int32_t offset_x = (offset_y >> 4) & 15;
    1083           0 :             offset_y &= 15;
    1084             : 
    1085           0 :             int32_t luma_offset_y = left_pad + 2 * ar_padding + (offset_y << 1);
    1086           0 :             int32_t luma_offset_x = top_pad + 2 * ar_padding + (offset_x << 1);
    1087             : 
    1088           0 :             int32_t chroma_offset_y = top_pad + (2 >> chroma_subsamp_y) * ar_padding +
    1089           0 :                 offset_y * (2 >> chroma_subsamp_y);
    1090           0 :             int32_t chroma_offset_x = left_pad + (2 >> chroma_subsamp_x) * ar_padding +
    1091           0 :                 offset_x * (2 >> chroma_subsamp_x);
    1092             : 
    1093           0 :             if (overlap && x) {
    1094           0 :                 ver_boundary_overlap(
    1095             :                     y_col_buf, 2,
    1096           0 :                     luma_grain_block + luma_offset_y * luma_grain_stride +
    1097             :                     luma_offset_x,
    1098             :                     luma_grain_stride, y_col_buf, 2, 2,
    1099           0 :                     AOMMIN(luma_subblock_size_y + 2, height - (y << 1)));
    1100             : 
    1101           0 :                 ver_boundary_overlap(
    1102             :                     cb_col_buf, 2 >> chroma_subsamp_x,
    1103           0 :                     cb_grain_block + chroma_offset_y * chroma_grain_stride +
    1104             :                     chroma_offset_x,
    1105             :                     chroma_grain_stride, cb_col_buf, 2 >> chroma_subsamp_x,
    1106             :                     2 >> chroma_subsamp_x,
    1107           0 :                     AOMMIN(chroma_subblock_size_y + (2 >> chroma_subsamp_y),
    1108             :                     (height - (y << 1)) >> chroma_subsamp_y));
    1109             : 
    1110           0 :                 ver_boundary_overlap(
    1111             :                     cr_col_buf, 2 >> chroma_subsamp_x,
    1112           0 :                     cr_grain_block + chroma_offset_y * chroma_grain_stride +
    1113             :                     chroma_offset_x,
    1114             :                     chroma_grain_stride, cr_col_buf, 2 >> chroma_subsamp_x,
    1115             :                     2 >> chroma_subsamp_x,
    1116           0 :                     AOMMIN(chroma_subblock_size_y + (2 >> chroma_subsamp_y),
    1117             :                     (height - (y << 1)) >> chroma_subsamp_y));
    1118             : 
    1119           0 :                 int32_t i = y ? 1 : 0;
    1120             : 
    1121           0 :                 if (use_high_bit_depth) {
    1122           0 :                     add_noise_to_block_hbd(
    1123             :                         params,
    1124           0 :                         (uint16_t *)luma + ((y + i) << 1) * luma_stride + (x << 1),
    1125             :                         (uint16_t *)cb +
    1126           0 :                         ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1127           0 :                         (x << (1 - chroma_subsamp_x)),
    1128             :                         (uint16_t *)cr +
    1129           0 :                         ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1130           0 :                         (x << (1 - chroma_subsamp_x)),
    1131           0 :                         luma_stride, chroma_stride, y_col_buf + i * 4,
    1132           0 :                         cb_col_buf + i * (2 - chroma_subsamp_y) * (2 - chroma_subsamp_x),
    1133           0 :                         cr_col_buf + i * (2 - chroma_subsamp_y) * (2 - chroma_subsamp_x),
    1134             :                         2, (2 - chroma_subsamp_x),
    1135           0 :                         AOMMIN(luma_subblock_size_y >> 1, height / 2 - y) - i, 1,
    1136             :                         bit_depth, chroma_subsamp_y, chroma_subsamp_x);
    1137             :                 }
    1138             :                 else {
    1139           0 :                     add_noise_to_block(
    1140           0 :                         params, luma + ((y + i) << 1) * luma_stride + (x << 1),
    1141           0 :                         cb + ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1142           0 :                         (x << (1 - chroma_subsamp_x)),
    1143           0 :                         cr + ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1144           0 :                         (x << (1 - chroma_subsamp_x)),
    1145           0 :                         luma_stride, chroma_stride, y_col_buf + i * 4,
    1146           0 :                         cb_col_buf + i * (2 - chroma_subsamp_y) * (2 - chroma_subsamp_x),
    1147           0 :                         cr_col_buf + i * (2 - chroma_subsamp_y) * (2 - chroma_subsamp_x),
    1148             :                         2, (2 - chroma_subsamp_x),
    1149           0 :                         AOMMIN(luma_subblock_size_y >> 1, height / 2 - y) - i, 1,
    1150             :                         bit_depth, chroma_subsamp_y, chroma_subsamp_x);
    1151             :                 }
    1152             :             }
    1153             : 
    1154           0 :             if (overlap && y) {
    1155           0 :                 if (x) {
    1156             :                     ASSERT(y_col_buf != NULL);
    1157           0 :                     hor_boundary_overlap(y_line_buf + (x << 1), luma_stride, y_col_buf, 2,
    1158           0 :                         y_line_buf + (x << 1), luma_stride, 2, 2);
    1159             : 
    1160           0 :                     hor_boundary_overlap(cb_line_buf + x * (2 >> chroma_subsamp_x),
    1161             :                         chroma_stride, cb_col_buf, 2 >> chroma_subsamp_x,
    1162           0 :                         cb_line_buf + x * (2 >> chroma_subsamp_x),
    1163             :                         chroma_stride, 2 >> chroma_subsamp_x,
    1164             :                         2 >> chroma_subsamp_y);
    1165             : 
    1166           0 :                     hor_boundary_overlap(cr_line_buf + x * (2 >> chroma_subsamp_x),
    1167             :                         chroma_stride, cr_col_buf, 2 >> chroma_subsamp_x,
    1168           0 :                         cr_line_buf + x * (2 >> chroma_subsamp_x),
    1169             :                         chroma_stride, 2 >> chroma_subsamp_x,
    1170             :                         2 >> chroma_subsamp_y);
    1171             :                 }
    1172             : 
    1173           0 :                 hor_boundary_overlap(
    1174           0 :                     y_line_buf + ((x ? x + 1 : 0) << 1), luma_stride,
    1175           0 :                     luma_grain_block + luma_offset_y * luma_grain_stride +
    1176           0 :                     luma_offset_x + (x ? 2 : 0),
    1177           0 :                     luma_grain_stride, y_line_buf + ((x ? x + 1 : 0) << 1), luma_stride,
    1178           0 :                     AOMMIN(luma_subblock_size_x - ((x ? 1 : 0) << 1),
    1179             :                         width - ((x ? x + 1 : 0) << 1)),
    1180             :                     2);
    1181             : 
    1182           0 :                 hor_boundary_overlap(
    1183           0 :                     cb_line_buf + ((x ? x + 1 : 0) << (1 - chroma_subsamp_x)),
    1184             :                     chroma_stride,
    1185           0 :                     cb_grain_block + chroma_offset_y * chroma_grain_stride +
    1186           0 :                     chroma_offset_x + ((x ? 1 : 0) << (1 - chroma_subsamp_x)),
    1187             :                     chroma_grain_stride,
    1188           0 :                     cb_line_buf + ((x ? x + 1 : 0) << (1 - chroma_subsamp_x)),
    1189             :                     chroma_stride,
    1190           0 :                     AOMMIN(chroma_subblock_size_x -
    1191             :                     ((x ? 1 : 0) << (1 - chroma_subsamp_x)),
    1192             :                         (width - ((x ? x + 1 : 0) << 1)) >> chroma_subsamp_x),
    1193             :                     2 >> chroma_subsamp_y);
    1194             : 
    1195           0 :                 hor_boundary_overlap(
    1196           0 :                     cr_line_buf + ((x ? x + 1 : 0) << (1 - chroma_subsamp_x)),
    1197             :                     chroma_stride,
    1198           0 :                     cr_grain_block + chroma_offset_y * chroma_grain_stride +
    1199           0 :                     chroma_offset_x + ((x ? 1 : 0) << (1 - chroma_subsamp_x)),
    1200             :                     chroma_grain_stride,
    1201           0 :                     cr_line_buf + ((x ? x + 1 : 0) << (1 - chroma_subsamp_x)),
    1202             :                     chroma_stride,
    1203           0 :                     AOMMIN(chroma_subblock_size_x -
    1204             :                     ((x ? 1 : 0) << (1 - chroma_subsamp_x)),
    1205             :                         (width - ((x ? x + 1 : 0) << 1)) >> chroma_subsamp_x),
    1206             :                     2 >> chroma_subsamp_y);
    1207             : 
    1208           0 :                 if (use_high_bit_depth) {
    1209           0 :                     add_noise_to_block_hbd(
    1210           0 :                         params, (uint16_t *)luma + (y << 1) * luma_stride + (x << 1),
    1211           0 :                         (uint16_t *)cb + (y << (1 - chroma_subsamp_y)) * chroma_stride +
    1212           0 :                         (x << ((1 - chroma_subsamp_x))),
    1213           0 :                         (uint16_t *)cr + (y << (1 - chroma_subsamp_y)) * chroma_stride +
    1214           0 :                         (x << ((1 - chroma_subsamp_x))),
    1215           0 :                         luma_stride, chroma_stride, y_line_buf + (x << 1),
    1216           0 :                         cb_line_buf + (x << (1 - chroma_subsamp_x)),
    1217           0 :                         cr_line_buf + (x << (1 - chroma_subsamp_x)), luma_stride,
    1218             :                         chroma_stride, 1,
    1219           0 :                         AOMMIN(luma_subblock_size_x >> 1, width / 2 - x), bit_depth,
    1220             :                         chroma_subsamp_y, chroma_subsamp_x);
    1221             :                 }
    1222             :                 else {
    1223           0 :                     add_noise_to_block(
    1224           0 :                         params, luma + (y << 1) * luma_stride + (x << 1),
    1225           0 :                         cb + (y << (1 - chroma_subsamp_y)) * chroma_stride +
    1226           0 :                         (x << ((1 - chroma_subsamp_x))),
    1227           0 :                         cr + (y << (1 - chroma_subsamp_y)) * chroma_stride +
    1228           0 :                         (x << ((1 - chroma_subsamp_x))),
    1229           0 :                         luma_stride, chroma_stride, y_line_buf + (x << 1),
    1230           0 :                         cb_line_buf + (x << (1 - chroma_subsamp_x)),
    1231           0 :                         cr_line_buf + (x << (1 - chroma_subsamp_x)), luma_stride,
    1232             :                         chroma_stride, 1,
    1233           0 :                         AOMMIN(luma_subblock_size_x >> 1, width / 2 - x), bit_depth,
    1234             :                         chroma_subsamp_y, chroma_subsamp_x);
    1235             :                 }
    1236             :             }
    1237             : 
    1238           0 :             int32_t i = overlap && y ? 1 : 0;
    1239           0 :             int32_t j = overlap && x ? 1 : 0;
    1240             : 
    1241           0 :             if (use_high_bit_depth) {
    1242           0 :                 add_noise_to_block_hbd(
    1243             :                     params,
    1244           0 :                     (uint16_t *)luma + ((y + i) << 1) * luma_stride + ((x + j) << 1),
    1245             :                     (uint16_t *)cb +
    1246           0 :                     ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1247           0 :                     ((x + j) << (1 - chroma_subsamp_x)),
    1248             :                     (uint16_t *)cr +
    1249           0 :                     ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1250           0 :                     ((x + j) << (1 - chroma_subsamp_x)),
    1251             :                     luma_stride, chroma_stride,
    1252           0 :                     luma_grain_block + (luma_offset_y + (i << 1)) * luma_grain_stride +
    1253           0 :                     luma_offset_x + (j << 1),
    1254             :                     cb_grain_block +
    1255           0 :                     (chroma_offset_y + (i << (1 - chroma_subsamp_y))) *
    1256           0 :                     chroma_grain_stride +
    1257           0 :                     chroma_offset_x + (j << (1 - chroma_subsamp_x)),
    1258             :                     cr_grain_block +
    1259           0 :                     (chroma_offset_y + (i << (1 - chroma_subsamp_y))) *
    1260           0 :                     chroma_grain_stride +
    1261           0 :                     chroma_offset_x + (j << (1 - chroma_subsamp_x)),
    1262             :                     luma_grain_stride, chroma_grain_stride,
    1263           0 :                     AOMMIN(luma_subblock_size_y >> 1, height / 2 - y) - i,
    1264           0 :                     AOMMIN(luma_subblock_size_x >> 1, width / 2 - x) - j, bit_depth,
    1265             :                     chroma_subsamp_y, chroma_subsamp_x);
    1266             :             }
    1267             :             else {
    1268           0 :                 add_noise_to_block(
    1269           0 :                     params, luma + ((y + i) << 1) * luma_stride + ((x + j) << 1),
    1270           0 :                     cb + ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1271           0 :                     ((x + j) << (1 - chroma_subsamp_x)),
    1272           0 :                     cr + ((y + i) << (1 - chroma_subsamp_y)) * chroma_stride +
    1273           0 :                     ((x + j) << (1 - chroma_subsamp_x)),
    1274             :                     luma_stride, chroma_stride,
    1275           0 :                     luma_grain_block + (luma_offset_y + (i << 1)) * luma_grain_stride +
    1276           0 :                     luma_offset_x + (j << 1),
    1277             :                     cb_grain_block +
    1278           0 :                     (chroma_offset_y + (i << (1 - chroma_subsamp_y))) *
    1279           0 :                     chroma_grain_stride +
    1280           0 :                     chroma_offset_x + (j << (1 - chroma_subsamp_x)),
    1281             :                     cr_grain_block +
    1282           0 :                     (chroma_offset_y + (i << (1 - chroma_subsamp_y))) *
    1283           0 :                     chroma_grain_stride +
    1284           0 :                     chroma_offset_x + (j << (1 - chroma_subsamp_x)),
    1285             :                     luma_grain_stride, chroma_grain_stride,
    1286           0 :                     AOMMIN(luma_subblock_size_y >> 1, height / 2 - y) - i,
    1287           0 :                     AOMMIN(luma_subblock_size_x >> 1, width / 2 - x) - j, bit_depth,
    1288             :                     chroma_subsamp_y, chroma_subsamp_x);
    1289             :             }
    1290             : 
    1291           0 :             if (overlap) {
    1292           0 :                 if (x) {
    1293             :                     // Copy overlapped column bufer to line buffer
    1294           0 :                     copy_area(y_col_buf + (luma_subblock_size_y << 1), 2,
    1295           0 :                         y_line_buf + (x << 1), luma_stride, 2, 2);
    1296             : 
    1297           0 :                     copy_area(
    1298           0 :                         cb_col_buf + (chroma_subblock_size_y << (1 - chroma_subsamp_x)),
    1299             :                         2 >> chroma_subsamp_x,
    1300           0 :                         cb_line_buf + (x << (1 - chroma_subsamp_x)), chroma_stride,
    1301             :                         2 >> chroma_subsamp_x, 2 >> chroma_subsamp_y);
    1302             : 
    1303           0 :                     copy_area(
    1304           0 :                         cr_col_buf + (chroma_subblock_size_y << (1 - chroma_subsamp_x)),
    1305             :                         2 >> chroma_subsamp_x,
    1306           0 :                         cr_line_buf + (x << (1 - chroma_subsamp_x)), chroma_stride,
    1307             :                         2 >> chroma_subsamp_x, 2 >> chroma_subsamp_y);
    1308             :                 }
    1309             : 
    1310             :                 // Copy grain to the line buffer for overlap with a bottom block
    1311           0 :                 copy_area(
    1312             :                     luma_grain_block +
    1313           0 :                     (luma_offset_y + luma_subblock_size_y) * luma_grain_stride +
    1314           0 :                     luma_offset_x + ((x ? 2 : 0)),
    1315           0 :                     luma_grain_stride, y_line_buf + ((x ? x + 1 : 0) << 1), luma_stride,
    1316           0 :                     AOMMIN(luma_subblock_size_x, width - (x << 1)) - (x ? 2 : 0), 2);
    1317             : 
    1318           0 :                 copy_area(cb_grain_block +
    1319           0 :                     (chroma_offset_y + chroma_subblock_size_y) *
    1320           0 :                     chroma_grain_stride +
    1321           0 :                     chroma_offset_x + (x ? 2 >> chroma_subsamp_x : 0),
    1322             :                     chroma_grain_stride,
    1323           0 :                     cb_line_buf + ((x ? x + 1 : 0) << (1 - chroma_subsamp_x)),
    1324             :                     chroma_stride,
    1325           0 :                     AOMMIN(chroma_subblock_size_x,
    1326             :                     ((width - (x << 1)) >> chroma_subsamp_x)) -
    1327           0 :                         (x ? 2 >> chroma_subsamp_x : 0),
    1328             :                     2 >> chroma_subsamp_y);
    1329             : 
    1330           0 :                 copy_area(cr_grain_block +
    1331           0 :                     (chroma_offset_y + chroma_subblock_size_y) *
    1332           0 :                     chroma_grain_stride +
    1333           0 :                     chroma_offset_x + (x ? 2 >> chroma_subsamp_x : 0),
    1334             :                     chroma_grain_stride,
    1335           0 :                     cr_line_buf + ((x ? x + 1 : 0) << (1 - chroma_subsamp_x)),
    1336             :                     chroma_stride,
    1337           0 :                     AOMMIN(chroma_subblock_size_x,
    1338             :                     ((width - (x << 1)) >> chroma_subsamp_x)) -
    1339           0 :                         (x ? 2 >> chroma_subsamp_x : 0),
    1340             :                     2 >> chroma_subsamp_y);
    1341             : 
    1342             :                 // Copy grain to the column buffer for overlap with the next block to
    1343             :                 // the right
    1344             : 
    1345           0 :                 copy_area(luma_grain_block + luma_offset_y * luma_grain_stride +
    1346           0 :                     luma_offset_x + luma_subblock_size_x,
    1347             :                     luma_grain_stride, y_col_buf, 2, 2,
    1348           0 :                     AOMMIN(luma_subblock_size_y + 2, height - (y << 1)));
    1349             : 
    1350           0 :                 copy_area(cb_grain_block + chroma_offset_y * chroma_grain_stride +
    1351           0 :                     chroma_offset_x + chroma_subblock_size_x,
    1352             :                     chroma_grain_stride, cb_col_buf, 2 >> chroma_subsamp_x,
    1353             :                     2 >> chroma_subsamp_x,
    1354           0 :                     AOMMIN(chroma_subblock_size_y + (2 >> chroma_subsamp_y),
    1355             :                     (height - (y << 1)) >> chroma_subsamp_y));
    1356             : 
    1357           0 :                 copy_area(cr_grain_block + chroma_offset_y * chroma_grain_stride +
    1358           0 :                     chroma_offset_x + chroma_subblock_size_x,
    1359             :                     chroma_grain_stride, cr_col_buf, 2 >> chroma_subsamp_x,
    1360             :                     2 >> chroma_subsamp_x,
    1361           0 :                     AOMMIN(chroma_subblock_size_y + (2 >> chroma_subsamp_y),
    1362             :                     (height - (y << 1)) >> chroma_subsamp_y));
    1363             :             }
    1364             :         }
    1365             :     }
    1366             : 
    1367           0 :     dealloc_arrays(params, &pred_pos_luma, &pred_pos_chroma, &luma_grain_block,
    1368             :         &cb_grain_block, &cr_grain_block, &y_line_buf, &cb_line_buf,
    1369             :         &cr_line_buf, &y_col_buf, &cb_col_buf, &cr_col_buf);
    1370           0 : }
    1371             : 
    1372             : /*
    1373             : void av1_film_grain_write_updated(const aom_film_grain_t *pars,
    1374             :                                   int32_t monochrome,
    1375             :                                   struct AomWriteBitBuffer *wb) {
    1376             :   eb_aom_wb_write_literal(wb, pars->num_y_points, 4);  // max 14
    1377             :   for (int32_t i = 0; i < pars->num_y_points; i++) {
    1378             :     eb_aom_wb_write_literal(wb, pars->scaling_points_y[i][0], 8);
    1379             :     eb_aom_wb_write_literal(wb, pars->scaling_points_y[i][1], 8);
    1380             :   }
    1381             : 
    1382             :   if (!monochrome)
    1383             :     eb_aom_wb_write_bit(wb, pars->chroma_scaling_from_luma);
    1384             : 
    1385             :   if (!(monochrome || pars->chroma_scaling_from_luma)) {
    1386             :     eb_aom_wb_write_literal(wb, pars->num_cb_points, 4);  // max 10
    1387             :     for (int32_t i = 0; i < pars->num_cb_points; i++) {
    1388             :       eb_aom_wb_write_literal(wb, pars->scaling_points_cb[i][0], 8);
    1389             :       eb_aom_wb_write_literal(wb, pars->scaling_points_cb[i][1], 8);
    1390             :     }
    1391             : 
    1392             :     eb_aom_wb_write_literal(wb, pars->num_cr_points, 4);  // max 10
    1393             :     for (int32_t i = 0; i < pars->num_cr_points; i++) {
    1394             :       eb_aom_wb_write_literal(wb, pars->scaling_points_cr[i][0], 8);
    1395             :       eb_aom_wb_write_literal(wb, pars->scaling_points_cr[i][1], 8);
    1396             :     }
    1397             :   }
    1398             : 
    1399             :   eb_aom_wb_write_literal(wb, pars->scaling_shift - 8, 2);  // 8 + value
    1400             : 
    1401             :   // AR coefficients
    1402             :   // Only sent if the corresponsing scaling function has
    1403             :   // more than 0 points
    1404             :   eb_aom_wb_write_literal(wb, pars->ar_coeff_lag, 2);
    1405             : 
    1406             :   int32_t num_pos_luma = 2 * pars->ar_coeff_lag * (pars->ar_coeff_lag + 1);
    1407             :   int32_t num_pos_chroma = num_pos_luma;
    1408             :   if (pars->num_y_points > 0) ++num_pos_chroma;
    1409             : 
    1410             :   if (pars->num_y_points)
    1411             :     for (int32_t i = 0; i < num_pos_luma; i++)
    1412             :       eb_aom_wb_write_literal(wb, pars->ar_coeffs_y[i] + 128, 8);
    1413             : 
    1414             :   if (pars->num_cb_points || pars->chroma_scaling_from_luma)
    1415             :     for (int32_t i = 0; i < num_pos_chroma; i++)
    1416             :       eb_aom_wb_write_literal(wb, pars->ar_coeffs_cb[i] + 128, 8);
    1417             : 
    1418             :   if (pars->num_cr_points || pars->chroma_scaling_from_luma)
    1419             :     for (int32_t i = 0; i < num_pos_chroma; i++)
    1420             :       eb_aom_wb_write_literal(wb, pars->ar_coeffs_cr[i] + 128, 8);
    1421             : 
    1422             :   eb_aom_wb_write_literal(wb, pars->ar_coeff_shift - 6, 2);  // 8 + value
    1423             : 
    1424             :   eb_aom_wb_write_literal(wb, pars->grain_scale_shift, 2);
    1425             : 
    1426             :   if (pars->num_cb_points) {
    1427             :     eb_aom_wb_write_literal(wb, pars->cb_mult, 8);
    1428             :     eb_aom_wb_write_literal(wb, pars->cb_luma_mult, 8);
    1429             :     eb_aom_wb_write_literal(wb, pars->cb_offset, 9);
    1430             :   }
    1431             : 
    1432             :   if (pars->num_cr_points) {
    1433             :     eb_aom_wb_write_literal(wb, pars->cr_mult, 8);
    1434             :     eb_aom_wb_write_literal(wb, pars->cr_luma_mult, 8);
    1435             :     eb_aom_wb_write_literal(wb, pars->cr_offset, 9);
    1436             :   }
    1437             : 
    1438             :   eb_aom_wb_write_bit(wb, pars->overlap_flag);
    1439             : 
    1440             :   eb_aom_wb_write_bit(wb, pars->clip_to_restricted_range);
    1441             : }
    1442             : */
    1443             : /*
    1444             : void av1_film_grain_read_updated(aom_film_grain_t *pars,
    1445             :                                  int32_t monochrome,
    1446             :                                  struct aom_read_bit_buffer *rb,
    1447             :                                  struct aom_internal_error_info *error) {
    1448             :   // Scaling functions parameters
    1449             :   pars->num_y_points = aom_rb_read_literal(rb, 4);  // max 14
    1450             :   if (pars->num_y_points > 14)
    1451             :     aom_internal_error(error, AOM_CODEC_UNSUP_BITSTREAM,
    1452             :                        "Number of points for film grain luma scaling function "
    1453             :                        "exceeds the maximum value.");
    1454             :   for (int32_t i = 0; i < pars->num_y_points; i++) {
    1455             :     pars->scaling_points_y[i][0] = aom_rb_read_literal(rb, 8);
    1456             :     if (i && pars->scaling_points_y[i - 1][0] >= pars->scaling_points_y[i][0])
    1457             :       aom_internal_error(error, AOM_CODEC_UNSUP_BITSTREAM,
    1458             :                          "First coordinateg of the scaling function points "
    1459             :                          "shall be increasing.");
    1460             :     pars->scaling_points_y[i][1] = aom_rb_read_literal(rb, 8);
    1461             :   }
    1462             : 
    1463             :   if (!monochrome)
    1464             :     pars->chroma_scaling_from_luma = aom_rb_read_bit(rb);
    1465             : 
    1466             :   if (monochrome || pars->chroma_scaling_from_luma) {
    1467             :     pars->num_cb_points = 0;
    1468             :     pars->num_cr_points = 0;
    1469             :   } else {
    1470             :     pars->num_cb_points = aom_rb_read_literal(rb, 4);  // max 10
    1471             :     if (pars->num_cb_points > 10)
    1472             :       aom_internal_error(error, AOM_CODEC_UNSUP_BITSTREAM,
    1473             :                          "Number of points for film grain cb scaling function "
    1474             :                          "exceeds the maximum value.");
    1475             :     for (int32_t i = 0; i < pars->num_cb_points; i++) {
    1476             :       pars->scaling_points_cb[i][0] = aom_rb_read_literal(rb, 8);
    1477             :       if (i &&
    1478             :           pars->scaling_points_cb[i - 1][0] >= pars->scaling_points_cb[i][0])
    1479             :         aom_internal_error(error, AOM_CODEC_UNSUP_BITSTREAM,
    1480             :                            "First coordinate of the scaling function points "
    1481             :                            "shall be increasing.");
    1482             :       pars->scaling_points_cb[i][1] = aom_rb_read_literal(rb, 8);
    1483             :     }
    1484             : 
    1485             :     pars->num_cr_points = aom_rb_read_literal(rb, 4);  // max 10
    1486             :     if (pars->num_cr_points > 10)
    1487             :       aom_internal_error(error, AOM_CODEC_UNSUP_BITSTREAM,
    1488             :                          "Number of points for film grain cr scaling function "
    1489             :                          "exceeds the maximum value.");
    1490             :     for (int32_t i = 0; i < pars->num_cr_points; i++) {
    1491             :       pars->scaling_points_cr[i][0] = aom_rb_read_literal(rb, 8);
    1492             :       if (i &&
    1493             :           pars->scaling_points_cr[i - 1][0] >= pars->scaling_points_cr[i][0])
    1494             :         aom_internal_error(error, AOM_CODEC_UNSUP_BITSTREAM,
    1495             :                            "First coordinate of the scaling function points "
    1496             :                            "shall be increasing.");
    1497             :       pars->scaling_points_cr[i][1] = aom_rb_read_literal(rb, 8);
    1498             :     }
    1499             :   }
    1500             : 
    1501             :   pars->scaling_shift = aom_rb_read_literal(rb, 2) + 8;  // 8 + value
    1502             : 
    1503             :   // AR coefficients
    1504             :   // Only sent if the corresponsing scaling function has
    1505             :   // more than 0 points
    1506             :   pars->ar_coeff_lag = aom_rb_read_literal(rb, 2);
    1507             : 
    1508             :   int32_t num_pos_luma = 2 * pars->ar_coeff_lag * (pars->ar_coeff_lag + 1);
    1509             :   int32_t num_pos_chroma = num_pos_luma;
    1510             :   if (pars->num_y_points > 0) ++num_pos_chroma;
    1511             : 
    1512             :   if (pars->num_y_points)
    1513             :     for (int32_t i = 0; i < num_pos_luma; i++)
    1514             :       pars->ar_coeffs_y[i] = aom_rb_read_literal(rb, 8) - 128;
    1515             : 
    1516             :   if (pars->num_cb_points || pars->chroma_scaling_from_luma)
    1517             :     for (int32_t i = 0; i < num_pos_chroma; i++)
    1518             :       pars->ar_coeffs_cb[i] = aom_rb_read_literal(rb, 8) - 128;
    1519             : 
    1520             :   if (pars->num_cr_points || pars->chroma_scaling_from_luma)
    1521             :     for (int32_t i = 0; i < num_pos_chroma; i++)
    1522             :       pars->ar_coeffs_cr[i] = aom_rb_read_literal(rb, 8) - 128;
    1523             : 
    1524             :   pars->ar_coeff_shift = aom_rb_read_literal(rb, 2) + 6;  // 6 + value
    1525             : 
    1526             :   pars->grain_scale_shift = aom_rb_read_literal(rb, 2);
    1527             : 
    1528             :   if (pars->num_cb_points) {
    1529             :     pars->cb_mult = aom_rb_read_literal(rb, 8);
    1530             :     pars->cb_luma_mult = aom_rb_read_literal(rb, 8);
    1531             :     pars->cb_offset = aom_rb_read_literal(rb, 9);
    1532             :   }
    1533             : 
    1534             :   if (pars->num_cr_points) {
    1535             :     pars->cr_mult = aom_rb_read_literal(rb, 8);
    1536             :     pars->cr_luma_mult = aom_rb_read_literal(rb, 8);
    1537             :     pars->cr_offset = aom_rb_read_literal(rb, 9);
    1538             :   }
    1539             : 
    1540             :   pars->overlap_flag = aom_rb_read_bit(rb);
    1541             : 
    1542             :   pars->clip_to_restricted_range = aom_rb_read_bit(rb);
    1543             : }
    1544             : */

Generated by: LCOV version 1.14