FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vp9_mc_template.c
Date: 2021-09-16 08:47:15
Exec Total Coverage
Lines: 124 124 100.0%
Branches: 102 104 98.1%

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 (VP56mv) { .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 (VP56mv) { .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 VP9Context *s = td->s;
37 1060562 VP9Block *b = td->b;
38 1060562 int row = td->row, col = td->col;
39 1060562 ThreadFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2;
40 1060562 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 VP56mv 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 }
440