| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * VP9 compatible video decoder | ||
| 3 | * | ||
| 4 | * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com> | ||
| 5 | * Copyright (C) 2013 Clément Bœsch <u pkh me> | ||
| 6 | * | ||
| 7 | * This file is part of FFmpeg. | ||
| 8 | * | ||
| 9 | * FFmpeg is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU Lesser General Public | ||
| 11 | * License as published by the Free Software Foundation; either | ||
| 12 | * version 2.1 of the License, or (at your option) any later version. | ||
| 13 | * | ||
| 14 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * Lesser General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU Lesser General Public | ||
| 20 | * License along with FFmpeg; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 22 | */ | ||
| 23 | |||
| 24 | #define ROUNDED_DIV_MVx2(a, b) \ | ||
| 25 | (VP9mv) { .x = ROUNDED_DIV(a.x + b.x, 2), .y = ROUNDED_DIV(a.y + b.y, 2) } | ||
| 26 | #define ROUNDED_DIV_MVx4(a, b, c, d) \ | ||
| 27 | (VP9mv) { .x = ROUNDED_DIV(a.x + b.x + c.x + d.x, 4), \ | ||
| 28 | .y = ROUNDED_DIV(a.y + b.y + c.y + d.y, 4) } | ||
| 29 | |||
| 30 | 1060562 | static void FN(inter_pred)(VP9TileData *td) | |
| 31 | { | ||
| 32 | static const uint8_t bwlog_tab[2][N_BS_SIZES] = { | ||
| 33 | { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, | ||
| 34 | { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 }, | ||
| 35 | }; | ||
| 36 | 1060562 | const VP9Context *s = td->s; | |
| 37 | 1060562 | VP9Block *b = td->b; | |
| 38 | 1060562 | int row = td->row, col = td->col; | |
| 39 | 1060562 | const ProgressFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2; | |
| 40 | 1060562 | const AVFrame *ref1 = tref1->f, *ref2; | |
| 41 | 1060562 | int w1 = ref1->width, h1 = ref1->height, w2, h2; | |
| 42 | 1060562 | ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride; | |
| 43 | 1060562 | int bytesperpixel = BYTES_PER_PIXEL; | |
| 44 | |||
| 45 |
2/2✓ Branch 0 taken 27251 times.
✓ Branch 1 taken 503030 times.
|
1060562 | if (b->comp) { |
| 46 | 54502 | tref2 = &s->s.refs[s->s.h.refidx[b->ref[1]]]; | |
| 47 | 54502 | ref2 = tref2->f; | |
| 48 | 54502 | w2 = ref2->width; | |
| 49 | 54502 | h2 = ref2->height; | |
| 50 | } | ||
| 51 | |||
| 52 | // y inter pred | ||
| 53 |
2/2✓ Branch 0 taken 50153 times.
✓ Branch 1 taken 480128 times.
|
1060562 | if (b->bs > BS_8x8) { |
| 54 | VP9mv uvmv; | ||
| 55 | |||
| 56 | #if SCALED == 0 | ||
| 57 |
2/2✓ Branch 0 taken 17387 times.
✓ Branch 1 taken 32766 times.
|
100306 | if (b->bs == BS_8x4) { |
| 58 | 34774 | 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 | 34774 | 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 | 34774 | w1 = (w1 + s->ss_h) >> s->ss_h; | |
| 66 |
2/2✓ Branch 0 taken 16799 times.
✓ Branch 1 taken 588 times.
|
34774 | if (s->ss_v) { |
| 67 | 33598 | h1 = (h1 + 1) >> 1; | |
| 68 |
4/4✓ Branch 0 taken 14841 times.
✓ Branch 1 taken 1958 times.
✓ Branch 2 taken 9339 times.
✓ Branch 3 taken 7460 times.
|
33598 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); |
| 69 | 33598 | 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 | 1176 | 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 |
2/2✓ Branch 0 taken 243 times.
✓ Branch 1 taken 345 times.
|
1176 | if (s->ss_h == 0) { |
| 86 | 486 | uvmv = b->mv[2][0]; | |
| 87 | } else { | ||
| 88 |
4/4✓ Branch 0 taken 294 times.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 265 times.
✓ Branch 3 taken 80 times.
|
690 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); |
| 89 | } | ||
| 90 | 1176 | 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 |
2/2✓ Branch 0 taken 289 times.
✓ Branch 1 taken 17098 times.
|
34774 | if (b->comp) { |
| 99 | 578 | 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 | 578 | 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 | 578 | w2 = (w2 + s->ss_h) >> s->ss_h; | |
| 107 |
2/2✓ Branch 0 taken 168 times.
✓ Branch 1 taken 121 times.
|
578 | if (s->ss_v) { |
| 108 | 336 | h2 = (h2 + 1) >> 1; | |
| 109 |
4/4✓ Branch 0 taken 117 times.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 71 times.
✓ Branch 3 taken 97 times.
|
336 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); |
| 110 | 336 | 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 | 242 | 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 |
2/2✓ Branch 0 taken 47 times.
✓ Branch 1 taken 74 times.
|
242 | if (s->ss_h == 0) { |
| 127 | 94 | uvmv = b->mv[2][1]; | |
| 128 | } else { | ||
| 129 |
3/4✗ Branch 0 not taken.
✓ Branch 1 taken 74 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 2 times.
|
148 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); |
| 130 | } | ||
| 131 | 242 | 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 |
2/2✓ Branch 0 taken 15727 times.
✓ Branch 1 taken 17039 times.
|
65532 | } else if (b->bs == BS_4x8) { |
| 140 | 31454 | 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 | 31454 | 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 | 31454 | h1 = (h1 + s->ss_v) >> s->ss_v; | |
| 147 |
2/2✓ Branch 0 taken 13925 times.
✓ Branch 1 taken 1802 times.
|
31454 | if (s->ss_h) { |
| 148 | 27850 | w1 = (w1 + 1) >> 1; | |
| 149 |
4/4✓ Branch 0 taken 11385 times.
✓ Branch 1 taken 2540 times.
✓ Branch 2 taken 9380 times.
✓ Branch 3 taken 4545 times.
|
27850 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); |
| 150 | 27850 | 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 | 3604 | 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 | 3604 | 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 |
2/2✓ Branch 0 taken 413 times.
✓ Branch 1 taken 15314 times.
|
31454 | if (b->comp) { |
| 173 | 826 | 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 | 826 | 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 | 826 | h2 = (h2 + s->ss_v) >> s->ss_v; | |
| 180 |
2/2✓ Branch 0 taken 188 times.
✓ Branch 1 taken 225 times.
|
826 | if (s->ss_h) { |
| 181 | 376 | w2 = (w2 + 1) >> 1; | |
| 182 |
4/4✓ Branch 0 taken 141 times.
✓ Branch 1 taken 47 times.
✓ Branch 2 taken 66 times.
✓ Branch 3 taken 122 times.
|
376 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); |
| 183 | 376 | 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 | 450 | 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 | 450 | 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 | { | ||
| 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 | 34078 | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y, | |
| 215 | ref1->data[0], ref1->linesize[0], tref1, | ||
| 216 | row << 3, col << 3, &b->mv[0][0], | ||
| 217 | 0, 0, 8, 8, 4, 4, w1, h1, 0); | ||
| 218 | 34078 | mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y, | |
| 219 | ref1->data[0], ref1->linesize[0], tref1, | ||
| 220 | row << 3, (col << 3) + 4, &b->mv[1][0], | ||
| 221 | 4, 0, 8, 8, 4, 4, w1, h1, 0); | ||
| 222 | 34078 | mc_luma_dir(td, mc[4][b->filter][0], | |
| 223 | td->dst[0] + 4 * ls_y, ls_y, | ||
| 224 | ref1->data[0], ref1->linesize[0], tref1, | ||
| 225 | (row << 3) + 4, col << 3, &b->mv[2][0], | ||
| 226 | 0, 4, 8, 8, 4, 4, w1, h1, 0); | ||
| 227 | 34078 | mc_luma_dir(td, mc[4][b->filter][0], | |
| 228 | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | ||
| 229 | ref1->data[0], ref1->linesize[0], tref1, | ||
| 230 | (row << 3) + 4, (col << 3) + 4, &b->mv[3][0], | ||
| 231 | 4, 4, 8, 8, 4, 4, w1, h1, 0); | ||
| 232 |
2/2✓ Branch 0 taken 16075 times.
✓ Branch 1 taken 964 times.
|
34078 | if (s->ss_v) { |
| 233 | 32150 | h1 = (h1 + 1) >> 1; | |
| 234 |
2/2✓ Branch 0 taken 15448 times.
✓ Branch 1 taken 627 times.
|
32150 | if (s->ss_h) { |
| 235 | 30896 | w1 = (w1 + 1) >> 1; | |
| 236 |
4/4✓ Branch 0 taken 11181 times.
✓ Branch 1 taken 4267 times.
✓ Branch 2 taken 9952 times.
✓ Branch 3 taken 5496 times.
|
30896 | uvmv = ROUNDED_DIV_MVx4(b->mv[0][0], b->mv[1][0], |
| 237 | b->mv[2][0], b->mv[3][0]); | ||
| 238 | 30896 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 239 | td->dst[1], td->dst[2], ls_uv, | ||
| 240 | ref1->data[1], ref1->linesize[1], | ||
| 241 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 242 | row << 2, col << 2, | ||
| 243 | &uvmv, 0, 0, 4, 4, 4, 4, w1, h1, 0); | ||
| 244 | } else { | ||
| 245 |
4/4✓ Branch 0 taken 504 times.
✓ Branch 1 taken 123 times.
✓ Branch 2 taken 441 times.
✓ Branch 3 taken 186 times.
|
1254 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]); |
| 246 | 1254 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 247 | td->dst[1], td->dst[2], ls_uv, | ||
| 248 | ref1->data[1], ref1->linesize[1], | ||
| 249 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 250 | row << 2, col << 3, | ||
| 251 | &uvmv, 0, 0, 8, 4, 4, 4, w1, h1, 0); | ||
| 252 |
4/4✓ Branch 0 taken 480 times.
✓ Branch 1 taken 147 times.
✓ Branch 2 taken 439 times.
✓ Branch 3 taken 188 times.
|
1254 | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[3][0]); |
| 253 | 1254 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 254 | td->dst[1] + 4 * bytesperpixel, | ||
| 255 | td->dst[2] + 4 * bytesperpixel, ls_uv, | ||
| 256 | ref1->data[1], ref1->linesize[1], | ||
| 257 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 258 | row << 2, (col << 3) + 4, | ||
| 259 | &uvmv, 4, 0, 8, 4, 4, 4, w1, h1, 0); | ||
| 260 | } | ||
| 261 | } else { | ||
| 262 |
2/2✓ Branch 0 taken 689 times.
✓ Branch 1 taken 275 times.
|
1928 | if (s->ss_h) { |
| 263 | 1378 | w1 = (w1 + 1) >> 1; | |
| 264 |
4/4✓ Branch 0 taken 563 times.
✓ Branch 1 taken 126 times.
✓ Branch 2 taken 532 times.
✓ Branch 3 taken 157 times.
|
1378 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]); |
| 265 | 1378 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 266 | td->dst[1], td->dst[2], ls_uv, | ||
| 267 | ref1->data[1], ref1->linesize[1], | ||
| 268 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 269 | row << 3, col << 2, | ||
| 270 | &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 |
4/4✓ Branch 0 taken 563 times.
✓ Branch 1 taken 126 times.
✓ Branch 2 taken 515 times.
✓ Branch 3 taken 174 times.
|
1378 | uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[2][0]); |
| 275 | 1378 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 276 | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | ||
| 277 | ref1->data[1], ref1->linesize[1], | ||
| 278 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 279 | (row << 3) + 4, col << 2, | ||
| 280 | &uvmv, 0, 4, 4, 8, 4, 4, w1, h1, 0); | ||
| 281 | } else { | ||
| 282 | 550 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 283 | td->dst[1], td->dst[2], ls_uv, | ||
| 284 | ref1->data[1], ref1->linesize[1], | ||
| 285 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 286 | row << 3, col << 3, | ||
| 287 | &b->mv[0][0], 0, 0, 8, 8, 4, 4, w1, h1, 0); | ||
| 288 | 550 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 289 | td->dst[1] + 4 * bytesperpixel, | ||
| 290 | td->dst[2] + 4 * bytesperpixel, ls_uv, | ||
| 291 | ref1->data[1], ref1->linesize[1], | ||
| 292 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 293 | row << 3, (col << 3) + 4, | ||
| 294 | &b->mv[1][0], 4, 0, 8, 8, 4, 4, w1, h1, 0); | ||
| 295 | 550 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 296 | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | ||
| 297 | ref1->data[1], ref1->linesize[1], | ||
| 298 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 299 | (row << 3) + 4, col << 3, | ||
| 300 | &b->mv[2][0], 0, 4, 8, 8, 4, 4, w1, h1, 0); | ||
| 301 | 550 | mc_chroma_dir(td, mc[4][b->filter][0], | |
| 302 | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | ||
| 303 | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | ||
| 304 | ref1->data[1], ref1->linesize[1], | ||
| 305 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 306 | (row << 3) + 4, (col << 3) + 4, | ||
| 307 | &b->mv[3][0], 4, 4, 8, 8, 4, 4, w1, h1, 0); | ||
| 308 | } | ||
| 309 | } | ||
| 310 | |||
| 311 |
2/2✓ Branch 0 taken 221 times.
✓ Branch 1 taken 16818 times.
|
34078 | if (b->comp) { |
| 312 | 442 | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y, | |
| 313 | ref2->data[0], ref2->linesize[0], tref2, | ||
| 314 | row << 3, col << 3, &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | ||
| 315 | 442 | mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y, | |
| 316 | ref2->data[0], ref2->linesize[0], tref2, | ||
| 317 | row << 3, (col << 3) + 4, &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | ||
| 318 | 442 | mc_luma_dir(td, mc[4][b->filter][1], | |
| 319 | td->dst[0] + 4 * ls_y, ls_y, | ||
| 320 | ref2->data[0], ref2->linesize[0], tref2, | ||
| 321 | (row << 3) + 4, col << 3, &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | ||
| 322 | 442 | mc_luma_dir(td, mc[4][b->filter][1], | |
| 323 | td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y, | ||
| 324 | ref2->data[0], ref2->linesize[0], tref2, | ||
| 325 | (row << 3) + 4, (col << 3) + 4, &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | ||
| 326 |
2/2✓ Branch 0 taken 154 times.
✓ Branch 1 taken 67 times.
|
442 | if (s->ss_v) { |
| 327 | 308 | h2 = (h2 + 1) >> 1; | |
| 328 |
2/2✓ Branch 0 taken 74 times.
✓ Branch 1 taken 80 times.
|
308 | if (s->ss_h) { |
| 329 | 148 | w2 = (w2 + 1) >> 1; | |
| 330 |
4/4✓ Branch 0 taken 48 times.
✓ Branch 1 taken 26 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 44 times.
|
148 | uvmv = ROUNDED_DIV_MVx4(b->mv[0][1], b->mv[1][1], |
| 331 | b->mv[2][1], b->mv[3][1]); | ||
| 332 | 148 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 333 | td->dst[1], td->dst[2], ls_uv, | ||
| 334 | ref2->data[1], ref2->linesize[1], | ||
| 335 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 336 | row << 2, col << 2, | ||
| 337 | &uvmv, 0, 0, 4, 4, 4, 4, w2, h2, 1); | ||
| 338 | } else { | ||
| 339 |
4/4✓ Branch 0 taken 25 times.
✓ Branch 1 taken 55 times.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 20 times.
|
160 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]); |
| 340 | 160 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 341 | td->dst[1], td->dst[2], ls_uv, | ||
| 342 | ref2->data[1], ref2->linesize[1], | ||
| 343 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 344 | row << 2, col << 3, | ||
| 345 | &uvmv, 0, 0, 8, 4, 4, 4, w2, h2, 1); | ||
| 346 |
4/4✓ Branch 0 taken 29 times.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 59 times.
✓ Branch 3 taken 21 times.
|
160 | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[3][1]); |
| 347 | 160 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 348 | td->dst[1] + 4 * bytesperpixel, | ||
| 349 | td->dst[2] + 4 * bytesperpixel, ls_uv, | ||
| 350 | ref2->data[1], ref2->linesize[1], | ||
| 351 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 352 | row << 2, (col << 3) + 4, | ||
| 353 | &uvmv, 4, 0, 8, 4, 4, 4, w2, h2, 1); | ||
| 354 | } | ||
| 355 | } else { | ||
| 356 |
2/2✓ Branch 0 taken 42 times.
✓ Branch 1 taken 25 times.
|
134 | if (s->ss_h) { |
| 357 | 84 | w2 = (w2 + 1) >> 1; | |
| 358 |
3/4✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 3 times.
|
84 | uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]); |
| 359 | 84 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 360 | td->dst[1], td->dst[2], ls_uv, | ||
| 361 | ref2->data[1], ref2->linesize[1], | ||
| 362 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 363 | row << 3, col << 2, | ||
| 364 | &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 |
4/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 40 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 5 times.
|
84 | uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[2][1]); |
| 369 | 84 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 370 | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | ||
| 371 | ref2->data[1], ref2->linesize[1], | ||
| 372 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 373 | (row << 3) + 4, col << 2, | ||
| 374 | &uvmv, 0, 4, 4, 8, 4, 4, w2, h2, 1); | ||
| 375 | } else { | ||
| 376 | 50 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 377 | td->dst[1], td->dst[2], ls_uv, | ||
| 378 | ref2->data[1], ref2->linesize[1], | ||
| 379 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 380 | row << 3, col << 3, | ||
| 381 | &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1); | ||
| 382 | 50 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 383 | td->dst[1] + 4 * bytesperpixel, | ||
| 384 | td->dst[2] + 4 * bytesperpixel, ls_uv, | ||
| 385 | ref2->data[1], ref2->linesize[1], | ||
| 386 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 387 | row << 3, (col << 3) + 4, | ||
| 388 | &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1); | ||
| 389 | 50 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 390 | td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv, | ||
| 391 | ref2->data[1], ref2->linesize[1], | ||
| 392 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 393 | (row << 3) + 4, col << 3, | ||
| 394 | &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1); | ||
| 395 | 50 | mc_chroma_dir(td, mc[4][b->filter][1], | |
| 396 | td->dst[1] + 4 * ls_uv + 4 * bytesperpixel, | ||
| 397 | td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv, | ||
| 398 | ref2->data[1], ref2->linesize[1], | ||
| 399 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 400 | (row << 3) + 4, (col << 3) + 4, | ||
| 401 | &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1); | ||
| 402 | } | ||
| 403 | } | ||
| 404 | } | ||
| 405 | } | ||
| 406 | } else { | ||
| 407 | 960256 | int bwl = bwlog_tab[0][b->bs]; | |
| 408 | 960256 | int bw = ff_vp9_bwh_tab[0][b->bs][0] * 4; | |
| 409 | 960256 | int bh = ff_vp9_bwh_tab[0][b->bs][1] * 4; | |
| 410 | 960256 | int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][0] * 4; | |
| 411 | 960256 | int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][1] * 4; | |
| 412 | |||
| 413 | 960256 | mc_luma_dir(td, mc[bwl][b->filter][0], td->dst[0], ls_y, | |
| 414 | ref1->data[0], ref1->linesize[0], tref1, | ||
| 415 | row << 3, col << 3, &b->mv[0][0], 0, 0, bw, bh, bw, bh, w1, h1, 0); | ||
| 416 | 960256 | w1 = (w1 + s->ss_h) >> s->ss_h; | |
| 417 | 960256 | h1 = (h1 + s->ss_v) >> s->ss_v; | |
| 418 | 960256 | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][0], | |
| 419 | td->dst[1], td->dst[2], ls_uv, | ||
| 420 | ref1->data[1], ref1->linesize[1], | ||
| 421 | ref1->data[2], ref1->linesize[2], tref1, | ||
| 422 | row << (3 - s->ss_v), col << (3 - s->ss_h), | ||
| 423 | &b->mv[0][0], 0, 0, uvbw, uvbh, uvbw, uvbh, w1, h1, 0); | ||
| 424 | |||
| 425 |
2/2✓ Branch 0 taken 26328 times.
✓ Branch 1 taken 453800 times.
|
960256 | if (b->comp) { |
| 426 | 52656 | mc_luma_dir(td, mc[bwl][b->filter][1], td->dst[0], ls_y, | |
| 427 | ref2->data[0], ref2->linesize[0], tref2, | ||
| 428 | row << 3, col << 3, &b->mv[0][1], 0, 0, bw, bh, bw, bh, w2, h2, 1); | ||
| 429 | 52656 | w2 = (w2 + s->ss_h) >> s->ss_h; | |
| 430 | 52656 | h2 = (h2 + s->ss_v) >> s->ss_v; | |
| 431 | 52656 | mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][1], | |
| 432 | td->dst[1], td->dst[2], ls_uv, | ||
| 433 | ref2->data[1], ref2->linesize[1], | ||
| 434 | ref2->data[2], ref2->linesize[2], tref2, | ||
| 435 | row << (3 - s->ss_v), col << (3 - s->ss_h), | ||
| 436 | &b->mv[0][1], 0, 0, uvbw, uvbh, uvbw, uvbh, w2, h2, 1); | ||
| 437 | } | ||
| 438 | } | ||
| 439 | 1060562 | } | |
| 440 |