| File: | root/firefox-clang/third_party/dav1d/src/lf_mask.c |
| Warning: | line 100, column 23 1st function call argument is an uninitialized value |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* | ||||
| 2 | * Copyright © 2018, VideoLAN and dav1d authors | ||||
| 3 | * Copyright © 2018, Two Orioles, LLC | ||||
| 4 | * All rights reserved. | ||||
| 5 | * | ||||
| 6 | * Redistribution and use in source and binary forms, with or without | ||||
| 7 | * modification, are permitted provided that the following conditions are met: | ||||
| 8 | * | ||||
| 9 | * 1. Redistributions of source code must retain the above copyright notice, this | ||||
| 10 | * list of conditions and the following disclaimer. | ||||
| 11 | * | ||||
| 12 | * 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| 13 | * this list of conditions and the following disclaimer in the documentation | ||||
| 14 | * and/or other materials provided with the distribution. | ||||
| 15 | * | ||||
| 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| 17 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| 19 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||||
| 20 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| 21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| 23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| 26 | */ | ||||
| 27 | |||||
| 28 | #include "config.h" | ||||
| 29 | |||||
| 30 | #include <string.h> | ||||
| 31 | |||||
| 32 | #include "common/intops.h" | ||||
| 33 | |||||
| 34 | #include "src/ctx.h" | ||||
| 35 | #include "src/levels.h" | ||||
| 36 | #include "src/lf_mask.h" | ||||
| 37 | #include "src/tables.h" | ||||
| 38 | |||||
| 39 | static void decomp_tx(uint8_t (*const txa)[2 /* txsz, step */][32 /* y */][32 /* x */], | ||||
| 40 | const enum RectTxfmSize from, | ||||
| 41 | const int depth, | ||||
| 42 | const int y_off, const int x_off, | ||||
| 43 | const uint16_t *const tx_masks) | ||||
| 44 | { | ||||
| 45 | const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[from]; | ||||
| 46 | const int is_split = (from == (int) TX_4X4 || depth
| ||||
| 47 | (tx_masks[depth] >> (y_off * 4 + x_off)) & 1; | ||||
| 48 | |||||
| 49 | if (is_split) { | ||||
| 50 | const enum RectTxfmSize sub = t_dim->sub; | ||||
| 51 | const int htw4 = t_dim->w >> 1, hth4 = t_dim->h >> 1; | ||||
| 52 | |||||
| 53 | decomp_tx(txa, sub, depth + 1, y_off * 2 + 0, x_off * 2 + 0, tx_masks); | ||||
| 54 | if (t_dim->w >= t_dim->h) | ||||
| 55 | decomp_tx((uint8_t(*)[2][32][32]) &txa[0][0][0][htw4], | ||||
| 56 | sub, depth + 1, y_off * 2 + 0, x_off * 2 + 1, tx_masks); | ||||
| 57 | if (t_dim->h >= t_dim->w) { | ||||
| 58 | decomp_tx((uint8_t(*)[2][32][32]) &txa[0][0][hth4][0], | ||||
| 59 | sub, depth + 1, y_off * 2 + 1, x_off * 2 + 0, tx_masks); | ||||
| 60 | if (t_dim->w
| ||||
| 61 | decomp_tx((uint8_t(*)[2][32][32]) &txa[0][0][hth4][htw4], | ||||
| 62 | sub, depth + 1, y_off * 2 + 1, x_off * 2 + 1, tx_masks); | ||||
| 63 | } | ||||
| 64 | } else { | ||||
| 65 | const int lw = imin(2, t_dim->lw), lh = imin(2, t_dim->lh); | ||||
| 66 | |||||
| 67 | #define set_ctx(rep_macro) \ | ||||
| 68 | for (int y = 0; y < t_dim->h; y++) { \ | ||||
| 69 | rep_macro(txa[0][0][y], 0, lw); \ | ||||
| 70 | rep_macro(txa[1][0][y], 0, lh); \ | ||||
| 71 | txa[0][1][y][0] = t_dim->w; \ | ||||
| 72 | } \ | ||||
| 73 | rep_macro(txa[1][1][0], 0, t_dim->h); | ||||
| 74 | case_set_upto16(t_dim->lw)switch (t_dim->lw) { case 0: set_ctx(set_ctx1); break; case 1: set_ctx(set_ctx2); break; case 2: set_ctx(set_ctx4); break ; case 3: set_ctx(set_ctx8); break; case 4: set_ctx(set_ctx16 ); break; default: ((void) sizeof ((0) ? 1 : 0), __extension__ ({ if (0) ; else __assert_fail ("0", "/root/firefox-clang/third_party/dav1d/src/lf_mask.c" , 74, __extension__ __PRETTY_FUNCTION__); })); }; | ||||
| 75 | #undef set_ctx | ||||
| 76 | } | ||||
| 77 | } | ||||
| 78 | |||||
| 79 | static inline void mask_edges_inter(uint16_t (*const masks)[32][3][2], | ||||
| 80 | const int by4, const int bx4, | ||||
| 81 | const int w4, const int h4, const int skip, | ||||
| 82 | const enum RectTxfmSize max_tx, | ||||
| 83 | const uint16_t *const tx_masks, | ||||
| 84 | uint8_t *const a, uint8_t *const l) | ||||
| 85 | { | ||||
| 86 | const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[max_tx]; | ||||
| 87 | int y, x; | ||||
| 88 | |||||
| 89 | ALIGN_STK_16(uint8_t, txa, 2 /* edge */, [2 /* txsz, step */][32 /* y */][32 /* x */])uint8_t txa[2][2 ][32 ][32 ] __attribute__((aligned(16))); | ||||
| 90 | for (int y_off = 0, y = 0; y < h4; y += t_dim->h, y_off++) | ||||
| 91 | for (int x_off = 0, x = 0; x < w4; x += t_dim->w, x_off++) | ||||
| 92 | decomp_tx((uint8_t(*)[2][32][32]) &txa[0][0][y][x], | ||||
| 93 | max_tx, 0, y_off, x_off, tx_masks); | ||||
| 94 | |||||
| 95 | // left block edge | ||||
| 96 | unsigned mask = 1U << by4; | ||||
| 97 | for (y = 0; y < h4; y++, mask <<= 1) { | ||||
| 98 | const int sidx = mask >= 0x10000; | ||||
| 99 | const unsigned smask = mask >> (sidx << 4); | ||||
| 100 | masks[0][bx4][imin(txa[0][0][y][0], l[y])][sidx] |= smask; | ||||
| |||||
| 101 | } | ||||
| 102 | |||||
| 103 | // top block edge | ||||
| 104 | for (x = 0, mask = 1U << bx4; x < w4; x++, mask <<= 1) { | ||||
| 105 | const int sidx = mask >= 0x10000; | ||||
| 106 | const unsigned smask = mask >> (sidx << 4); | ||||
| 107 | masks[1][by4][imin(txa[1][0][0][x], a[x])][sidx] |= smask; | ||||
| 108 | } | ||||
| 109 | |||||
| 110 | if (!skip) { | ||||
| 111 | // inner (tx) left|right edges | ||||
| 112 | for (y = 0, mask = 1U << by4; y < h4; y++, mask <<= 1) { | ||||
| 113 | const int sidx = mask >= 0x10000U; | ||||
| 114 | const unsigned smask = mask >> (sidx << 4); | ||||
| 115 | int ltx = txa[0][0][y][0]; | ||||
| 116 | int step = txa[0][1][y][0]; | ||||
| 117 | for (x = step; x < w4; x += step) { | ||||
| 118 | const int rtx = txa[0][0][y][x]; | ||||
| 119 | masks[0][bx4 + x][imin(rtx, ltx)][sidx] |= smask; | ||||
| 120 | ltx = rtx; | ||||
| 121 | step = txa[0][1][y][x]; | ||||
| 122 | } | ||||
| 123 | } | ||||
| 124 | |||||
| 125 | // top | ||||
| 126 | // inner (tx) --- edges | ||||
| 127 | // bottom | ||||
| 128 | for (x = 0, mask = 1U << bx4; x < w4; x++, mask <<= 1) { | ||||
| 129 | const int sidx = mask >= 0x10000U; | ||||
| 130 | const unsigned smask = mask >> (sidx << 4); | ||||
| 131 | int ttx = txa[1][0][0][x]; | ||||
| 132 | int step = txa[1][1][0][x]; | ||||
| 133 | for (y = step; y < h4; y += step) { | ||||
| 134 | const int btx = txa[1][0][y][x]; | ||||
| 135 | masks[1][by4 + y][imin(ttx, btx)][sidx] |= smask; | ||||
| 136 | ttx = btx; | ||||
| 137 | step = txa[1][1][y][x]; | ||||
| 138 | } | ||||
| 139 | } | ||||
| 140 | } | ||||
| 141 | |||||
| 142 | for (y = 0; y < h4; y++) | ||||
| 143 | l[y] = txa[0][0][y][w4 - 1]; | ||||
| 144 | memcpy(a, txa[1][0][h4 - 1], w4); | ||||
| 145 | } | ||||
| 146 | |||||
| 147 | static inline void mask_edges_intra(uint16_t (*const masks)[32][3][2], | ||||
| 148 | const int by4, const int bx4, | ||||
| 149 | const int w4, const int h4, | ||||
| 150 | const enum RectTxfmSize tx, | ||||
| 151 | uint8_t *const a, uint8_t *const l) | ||||
| 152 | { | ||||
| 153 | const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[tx]; | ||||
| 154 | const int twl4 = t_dim->lw, thl4 = t_dim->lh; | ||||
| 155 | const int twl4c = imin(2, twl4), thl4c = imin(2, thl4); | ||||
| 156 | int y, x; | ||||
| 157 | |||||
| 158 | // left block edge | ||||
| 159 | unsigned mask = 1U << by4; | ||||
| 160 | for (y = 0; y < h4; y++, mask <<= 1) { | ||||
| 161 | const int sidx = mask >= 0x10000; | ||||
| 162 | const unsigned smask = mask >> (sidx << 4); | ||||
| 163 | masks[0][bx4][imin(twl4c, l[y])][sidx] |= smask; | ||||
| 164 | } | ||||
| 165 | |||||
| 166 | // top block edge | ||||
| 167 | for (x = 0, mask = 1U << bx4; x < w4; x++, mask <<= 1) { | ||||
| 168 | const int sidx = mask >= 0x10000; | ||||
| 169 | const unsigned smask = mask >> (sidx << 4); | ||||
| 170 | masks[1][by4][imin(thl4c, a[x])][sidx] |= smask; | ||||
| 171 | } | ||||
| 172 | |||||
| 173 | // inner (tx) left|right edges | ||||
| 174 | const int hstep = t_dim->w; | ||||
| 175 | unsigned t = 1U << by4; | ||||
| 176 | unsigned inner = (unsigned) ((((uint64_t) t) << h4) - t); | ||||
| 177 | unsigned inner1 = inner & 0xffff, inner2 = inner >> 16; | ||||
| 178 | for (x = hstep; x < w4; x += hstep) { | ||||
| 179 | if (inner1) masks[0][bx4 + x][twl4c][0] |= inner1; | ||||
| 180 | if (inner2) masks[0][bx4 + x][twl4c][1] |= inner2; | ||||
| 181 | } | ||||
| 182 | |||||
| 183 | // top | ||||
| 184 | // inner (tx) --- edges | ||||
| 185 | // bottom | ||||
| 186 | const int vstep = t_dim->h; | ||||
| 187 | t = 1U << bx4; | ||||
| 188 | inner = (unsigned) ((((uint64_t) t) << w4) - t); | ||||
| 189 | inner1 = inner & 0xffff; | ||||
| 190 | inner2 = inner >> 16; | ||||
| 191 | for (y = vstep; y < h4; y += vstep) { | ||||
| 192 | if (inner1) masks[1][by4 + y][thl4c][0] |= inner1; | ||||
| 193 | if (inner2) masks[1][by4 + y][thl4c][1] |= inner2; | ||||
| 194 | } | ||||
| 195 | |||||
| 196 | dav1d_memset_likely_pow2(a, thl4c, w4); | ||||
| 197 | dav1d_memset_likely_pow2(l, twl4c, h4); | ||||
| 198 | } | ||||
| 199 | |||||
| 200 | static void mask_edges_chroma(uint16_t (*const masks)[32][2][2], | ||||
| 201 | const int cby4, const int cbx4, | ||||
| 202 | const int cw4, const int ch4, | ||||
| 203 | const int skip_inter, | ||||
| 204 | const enum RectTxfmSize tx, | ||||
| 205 | uint8_t *const a, uint8_t *const l, | ||||
| 206 | const int ss_hor, const int ss_ver) | ||||
| 207 | { | ||||
| 208 | const TxfmInfo *const t_dim = &dav1d_txfm_dimensions[tx]; | ||||
| 209 | const int twl4 = t_dim->lw, thl4 = t_dim->lh; | ||||
| 210 | const int twl4c = !!twl4, thl4c = !!thl4; | ||||
| 211 | int y, x; | ||||
| 212 | const int vbits = 4 - ss_ver, hbits = 4 - ss_hor; | ||||
| 213 | const int vmask = 16 >> ss_ver, hmask = 16 >> ss_hor; | ||||
| 214 | const unsigned vmax = 1 << vmask, hmax = 1 << hmask; | ||||
| 215 | |||||
| 216 | // left block edge | ||||
| 217 | unsigned mask = 1U << cby4; | ||||
| 218 | for (y = 0; y < ch4; y++, mask <<= 1) { | ||||
| 219 | const int sidx = mask >= vmax; | ||||
| 220 | const unsigned smask = mask >> (sidx << vbits); | ||||
| 221 | masks[0][cbx4][imin(twl4c, l[y])][sidx] |= smask; | ||||
| 222 | } | ||||
| 223 | |||||
| 224 | // top block edge | ||||
| 225 | for (x = 0, mask = 1U << cbx4; x < cw4; x++, mask <<= 1) { | ||||
| 226 | const int sidx = mask >= hmax; | ||||
| 227 | const unsigned smask = mask >> (sidx << hbits); | ||||
| 228 | masks[1][cby4][imin(thl4c, a[x])][sidx] |= smask; | ||||
| 229 | } | ||||
| 230 | |||||
| 231 | if (!skip_inter) { | ||||
| 232 | // inner (tx) left|right edges | ||||
| 233 | const int hstep = t_dim->w; | ||||
| 234 | unsigned t = 1U << cby4; | ||||
| 235 | unsigned inner = (unsigned) ((((uint64_t) t) << ch4) - t); | ||||
| 236 | unsigned inner1 = inner & ((1 << vmask) - 1), inner2 = inner >> vmask; | ||||
| 237 | for (x = hstep; x < cw4; x += hstep) { | ||||
| 238 | if (inner1) masks[0][cbx4 + x][twl4c][0] |= inner1; | ||||
| 239 | if (inner2) masks[0][cbx4 + x][twl4c][1] |= inner2; | ||||
| 240 | } | ||||
| 241 | |||||
| 242 | // top | ||||
| 243 | // inner (tx) --- edges | ||||
| 244 | // bottom | ||||
| 245 | const int vstep = t_dim->h; | ||||
| 246 | t = 1U << cbx4; | ||||
| 247 | inner = (unsigned) ((((uint64_t) t) << cw4) - t); | ||||
| 248 | inner1 = inner & ((1 << hmask) - 1), inner2 = inner >> hmask; | ||||
| 249 | for (y = vstep; y < ch4; y += vstep) { | ||||
| 250 | if (inner1) masks[1][cby4 + y][thl4c][0] |= inner1; | ||||
| 251 | if (inner2) masks[1][cby4 + y][thl4c][1] |= inner2; | ||||
| 252 | } | ||||
| 253 | } | ||||
| 254 | |||||
| 255 | dav1d_memset_likely_pow2(a, thl4c, cw4); | ||||
| 256 | dav1d_memset_likely_pow2(l, twl4c, ch4); | ||||
| 257 | } | ||||
| 258 | |||||
| 259 | static void fill_levelcache_block(uint8_t (*level_cache_ptr)[4], | ||||
| 260 | const ptrdiff_t b_stride, | ||||
| 261 | const int bw, const int bh, | ||||
| 262 | const unsigned v0, | ||||
| 263 | const unsigned v1) | ||||
| 264 | { | ||||
| 265 | union alias16 v = (union alias16) { .u8 = { v0, v1 }}; | ||||
| 266 | |||||
| 267 | for (int y = 0; y < bh; y++) { | ||||
| 268 | for (int x = 0; x < bw; x++) | ||||
| 269 | ((union alias16 *) &level_cache_ptr[x][0])->u16 = v.u16; | ||||
| 270 | level_cache_ptr += b_stride; | ||||
| 271 | } | ||||
| 272 | } | ||||
| 273 | |||||
| 274 | void dav1d_create_lf_mask_intra(Av1Filter *const lflvl, | ||||
| 275 | uint8_t (*const level_cache)[4], | ||||
| 276 | const ptrdiff_t b4_stride, | ||||
| 277 | const uint8_t (*filter_level)[8][2], | ||||
| 278 | const int bx, const int by, | ||||
| 279 | const int iw, const int ih, | ||||
| 280 | const enum BlockSize bs, | ||||
| 281 | const enum RectTxfmSize ytx, | ||||
| 282 | const enum RectTxfmSize uvtx, | ||||
| 283 | const enum Dav1dPixelLayout layout, | ||||
| 284 | uint8_t *const ay, uint8_t *const ly, | ||||
| 285 | uint8_t *const auv, uint8_t *const luv) | ||||
| 286 | { | ||||
| 287 | const uint8_t *const b_dim = dav1d_block_dimensions[bs]; | ||||
| 288 | const int bw4 = imin(iw - bx, b_dim[0]); | ||||
| 289 | const int bh4 = imin(ih - by, b_dim[1]); | ||||
| 290 | const int bx4 = bx & 31; | ||||
| 291 | const int by4 = by & 31; | ||||
| 292 | assert(bw4 >= 0 && bh4 >= 0)((void) sizeof ((bw4 >= 0 && bh4 >= 0) ? 1 : 0) , __extension__ ({ if (bw4 >= 0 && bh4 >= 0) ; else __assert_fail ("bw4 >= 0 && bh4 >= 0", "/root/firefox-clang/third_party/dav1d/src/lf_mask.c" , 292, __extension__ __PRETTY_FUNCTION__); })); | ||||
| 293 | |||||
| 294 | if (bw4 && bh4) { | ||||
| 295 | uint8_t (*level_cache_ptr)[4] = level_cache + by * b4_stride + bx; | ||||
| 296 | |||||
| 297 | fill_levelcache_block(level_cache_ptr, b4_stride, bw4, bh4, | ||||
| 298 | filter_level[0][0][0], filter_level[1][0][0]); | ||||
| 299 | mask_edges_intra(lflvl->filter_y, by4, bx4, bw4, bh4, ytx, ay, ly); | ||||
| 300 | } | ||||
| 301 | |||||
| 302 | if (!auv) return; | ||||
| 303 | |||||
| 304 | const int ss_ver = layout == DAV1D_PIXEL_LAYOUT_I420; | ||||
| 305 | const int ss_hor = layout != DAV1D_PIXEL_LAYOUT_I444; | ||||
| 306 | const int cbw4 = imin(((iw + ss_hor) >> ss_hor) - (bx >> ss_hor), | ||||
| 307 | (b_dim[0] + ss_hor) >> ss_hor); | ||||
| 308 | const int cbh4 = imin(((ih + ss_ver) >> ss_ver) - (by >> ss_ver), | ||||
| 309 | (b_dim[1] + ss_ver) >> ss_ver); | ||||
| 310 | assert(cbw4 >= 0 && cbh4 >= 0)((void) sizeof ((cbw4 >= 0 && cbh4 >= 0) ? 1 : 0 ), __extension__ ({ if (cbw4 >= 0 && cbh4 >= 0) ; else __assert_fail ("cbw4 >= 0 && cbh4 >= 0" , "/root/firefox-clang/third_party/dav1d/src/lf_mask.c", 310, __extension__ __PRETTY_FUNCTION__); })); | ||||
| 311 | |||||
| 312 | if (!cbw4 || !cbh4) return; | ||||
| 313 | |||||
| 314 | const int cbx4 = bx4 >> ss_hor; | ||||
| 315 | const int cby4 = by4 >> ss_ver; | ||||
| 316 | |||||
| 317 | uint8_t (*level_cache_ptr)[4] = | ||||
| 318 | level_cache + (by >> ss_ver) * b4_stride + (bx >> ss_hor); | ||||
| 319 | |||||
| 320 | fill_levelcache_block((uint8_t(*)[4]) &level_cache_ptr[0][2], b4_stride, | ||||
| 321 | cbw4, cbh4, filter_level[2][0][0], | ||||
| 322 | filter_level[3][0][0]); | ||||
| 323 | mask_edges_chroma(lflvl->filter_uv, cby4, cbx4, cbw4, cbh4, 0, uvtx, | ||||
| 324 | auv, luv, ss_hor, ss_ver); | ||||
| 325 | } | ||||
| 326 | |||||
| 327 | void dav1d_create_lf_mask_inter(Av1Filter *const lflvl, | ||||
| 328 | uint8_t (*const level_cache)[4], | ||||
| 329 | const ptrdiff_t b4_stride, | ||||
| 330 | const uint8_t (*filter_level)[8][2], | ||||
| 331 | const int bx, const int by, | ||||
| 332 | const int iw, const int ih, | ||||
| 333 | const int skip, const enum BlockSize bs, | ||||
| 334 | const enum RectTxfmSize max_ytx, | ||||
| 335 | const uint16_t *const tx_masks, | ||||
| 336 | const enum RectTxfmSize uvtx, | ||||
| 337 | const enum Dav1dPixelLayout layout, | ||||
| 338 | uint8_t *const ay, uint8_t *const ly, | ||||
| 339 | uint8_t *const auv, uint8_t *const luv) | ||||
| 340 | { | ||||
| 341 | const uint8_t *const b_dim = dav1d_block_dimensions[bs]; | ||||
| 342 | const int bw4 = imin(iw - bx, b_dim[0]); | ||||
| 343 | const int bh4 = imin(ih - by, b_dim[1]); | ||||
| 344 | const int bx4 = bx & 31; | ||||
| 345 | const int by4 = by & 31; | ||||
| 346 | assert(bw4 >= 0 && bh4 >= 0)((void) sizeof ((bw4 >= 0 && bh4 >= 0) ? 1 : 0) , __extension__ ({ if (bw4 >= 0 && bh4 >= 0) ; else __assert_fail ("bw4 >= 0 && bh4 >= 0", "/root/firefox-clang/third_party/dav1d/src/lf_mask.c" , 346, __extension__ __PRETTY_FUNCTION__); })); | ||||
| |||||
| 347 | |||||
| 348 | if (bw4 && bh4) { | ||||
| 349 | uint8_t (*level_cache_ptr)[4] = level_cache + by * b4_stride + bx; | ||||
| 350 | |||||
| 351 | fill_levelcache_block(level_cache_ptr, b4_stride, bw4, bh4, | ||||
| 352 | filter_level[0][0][0], filter_level[1][0][0]); | ||||
| 353 | mask_edges_inter(lflvl->filter_y, by4, bx4, bw4, bh4, skip, | ||||
| 354 | max_ytx, tx_masks, ay, ly); | ||||
| 355 | } | ||||
| 356 | |||||
| 357 | if (!auv) return; | ||||
| 358 | |||||
| 359 | const int ss_ver = layout == DAV1D_PIXEL_LAYOUT_I420; | ||||
| 360 | const int ss_hor = layout != DAV1D_PIXEL_LAYOUT_I444; | ||||
| 361 | const int cbw4 = imin(((iw + ss_hor) >> ss_hor) - (bx >> ss_hor), | ||||
| 362 | (b_dim[0] + ss_hor) >> ss_hor); | ||||
| 363 | const int cbh4 = imin(((ih + ss_ver) >> ss_ver) - (by >> ss_ver), | ||||
| 364 | (b_dim[1] + ss_ver) >> ss_ver); | ||||
| 365 | assert(cbw4 >= 0 && cbh4 >= 0)((void) sizeof ((cbw4 >= 0 && cbh4 >= 0) ? 1 : 0 ), __extension__ ({ if (cbw4 >= 0 && cbh4 >= 0) ; else __assert_fail ("cbw4 >= 0 && cbh4 >= 0" , "/root/firefox-clang/third_party/dav1d/src/lf_mask.c", 365, __extension__ __PRETTY_FUNCTION__); })); | ||||
| 366 | |||||
| 367 | if (!cbw4 || !cbh4) return; | ||||
| 368 | |||||
| 369 | const int cbx4 = bx4 >> ss_hor; | ||||
| 370 | const int cby4 = by4 >> ss_ver; | ||||
| 371 | |||||
| 372 | uint8_t (*level_cache_ptr)[4] = | ||||
| 373 | level_cache + (by >> ss_ver) * b4_stride + (bx >> ss_hor); | ||||
| 374 | |||||
| 375 | fill_levelcache_block((uint8_t(*)[4]) &level_cache_ptr[0][2], b4_stride, | ||||
| 376 | cbw4, cbh4, filter_level[2][0][0], | ||||
| 377 | filter_level[3][0][0]); | ||||
| 378 | mask_edges_chroma(lflvl->filter_uv, cby4, cbx4, cbw4, cbh4, skip, uvtx, | ||||
| 379 | auv, luv, ss_hor, ss_ver); | ||||
| 380 | } | ||||
| 381 | |||||
| 382 | void dav1d_calc_eih(Av1FilterLUT *const lim_lut, const int filter_sharpness) { | ||||
| 383 | // set E/I/H values from loopfilter level | ||||
| 384 | const int sharp = filter_sharpness; | ||||
| 385 | for (int level = 0; level < 64; level++) { | ||||
| 386 | int limit = level; | ||||
| 387 | |||||
| 388 | if (sharp > 0) { | ||||
| 389 | limit >>= (sharp + 3) >> 2; | ||||
| 390 | limit = imin(limit, 9 - sharp); | ||||
| 391 | } | ||||
| 392 | limit = imax(limit, 1); | ||||
| 393 | |||||
| 394 | lim_lut->i[level] = limit; | ||||
| 395 | lim_lut->e[level] = 2 * (level + 2) + limit; | ||||
| 396 | } | ||||
| 397 | lim_lut->sharp[0] = (sharp + 3) >> 2; | ||||
| 398 | lim_lut->sharp[1] = sharp ? 9 - sharp : 0xff; | ||||
| 399 | } | ||||
| 400 | |||||
| 401 | static void calc_lf_value(uint8_t (*const lflvl_values)[2], | ||||
| 402 | const int base_lvl, const int lf_delta, | ||||
| 403 | const int seg_delta, | ||||
| 404 | const Dav1dLoopfilterModeRefDeltas *const mr_delta) | ||||
| 405 | { | ||||
| 406 | const int base = iclip(iclip(base_lvl + lf_delta, 0, 63) + seg_delta, 0, 63); | ||||
| 407 | |||||
| 408 | if (!mr_delta) { | ||||
| 409 | memset(lflvl_values, base, sizeof(*lflvl_values) * 8); | ||||
| 410 | } else { | ||||
| 411 | const int sh = base >= 32; | ||||
| 412 | lflvl_values[0][0] = lflvl_values[0][1] = | ||||
| 413 | iclip(base + (mr_delta->ref_delta[0] * (1 << sh)), 0, 63); | ||||
| 414 | for (int r = 1; r < 8; r++) { | ||||
| 415 | for (int m = 0; m < 2; m++) { | ||||
| 416 | const int delta = | ||||
| 417 | mr_delta->mode_delta[m] + mr_delta->ref_delta[r]; | ||||
| 418 | lflvl_values[r][m] = iclip(base + (delta * (1 << sh)), 0, 63); | ||||
| 419 | } | ||||
| 420 | } | ||||
| 421 | } | ||||
| 422 | } | ||||
| 423 | |||||
| 424 | static inline void calc_lf_value_chroma(uint8_t (*const lflvl_values)[2], | ||||
| 425 | const int base_lvl, const int lf_delta, | ||||
| 426 | const int seg_delta, | ||||
| 427 | const Dav1dLoopfilterModeRefDeltas *const mr_delta) | ||||
| 428 | { | ||||
| 429 | if (!base_lvl) | ||||
| 430 | memset(lflvl_values, 0, sizeof(*lflvl_values) * 8); | ||||
| 431 | else | ||||
| 432 | calc_lf_value(lflvl_values, base_lvl, lf_delta, seg_delta, mr_delta); | ||||
| 433 | } | ||||
| 434 | |||||
| 435 | void dav1d_calc_lf_values(uint8_t (*const lflvl_values)[4][8][2], | ||||
| 436 | const Dav1dFrameHeader *const hdr, | ||||
| 437 | const int8_t lf_delta[4]) | ||||
| 438 | { | ||||
| 439 | const int n_seg = hdr->segmentation.enabled ? 8 : 1; | ||||
| 440 | |||||
| 441 | if (!hdr->loopfilter.level_y[0] && !hdr->loopfilter.level_y[1]) { | ||||
| 442 | memset(lflvl_values, 0, sizeof(*lflvl_values) * n_seg); | ||||
| 443 | return; | ||||
| 444 | } | ||||
| 445 | |||||
| 446 | const Dav1dLoopfilterModeRefDeltas *const mr_deltas = | ||||
| 447 | hdr->loopfilter.mode_ref_delta_enabled ? | ||||
| 448 | &hdr->loopfilter.mode_ref_deltas : NULL((void*)0); | ||||
| 449 | for (int s = 0; s < n_seg; s++) { | ||||
| 450 | const Dav1dSegmentationData *const segd = | ||||
| 451 | hdr->segmentation.enabled ? &hdr->segmentation.seg_data.d[s] : NULL((void*)0); | ||||
| 452 | |||||
| 453 | calc_lf_value(lflvl_values[s][0], hdr->loopfilter.level_y[0], | ||||
| 454 | lf_delta[0], segd ? segd->delta_lf_y_v : 0, mr_deltas); | ||||
| 455 | calc_lf_value(lflvl_values[s][1], hdr->loopfilter.level_y[1], | ||||
| 456 | lf_delta[hdr->delta.lf.multi ? 1 : 0], | ||||
| 457 | segd ? segd->delta_lf_y_h : 0, mr_deltas); | ||||
| 458 | calc_lf_value_chroma(lflvl_values[s][2], hdr->loopfilter.level_u, | ||||
| 459 | lf_delta[hdr->delta.lf.multi ? 2 : 0], | ||||
| 460 | segd ? segd->delta_lf_u : 0, mr_deltas); | ||||
| 461 | calc_lf_value_chroma(lflvl_values[s][3], hdr->loopfilter.level_v, | ||||
| 462 | lf_delta[hdr->delta.lf.multi ? 3 : 0], | ||||
| 463 | segd ? segd->delta_lf_v : 0, mr_deltas); | ||||
| 464 | } | ||||
| 465 | } |