439 | 6.91M | } vp9recon.c:inter_pred_scaled_8bpp Line | Count | Source | 31 | 1.36M | { | 32 | 1.36M | static const uint8_t bwlog_tab[2][N_BS_SIZES] = { | 33 | 1.36M | { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, | 34 | 1.36M | { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 }, | 35 | 1.36M | }; | 36 | 1.36M | const VP9Context *s = td->s; | 37 | 1.36M | VP9Block *b = td->b; | 38 | 1.36M | int row = td->row, col = td->col; | 39 | 1.36M | const ProgressFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2; | 40 | 1.36M | const AVFrame *ref1 = tref1->f, *ref2; | 41 | 1.36M | int w1 = ref1->width, h1 = ref1->height, w2, h2; | 42 | 1.36M | ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride; | 43 | 1.36M | int bytesperpixel = BYTES_PER_PIXEL; | 44 | | | 45 | 1.36M | if (b->comp) { | 46 | 1.12M | tref2 = &s->s.refs[s->s.h.refidx[b->ref[1]]]; | 47 | 1.12M | ref2 = tref2->f; | 48 | 1.12M | w2 = ref2->width; | 49 | 1.12M | h2 = ref2->height; | 50 | 1.12M | } | 51 | | | 52 | | // y inter pred | 53 | 1.36M | if (b->bs > BS_8x8) { | 54 | 507k | VP9mv uvmv; | 55 | | | 56 | | #if SCALED == 0 | 57 | | if (b->bs == BS_8x4) { | 58 | | mc_luma_dir(td, mc[3][b->filter][0], td->dst[0], ls_y, | 59 | | ref1->data[0], ref1->linesize[0], tref1, | 60 | | row << 3, col << 3, &b->mv[0][0],,,,, 8, 4, w1, h1, 0); | 61 | | mc_luma_dir(td, mc[3][b->filter][0], | 62 | | td->dst[0] + 4 * ls_y, ls_y, | 63 | | ref1->data[0], ref1->linesize[0], tref1, | 64 | | (row << 3) + 4, col << 3, &b->mv[2][0],,,,, 8, 4, w1, h1, 0); | 65 | | w1 = (w1 + s->ss_h) >> s->ss_h; | 66 | | if (s->ss_v) { | 67 | | h1 = (h1 + 1) >> 1; | 68 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 69 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 70 | | td->dst[1], td->dst[2], ls_uv, | 71 | | ref1->data[1], ref1->linesize[1], | 72 | | ref1->data[2], ref1->linesize[2], tref1, | 73 | | row << 2, col << (3 - s->ss_h), | 74 | | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 75 | | } else { | 76 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 77 | | td->dst[1], td->dst[2], ls_uv, | 78 | | ref1->data[1], ref1->linesize[1], | 79 | | ref1->data[2], ref1->linesize[2], tref1, | 80 | | row << 3, col << (3 - s->ss_h), | 81 | | &b->mv[0][0],,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 82 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 83 | | // to get the motion vector for the bottom 4x4 block | 84 | | // https://code.google.com/p/webm/issues/detail?id=993 | 85 | | if (s->ss_h == 0) { | 86 | | uvmv = b->mv[2][0]; | 87 | | } else { | 88 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 89 | | } | 90 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 91 | | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 92 | | ref1->data[1], ref1->linesize[1], | 93 | | ref1->data[2], ref1->linesize[2], tref1, | 94 | | (row << 3) + 4, col << (3 - s->ss_h), | 95 | | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 96 | | } | 97 | | | 98 | | if (b->comp) { | 99 | | mc_luma_dir(td, mc[3][b->filter][1], td->dst[0], ls_y, | 100 | | ref2->data[0], ref2->linesize[0], tref2, | 101 | | row << 3, col << 3, &b->mv[0][1],,,,, 8, 4, w2, h2, 1); | 102 | | mc_luma_dir(td, mc[3][b->filter][1], | 103 | | td->dst[0] + 4 * ls_y, ls_y, | 104 | | ref2->data[0], ref2->linesize[0], tref2, | 105 | | (row << 3) + 4, col << 3, &b->mv[2][1],,,,, 8, 4, w2, h2, 1); | 106 | | w2 = (w2 + s->ss_h) >> s->ss_h; | 107 | | if (s->ss_v) { | 108 | | h2 = (h2 + 1) >> 1; | 109 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 110 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 111 | | td->dst[1], td->dst[2], ls_uv, | 112 | | ref2->data[1], ref2->linesize[1], | 113 | | ref2->data[2], ref2->linesize[2], tref2, | 114 | | row << 2, col << (3 - s->ss_h), | 115 | | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 116 | | } else { | 117 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 118 | | td->dst[1], td->dst[2], ls_uv, | 119 | | ref2->data[1], ref2->linesize[1], | 120 | | ref2->data[2], ref2->linesize[2], tref2, | 121 | | row << 3, col << (3 - s->ss_h), | 122 | | &b->mv[0][1],,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 123 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 124 | | // to get the motion vector for the bottom 4x4 block | 125 | | // https://code.google.com/p/webm/issues/detail?id=993 | 126 | | if (s->ss_h == 0) { | 127 | | uvmv = b->mv[2][1]; | 128 | | } else { | 129 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 130 | | } | 131 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 132 | | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 133 | | ref2->data[1], ref2->linesize[1], | 134 | | ref2->data[2], ref2->linesize[2], tref2, | 135 | | (row << 3) + 4, col << (3 - s->ss_h), | 136 | | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 137 | | } | 138 | | } | 139 | | } else if (b->bs == BS_4x8) { | 140 | | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 141 | | ref1->data[0], ref1->linesize[0], tref1, | 142 | | row << 3, col << 3, &b->mv[0][0],,,,, 4, 8, w1, h1, 0); | 143 | | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 144 | | ref1->data[0], ref1->linesize[0], tref1, | 145 | | row << 3, (col << 3) + 4, &b->mv[1][0],,,,, 4, 8, w1, h1, 0); | 146 | | h1 = (h1 + s->ss_v) >> s->ss_v; | 147 | | if (s->ss_h) { | 148 | | w1 = (w1 + 1) >> 1; | 149 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 150 | | mc_chroma_dir(td, mc[4][b->filter][0], | 151 | | td->dst[1], td->dst[2], ls_uv, | 152 | | ref1->data[1], ref1->linesize[1], | 153 | | ref1->data[2], ref1->linesize[2], tref1, | 154 | | row << (3 - s->ss_v), col << 2, | 155 | | &uvmv,,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 156 | | } else { | 157 | | mc_chroma_dir(td, mc[4][b->filter][0], | 158 | | td->dst[1], td->dst[2], ls_uv, | 159 | | ref1->data[1], ref1->linesize[1], | 160 | | ref1->data[2], ref1->linesize[2], tref1, | 161 | | row << (3 - s->ss_v), col << 3, | 162 | | &b->mv[0][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 163 | | mc_chroma_dir(td, mc[4][b->filter][0], | 164 | | td->dst[1] + 4 * bytesperpixel, | 165 | | td->dst[2] + 4 * bytesperpixel, ls_uv, | 166 | | ref1->data[1], ref1->linesize[1], | 167 | | ref1->data[2], ref1->linesize[2], tref1, | 168 | | row << (3 - s->ss_v), (col << 3) + 4, | 169 | | &b->mv[1][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 170 | | } | 171 | | | 172 | | if (b->comp) { | 173 | | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 174 | | ref2->data[0], ref2->linesize[0], tref2, | 175 | | row << 3, col << 3, &b->mv[0][1],,,,, 4, 8, w2, h2, 1); | 176 | | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 177 | | ref2->data[0], ref2->linesize[0], tref2, | 178 | | row << 3, (col << 3) + 4, &b->mv[1][1],,,,, 4, 8, w2, h2, 1); | 179 | | h2 = (h2 + s->ss_v) >> s->ss_v; | 180 | | if (s->ss_h) { | 181 | | w2 = (w2 + 1) >> 1; | 182 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 183 | | mc_chroma_dir(td, mc[4][b->filter][1], | 184 | | td->dst[1], td->dst[2], ls_uv, | 185 | | ref2->data[1], ref2->linesize[1], | 186 | | ref2->data[2], ref2->linesize[2], tref2, | 187 | | row << (3 - s->ss_v), col << 2, | 188 | | &uvmv,,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 189 | | } else { | 190 | | mc_chroma_dir(td, mc[4][b->filter][1], | 191 | | td->dst[1], td->dst[2], ls_uv, | 192 | | ref2->data[1], ref2->linesize[1], | 193 | | ref2->data[2], ref2->linesize[2], tref2, | 194 | | row << (3 - s->ss_v), col << 3, | 195 | | &b->mv[0][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 196 | | mc_chroma_dir(td, mc[4][b->filter][1], | 197 | | td->dst[1] + 4 * bytesperpixel, | 198 | | td->dst[2] + 4 * bytesperpixel, ls_uv, | 199 | | ref2->data[1], ref2->linesize[1], | 200 | | ref2->data[2], ref2->linesize[2], tref2, | 201 | | row << (3 - s->ss_v), (col << 3) + 4, | 202 | | &b->mv[1][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 203 | | } | 204 | | } | 205 | | } else | 206 | | #endif | 207 | 507k | { | 208 | | #if SCALED == 0 | 209 | | av_assert2(b->bs == BS_4x4); | 210 | | #endif | 211 | | | 212 | | // FIXME if two horizontally adjacent blocks have the same MV, | 213 | | // do a w8 instead of a w4 call | 214 | 507k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 215 | 507k | ref1->data[0], ref1->linesize[0], tref1, | 216 | 507k | row << 3, col << 3, &b->mv[0][0], | 217 | 507k | 0, 0, 8, 8, 4, 4, w1, h1, 0); | 218 | 507k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 219 | 507k | ref1->data[0], ref1->linesize[0], tref1, | 220 | 507k | row << 3, (col << 3) + 4, &b->mv[1][0], | 221 | 507k | 4, 0, 8, 8, 4, 4, w1, h1, 0); | 222 | 507k | mc_luma_dir(td, mc[4][b->filter][0], | 223 | 507k | td->dst[0] + 4 * ls_y, ls_y, | 224 | 507k | ref1->data[0], ref1->linesize[0], tref1, | 225 | 507k | (row << 3) + 4, col << 3, &b->mv[2][0], | 226 | 507k | 0, 4, 8, 8, 4, 4, w1, h1, 0); | 227 | 507k | mc_luma_dir(td, mc[4][b->filter][0], | 228 | 507k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 229 | 507k | ref1->data[0], ref1->linesize[0], tref1, | 230 | 507k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][0], | 231 | 507k | 4, 4, 8, 8, 4, 4, w1, h1, 0); | 232 | 507k | if (s->ss_v) { | 233 | 183k | h1 = (h1 + 1) >> 1; | 234 | 183k | if (s->ss_h) { | 235 | 108k | w1 = (w1 + 1) >> 1; | 236 | 108k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][0], b->mv[1][0], | 237 | 108k | b->mv[2][0], b->mv[3][0]); | 238 | 108k | mc_chroma_dir(td, mc[4][b->filter][0], | 239 | 108k | td->dst[1], td->dst[2], ls_uv, | 240 | 108k | ref1->data[1], ref1->linesize[1], | 241 | 108k | ref1->data[2], ref1->linesize[2], tref1, | 242 | 108k | row << 2, col << 2, | 243 | 108k | &uvmv, 0, 0, 4, 4, 4, 4, w1, h1, 0); | 244 | 108k | } else { | 245 | 74.9k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 246 | 74.9k | mc_chroma_dir(td, mc[4][b->filter][0], | 247 | 74.9k | td->dst[1], td->dst[2], ls_uv, | 248 | 74.9k | ref1->data[1], ref1->linesize[1], | 249 | 74.9k | ref1->data[2], ref1->linesize[2], tref1, | 250 | 74.9k | row << 2, col << 3, | 251 | 74.9k | &uvmv, 0, 0, 8, 4, 4, 4, w1, h1, 0); | 252 | 74.9k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[3][0]); | 253 | 74.9k | mc_chroma_dir(td, mc[4][b->filter][0], | 254 | 74.9k | td->dst[1] + 4 * bytesperpixel, | 255 | 74.9k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 256 | 74.9k | ref1->data[1], ref1->linesize[1], | 257 | 74.9k | ref1->data[2], ref1->linesize[2], tref1, | 258 | 74.9k | row << 2, (col << 3) + 4, | 259 | 74.9k | &uvmv, 4, 0, 8, 4, 4, 4, w1, h1, 0); | 260 | 74.9k | } | 261 | 323k | } else { | 262 | 323k | if (s->ss_h) { | 263 | 65.2k | w1 = (w1 + 1) >> 1; | 264 | 65.2k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 265 | 65.2k | mc_chroma_dir(td, mc[4][b->filter][0], | 266 | 65.2k | td->dst[1], td->dst[2], ls_uv, | 267 | 65.2k | ref1->data[1], ref1->linesize[1], | 268 | 65.2k | ref1->data[2], ref1->linesize[2], tref1, | 269 | 65.2k | row << 3, col << 2, | 270 | 65.2k | &uvmv, 0, 0, 4, 8, 4, 4, w1, h1, 0); | 271 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 272 | | // bottom block | 273 | | // https://code.google.com/p/webm/issues/detail?id=993 | 274 | 65.2k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[2][0]); | 275 | 65.2k | mc_chroma_dir(td, mc[4][b->filter][0], | 276 | 65.2k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 277 | 65.2k | ref1->data[1], ref1->linesize[1], | 278 | 65.2k | ref1->data[2], ref1->linesize[2], tref1, | 279 | 65.2k | (row << 3) + 4, col << 2, | 280 | 65.2k | &uvmv, 0, 4, 4, 8, 4, 4, w1, h1, 0); | 281 | 258k | } else { | 282 | 258k | mc_chroma_dir(td, mc[4][b->filter][0], | 283 | 258k | td->dst[1], td->dst[2], ls_uv, | 284 | 258k | ref1->data[1], ref1->linesize[1], | 285 | 258k | ref1->data[2], ref1->linesize[2], tref1, | 286 | 258k | row << 3, col << 3, | 287 | 258k | &b->mv[0][0], 0, 0, 8, 8, 4, 4, w1, h1, 0); | 288 | 258k | mc_chroma_dir(td, mc[4][b->filter][0], | 289 | 258k | td->dst[1] + 4 * bytesperpixel, | 290 | 258k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 291 | 258k | ref1->data[1], ref1->linesize[1], | 292 | 258k | ref1->data[2], ref1->linesize[2], tref1, | 293 | 258k | row << 3, (col << 3) + 4, | 294 | 258k | &b->mv[1][0], 4, 0, 8, 8, 4, 4, w1, h1, 0); | 295 | 258k | mc_chroma_dir(td, mc[4][b->filter][0], | 296 | 258k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 297 | 258k | ref1->data[1], ref1->linesize[1], | 298 | 258k | ref1->data[2], ref1->linesize[2], tref1, | 299 | 258k | (row << 3) + 4, col << 3, | 300 | 258k | &b->mv[2][0], 0, 4, 8, 8, 4, 4, w1, h1, 0); | 301 | 258k | mc_chroma_dir(td, mc[4][b->filter][0], | 302 | 258k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 303 | 258k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 304 | 258k | ref1->data[1], ref1->linesize[1], | 305 | 258k | ref1->data[2], ref1->linesize[2], tref1, | 306 | 258k | (row << 3) + 4, (col << 3) + 4, | 307 | 258k | &b->mv[3][0], 4, 4, 8, 8, 4, 4, w1, h1, 0); | 308 | 258k | } | 309 | 323k | } | 310 | | | 311 | 507k | if (b->comp) { | 312 | 445k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 313 | 445k | ref2->data[0], ref2->linesize[0], tref2, | 314 | 445k | row << 3, col << 3, &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 315 | 445k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 316 | 445k | ref2->data[0], ref2->linesize[0], tref2, | 317 | 445k | row << 3, (col << 3) + 4, &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 318 | 445k | mc_luma_dir(td, mc[4][b->filter][1], | 319 | 445k | td->dst[0] + 4 * ls_y, ls_y, | 320 | 445k | ref2->data[0], ref2->linesize[0], tref2, | 321 | 445k | (row << 3) + 4, col << 3, &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 322 | 445k | mc_luma_dir(td, mc[4][b->filter][1], | 323 | 445k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 324 | 445k | ref2->data[0], ref2->linesize[0], tref2, | 325 | 445k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 326 | 445k | if (s->ss_v) { | 327 | 160k | h2 = (h2 + 1) >> 1; | 328 | 160k | if (s->ss_h) { | 329 | 101k | w2 = (w2 + 1) >> 1; | 330 | 101k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][1], b->mv[1][1], | 331 | 101k | b->mv[2][1], b->mv[3][1]); | 332 | 101k | mc_chroma_dir(td, mc[4][b->filter][1], | 333 | 101k | td->dst[1], td->dst[2], ls_uv, | 334 | 101k | ref2->data[1], ref2->linesize[1], | 335 | 101k | ref2->data[2], ref2->linesize[2], tref2, | 336 | 101k | row << 2, col << 2, | 337 | 101k | &uvmv, 0, 0, 4, 4, 4, 4, w2, h2, 1); | 338 | 101k | } else { | 339 | 58.6k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 340 | 58.6k | mc_chroma_dir(td, mc[4][b->filter][1], | 341 | 58.6k | td->dst[1], td->dst[2], ls_uv, | 342 | 58.6k | ref2->data[1], ref2->linesize[1], | 343 | 58.6k | ref2->data[2], ref2->linesize[2], tref2, | 344 | 58.6k | row << 2, col << 3, | 345 | 58.6k | &uvmv, 0, 0, 8, 4, 4, 4, w2, h2, 1); | 346 | 58.6k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[3][1]); | 347 | 58.6k | mc_chroma_dir(td, mc[4][b->filter][1], | 348 | 58.6k | td->dst[1] + 4 * bytesperpixel, | 349 | 58.6k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 350 | 58.6k | ref2->data[1], ref2->linesize[1], | 351 | 58.6k | ref2->data[2], ref2->linesize[2], tref2, | 352 | 58.6k | row << 2, (col << 3) + 4, | 353 | 58.6k | &uvmv, 4, 0, 8, 4, 4, 4, w2, h2, 1); | 354 | 58.6k | } | 355 | 284k | } else { | 356 | 284k | if (s->ss_h) { | 357 | 51.3k | w2 = (w2 + 1) >> 1; | 358 | 51.3k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 359 | 51.3k | mc_chroma_dir(td, mc[4][b->filter][1], | 360 | 51.3k | td->dst[1], td->dst[2], ls_uv, | 361 | 51.3k | ref2->data[1], ref2->linesize[1], | 362 | 51.3k | ref2->data[2], ref2->linesize[2], tref2, | 363 | 51.3k | row << 3, col << 2, | 364 | 51.3k | &uvmv, 0, 0, 4, 8, 4, 4, w2, h2, 1); | 365 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 366 | | // bottom block | 367 | | // https://code.google.com/p/webm/issues/detail?id=993 | 368 | 51.3k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[2][1]); | 369 | 51.3k | mc_chroma_dir(td, mc[4][b->filter][1], | 370 | 51.3k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 371 | 51.3k | ref2->data[1], ref2->linesize[1], | 372 | 51.3k | ref2->data[2], ref2->linesize[2], tref2, | 373 | 51.3k | (row << 3) + 4, col << 2, | 374 | 51.3k | &uvmv, 0, 4, 4, 8, 4, 4, w2, h2, 1); | 375 | 233k | } else { | 376 | 233k | mc_chroma_dir(td, mc[4][b->filter][1], | 377 | 233k | td->dst[1], td->dst[2], ls_uv, | 378 | 233k | ref2->data[1], ref2->linesize[1], | 379 | 233k | ref2->data[2], ref2->linesize[2], tref2, | 380 | 233k | row << 3, col << 3, | 381 | 233k | &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 382 | 233k | mc_chroma_dir(td, mc[4][b->filter][1], | 383 | 233k | td->dst[1] + 4 * bytesperpixel, | 384 | 233k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 385 | 233k | ref2->data[1], ref2->linesize[1], | 386 | 233k | ref2->data[2], ref2->linesize[2], tref2, | 387 | 233k | row << 3, (col << 3) + 4, | 388 | 233k | &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 389 | 233k | mc_chroma_dir(td, mc[4][b->filter][1], | 390 | 233k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 391 | 233k | ref2->data[1], ref2->linesize[1], | 392 | 233k | ref2->data[2], ref2->linesize[2], tref2, | 393 | 233k | (row << 3) + 4, col << 3, | 394 | 233k | &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 395 | 233k | mc_chroma_dir(td, mc[4][b->filter][1], | 396 | 233k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 397 | 233k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 398 | 233k | ref2->data[1], ref2->linesize[1], | 399 | 233k | ref2->data[2], ref2->linesize[2], tref2, | 400 | 233k | (row << 3) + 4, (col << 3) + 4, | 401 | 233k | &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 402 | 233k | } | 403 | 284k | } | 404 | 445k | } | 405 | 507k | } | 406 | 856k | } else { | 407 | 856k | int bwl = bwlog_tab[0][b->bs]; | 408 | 856k | int bw = ff_vp9_bwh_tab[0][b->bs][0] * 4; | 409 | 856k | int bh = ff_vp9_bwh_tab[0][b->bs][1] * 4; | 410 | 856k | int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][0] * 4; | 411 | 856k | int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][1] * 4; | 412 | | | 413 | 856k | mc_luma_dir(td, mc[bwl][b->filter][0], td->dst[0], ls_y, | 414 | 856k | ref1->data[0], ref1->linesize[0], tref1, | 415 | 856k | row << 3, col << 3, &b->mv[0][0], 0, 0, bw, bh, bw, bh, w1, h1, 0); | 416 | 856k | w1 = (w1 + s->ss_h) >> s->ss_h; | 417 | 856k | h1 = (h1 + s->ss_v) >> s->ss_v; | 418 | 856k | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][0], | 419 | 856k | td->dst[1], td->dst[2], ls_uv, | 420 | 856k | ref1->data[1], ref1->linesize[1], | 421 | 856k | ref1->data[2], ref1->linesize[2], tref1, | 422 | 856k | row << (3 - s->ss_v), col << (3 - s->ss_h), | 423 | 856k | &b->mv[0][0], 0, 0, uvbw, uvbh, uvbw, uvbh, w1, h1, 0); | 424 | | | 425 | 856k | if (b->comp) { | 426 | 675k | mc_luma_dir(td, mc[bwl][b->filter][1], td->dst[0], ls_y, | 427 | 675k | ref2->data[0], ref2->linesize[0], tref2, | 428 | 675k | row << 3, col << 3, &b->mv[0][1], 0, 0, bw, bh, bw, bh, w2, h2, 1); | 429 | 675k | w2 = (w2 + s->ss_h) >> s->ss_h; | 430 | 675k | h2 = (h2 + s->ss_v) >> s->ss_v; | 431 | 675k | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][1], | 432 | 675k | td->dst[1], td->dst[2], ls_uv, | 433 | 675k | ref2->data[1], ref2->linesize[1], | 434 | 675k | ref2->data[2], ref2->linesize[2], tref2, | 435 | 675k | row << (3 - s->ss_v), col << (3 - s->ss_h), | 436 | 675k | &b->mv[0][1], 0, 0, uvbw, uvbh, uvbw, uvbh, w2, h2, 1); | 437 | 675k | } | 438 | 856k | } | 439 | 1.36M | } |
vp9recon.c:inter_pred_scaled_16bpp Line | Count | Source | 31 | 1.60M | { | 32 | 1.60M | static const uint8_t bwlog_tab[2][N_BS_SIZES] = { | 33 | 1.60M | { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, | 34 | 1.60M | { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 }, | 35 | 1.60M | }; | 36 | 1.60M | const VP9Context *s = td->s; | 37 | 1.60M | VP9Block *b = td->b; | 38 | 1.60M | int row = td->row, col = td->col; | 39 | 1.60M | const ProgressFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2; | 40 | 1.60M | const AVFrame *ref1 = tref1->f, *ref2; | 41 | 1.60M | int w1 = ref1->width, h1 = ref1->height, w2, h2; | 42 | 1.60M | ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride; | 43 | 1.60M | int bytesperpixel = BYTES_PER_PIXEL; | 44 | | | 45 | 1.60M | if (b->comp) { | 46 | 1.22M | tref2 = &s->s.refs[s->s.h.refidx[b->ref[1]]]; | 47 | 1.22M | ref2 = tref2->f; | 48 | 1.22M | w2 = ref2->width; | 49 | 1.22M | h2 = ref2->height; | 50 | 1.22M | } | 51 | | | 52 | | // y inter pred | 53 | 1.60M | if (b->bs > BS_8x8) { | 54 | 481k | VP9mv uvmv; | 55 | | | 56 | | #if SCALED == 0 | 57 | | if (b->bs == BS_8x4) { | 58 | | mc_luma_dir(td, mc[3][b->filter][0], td->dst[0], ls_y, | 59 | | ref1->data[0], ref1->linesize[0], tref1, | 60 | | row << 3, col << 3, &b->mv[0][0],,,,, 8, 4, w1, h1, 0); | 61 | | mc_luma_dir(td, mc[3][b->filter][0], | 62 | | td->dst[0] + 4 * ls_y, ls_y, | 63 | | ref1->data[0], ref1->linesize[0], tref1, | 64 | | (row << 3) + 4, col << 3, &b->mv[2][0],,,,, 8, 4, w1, h1, 0); | 65 | | w1 = (w1 + s->ss_h) >> s->ss_h; | 66 | | if (s->ss_v) { | 67 | | h1 = (h1 + 1) >> 1; | 68 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 69 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 70 | | td->dst[1], td->dst[2], ls_uv, | 71 | | ref1->data[1], ref1->linesize[1], | 72 | | ref1->data[2], ref1->linesize[2], tref1, | 73 | | row << 2, col << (3 - s->ss_h), | 74 | | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 75 | | } else { | 76 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 77 | | td->dst[1], td->dst[2], ls_uv, | 78 | | ref1->data[1], ref1->linesize[1], | 79 | | ref1->data[2], ref1->linesize[2], tref1, | 80 | | row << 3, col << (3 - s->ss_h), | 81 | | &b->mv[0][0],,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 82 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 83 | | // to get the motion vector for the bottom 4x4 block | 84 | | // https://code.google.com/p/webm/issues/detail?id=993 | 85 | | if (s->ss_h == 0) { | 86 | | uvmv = b->mv[2][0]; | 87 | | } else { | 88 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 89 | | } | 90 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 91 | | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 92 | | ref1->data[1], ref1->linesize[1], | 93 | | ref1->data[2], ref1->linesize[2], tref1, | 94 | | (row << 3) + 4, col << (3 - s->ss_h), | 95 | | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 96 | | } | 97 | | | 98 | | if (b->comp) { | 99 | | mc_luma_dir(td, mc[3][b->filter][1], td->dst[0], ls_y, | 100 | | ref2->data[0], ref2->linesize[0], tref2, | 101 | | row << 3, col << 3, &b->mv[0][1],,,,, 8, 4, w2, h2, 1); | 102 | | mc_luma_dir(td, mc[3][b->filter][1], | 103 | | td->dst[0] + 4 * ls_y, ls_y, | 104 | | ref2->data[0], ref2->linesize[0], tref2, | 105 | | (row << 3) + 4, col << 3, &b->mv[2][1],,,,, 8, 4, w2, h2, 1); | 106 | | w2 = (w2 + s->ss_h) >> s->ss_h; | 107 | | if (s->ss_v) { | 108 | | h2 = (h2 + 1) >> 1; | 109 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 110 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 111 | | td->dst[1], td->dst[2], ls_uv, | 112 | | ref2->data[1], ref2->linesize[1], | 113 | | ref2->data[2], ref2->linesize[2], tref2, | 114 | | row << 2, col << (3 - s->ss_h), | 115 | | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 116 | | } else { | 117 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 118 | | td->dst[1], td->dst[2], ls_uv, | 119 | | ref2->data[1], ref2->linesize[1], | 120 | | ref2->data[2], ref2->linesize[2], tref2, | 121 | | row << 3, col << (3 - s->ss_h), | 122 | | &b->mv[0][1],,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 123 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 124 | | // to get the motion vector for the bottom 4x4 block | 125 | | // https://code.google.com/p/webm/issues/detail?id=993 | 126 | | if (s->ss_h == 0) { | 127 | | uvmv = b->mv[2][1]; | 128 | | } else { | 129 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 130 | | } | 131 | | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 132 | | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 133 | | ref2->data[1], ref2->linesize[1], | 134 | | ref2->data[2], ref2->linesize[2], tref2, | 135 | | (row << 3) + 4, col << (3 - s->ss_h), | 136 | | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 137 | | } | 138 | | } | 139 | | } else if (b->bs == BS_4x8) { | 140 | | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 141 | | ref1->data[0], ref1->linesize[0], tref1, | 142 | | row << 3, col << 3, &b->mv[0][0],,,,, 4, 8, w1, h1, 0); | 143 | | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 144 | | ref1->data[0], ref1->linesize[0], tref1, | 145 | | row << 3, (col << 3) + 4, &b->mv[1][0],,,,, 4, 8, w1, h1, 0); | 146 | | h1 = (h1 + s->ss_v) >> s->ss_v; | 147 | | if (s->ss_h) { | 148 | | w1 = (w1 + 1) >> 1; | 149 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 150 | | mc_chroma_dir(td, mc[4][b->filter][0], | 151 | | td->dst[1], td->dst[2], ls_uv, | 152 | | ref1->data[1], ref1->linesize[1], | 153 | | ref1->data[2], ref1->linesize[2], tref1, | 154 | | row << (3 - s->ss_v), col << 2, | 155 | | &uvmv,,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 156 | | } else { | 157 | | mc_chroma_dir(td, mc[4][b->filter][0], | 158 | | td->dst[1], td->dst[2], ls_uv, | 159 | | ref1->data[1], ref1->linesize[1], | 160 | | ref1->data[2], ref1->linesize[2], tref1, | 161 | | row << (3 - s->ss_v), col << 3, | 162 | | &b->mv[0][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 163 | | mc_chroma_dir(td, mc[4][b->filter][0], | 164 | | td->dst[1] + 4 * bytesperpixel, | 165 | | td->dst[2] + 4 * bytesperpixel, ls_uv, | 166 | | ref1->data[1], ref1->linesize[1], | 167 | | ref1->data[2], ref1->linesize[2], tref1, | 168 | | row << (3 - s->ss_v), (col << 3) + 4, | 169 | | &b->mv[1][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 170 | | } | 171 | | | 172 | | if (b->comp) { | 173 | | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 174 | | ref2->data[0], ref2->linesize[0], tref2, | 175 | | row << 3, col << 3, &b->mv[0][1],,,,, 4, 8, w2, h2, 1); | 176 | | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 177 | | ref2->data[0], ref2->linesize[0], tref2, | 178 | | row << 3, (col << 3) + 4, &b->mv[1][1],,,,, 4, 8, w2, h2, 1); | 179 | | h2 = (h2 + s->ss_v) >> s->ss_v; | 180 | | if (s->ss_h) { | 181 | | w2 = (w2 + 1) >> 1; | 182 | | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 183 | | mc_chroma_dir(td, mc[4][b->filter][1], | 184 | | td->dst[1], td->dst[2], ls_uv, | 185 | | ref2->data[1], ref2->linesize[1], | 186 | | ref2->data[2], ref2->linesize[2], tref2, | 187 | | row << (3 - s->ss_v), col << 2, | 188 | | &uvmv,,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 189 | | } else { | 190 | | mc_chroma_dir(td, mc[4][b->filter][1], | 191 | | td->dst[1], td->dst[2], ls_uv, | 192 | | ref2->data[1], ref2->linesize[1], | 193 | | ref2->data[2], ref2->linesize[2], tref2, | 194 | | row << (3 - s->ss_v), col << 3, | 195 | | &b->mv[0][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 196 | | mc_chroma_dir(td, mc[4][b->filter][1], | 197 | | td->dst[1] + 4 * bytesperpixel, | 198 | | td->dst[2] + 4 * bytesperpixel, ls_uv, | 199 | | ref2->data[1], ref2->linesize[1], | 200 | | ref2->data[2], ref2->linesize[2], tref2, | 201 | | row << (3 - s->ss_v), (col << 3) + 4, | 202 | | &b->mv[1][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 203 | | } | 204 | | } | 205 | | } else | 206 | | #endif | 207 | 481k | { | 208 | | #if SCALED == 0 | 209 | | av_assert2(b->bs == BS_4x4); | 210 | | #endif | 211 | | | 212 | | // FIXME if two horizontally adjacent blocks have the same MV, | 213 | | // do a w8 instead of a w4 call | 214 | 481k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 215 | 481k | ref1->data[0], ref1->linesize[0], tref1, | 216 | 481k | row << 3, col << 3, &b->mv[0][0], | 217 | 481k | 0, 0, 8, 8, 4, 4, w1, h1, 0); | 218 | 481k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 219 | 481k | ref1->data[0], ref1->linesize[0], tref1, | 220 | 481k | row << 3, (col << 3) + 4, &b->mv[1][0], | 221 | 481k | 4, 0, 8, 8, 4, 4, w1, h1, 0); | 222 | 481k | mc_luma_dir(td, mc[4][b->filter][0], | 223 | 481k | td->dst[0] + 4 * ls_y, ls_y, | 224 | 481k | ref1->data[0], ref1->linesize[0], tref1, | 225 | 481k | (row << 3) + 4, col << 3, &b->mv[2][0], | 226 | 481k | 0, 4, 8, 8, 4, 4, w1, h1, 0); | 227 | 481k | mc_luma_dir(td, mc[4][b->filter][0], | 228 | 481k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 229 | 481k | ref1->data[0], ref1->linesize[0], tref1, | 230 | 481k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][0], | 231 | 481k | 4, 4, 8, 8, 4, 4, w1, h1, 0); | 232 | 481k | if (s->ss_v) { | 233 | 183k | h1 = (h1 + 1) >> 1; | 234 | 183k | if (s->ss_h) { | 235 | 80.7k | w1 = (w1 + 1) >> 1; | 236 | 80.7k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][0], b->mv[1][0], | 237 | 80.7k | b->mv[2][0], b->mv[3][0]); | 238 | 80.7k | mc_chroma_dir(td, mc[4][b->filter][0], | 239 | 80.7k | td->dst[1], td->dst[2], ls_uv, | 240 | 80.7k | ref1->data[1], ref1->linesize[1], | 241 | 80.7k | ref1->data[2], ref1->linesize[2], tref1, | 242 | 80.7k | row << 2, col << 2, | 243 | 80.7k | &uvmv, 0, 0, 4, 4, 4, 4, w1, h1, 0); | 244 | 102k | } else { | 245 | 102k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 246 | 102k | mc_chroma_dir(td, mc[4][b->filter][0], | 247 | 102k | td->dst[1], td->dst[2], ls_uv, | 248 | 102k | ref1->data[1], ref1->linesize[1], | 249 | 102k | ref1->data[2], ref1->linesize[2], tref1, | 250 | 102k | row << 2, col << 3, | 251 | 102k | &uvmv, 0, 0, 8, 4, 4, 4, w1, h1, 0); | 252 | 102k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[3][0]); | 253 | 102k | mc_chroma_dir(td, mc[4][b->filter][0], | 254 | 102k | td->dst[1] + 4 * bytesperpixel, | 255 | 102k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 256 | 102k | ref1->data[1], ref1->linesize[1], | 257 | 102k | ref1->data[2], ref1->linesize[2], tref1, | 258 | 102k | row << 2, (col << 3) + 4, | 259 | 102k | &uvmv, 4, 0, 8, 4, 4, 4, w1, h1, 0); | 260 | 102k | } | 261 | 298k | } else { | 262 | 298k | if (s->ss_h) { | 263 | 146k | w1 = (w1 + 1) >> 1; | 264 | 146k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 265 | 146k | mc_chroma_dir(td, mc[4][b->filter][0], | 266 | 146k | td->dst[1], td->dst[2], ls_uv, | 267 | 146k | ref1->data[1], ref1->linesize[1], | 268 | 146k | ref1->data[2], ref1->linesize[2], tref1, | 269 | 146k | row << 3, col << 2, | 270 | 146k | &uvmv, 0, 0, 4, 8, 4, 4, w1, h1, 0); | 271 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 272 | | // bottom block | 273 | | // https://code.google.com/p/webm/issues/detail?id=993 | 274 | 146k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[2][0]); | 275 | 146k | mc_chroma_dir(td, mc[4][b->filter][0], | 276 | 146k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 277 | 146k | ref1->data[1], ref1->linesize[1], | 278 | 146k | ref1->data[2], ref1->linesize[2], tref1, | 279 | 146k | (row << 3) + 4, col << 2, | 280 | 146k | &uvmv, 0, 4, 4, 8, 4, 4, w1, h1, 0); | 281 | 152k | } else { | 282 | 152k | mc_chroma_dir(td, mc[4][b->filter][0], | 283 | 152k | td->dst[1], td->dst[2], ls_uv, | 284 | 152k | ref1->data[1], ref1->linesize[1], | 285 | 152k | ref1->data[2], ref1->linesize[2], tref1, | 286 | 152k | row << 3, col << 3, | 287 | 152k | &b->mv[0][0], 0, 0, 8, 8, 4, 4, w1, h1, 0); | 288 | 152k | mc_chroma_dir(td, mc[4][b->filter][0], | 289 | 152k | td->dst[1] + 4 * bytesperpixel, | 290 | 152k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 291 | 152k | ref1->data[1], ref1->linesize[1], | 292 | 152k | ref1->data[2], ref1->linesize[2], tref1, | 293 | 152k | row << 3, (col << 3) + 4, | 294 | 152k | &b->mv[1][0], 4, 0, 8, 8, 4, 4, w1, h1, 0); | 295 | 152k | mc_chroma_dir(td, mc[4][b->filter][0], | 296 | 152k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 297 | 152k | ref1->data[1], ref1->linesize[1], | 298 | 152k | ref1->data[2], ref1->linesize[2], tref1, | 299 | 152k | (row << 3) + 4, col << 3, | 300 | 152k | &b->mv[2][0], 0, 4, 8, 8, 4, 4, w1, h1, 0); | 301 | 152k | mc_chroma_dir(td, mc[4][b->filter][0], | 302 | 152k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 303 | 152k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 304 | 152k | ref1->data[1], ref1->linesize[1], | 305 | 152k | ref1->data[2], ref1->linesize[2], tref1, | 306 | 152k | (row << 3) + 4, (col << 3) + 4, | 307 | 152k | &b->mv[3][0], 4, 4, 8, 8, 4, 4, w1, h1, 0); | 308 | 152k | } | 309 | 298k | } | 310 | | | 311 | 481k | if (b->comp) { | 312 | 402k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 313 | 402k | ref2->data[0], ref2->linesize[0], tref2, | 314 | 402k | row << 3, col << 3, &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 315 | 402k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 316 | 402k | ref2->data[0], ref2->linesize[0], tref2, | 317 | 402k | row << 3, (col << 3) + 4, &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 318 | 402k | mc_luma_dir(td, mc[4][b->filter][1], | 319 | 402k | td->dst[0] + 4 * ls_y, ls_y, | 320 | 402k | ref2->data[0], ref2->linesize[0], tref2, | 321 | 402k | (row << 3) + 4, col << 3, &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 322 | 402k | mc_luma_dir(td, mc[4][b->filter][1], | 323 | 402k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 324 | 402k | ref2->data[0], ref2->linesize[0], tref2, | 325 | 402k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 326 | 402k | if (s->ss_v) { | 327 | 153k | h2 = (h2 + 1) >> 1; | 328 | 153k | if (s->ss_h) { | 329 | 65.3k | w2 = (w2 + 1) >> 1; | 330 | 65.3k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][1], b->mv[1][1], | 331 | 65.3k | b->mv[2][1], b->mv[3][1]); | 332 | 65.3k | mc_chroma_dir(td, mc[4][b->filter][1], | 333 | 65.3k | td->dst[1], td->dst[2], ls_uv, | 334 | 65.3k | ref2->data[1], ref2->linesize[1], | 335 | 65.3k | ref2->data[2], ref2->linesize[2], tref2, | 336 | 65.3k | row << 2, col << 2, | 337 | 65.3k | &uvmv, 0, 0, 4, 4, 4, 4, w2, h2, 1); | 338 | 88.1k | } else { | 339 | 88.1k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 340 | 88.1k | mc_chroma_dir(td, mc[4][b->filter][1], | 341 | 88.1k | td->dst[1], td->dst[2], ls_uv, | 342 | 88.1k | ref2->data[1], ref2->linesize[1], | 343 | 88.1k | ref2->data[2], ref2->linesize[2], tref2, | 344 | 88.1k | row << 2, col << 3, | 345 | 88.1k | &uvmv, 0, 0, 8, 4, 4, 4, w2, h2, 1); | 346 | 88.1k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[3][1]); | 347 | 88.1k | mc_chroma_dir(td, mc[4][b->filter][1], | 348 | 88.1k | td->dst[1] + 4 * bytesperpixel, | 349 | 88.1k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 350 | 88.1k | ref2->data[1], ref2->linesize[1], | 351 | 88.1k | ref2->data[2], ref2->linesize[2], tref2, | 352 | 88.1k | row << 2, (col << 3) + 4, | 353 | 88.1k | &uvmv, 4, 0, 8, 4, 4, 4, w2, h2, 1); | 354 | 88.1k | } | 355 | 249k | } else { | 356 | 249k | if (s->ss_h) { | 357 | 114k | w2 = (w2 + 1) >> 1; | 358 | 114k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 359 | 114k | mc_chroma_dir(td, mc[4][b->filter][1], | 360 | 114k | td->dst[1], td->dst[2], ls_uv, | 361 | 114k | ref2->data[1], ref2->linesize[1], | 362 | 114k | ref2->data[2], ref2->linesize[2], tref2, | 363 | 114k | row << 3, col << 2, | 364 | 114k | &uvmv, 0, 0, 4, 8, 4, 4, w2, h2, 1); | 365 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 366 | | // bottom block | 367 | | // https://code.google.com/p/webm/issues/detail?id=993 | 368 | 114k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[2][1]); | 369 | 114k | mc_chroma_dir(td, mc[4][b->filter][1], | 370 | 114k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 371 | 114k | ref2->data[1], ref2->linesize[1], | 372 | 114k | ref2->data[2], ref2->linesize[2], tref2, | 373 | 114k | (row << 3) + 4, col << 2, | 374 | 114k | &uvmv, 0, 4, 4, 8, 4, 4, w2, h2, 1); | 375 | 134k | } else { | 376 | 134k | mc_chroma_dir(td, mc[4][b->filter][1], | 377 | 134k | td->dst[1], td->dst[2], ls_uv, | 378 | 134k | ref2->data[1], ref2->linesize[1], | 379 | 134k | ref2->data[2], ref2->linesize[2], tref2, | 380 | 134k | row << 3, col << 3, | 381 | 134k | &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 382 | 134k | mc_chroma_dir(td, mc[4][b->filter][1], | 383 | 134k | td->dst[1] + 4 * bytesperpixel, | 384 | 134k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 385 | 134k | ref2->data[1], ref2->linesize[1], | 386 | 134k | ref2->data[2], ref2->linesize[2], tref2, | 387 | 134k | row << 3, (col << 3) + 4, | 388 | 134k | &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 389 | 134k | mc_chroma_dir(td, mc[4][b->filter][1], | 390 | 134k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 391 | 134k | ref2->data[1], ref2->linesize[1], | 392 | 134k | ref2->data[2], ref2->linesize[2], tref2, | 393 | 134k | (row << 3) + 4, col << 3, | 394 | 134k | &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 395 | 134k | mc_chroma_dir(td, mc[4][b->filter][1], | 396 | 134k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 397 | 134k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 398 | 134k | ref2->data[1], ref2->linesize[1], | 399 | 134k | ref2->data[2], ref2->linesize[2], tref2, | 400 | 134k | (row << 3) + 4, (col << 3) + 4, | 401 | 134k | &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 402 | 134k | } | 403 | 249k | } | 404 | 402k | } | 405 | 481k | } | 406 | 1.12M | } else { | 407 | 1.12M | int bwl = bwlog_tab[0][b->bs]; | 408 | 1.12M | int bw = ff_vp9_bwh_tab[0][b->bs][0] * 4; | 409 | 1.12M | int bh = ff_vp9_bwh_tab[0][b->bs][1] * 4; | 410 | 1.12M | int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][0] * 4; | 411 | 1.12M | int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][1] * 4; | 412 | | | 413 | 1.12M | mc_luma_dir(td, mc[bwl][b->filter][0], td->dst[0], ls_y, | 414 | 1.12M | ref1->data[0], ref1->linesize[0], tref1, | 415 | 1.12M | row << 3, col << 3, &b->mv[0][0], 0, 0, bw, bh, bw, bh, w1, h1, 0); | 416 | 1.12M | w1 = (w1 + s->ss_h) >> s->ss_h; | 417 | 1.12M | h1 = (h1 + s->ss_v) >> s->ss_v; | 418 | 1.12M | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][0], | 419 | 1.12M | td->dst[1], td->dst[2], ls_uv, | 420 | 1.12M | ref1->data[1], ref1->linesize[1], | 421 | 1.12M | ref1->data[2], ref1->linesize[2], tref1, | 422 | 1.12M | row << (3 - s->ss_v), col << (3 - s->ss_h), | 423 | 1.12M | &b->mv[0][0], 0, 0, uvbw, uvbh, uvbw, uvbh, w1, h1, 0); | 424 | | | 425 | 1.12M | if (b->comp) { | 426 | 823k | mc_luma_dir(td, mc[bwl][b->filter][1], td->dst[0], ls_y, | 427 | 823k | ref2->data[0], ref2->linesize[0], tref2, | 428 | 823k | row << 3, col << 3, &b->mv[0][1], 0, 0, bw, bh, bw, bh, w2, h2, 1); | 429 | 823k | w2 = (w2 + s->ss_h) >> s->ss_h; | 430 | 823k | h2 = (h2 + s->ss_v) >> s->ss_v; | 431 | 823k | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][1], | 432 | 823k | td->dst[1], td->dst[2], ls_uv, | 433 | 823k | ref2->data[1], ref2->linesize[1], | 434 | 823k | ref2->data[2], ref2->linesize[2], tref2, | 435 | 823k | row << (3 - s->ss_v), col << (3 - s->ss_h), | 436 | 823k | &b->mv[0][1], 0, 0, uvbw, uvbh, uvbw, uvbh, w2, h2, 1); | 437 | 823k | } | 438 | 1.12M | } | 439 | 1.60M | } |
vp9recon.c:inter_pred_8bpp Line | Count | Source | 31 | 1.51M | { | 32 | 1.51M | static const uint8_t bwlog_tab[2][N_BS_SIZES] = { | 33 | 1.51M | { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, | 34 | 1.51M | { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 }, | 35 | 1.51M | }; | 36 | 1.51M | const VP9Context *s = td->s; | 37 | 1.51M | VP9Block *b = td->b; | 38 | 1.51M | int row = td->row, col = td->col; | 39 | 1.51M | const ProgressFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2; | 40 | 1.51M | const AVFrame *ref1 = tref1->f, *ref2; | 41 | 1.51M | int w1 = ref1->width, h1 = ref1->height, w2, h2; | 42 | 1.51M | ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride; | 43 | 1.51M | int bytesperpixel = BYTES_PER_PIXEL; | 44 | | | 45 | 1.51M | if (b->comp) { | 46 | 1.02M | tref2 = &s->s.refs[s->s.h.refidx[b->ref[1]]]; | 47 | 1.02M | ref2 = tref2->f; | 48 | 1.02M | w2 = ref2->width; | 49 | 1.02M | h2 = ref2->height; | 50 | 1.02M | } | 51 | | | 52 | | // y inter pred | 53 | 1.51M | if (b->bs > BS_8x8) { | 54 | 522k | VP9mv uvmv; | 55 | | | 56 | 522k | #if SCALED == 0 | 57 | 522k | if (b->bs == BS_8x4) { | 58 | 140k | mc_luma_dir(td, mc[3][b->filter][0], td->dst[0], ls_y, | 59 | 140k | ref1->data[0], ref1->linesize[0], tref1, | 60 | 140k | row << 3, col << 3, &b->mv[0][0],,,,, 8, 4, w1, h1, 0); | 61 | 140k | mc_luma_dir(td, mc[3][b->filter][0], | 62 | 140k | td->dst[0] + 4 * ls_y, ls_y, | 63 | 140k | ref1->data[0], ref1->linesize[0], tref1, | 64 | 140k | (row << 3) + 4, col << 3, &b->mv[2][0],,,,, 8, 4, w1, h1, 0); | 65 | 140k | w1 = (w1 + s->ss_h) >> s->ss_h; | 66 | 140k | if (s->ss_v) { | 67 | 63.1k | h1 = (h1 + 1) >> 1; | 68 | 63.1k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 69 | 63.1k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 70 | 63.1k | td->dst[1], td->dst[2], ls_uv, | 71 | 63.1k | ref1->data[1], ref1->linesize[1], | 72 | 63.1k | ref1->data[2], ref1->linesize[2], tref1, | 73 | 63.1k | row << 2, col << (3 - s->ss_h), | 74 | 63.1k | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 75 | 77.6k | } else { | 76 | 77.6k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 77 | 77.6k | td->dst[1], td->dst[2], ls_uv, | 78 | 77.6k | ref1->data[1], ref1->linesize[1], | 79 | 77.6k | ref1->data[2], ref1->linesize[2], tref1, | 80 | 77.6k | row << 3, col << (3 - s->ss_h), | 81 | 77.6k | &b->mv[0][0],,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 82 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 83 | | // to get the motion vector for the bottom 4x4 block | 84 | | // https://code.google.com/p/webm/issues/detail?id=993 | 85 | 77.6k | if (s->ss_h == 0) { | 86 | 36.5k | uvmv = b->mv[2][0]; | 87 | 41.1k | } else { | 88 | 41.1k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 89 | 41.1k | } | 90 | 77.6k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 91 | 77.6k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 92 | 77.6k | ref1->data[1], ref1->linesize[1], | 93 | 77.6k | ref1->data[2], ref1->linesize[2], tref1, | 94 | 77.6k | (row << 3) + 4, col << (3 - s->ss_h), | 95 | 77.6k | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 96 | 77.6k | } | 97 | | | 98 | 140k | if (b->comp) { | 99 | 109k | mc_luma_dir(td, mc[3][b->filter][1], td->dst[0], ls_y, | 100 | 109k | ref2->data[0], ref2->linesize[0], tref2, | 101 | 109k | row << 3, col << 3, &b->mv[0][1],,,,, 8, 4, w2, h2, 1); | 102 | 109k | mc_luma_dir(td, mc[3][b->filter][1], | 103 | 109k | td->dst[0] + 4 * ls_y, ls_y, | 104 | 109k | ref2->data[0], ref2->linesize[0], tref2, | 105 | 109k | (row << 3) + 4, col << 3, &b->mv[2][1],,,,, 8, 4, w2, h2, 1); | 106 | 109k | w2 = (w2 + s->ss_h) >> s->ss_h; | 107 | 109k | if (s->ss_v) { | 108 | 46.9k | h2 = (h2 + 1) >> 1; | 109 | 46.9k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 110 | 46.9k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 111 | 46.9k | td->dst[1], td->dst[2], ls_uv, | 112 | 46.9k | ref2->data[1], ref2->linesize[1], | 113 | 46.9k | ref2->data[2], ref2->linesize[2], tref2, | 114 | 46.9k | row << 2, col << (3 - s->ss_h), | 115 | 46.9k | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 116 | 62.1k | } else { | 117 | 62.1k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 118 | 62.1k | td->dst[1], td->dst[2], ls_uv, | 119 | 62.1k | ref2->data[1], ref2->linesize[1], | 120 | 62.1k | ref2->data[2], ref2->linesize[2], tref2, | 121 | 62.1k | row << 3, col << (3 - s->ss_h), | 122 | 62.1k | &b->mv[0][1],,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 123 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 124 | | // to get the motion vector for the bottom 4x4 block | 125 | | // https://code.google.com/p/webm/issues/detail?id=993 | 126 | 62.1k | if (s->ss_h == 0) { | 127 | 26.8k | uvmv = b->mv[2][1]; | 128 | 35.2k | } else { | 129 | 35.2k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 130 | 35.2k | } | 131 | 62.1k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 132 | 62.1k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 133 | 62.1k | ref2->data[1], ref2->linesize[1], | 134 | 62.1k | ref2->data[2], ref2->linesize[2], tref2, | 135 | 62.1k | (row << 3) + 4, col << (3 - s->ss_h), | 136 | 62.1k | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 137 | 62.1k | } | 138 | 109k | } | 139 | 381k | } else if (b->bs == BS_4x8) { | 140 | 77.1k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 141 | 77.1k | ref1->data[0], ref1->linesize[0], tref1, | 142 | 77.1k | row << 3, col << 3, &b->mv[0][0],,,,, 4, 8, w1, h1, 0); | 143 | 77.1k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 144 | 77.1k | ref1->data[0], ref1->linesize[0], tref1, | 145 | 77.1k | row << 3, (col << 3) + 4, &b->mv[1][0],,,,, 4, 8, w1, h1, 0); | 146 | 77.1k | h1 = (h1 + s->ss_v) >> s->ss_v; | 147 | 77.1k | if (s->ss_h) { | 148 | 23.0k | w1 = (w1 + 1) >> 1; | 149 | 23.0k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 150 | 23.0k | mc_chroma_dir(td, mc[4][b->filter][0], | 151 | 23.0k | td->dst[1], td->dst[2], ls_uv, | 152 | 23.0k | ref1->data[1], ref1->linesize[1], | 153 | 23.0k | ref1->data[2], ref1->linesize[2], tref1, | 154 | 23.0k | row << (3 - s->ss_v), col << 2, | 155 | 23.0k | &uvmv,,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 156 | 54.0k | } else { | 157 | 54.0k | mc_chroma_dir(td, mc[4][b->filter][0], | 158 | 54.0k | td->dst[1], td->dst[2], ls_uv, | 159 | 54.0k | ref1->data[1], ref1->linesize[1], | 160 | 54.0k | ref1->data[2], ref1->linesize[2], tref1, | 161 | 54.0k | row << (3 - s->ss_v), col << 3, | 162 | 54.0k | &b->mv[0][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 163 | 54.0k | mc_chroma_dir(td, mc[4][b->filter][0], | 164 | 54.0k | td->dst[1] + 4 * bytesperpixel, | 165 | 54.0k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 166 | 54.0k | ref1->data[1], ref1->linesize[1], | 167 | 54.0k | ref1->data[2], ref1->linesize[2], tref1, | 168 | 54.0k | row << (3 - s->ss_v), (col << 3) + 4, | 169 | 54.0k | &b->mv[1][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 170 | 54.0k | } | 171 | | | 172 | 77.1k | if (b->comp) { | 173 | 56.4k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 174 | 56.4k | ref2->data[0], ref2->linesize[0], tref2, | 175 | 56.4k | row << 3, col << 3, &b->mv[0][1],,,,, 4, 8, w2, h2, 1); | 176 | 56.4k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 177 | 56.4k | ref2->data[0], ref2->linesize[0], tref2, | 178 | 56.4k | row << 3, (col << 3) + 4, &b->mv[1][1],,,,, 4, 8, w2, h2, 1); | 179 | 56.4k | h2 = (h2 + s->ss_v) >> s->ss_v; | 180 | 56.4k | if (s->ss_h) { | 181 | 14.9k | w2 = (w2 + 1) >> 1; | 182 | 14.9k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 183 | 14.9k | mc_chroma_dir(td, mc[4][b->filter][1], | 184 | 14.9k | td->dst[1], td->dst[2], ls_uv, | 185 | 14.9k | ref2->data[1], ref2->linesize[1], | 186 | 14.9k | ref2->data[2], ref2->linesize[2], tref2, | 187 | 14.9k | row << (3 - s->ss_v), col << 2, | 188 | 14.9k | &uvmv,,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 189 | 41.4k | } else { | 190 | 41.4k | mc_chroma_dir(td, mc[4][b->filter][1], | 191 | 41.4k | td->dst[1], td->dst[2], ls_uv, | 192 | 41.4k | ref2->data[1], ref2->linesize[1], | 193 | 41.4k | ref2->data[2], ref2->linesize[2], tref2, | 194 | 41.4k | row << (3 - s->ss_v), col << 3, | 195 | 41.4k | &b->mv[0][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 196 | 41.4k | mc_chroma_dir(td, mc[4][b->filter][1], | 197 | 41.4k | td->dst[1] + 4 * bytesperpixel, | 198 | 41.4k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 199 | 41.4k | ref2->data[1], ref2->linesize[1], | 200 | 41.4k | ref2->data[2], ref2->linesize[2], tref2, | 201 | 41.4k | row << (3 - s->ss_v), (col << 3) + 4, | 202 | 41.4k | &b->mv[1][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 203 | 41.4k | } | 204 | 56.4k | } | 205 | 77.1k | } else | 206 | 304k | #endif | 207 | 304k | { | 208 | 304k | #if SCALED == 0 | 209 | 304k | av_assert2(b->bs == BS_4x4); | 210 | 304k | #endif | 211 | | | 212 | | // FIXME if two horizontally adjacent blocks have the same MV, | 213 | | // do a w8 instead of a w4 call | 214 | 304k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 215 | 304k | ref1->data[0], ref1->linesize[0], tref1, | 216 | 304k | row << 3, col << 3, &b->mv[0][0], | 217 | 304k | 0, 0, 8, 8, 4, 4, w1, h1, 0); | 218 | 304k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 219 | 304k | ref1->data[0], ref1->linesize[0], tref1, | 220 | 304k | row << 3, (col << 3) + 4, &b->mv[1][0], | 221 | 304k | 4, 0, 8, 8, 4, 4, w1, h1, 0); | 222 | 304k | mc_luma_dir(td, mc[4][b->filter][0], | 223 | 304k | td->dst[0] + 4 * ls_y, ls_y, | 224 | 304k | ref1->data[0], ref1->linesize[0], tref1, | 225 | 304k | (row << 3) + 4, col << 3, &b->mv[2][0], | 226 | 304k | 0, 4, 8, 8, 4, 4, w1, h1, 0); | 227 | 304k | mc_luma_dir(td, mc[4][b->filter][0], | 228 | 304k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 229 | 304k | ref1->data[0], ref1->linesize[0], tref1, | 230 | 304k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][0], | 231 | 304k | 4, 4, 8, 8, 4, 4, w1, h1, 0); | 232 | 304k | if (s->ss_v) { | 233 | 197k | h1 = (h1 + 1) >> 1; | 234 | 197k | if (s->ss_h) { | 235 | 14.0k | w1 = (w1 + 1) >> 1; | 236 | 14.0k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][0], b->mv[1][0], | 237 | 14.0k | b->mv[2][0], b->mv[3][0]); | 238 | 14.0k | mc_chroma_dir(td, mc[4][b->filter][0], | 239 | 14.0k | td->dst[1], td->dst[2], ls_uv, | 240 | 14.0k | ref1->data[1], ref1->linesize[1], | 241 | 14.0k | ref1->data[2], ref1->linesize[2], tref1, | 242 | 14.0k | row << 2, col << 2, | 243 | 14.0k | &uvmv, 0, 0, 4, 4, 4, 4, w1, h1, 0); | 244 | 183k | } else { | 245 | 183k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 246 | 183k | mc_chroma_dir(td, mc[4][b->filter][0], | 247 | 183k | td->dst[1], td->dst[2], ls_uv, | 248 | 183k | ref1->data[1], ref1->linesize[1], | 249 | 183k | ref1->data[2], ref1->linesize[2], tref1, | 250 | 183k | row << 2, col << 3, | 251 | 183k | &uvmv, 0, 0, 8, 4, 4, 4, w1, h1, 0); | 252 | 183k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[3][0]); | 253 | 183k | mc_chroma_dir(td, mc[4][b->filter][0], | 254 | 183k | td->dst[1] + 4 * bytesperpixel, | 255 | 183k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 256 | 183k | ref1->data[1], ref1->linesize[1], | 257 | 183k | ref1->data[2], ref1->linesize[2], tref1, | 258 | 183k | row << 2, (col << 3) + 4, | 259 | 183k | &uvmv, 4, 0, 8, 4, 4, 4, w1, h1, 0); | 260 | 183k | } | 261 | 197k | } else { | 262 | 107k | if (s->ss_h) { | 263 | 56.1k | w1 = (w1 + 1) >> 1; | 264 | 56.1k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 265 | 56.1k | mc_chroma_dir(td, mc[4][b->filter][0], | 266 | 56.1k | td->dst[1], td->dst[2], ls_uv, | 267 | 56.1k | ref1->data[1], ref1->linesize[1], | 268 | 56.1k | ref1->data[2], ref1->linesize[2], tref1, | 269 | 56.1k | row << 3, col << 2, | 270 | 56.1k | &uvmv, 0, 0, 4, 8, 4, 4, w1, h1, 0); | 271 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 272 | | // bottom block | 273 | | // https://code.google.com/p/webm/issues/detail?id=993 | 274 | 56.1k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[2][0]); | 275 | 56.1k | mc_chroma_dir(td, mc[4][b->filter][0], | 276 | 56.1k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 277 | 56.1k | ref1->data[1], ref1->linesize[1], | 278 | 56.1k | ref1->data[2], ref1->linesize[2], tref1, | 279 | 56.1k | (row << 3) + 4, col << 2, | 280 | 56.1k | &uvmv, 0, 4, 4, 8, 4, 4, w1, h1, 0); | 281 | 56.1k | } else { | 282 | 50.9k | mc_chroma_dir(td, mc[4][b->filter][0], | 283 | 50.9k | td->dst[1], td->dst[2], ls_uv, | 284 | 50.9k | ref1->data[1], ref1->linesize[1], | 285 | 50.9k | ref1->data[2], ref1->linesize[2], tref1, | 286 | 50.9k | row << 3, col << 3, | 287 | 50.9k | &b->mv[0][0], 0, 0, 8, 8, 4, 4, w1, h1, 0); | 288 | 50.9k | mc_chroma_dir(td, mc[4][b->filter][0], | 289 | 50.9k | td->dst[1] + 4 * bytesperpixel, | 290 | 50.9k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 291 | 50.9k | ref1->data[1], ref1->linesize[1], | 292 | 50.9k | ref1->data[2], ref1->linesize[2], tref1, | 293 | 50.9k | row << 3, (col << 3) + 4, | 294 | 50.9k | &b->mv[1][0], 4, 0, 8, 8, 4, 4, w1, h1, 0); | 295 | 50.9k | mc_chroma_dir(td, mc[4][b->filter][0], | 296 | 50.9k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 297 | 50.9k | ref1->data[1], ref1->linesize[1], | 298 | 50.9k | ref1->data[2], ref1->linesize[2], tref1, | 299 | 50.9k | (row << 3) + 4, col << 3, | 300 | 50.9k | &b->mv[2][0], 0, 4, 8, 8, 4, 4, w1, h1, 0); | 301 | 50.9k | mc_chroma_dir(td, mc[4][b->filter][0], | 302 | 50.9k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 303 | 50.9k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 304 | 50.9k | ref1->data[1], ref1->linesize[1], | 305 | 50.9k | ref1->data[2], ref1->linesize[2], tref1, | 306 | 50.9k | (row << 3) + 4, (col << 3) + 4, | 307 | 50.9k | &b->mv[3][0], 4, 4, 8, 8, 4, 4, w1, h1, 0); | 308 | 50.9k | } | 309 | 107k | } | 310 | | | 311 | 304k | if (b->comp) { | 312 | 206k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 313 | 206k | ref2->data[0], ref2->linesize[0], tref2, | 314 | 206k | row << 3, col << 3, &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 315 | 206k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 316 | 206k | ref2->data[0], ref2->linesize[0], tref2, | 317 | 206k | row << 3, (col << 3) + 4, &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 318 | 206k | mc_luma_dir(td, mc[4][b->filter][1], | 319 | 206k | td->dst[0] + 4 * ls_y, ls_y, | 320 | 206k | ref2->data[0], ref2->linesize[0], tref2, | 321 | 206k | (row << 3) + 4, col << 3, &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 322 | 206k | mc_luma_dir(td, mc[4][b->filter][1], | 323 | 206k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 324 | 206k | ref2->data[0], ref2->linesize[0], tref2, | 325 | 206k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 326 | 206k | if (s->ss_v) { | 327 | 140k | h2 = (h2 + 1) >> 1; | 328 | 140k | if (s->ss_h) { | 329 | 6.61k | w2 = (w2 + 1) >> 1; | 330 | 6.61k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][1], b->mv[1][1], | 331 | 6.61k | b->mv[2][1], b->mv[3][1]); | 332 | 6.61k | mc_chroma_dir(td, mc[4][b->filter][1], | 333 | 6.61k | td->dst[1], td->dst[2], ls_uv, | 334 | 6.61k | ref2->data[1], ref2->linesize[1], | 335 | 6.61k | ref2->data[2], ref2->linesize[2], tref2, | 336 | 6.61k | row << 2, col << 2, | 337 | 6.61k | &uvmv, 0, 0, 4, 4, 4, 4, w2, h2, 1); | 338 | 134k | } else { | 339 | 134k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 340 | 134k | mc_chroma_dir(td, mc[4][b->filter][1], | 341 | 134k | td->dst[1], td->dst[2], ls_uv, | 342 | 134k | ref2->data[1], ref2->linesize[1], | 343 | 134k | ref2->data[2], ref2->linesize[2], tref2, | 344 | 134k | row << 2, col << 3, | 345 | 134k | &uvmv, 0, 0, 8, 4, 4, 4, w2, h2, 1); | 346 | 134k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[3][1]); | 347 | 134k | mc_chroma_dir(td, mc[4][b->filter][1], | 348 | 134k | td->dst[1] + 4 * bytesperpixel, | 349 | 134k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 350 | 134k | ref2->data[1], ref2->linesize[1], | 351 | 134k | ref2->data[2], ref2->linesize[2], tref2, | 352 | 134k | row << 2, (col << 3) + 4, | 353 | 134k | &uvmv, 4, 0, 8, 4, 4, 4, w2, h2, 1); | 354 | 134k | } | 355 | 140k | } else { | 356 | 65.6k | if (s->ss_h) { | 357 | 40.7k | w2 = (w2 + 1) >> 1; | 358 | 40.7k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 359 | 40.7k | mc_chroma_dir(td, mc[4][b->filter][1], | 360 | 40.7k | td->dst[1], td->dst[2], ls_uv, | 361 | 40.7k | ref2->data[1], ref2->linesize[1], | 362 | 40.7k | ref2->data[2], ref2->linesize[2], tref2, | 363 | 40.7k | row << 3, col << 2, | 364 | 40.7k | &uvmv, 0, 0, 4, 8, 4, 4, w2, h2, 1); | 365 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 366 | | // bottom block | 367 | | // https://code.google.com/p/webm/issues/detail?id=993 | 368 | 40.7k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[2][1]); | 369 | 40.7k | mc_chroma_dir(td, mc[4][b->filter][1], | 370 | 40.7k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 371 | 40.7k | ref2->data[1], ref2->linesize[1], | 372 | 40.7k | ref2->data[2], ref2->linesize[2], tref2, | 373 | 40.7k | (row << 3) + 4, col << 2, | 374 | 40.7k | &uvmv, 0, 4, 4, 8, 4, 4, w2, h2, 1); | 375 | 40.7k | } else { | 376 | 24.8k | mc_chroma_dir(td, mc[4][b->filter][1], | 377 | 24.8k | td->dst[1], td->dst[2], ls_uv, | 378 | 24.8k | ref2->data[1], ref2->linesize[1], | 379 | 24.8k | ref2->data[2], ref2->linesize[2], tref2, | 380 | 24.8k | row << 3, col << 3, | 381 | 24.8k | &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 382 | 24.8k | mc_chroma_dir(td, mc[4][b->filter][1], | 383 | 24.8k | td->dst[1] + 4 * bytesperpixel, | 384 | 24.8k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 385 | 24.8k | ref2->data[1], ref2->linesize[1], | 386 | 24.8k | ref2->data[2], ref2->linesize[2], tref2, | 387 | 24.8k | row << 3, (col << 3) + 4, | 388 | 24.8k | &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 389 | 24.8k | mc_chroma_dir(td, mc[4][b->filter][1], | 390 | 24.8k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 391 | 24.8k | ref2->data[1], ref2->linesize[1], | 392 | 24.8k | ref2->data[2], ref2->linesize[2], tref2, | 393 | 24.8k | (row << 3) + 4, col << 3, | 394 | 24.8k | &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 395 | 24.8k | mc_chroma_dir(td, mc[4][b->filter][1], | 396 | 24.8k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 397 | 24.8k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 398 | 24.8k | ref2->data[1], ref2->linesize[1], | 399 | 24.8k | ref2->data[2], ref2->linesize[2], tref2, | 400 | 24.8k | (row << 3) + 4, (col << 3) + 4, | 401 | 24.8k | &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 402 | 24.8k | } | 403 | 65.6k | } | 404 | 206k | } | 405 | 304k | } | 406 | 993k | } else { | 407 | 993k | int bwl = bwlog_tab[0][b->bs]; | 408 | 993k | int bw = ff_vp9_bwh_tab[0][b->bs][0] * 4; | 409 | 993k | int bh = ff_vp9_bwh_tab[0][b->bs][1] * 4; | 410 | 993k | int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][0] * 4; | 411 | 993k | int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][1] * 4; | 412 | | | 413 | 993k | mc_luma_dir(td, mc[bwl][b->filter][0], td->dst[0], ls_y, | 414 | 993k | ref1->data[0], ref1->linesize[0], tref1, | 415 | 993k | row << 3, col << 3, &b->mv[0][0], 0, 0, bw, bh, bw, bh, w1, h1, 0); | 416 | 993k | w1 = (w1 + s->ss_h) >> s->ss_h; | 417 | 993k | h1 = (h1 + s->ss_v) >> s->ss_v; | 418 | 993k | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][0], | 419 | 993k | td->dst[1], td->dst[2], ls_uv, | 420 | 993k | ref1->data[1], ref1->linesize[1], | 421 | 993k | ref1->data[2], ref1->linesize[2], tref1, | 422 | 993k | row << (3 - s->ss_v), col << (3 - s->ss_h), | 423 | 993k | &b->mv[0][0], 0, 0, uvbw, uvbh, uvbw, uvbh, w1, h1, 0); | 424 | | | 425 | 993k | if (b->comp) { | 426 | 654k | mc_luma_dir(td, mc[bwl][b->filter][1], td->dst[0], ls_y, | 427 | 654k | ref2->data[0], ref2->linesize[0], tref2, | 428 | 654k | row << 3, col << 3, &b->mv[0][1], 0, 0, bw, bh, bw, bh, w2, h2, 1); | 429 | 654k | w2 = (w2 + s->ss_h) >> s->ss_h; | 430 | 654k | h2 = (h2 + s->ss_v) >> s->ss_v; | 431 | 654k | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][1], | 432 | 654k | td->dst[1], td->dst[2], ls_uv, | 433 | 654k | ref2->data[1], ref2->linesize[1], | 434 | 654k | ref2->data[2], ref2->linesize[2], tref2, | 435 | 654k | row << (3 - s->ss_v), col << (3 - s->ss_h), | 436 | 654k | &b->mv[0][1], 0, 0, uvbw, uvbh, uvbw, uvbh, w2, h2, 1); | 437 | 654k | } | 438 | 993k | } | 439 | 1.51M | } |
vp9recon.c:inter_pred_16bpp Line | Count | Source | 31 | 2.42M | { | 32 | 2.42M | static const uint8_t bwlog_tab[2][N_BS_SIZES] = { | 33 | 2.42M | { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, | 34 | 2.42M | { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 }, | 35 | 2.42M | }; | 36 | 2.42M | const VP9Context *s = td->s; | 37 | 2.42M | VP9Block *b = td->b; | 38 | 2.42M | int row = td->row, col = td->col; | 39 | 2.42M | const ProgressFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2; | 40 | 2.42M | const AVFrame *ref1 = tref1->f, *ref2; | 41 | 2.42M | int w1 = ref1->width, h1 = ref1->height, w2, h2; | 42 | 2.42M | ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride; | 43 | 2.42M | int bytesperpixel = BYTES_PER_PIXEL; | 44 | | | 45 | 2.42M | if (b->comp) { | 46 | 1.15M | tref2 = &s->s.refs[s->s.h.refidx[b->ref[1]]]; | 47 | 1.15M | ref2 = tref2->f; | 48 | 1.15M | w2 = ref2->width; | 49 | 1.15M | h2 = ref2->height; | 50 | 1.15M | } | 51 | | | 52 | | // y inter pred | 53 | 2.42M | if (b->bs > BS_8x8) { | 54 | 772k | VP9mv uvmv; | 55 | | | 56 | 772k | #if SCALED == 0 | 57 | 772k | if (b->bs == BS_8x4) { | 58 | 271k | mc_luma_dir(td, mc[3][b->filter][0], td->dst[0], ls_y, | 59 | 271k | ref1->data[0], ref1->linesize[0], tref1, | 60 | 271k | row << 3, col << 3, &b->mv[0][0],,,,, 8, 4, w1, h1, 0); | 61 | 271k | mc_luma_dir(td, mc[3][b->filter][0], | 62 | 271k | td->dst[0] + 4 * ls_y, ls_y, | 63 | 271k | ref1->data[0], ref1->linesize[0], tref1, | 64 | 271k | (row << 3) + 4, col << 3, &b->mv[2][0],,,,, 8, 4, w1, h1, 0); | 65 | 271k | w1 = (w1 + s->ss_h) >> s->ss_h; | 66 | 271k | if (s->ss_v) { | 67 | 80.6k | h1 = (h1 + 1) >> 1; | 68 | 80.6k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 69 | 80.6k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 70 | 80.6k | td->dst[1], td->dst[2], ls_uv, | 71 | 80.6k | ref1->data[1], ref1->linesize[1], | 72 | 80.6k | ref1->data[2], ref1->linesize[2], tref1, | 73 | 80.6k | row << 2, col << (3 - s->ss_h), | 74 | 80.6k | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 75 | 190k | } else { | 76 | 190k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 77 | 190k | td->dst[1], td->dst[2], ls_uv, | 78 | 190k | ref1->data[1], ref1->linesize[1], | 79 | 190k | ref1->data[2], ref1->linesize[2], tref1, | 80 | 190k | row << 3, col << (3 - s->ss_h), | 81 | 190k | &b->mv[0][0],,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 82 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 83 | | // to get the motion vector for the bottom 4x4 block | 84 | | // https://code.google.com/p/webm/issues/detail?id=993 | 85 | 190k | if (s->ss_h == 0) { | 86 | 150k | uvmv = b->mv[2][0]; | 87 | 150k | } else { | 88 | 40.6k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 89 | 40.6k | } | 90 | 190k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0], | 91 | 190k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 92 | 190k | ref1->data[1], ref1->linesize[1], | 93 | 190k | ref1->data[2], ref1->linesize[2], tref1, | 94 | 190k | (row << 3) + 4, col << (3 - s->ss_h), | 95 | 190k | &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0); | 96 | 190k | } | 97 | | | 98 | 271k | if (b->comp) { | 99 | 125k | mc_luma_dir(td, mc[3][b->filter][1], td->dst[0], ls_y, | 100 | 125k | ref2->data[0], ref2->linesize[0], tref2, | 101 | 125k | row << 3, col << 3, &b->mv[0][1],,,,, 8, 4, w2, h2, 1); | 102 | 125k | mc_luma_dir(td, mc[3][b->filter][1], | 103 | 125k | td->dst[0] + 4 * ls_y, ls_y, | 104 | 125k | ref2->data[0], ref2->linesize[0], tref2, | 105 | 125k | (row << 3) + 4, col << 3, &b->mv[2][1],,,,, 8, 4, w2, h2, 1); | 106 | 125k | w2 = (w2 + s->ss_h) >> s->ss_h; | 107 | 125k | if (s->ss_v) { | 108 | 47.7k | h2 = (h2 + 1) >> 1; | 109 | 47.7k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 110 | 47.7k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 111 | 47.7k | td->dst[1], td->dst[2], ls_uv, | 112 | 47.7k | ref2->data[1], ref2->linesize[1], | 113 | 47.7k | ref2->data[2], ref2->linesize[2], tref2, | 114 | 47.7k | row << 2, col << (3 - s->ss_h), | 115 | 47.7k | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 116 | 77.5k | } else { | 117 | 77.5k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 118 | 77.5k | td->dst[1], td->dst[2], ls_uv, | 119 | 77.5k | ref2->data[1], ref2->linesize[1], | 120 | 77.5k | ref2->data[2], ref2->linesize[2], tref2, | 121 | 77.5k | row << 3, col << (3 - s->ss_h), | 122 | 77.5k | &b->mv[0][1],,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 123 | | // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index | 124 | | // to get the motion vector for the bottom 4x4 block | 125 | | // https://code.google.com/p/webm/issues/detail?id=993 | 126 | 77.5k | if (s->ss_h == 0) { | 127 | 62.1k | uvmv = b->mv[2][1]; | 128 | 62.1k | } else { | 129 | 15.4k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 130 | 15.4k | } | 131 | 77.5k | mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1], | 132 | 77.5k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 133 | 77.5k | ref2->data[1], ref2->linesize[1], | 134 | 77.5k | ref2->data[2], ref2->linesize[2], tref2, | 135 | 77.5k | (row << 3) + 4, col << (3 - s->ss_h), | 136 | 77.5k | &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1); | 137 | 77.5k | } | 138 | 125k | } | 139 | 500k | } else if (b->bs == BS_4x8) { | 140 | 162k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 141 | 162k | ref1->data[0], ref1->linesize[0], tref1, | 142 | 162k | row << 3, col << 3, &b->mv[0][0],,,,, 4, 8, w1, h1, 0); | 143 | 162k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 144 | 162k | ref1->data[0], ref1->linesize[0], tref1, | 145 | 162k | row << 3, (col << 3) + 4, &b->mv[1][0],,,,, 4, 8, w1, h1, 0); | 146 | 162k | h1 = (h1 + s->ss_v) >> s->ss_v; | 147 | 162k | if (s->ss_h) { | 148 | 47.3k | w1 = (w1 + 1) >> 1; | 149 | 47.3k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 150 | 47.3k | mc_chroma_dir(td, mc[4][b->filter][0], | 151 | 47.3k | td->dst[1], td->dst[2], ls_uv, | 152 | 47.3k | ref1->data[1], ref1->linesize[1], | 153 | 47.3k | ref1->data[2], ref1->linesize[2], tref1, | 154 | 47.3k | row << (3 - s->ss_v), col << 2, | 155 | 47.3k | &uvmv,,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 156 | 115k | } else { | 157 | 115k | mc_chroma_dir(td, mc[4][b->filter][0], | 158 | 115k | td->dst[1], td->dst[2], ls_uv, | 159 | 115k | ref1->data[1], ref1->linesize[1], | 160 | 115k | ref1->data[2], ref1->linesize[2], tref1, | 161 | 115k | row << (3 - s->ss_v), col << 3, | 162 | 115k | &b->mv[0][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 163 | 115k | mc_chroma_dir(td, mc[4][b->filter][0], | 164 | 115k | td->dst[1] + 4 * bytesperpixel, | 165 | 115k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 166 | 115k | ref1->data[1], ref1->linesize[1], | 167 | 115k | ref1->data[2], ref1->linesize[2], tref1, | 168 | 115k | row << (3 - s->ss_v), (col << 3) + 4, | 169 | 115k | &b->mv[1][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0); | 170 | 115k | } | 171 | | | 172 | 162k | if (b->comp) { | 173 | 76.5k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 174 | 76.5k | ref2->data[0], ref2->linesize[0], tref2, | 175 | 76.5k | row << 3, col << 3, &b->mv[0][1],,,,, 4, 8, w2, h2, 1); | 176 | 76.5k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 177 | 76.5k | ref2->data[0], ref2->linesize[0], tref2, | 178 | 76.5k | row << 3, (col << 3) + 4, &b->mv[1][1],,,,, 4, 8, w2, h2, 1); | 179 | 76.5k | h2 = (h2 + s->ss_v) >> s->ss_v; | 180 | 76.5k | if (s->ss_h) { | 181 | 18.7k | w2 = (w2 + 1) >> 1; | 182 | 18.7k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 183 | 18.7k | mc_chroma_dir(td, mc[4][b->filter][1], | 184 | 18.7k | td->dst[1], td->dst[2], ls_uv, | 185 | 18.7k | ref2->data[1], ref2->linesize[1], | 186 | 18.7k | ref2->data[2], ref2->linesize[2], tref2, | 187 | 18.7k | row << (3 - s->ss_v), col << 2, | 188 | 18.7k | &uvmv,,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 189 | 57.8k | } else { | 190 | 57.8k | mc_chroma_dir(td, mc[4][b->filter][1], | 191 | 57.8k | td->dst[1], td->dst[2], ls_uv, | 192 | 57.8k | ref2->data[1], ref2->linesize[1], | 193 | 57.8k | ref2->data[2], ref2->linesize[2], tref2, | 194 | 57.8k | row << (3 - s->ss_v), col << 3, | 195 | 57.8k | &b->mv[0][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 196 | 57.8k | mc_chroma_dir(td, mc[4][b->filter][1], | 197 | 57.8k | td->dst[1] + 4 * bytesperpixel, | 198 | 57.8k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 199 | 57.8k | ref2->data[1], ref2->linesize[1], | 200 | 57.8k | ref2->data[2], ref2->linesize[2], tref2, | 201 | 57.8k | row << (3 - s->ss_v), (col << 3) + 4, | 202 | 57.8k | &b->mv[1][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1); | 203 | 57.8k | } | 204 | 76.5k | } | 205 | 162k | } else | 206 | 338k | #endif | 207 | 338k | { | 208 | 338k | #if SCALED == 0 | 209 | 338k | av_assert2(b->bs == BS_4x4); | 210 | 338k | #endif | 211 | | | 212 | | // FIXME if two horizontally adjacent blocks have the same MV, | 213 | | // do a w8 instead of a w4 call | 214 | 338k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | 215 | 338k | ref1->data[0], ref1->linesize[0], tref1, | 216 | 338k | row << 3, col << 3, &b->mv[0][0], | 217 | 338k | 0, 0, 8, 8, 4, 4, w1, h1, 0); | 218 | 338k | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | 219 | 338k | ref1->data[0], ref1->linesize[0], tref1, | 220 | 338k | row << 3, (col << 3) + 4, &b->mv[1][0], | 221 | 338k | 4, 0, 8, 8, 4, 4, w1, h1, 0); | 222 | 338k | mc_luma_dir(td, mc[4][b->filter][0], | 223 | 338k | td->dst[0] + 4 * ls_y, ls_y, | 224 | 338k | ref1->data[0], ref1->linesize[0], tref1, | 225 | 338k | (row << 3) + 4, col << 3, &b->mv[2][0], | 226 | 338k | 0, 4, 8, 8, 4, 4, w1, h1, 0); | 227 | 338k | mc_luma_dir(td, mc[4][b->filter][0], | 228 | 338k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 229 | 338k | ref1->data[0], ref1->linesize[0], tref1, | 230 | 338k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][0], | 231 | 338k | 4, 4, 8, 8, 4, 4, w1, h1, 0); | 232 | 338k | if (s->ss_v) { | 233 | 99.5k | h1 = (h1 + 1) >> 1; | 234 | 99.5k | if (s->ss_h) { | 235 | 58.8k | w1 = (w1 + 1) >> 1; | 236 | 58.8k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][0], b->mv[1][0], | 237 | 58.8k | b->mv[2][0], b->mv[3][0]); | 238 | 58.8k | mc_chroma_dir(td, mc[4][b->filter][0], | 239 | 58.8k | td->dst[1], td->dst[2], ls_uv, | 240 | 58.8k | ref1->data[1], ref1->linesize[1], | 241 | 58.8k | ref1->data[2], ref1->linesize[2], tref1, | 242 | 58.8k | row << 2, col << 2, | 243 | 58.8k | &uvmv, 0, 0, 4, 4, 4, 4, w1, h1, 0); | 244 | 58.8k | } else { | 245 | 40.6k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); | 246 | 40.6k | mc_chroma_dir(td, mc[4][b->filter][0], | 247 | 40.6k | td->dst[1], td->dst[2], ls_uv, | 248 | 40.6k | ref1->data[1], ref1->linesize[1], | 249 | 40.6k | ref1->data[2], ref1->linesize[2], tref1, | 250 | 40.6k | row << 2, col << 3, | 251 | 40.6k | &uvmv, 0, 0, 8, 4, 4, 4, w1, h1, 0); | 252 | 40.6k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[3][0]); | 253 | 40.6k | mc_chroma_dir(td, mc[4][b->filter][0], | 254 | 40.6k | td->dst[1] + 4 * bytesperpixel, | 255 | 40.6k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 256 | 40.6k | ref1->data[1], ref1->linesize[1], | 257 | 40.6k | ref1->data[2], ref1->linesize[2], tref1, | 258 | 40.6k | row << 2, (col << 3) + 4, | 259 | 40.6k | &uvmv, 4, 0, 8, 4, 4, 4, w1, h1, 0); | 260 | 40.6k | } | 261 | 238k | } else { | 262 | 238k | if (s->ss_h) { | 263 | 74.3k | w1 = (w1 + 1) >> 1; | 264 | 74.3k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); | 265 | 74.3k | mc_chroma_dir(td, mc[4][b->filter][0], | 266 | 74.3k | td->dst[1], td->dst[2], ls_uv, | 267 | 74.3k | ref1->data[1], ref1->linesize[1], | 268 | 74.3k | ref1->data[2], ref1->linesize[2], tref1, | 269 | 74.3k | row << 3, col << 2, | 270 | 74.3k | &uvmv, 0, 0, 4, 8, 4, 4, w1, h1, 0); | 271 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 272 | | // bottom block | 273 | | // https://code.google.com/p/webm/issues/detail?id=993 | 274 | 74.3k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[2][0]); | 275 | 74.3k | mc_chroma_dir(td, mc[4][b->filter][0], | 276 | 74.3k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 277 | 74.3k | ref1->data[1], ref1->linesize[1], | 278 | 74.3k | ref1->data[2], ref1->linesize[2], tref1, | 279 | 74.3k | (row << 3) + 4, col << 2, | 280 | 74.3k | &uvmv, 0, 4, 4, 8, 4, 4, w1, h1, 0); | 281 | 164k | } else { | 282 | 164k | mc_chroma_dir(td, mc[4][b->filter][0], | 283 | 164k | td->dst[1], td->dst[2], ls_uv, | 284 | 164k | ref1->data[1], ref1->linesize[1], | 285 | 164k | ref1->data[2], ref1->linesize[2], tref1, | 286 | 164k | row << 3, col << 3, | 287 | 164k | &b->mv[0][0], 0, 0, 8, 8, 4, 4, w1, h1, 0); | 288 | 164k | mc_chroma_dir(td, mc[4][b->filter][0], | 289 | 164k | td->dst[1] + 4 * bytesperpixel, | 290 | 164k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 291 | 164k | ref1->data[1], ref1->linesize[1], | 292 | 164k | ref1->data[2], ref1->linesize[2], tref1, | 293 | 164k | row << 3, (col << 3) + 4, | 294 | 164k | &b->mv[1][0], 4, 0, 8, 8, 4, 4, w1, h1, 0); | 295 | 164k | mc_chroma_dir(td, mc[4][b->filter][0], | 296 | 164k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 297 | 164k | ref1->data[1], ref1->linesize[1], | 298 | 164k | ref1->data[2], ref1->linesize[2], tref1, | 299 | 164k | (row << 3) + 4, col << 3, | 300 | 164k | &b->mv[2][0], 0, 4, 8, 8, 4, 4, w1, h1, 0); | 301 | 164k | mc_chroma_dir(td, mc[4][b->filter][0], | 302 | 164k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 303 | 164k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 304 | 164k | ref1->data[1], ref1->linesize[1], | 305 | 164k | ref1->data[2], ref1->linesize[2], tref1, | 306 | 164k | (row << 3) + 4, (col << 3) + 4, | 307 | 164k | &b->mv[3][0], 4, 4, 8, 8, 4, 4, w1, h1, 0); | 308 | 164k | } | 309 | 238k | } | 310 | | | 311 | 338k | if (b->comp) { | 312 | 128k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | 313 | 128k | ref2->data[0], ref2->linesize[0], tref2, | 314 | 128k | row << 3, col << 3, &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 315 | 128k | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | 316 | 128k | ref2->data[0], ref2->linesize[0], tref2, | 317 | 128k | row << 3, (col << 3) + 4, &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 318 | 128k | mc_luma_dir(td, mc[4][b->filter][1], | 319 | 128k | td->dst[0] + 4 * ls_y, ls_y, | 320 | 128k | ref2->data[0], ref2->linesize[0], tref2, | 321 | 128k | (row << 3) + 4, col << 3, &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 322 | 128k | mc_luma_dir(td, mc[4][b->filter][1], | 323 | 128k | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | 324 | 128k | ref2->data[0], ref2->linesize[0], tref2, | 325 | 128k | (row << 3) + 4, (col << 3) + 4, &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 326 | 128k | if (s->ss_v) { | 327 | 50.8k | h2 = (h2 + 1) >> 1; | 328 | 50.8k | if (s->ss_h) { | 329 | 22.4k | w2 = (w2 + 1) >> 1; | 330 | 22.4k | uvmv = ROUNDED_DIV_MVx4(b->mv[0][1], b->mv[1][1], | 331 | 22.4k | b->mv[2][1], b->mv[3][1]); | 332 | 22.4k | mc_chroma_dir(td, mc[4][b->filter][1], | 333 | 22.4k | td->dst[1], td->dst[2], ls_uv, | 334 | 22.4k | ref2->data[1], ref2->linesize[1], | 335 | 22.4k | ref2->data[2], ref2->linesize[2], tref2, | 336 | 22.4k | row << 2, col << 2, | 337 | 22.4k | &uvmv, 0, 0, 4, 4, 4, 4, w2, h2, 1); | 338 | 28.4k | } else { | 339 | 28.4k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); | 340 | 28.4k | mc_chroma_dir(td, mc[4][b->filter][1], | 341 | 28.4k | td->dst[1], td->dst[2], ls_uv, | 342 | 28.4k | ref2->data[1], ref2->linesize[1], | 343 | 28.4k | ref2->data[2], ref2->linesize[2], tref2, | 344 | 28.4k | row << 2, col << 3, | 345 | 28.4k | &uvmv, 0, 0, 8, 4, 4, 4, w2, h2, 1); | 346 | 28.4k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[3][1]); | 347 | 28.4k | mc_chroma_dir(td, mc[4][b->filter][1], | 348 | 28.4k | td->dst[1] + 4 * bytesperpixel, | 349 | 28.4k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 350 | 28.4k | ref2->data[1], ref2->linesize[1], | 351 | 28.4k | ref2->data[2], ref2->linesize[2], tref2, | 352 | 28.4k | row << 2, (col << 3) + 4, | 353 | 28.4k | &uvmv, 4, 0, 8, 4, 4, 4, w2, h2, 1); | 354 | 28.4k | } | 355 | 77.1k | } else { | 356 | 77.1k | if (s->ss_h) { | 357 | 19.9k | w2 = (w2 + 1) >> 1; | 358 | 19.9k | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); | 359 | 19.9k | mc_chroma_dir(td, mc[4][b->filter][1], | 360 | 19.9k | td->dst[1], td->dst[2], ls_uv, | 361 | 19.9k | ref2->data[1], ref2->linesize[1], | 362 | 19.9k | ref2->data[2], ref2->linesize[2], tref2, | 363 | 19.9k | row << 3, col << 2, | 364 | 19.9k | &uvmv, 0, 0, 4, 8, 4, 4, w2, h2, 1); | 365 | | // BUG libvpx uses wrong block index for 4:2:2 bs=4x4 | 366 | | // bottom block | 367 | | // https://code.google.com/p/webm/issues/detail?id=993 | 368 | 19.9k | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[2][1]); | 369 | 19.9k | mc_chroma_dir(td, mc[4][b->filter][1], | 370 | 19.9k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 371 | 19.9k | ref2->data[1], ref2->linesize[1], | 372 | 19.9k | ref2->data[2], ref2->linesize[2], tref2, | 373 | 19.9k | (row << 3) + 4, col << 2, | 374 | 19.9k | &uvmv, 0, 4, 4, 8, 4, 4, w2, h2, 1); | 375 | 57.2k | } else { | 376 | 57.2k | mc_chroma_dir(td, mc[4][b->filter][1], | 377 | 57.2k | td->dst[1], td->dst[2], ls_uv, | 378 | 57.2k | ref2->data[1], ref2->linesize[1], | 379 | 57.2k | ref2->data[2], ref2->linesize[2], tref2, | 380 | 57.2k | row << 3, col << 3, | 381 | 57.2k | &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | 382 | 57.2k | mc_chroma_dir(td, mc[4][b->filter][1], | 383 | 57.2k | td->dst[1] + 4 * bytesperpixel, | 384 | 57.2k | td->dst[2] + 4 * bytesperpixel, ls_uv, | 385 | 57.2k | ref2->data[1], ref2->linesize[1], | 386 | 57.2k | ref2->data[2], ref2->linesize[2], tref2, | 387 | 57.2k | row << 3, (col << 3) + 4, | 388 | 57.2k | &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | 389 | 57.2k | mc_chroma_dir(td, mc[4][b->filter][1], | 390 | 57.2k | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | 391 | 57.2k | ref2->data[1], ref2->linesize[1], | 392 | 57.2k | ref2->data[2], ref2->linesize[2], tref2, | 393 | 57.2k | (row << 3) + 4, col << 3, | 394 | 57.2k | &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | 395 | 57.2k | mc_chroma_dir(td, mc[4][b->filter][1], | 396 | 57.2k | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | 397 | 57.2k | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | 398 | 57.2k | ref2->data[1], ref2->linesize[1], | 399 | 57.2k | ref2->data[2], ref2->linesize[2], tref2, | 400 | 57.2k | (row << 3) + 4, (col << 3) + 4, | 401 | 57.2k | &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | 402 | 57.2k | } | 403 | 77.1k | } | 404 | 128k | } | 405 | 338k | } | 406 | 1.65M | } else { | 407 | 1.65M | int bwl = bwlog_tab[0][b->bs]; | 408 | 1.65M | int bw = ff_vp9_bwh_tab[0][b->bs][0] * 4; | 409 | 1.65M | int bh = ff_vp9_bwh_tab[0][b->bs][1] * 4; | 410 | 1.65M | int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][0] * 4; | 411 | 1.65M | int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][1] * 4; | 412 | | | 413 | 1.65M | mc_luma_dir(td, mc[bwl][b->filter][0], td->dst[0], ls_y, | 414 | 1.65M | ref1->data[0], ref1->linesize[0], tref1, | 415 | 1.65M | row << 3, col << 3, &b->mv[0][0], 0, 0, bw, bh, bw, bh, w1, h1, 0); | 416 | 1.65M | w1 = (w1 + s->ss_h) >> s->ss_h; | 417 | 1.65M | h1 = (h1 + s->ss_v) >> s->ss_v; | 418 | 1.65M | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][0], | 419 | 1.65M | td->dst[1], td->dst[2], ls_uv, | 420 | 1.65M | ref1->data[1], ref1->linesize[1], | 421 | 1.65M | ref1->data[2], ref1->linesize[2], tref1, | 422 | 1.65M | row << (3 - s->ss_v), col << (3 - s->ss_h), | 423 | 1.65M | &b->mv[0][0], 0, 0, uvbw, uvbh, uvbw, uvbh, w1, h1, 0); | 424 | | | 425 | 1.65M | if (b->comp) { | 426 | 822k | mc_luma_dir(td, mc[bwl][b->filter][1], td->dst[0], ls_y, | 427 | 822k | ref2->data[0], ref2->linesize[0], tref2, | 428 | 822k | row << 3, col << 3, &b->mv[0][1], 0, 0, bw, bh, bw, bh, w2, h2, 1); | 429 | 822k | w2 = (w2 + s->ss_h) >> s->ss_h; | 430 | 822k | h2 = (h2 + s->ss_v) >> s->ss_v; | 431 | 822k | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][1], | 432 | 822k | td->dst[1], td->dst[2], ls_uv, | 433 | 822k | ref2->data[1], ref2->linesize[1], | 434 | 822k | ref2->data[2], ref2->linesize[2], tref2, | 435 | 822k | row << (3 - s->ss_v), col << (3 - s->ss_h), | 436 | 822k | &b->mv[0][1], 0, 0, uvbw, uvbh, uvbw, uvbh, w2, h2, 1); | 437 | 822k | } | 438 | 1.65M | } | 439 | 2.42M | } |
|