FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hevc_mvs.c
Date: 2024-04-25 15:36:26
Exec Total Coverage
Lines: 404 408 99.0%
Functions: 14 14 100.0%
Branches: 371 384 96.6%

Line Branch Exec Source
1 /*
2 * HEVC video decoder
3 *
4 * Copyright (C) 2012 - 2013 Guillaume Martres
5 * Copyright (C) 2013 Anand Meher Kotra
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 #include "hevc.h"
25 #include "hevcdec.h"
26 #include "progressframe.h"
27
28 static const uint8_t l0_l1_cand_idx[12][2] = {
29 { 0, 1, },
30 { 1, 0, },
31 { 0, 2, },
32 { 2, 0, },
33 { 1, 2, },
34 { 2, 1, },
35 { 0, 3, },
36 { 3, 0, },
37 { 1, 3, },
38 { 3, 1, },
39 { 2, 3, },
40 { 3, 2, },
41 };
42
43 28053916 void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0,
44 int nPbW, int nPbH)
45 {
46 28053916 const HEVCContext *const s = lc->parent;
47 28053916 int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
48 28053916 int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
49
50
4/4
✓ Branch 0 taken 4513101 times.
✓ Branch 1 taken 23540815 times.
✓ Branch 2 taken 3691419 times.
✓ Branch 3 taken 821682 times.
28053916 lc->na.cand_up = (lc->ctb_up_flag || y0b);
51
4/4
✓ Branch 0 taken 2310111 times.
✓ Branch 1 taken 25743805 times.
✓ Branch 2 taken 1886309 times.
✓ Branch 3 taken 423802 times.
28053916 lc->na.cand_left = (lc->ctb_left_flag || x0b);
52
8/8
✓ Branch 0 taken 5341068 times.
✓ Branch 1 taken 22712848 times.
✓ Branch 2 taken 3509157 times.
✓ Branch 3 taken 1831911 times.
✓ Branch 4 taken 25943924 times.
✓ Branch 5 taken 278081 times.
✓ Branch 6 taken 25404419 times.
✓ Branch 7 taken 539505 times.
28053916 lc->na.cand_up_left = (x0b || y0b) ? lc->na.cand_left && lc->na.cand_up : lc->ctb_up_left_flag;
53 28053916 lc->na.cand_up_right_sap =
54 28053916 (x0b + nPbW == 1 << s->ps.sps->log2_ctb_size) ?
55
6/6
✓ Branch 0 taken 5256791 times.
✓ Branch 1 taken 22797125 times.
✓ Branch 2 taken 4332575 times.
✓ Branch 3 taken 924216 times.
✓ Branch 4 taken 1484055 times.
✓ Branch 5 taken 2848520 times.
28053916 lc->ctb_up_right_flag && !y0b : lc->na.cand_up;
56 28053916 lc->na.cand_up_right =
57 28053916 lc->na.cand_up_right_sap
58
4/4
✓ Branch 0 taken 23733683 times.
✓ Branch 1 taken 4320233 times.
✓ Branch 2 taken 23612382 times.
✓ Branch 3 taken 121301 times.
28053916 && (x0 + nPbW) < lc->end_of_tiles_x;
59
2/2
✓ Branch 0 taken 22509643 times.
✓ Branch 1 taken 5544273 times.
28053916 lc->na.cand_bottom_left = ((y0 + nPbH) >= lc->end_of_tiles_y) ? 0 : lc->na.cand_left;
60 28053916 }
61
62 /*
63 * 6.4.1 Derivation process for z-scan order block availability
64 */
65 5299517 static av_always_inline int z_scan_block_avail(const HEVCContext *s, int xCurr, int yCurr,
66 int xN, int yN)
67 {
68 #define MIN_TB_ADDR_ZS(x, y) \
69 s->ps.pps->min_tb_addr_zs[(y) * (s->ps.sps->tb_mask+2) + (x)]
70
71 5299517 int xCurr_ctb = xCurr >> s->ps.sps->log2_ctb_size;
72 5299517 int yCurr_ctb = yCurr >> s->ps.sps->log2_ctb_size;
73 5299517 int xN_ctb = xN >> s->ps.sps->log2_ctb_size;
74 5299517 int yN_ctb = yN >> s->ps.sps->log2_ctb_size;
75
4/4
✓ Branch 0 taken 4415166 times.
✓ Branch 1 taken 884351 times.
✓ Branch 2 taken 517130 times.
✓ Branch 3 taken 3898036 times.
5299517 if( yN_ctb < yCurr_ctb || xN_ctb < xCurr_ctb )
76 1401481 return 1;
77 else {
78 3898036 int Curr = MIN_TB_ADDR_ZS((xCurr >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask,
79 (yCurr >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask);
80 3898036 int N = MIN_TB_ADDR_ZS((xN >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask,
81 (yN >> s->ps.sps->log2_min_tb_size) & s->ps.sps->tb_mask);
82 3898036 return N <= Curr;
83 }
84 }
85
86 //check if the two luma locations belong to the same motion estimation region
87 11126307 static av_always_inline int is_diff_mer(const HEVCContext *s, int xN, int yN, int xP, int yP)
88 {
89 11126307 uint8_t plevel = s->ps.pps->log2_parallel_merge_level;
90
91
2/2
✓ Branch 0 taken 755253 times.
✓ Branch 1 taken 10371054 times.
11881560 return xN >> plevel == xP >> plevel &&
92
2/2
✓ Branch 0 taken 421308 times.
✓ Branch 1 taken 333945 times.
755253 yN >> plevel == yP >> plevel;
93 }
94
95 #define MATCH_MV(x) (AV_RN32A(&A.x) == AV_RN32A(&B.x))
96 #define MATCH(x) (A.x == B.x)
97
98 // check if the mv's and refidx are the same between A and B
99 4418141 static av_always_inline int compare_mv_ref_idx(struct MvField A, struct MvField B)
100 {
101 4418141 int a_pf = A.pred_flag;
102 4418141 int b_pf = B.pred_flag;
103
2/2
✓ Branch 0 taken 3288975 times.
✓ Branch 1 taken 1129166 times.
4418141 if (a_pf == b_pf) {
104
2/2
✓ Branch 0 taken 1773399 times.
✓ Branch 1 taken 1515576 times.
3288975 if (a_pf == PF_BI) {
105
2/2
✓ Branch 0 taken 908561 times.
✓ Branch 1 taken 695231 times.
1603792 return MATCH(ref_idx[0]) && MATCH_MV(mv[0]) &&
106
6/6
✓ Branch 0 taken 1603792 times.
✓ Branch 1 taken 169607 times.
✓ Branch 2 taken 889451 times.
✓ Branch 3 taken 19110 times.
✓ Branch 4 taken 812923 times.
✓ Branch 5 taken 76528 times.
3377191 MATCH(ref_idx[1]) && MATCH_MV(mv[1]);
107
2/2
✓ Branch 0 taken 1333601 times.
✓ Branch 1 taken 181975 times.
1515576 } else if (a_pf == PF_L0) {
108
4/4
✓ Branch 0 taken 1045090 times.
✓ Branch 1 taken 288511 times.
✓ Branch 2 taken 505321 times.
✓ Branch 3 taken 539769 times.
1333601 return MATCH(ref_idx[0]) && MATCH_MV(mv[0]);
109
1/2
✓ Branch 0 taken 181975 times.
✗ Branch 1 not taken.
181975 } else if (a_pf == PF_L1) {
110
4/4
✓ Branch 0 taken 174398 times.
✓ Branch 1 taken 7577 times.
✓ Branch 2 taken 105500 times.
✓ Branch 3 taken 68898 times.
181975 return MATCH(ref_idx[1]) && MATCH_MV(mv[1]);
111 }
112 }
113 1129166 return 0;
114 }
115
116 2294423 static av_always_inline void mv_scale(Mv *dst, const Mv *src, int td, int tb)
117 {
118 int tx, scale_factor;
119
120 2294423 td = av_clip_int8(td);
121 2294423 tb = av_clip_int8(tb);
122 2294423 tx = (0x4000 + abs(td / 2)) / td;
123 2294423 scale_factor = av_clip_intp2((tb * tx + 32) >> 6, 12);
124 2294423 dst->x = av_clip_int16((scale_factor * src->x + 127 +
125 2294423 (scale_factor * src->x < 0)) >> 8);
126 2294423 dst->y = av_clip_int16((scale_factor * src->y + 127 +
127 2294423 (scale_factor * src->y < 0)) >> 8);
128 2294423 }
129
130 1786330 static int check_mvset(Mv *mvLXCol, const Mv *mvCol,
131 int colPic, int poc,
132 const RefPicList *refPicList, int X, int refIdxLx,
133 const RefPicList *refPicList_col, int listCol, int refidxCol)
134 {
135 1786330 int cur_lt = refPicList[X].isLongTerm[refIdxLx];
136 1786330 int col_lt = refPicList_col[listCol].isLongTerm[refidxCol];
137 int col_poc_diff, cur_poc_diff;
138
139
2/2
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 1784890 times.
1786330 if (cur_lt != col_lt) {
140 1440 mvLXCol->x = 0;
141 1440 mvLXCol->y = 0;
142 1440 return 0;
143 }
144
145 1784890 col_poc_diff = colPic - refPicList_col[listCol].list[refidxCol];
146 1784890 cur_poc_diff = poc - refPicList[X].list[refIdxLx];
147
148
5/6
✓ Branch 0 taken 1783795 times.
✓ Branch 1 taken 1095 times.
✓ Branch 2 taken 1451627 times.
✓ Branch 3 taken 332168 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1451627 times.
1784890 if (cur_lt || col_poc_diff == cur_poc_diff || !col_poc_diff) {
149 333263 mvLXCol->x = mvCol->x;
150 333263 mvLXCol->y = mvCol->y;
151 } else {
152 1451627 mv_scale(mvLXCol, mvCol, col_poc_diff, cur_poc_diff);
153 }
154 1784890 return 1;
155 }
156
157 #define CHECK_MVSET(l) \
158 check_mvset(mvLXCol, temp_col.mv + l, \
159 colPic, s->poc, \
160 refPicList, X, refIdxLx, \
161 refPicList_col, L ## l, temp_col.ref_idx[l])
162
163 // derive the motion vectors section 8.5.3.1.8
164 2231062 static int derive_temporal_colocated_mvs(const HEVCContext *s, MvField temp_col,
165 int refIdxLx, Mv *mvLXCol, int X,
166 int colPic, const RefPicList *refPicList_col)
167 {
168 2231062 const RefPicList *refPicList = s->ref->refPicList;
169
170
2/2
✓ Branch 0 taken 444732 times.
✓ Branch 1 taken 1786330 times.
2231062 if (temp_col.pred_flag == PF_INTRA)
171 444732 return 0;
172
173
2/2
✓ Branch 0 taken 210994 times.
✓ Branch 1 taken 1575336 times.
1786330 if (!(temp_col.pred_flag & PF_L0))
174 210994 return CHECK_MVSET(1);
175
2/2
✓ Branch 0 taken 748992 times.
✓ Branch 1 taken 826344 times.
1575336 else if (temp_col.pred_flag == PF_L0)
176 748992 return CHECK_MVSET(0);
177
1/2
✓ Branch 0 taken 826344 times.
✗ Branch 1 not taken.
826344 else if (temp_col.pred_flag == PF_BI) {
178 826344 int check_diffpicount = 0;
179 int i, j;
180
2/2
✓ Branch 0 taken 1652688 times.
✓ Branch 1 taken 826344 times.
2479032 for (j = 0; j < 2; j++) {
181
2/2
✓ Branch 0 taken 3539979 times.
✓ Branch 1 taken 921783 times.
4461762 for (i = 0; i < refPicList[j].nb_refs; i++) {
182
2/2
✓ Branch 0 taken 730905 times.
✓ Branch 1 taken 2809074 times.
3539979 if (refPicList[j].list[i] > s->poc) {
183 730905 check_diffpicount++;
184 730905 break;
185 }
186 }
187 }
188
2/2
✓ Branch 0 taken 237536 times.
✓ Branch 1 taken 588808 times.
826344 if (!check_diffpicount) {
189
2/2
✓ Branch 0 taken 133677 times.
✓ Branch 1 taken 103859 times.
237536 if (X==0)
190 133677 return CHECK_MVSET(0);
191 else
192 103859 return CHECK_MVSET(1);
193 } else {
194
2/2
✓ Branch 0 taken 327399 times.
✓ Branch 1 taken 261409 times.
588808 if (s->sh.collocated_list == L1)
195 327399 return CHECK_MVSET(0);
196 else
197 261409 return CHECK_MVSET(1);
198 }
199 }
200
201 return 0;
202 }
203
204 #define TAB_MVF(x, y) \
205 tab_mvf[(y) * min_pu_width + x]
206
207 #define TAB_MVF_PU(v) \
208 TAB_MVF(((x ## v) >> s->ps.sps->log2_min_pu_size), \
209 ((y ## v) >> s->ps.sps->log2_min_pu_size))
210
211 #define DERIVE_TEMPORAL_COLOCATED_MVS \
212 derive_temporal_colocated_mvs(s, temp_col, \
213 refIdxLx, mvLXCol, X, colPic, \
214 ff_hevc_get_ref_list(s, ref, x, y))
215
216 /*
217 * 8.5.3.1.7 temporal luma motion vector prediction
218 */
219 2000681 static int temporal_luma_motion_vector(const HEVCContext *s, int x0, int y0,
220 int nPbW, int nPbH, int refIdxLx,
221 Mv *mvLXCol, int X)
222 {
223 const MvField *tab_mvf;
224 MvField temp_col;
225 int x, y, x_pu, y_pu;
226 2000681 int min_pu_width = s->ps.sps->min_pu_width;
227 2000681 int availableFlagLXCol = 0;
228 int colPic;
229
230 2000681 const HEVCFrame *ref = s->collocated_ref;
231
232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2000681 times.
2000681 if (!ref) {
233 memset(mvLXCol, 0, sizeof(*mvLXCol));
234 return 0;
235 }
236
237 2000681 tab_mvf = ref->tab_mvf;
238 2000681 colPic = ref->poc;
239
240 //bottom right collocated motion vector
241 2000681 x = x0 + nPbW;
242 2000681 y = y0 + nPbH;
243
244
1/2
✓ Branch 0 taken 2000681 times.
✗ Branch 1 not taken.
2000681 if (tab_mvf &&
245
2/2
✓ Branch 0 taken 1434522 times.
✓ Branch 1 taken 566159 times.
2000681 (y0 >> s->ps.sps->log2_ctb_size) == (y >> s->ps.sps->log2_ctb_size) &&
246
2/2
✓ Branch 0 taken 1387860 times.
✓ Branch 1 taken 46662 times.
1434522 y < s->ps.sps->height &&
247
2/2
✓ Branch 0 taken 1365898 times.
✓ Branch 1 taken 21962 times.
1387860 x < s->ps.sps->width) {
248 1365898 x &= ~15;
249 1365898 y &= ~15;
250
2/2
✓ Branch 0 taken 1443 times.
✓ Branch 1 taken 1364455 times.
1365898 if (s->threads_type == FF_THREAD_FRAME)
251 1443 ff_progress_frame_await(&ref->tf, y);
252 1365898 x_pu = x >> s->ps.sps->log2_min_pu_size;
253 1365898 y_pu = y >> s->ps.sps->log2_min_pu_size;
254 1365898 temp_col = TAB_MVF(x_pu, y_pu);
255 1365898 availableFlagLXCol = DERIVE_TEMPORAL_COLOCATED_MVS;
256 }
257
258 // derive center collocated motion vector
259
3/4
✓ Branch 0 taken 2000681 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 865164 times.
✓ Branch 3 taken 1135517 times.
2000681 if (tab_mvf && !availableFlagLXCol) {
260 865164 x = x0 + (nPbW >> 1);
261 865164 y = y0 + (nPbH >> 1);
262 865164 x &= ~15;
263 865164 y &= ~15;
264
2/2
✓ Branch 0 taken 1167 times.
✓ Branch 1 taken 863997 times.
865164 if (s->threads_type == FF_THREAD_FRAME)
265 1167 ff_progress_frame_await(&ref->tf, y);
266 865164 x_pu = x >> s->ps.sps->log2_min_pu_size;
267 865164 y_pu = y >> s->ps.sps->log2_min_pu_size;
268 865164 temp_col = TAB_MVF(x_pu, y_pu);
269 865164 availableFlagLXCol = DERIVE_TEMPORAL_COLOCATED_MVS;
270 }
271 2000681 return availableFlagLXCol;
272 }
273
274 #define AVAILABLE(cand, v) \
275 (cand && !(TAB_MVF_PU(v).pred_flag == PF_INTRA))
276
277 #define PRED_BLOCK_AVAILABLE(v) \
278 z_scan_block_avail(s, x0, y0, x ## v, y ## v)
279
280 #define COMPARE_MV_REFIDX(a, b) \
281 compare_mv_ref_idx(TAB_MVF_PU(a), TAB_MVF_PU(b))
282
283 /*
284 * 8.5.3.1.2 Derivation process for spatial merging candidates
285 */
286 6229489 static void derive_spatial_merge_candidates(HEVCLocalContext *lc, const HEVCContext *s,
287 int x0, int y0,
288 int nPbW, int nPbH,
289 int log2_cb_size,
290 int singleMCLFlag, int part_idx,
291 int merge_idx,
292 struct MvField mergecandlist[])
293 {
294 6229489 const RefPicList *refPicList = s->ref->refPicList;
295 6229489 const MvField *tab_mvf = s->ref->tab_mvf;
296
297 6229489 const int min_pu_width = s->ps.sps->min_pu_width;
298
299 6229489 const int cand_bottom_left = lc->na.cand_bottom_left;
300 6229489 const int cand_left = lc->na.cand_left;
301 6229489 const int cand_up_left = lc->na.cand_up_left;
302 6229489 const int cand_up = lc->na.cand_up;
303 6229489 const int cand_up_right = lc->na.cand_up_right_sap;
304
305 6229489 const int xA1 = x0 - 1;
306 6229489 const int yA1 = y0 + nPbH - 1;
307
308 6229489 const int xB1 = x0 + nPbW - 1;
309 6229489 const int yB1 = y0 - 1;
310
311 6229489 const int xB0 = x0 + nPbW;
312 6229489 const int yB0 = y0 - 1;
313
314 6229489 const int xA0 = x0 - 1;
315 6229489 const int yA0 = y0 + nPbH;
316
317 6229489 const int xB2 = x0 - 1;
318 6229489 const int yB2 = y0 - 1;
319
320 12458978 const int nb_refs = (s->sh.slice_type == HEVC_SLICE_P) ?
321
2/2
✓ Branch 0 taken 1404085 times.
✓ Branch 1 taken 4825404 times.
6229489 s->sh.nb_refs[0] : FFMIN(s->sh.nb_refs[0], s->sh.nb_refs[1]);
322
323 6229489 int zero_idx = 0;
324
325 6229489 int nb_merge_cand = 0;
326 6229489 int nb_orig_merge_cand = 0;
327
328 int is_available_a0;
329 int is_available_a1;
330 int is_available_b0;
331 int is_available_b1;
332 int is_available_b2;
333
334
335
4/4
✓ Branch 0 taken 6014854 times.
✓ Branch 1 taken 214635 times.
✓ Branch 2 taken 668749 times.
✓ Branch 3 taken 5346105 times.
6229489 if (!singleMCLFlag && part_idx == 1 &&
336
2/2
✓ Branch 0 taken 404624 times.
✓ Branch 1 taken 264125 times.
668749 (lc->cu.part_mode == PART_Nx2N ||
337
2/2
✓ Branch 0 taken 358427 times.
✓ Branch 1 taken 46197 times.
404624 lc->cu.part_mode == PART_nLx2N ||
338
4/4
✓ Branch 0 taken 308969 times.
✓ Branch 1 taken 49458 times.
✓ Branch 2 taken 138388 times.
✓ Branch 3 taken 5731321 times.
6228136 lc->cu.part_mode == PART_nRx2N) ||
339 5869709 is_diff_mer(s, xA1, yA1, x0, y0)) {
340 498168 is_available_a1 = 0;
341 } else {
342
4/4
✓ Branch 0 taken 5605494 times.
✓ Branch 1 taken 125827 times.
✓ Branch 2 taken 5356735 times.
✓ Branch 3 taken 248759 times.
5731321 is_available_a1 = AVAILABLE(cand_left, A1);
343
2/2
✓ Branch 0 taken 5356735 times.
✓ Branch 1 taken 374586 times.
5731321 if (is_available_a1) {
344 5356735 mergecandlist[nb_merge_cand] = TAB_MVF_PU(A1);
345
2/2
✓ Branch 0 taken 3187874 times.
✓ Branch 1 taken 2168861 times.
5356735 if (merge_idx == 0)
346 3187874 return;
347 2168861 nb_merge_cand++;
348 }
349 }
350
351
4/4
✓ Branch 0 taken 2863023 times.
✓ Branch 1 taken 178592 times.
✓ Branch 2 taken 521112 times.
✓ Branch 3 taken 2341911 times.
3041615 if (!singleMCLFlag && part_idx == 1 &&
352
2/2
✓ Branch 0 taken 428403 times.
✓ Branch 1 taken 92709 times.
521112 (lc->cu.part_mode == PART_2NxN ||
353
2/2
✓ Branch 0 taken 412700 times.
✓ Branch 1 taken 15703 times.
428403 lc->cu.part_mode == PART_2NxnU ||
354
4/4
✓ Branch 0 taken 395605 times.
✓ Branch 1 taken 17095 times.
✓ Branch 2 taken 127861 times.
✓ Branch 3 taken 2788247 times.
3328808 lc->cu.part_mode == PART_2NxnD) ||
355 2916108 is_diff_mer(s, xB1, yB1, x0, y0)) {
356 253368 is_available_b1 = 0;
357 } else {
358
4/4
✓ Branch 0 taken 2674493 times.
✓ Branch 1 taken 113754 times.
✓ Branch 2 taken 2548490 times.
✓ Branch 3 taken 126003 times.
2788247 is_available_b1 = AVAILABLE(cand_up, B1);
359
4/4
✓ Branch 0 taken 2548490 times.
✓ Branch 1 taken 239757 times.
✓ Branch 2 taken 1916696 times.
✓ Branch 3 taken 631794 times.
2788247 if (is_available_b1 &&
360
2/2
✓ Branch 1 taken 1596259 times.
✓ Branch 2 taken 320437 times.
1916696 !(is_available_a1 && COMPARE_MV_REFIDX(B1, A1))) {
361 2228053 mergecandlist[nb_merge_cand] = TAB_MVF_PU(B1);
362
2/2
✓ Branch 0 taken 1370297 times.
✓ Branch 1 taken 857756 times.
2228053 if (merge_idx == nb_merge_cand)
363 1370297 return;
364 857756 nb_merge_cand++;
365 }
366 }
367
368 // above right spatial merge candidate
369
2/2
✓ Branch 0 taken 1168677 times.
✓ Branch 1 taken 157735 times.
1326412 is_available_b0 = AVAILABLE(cand_up_right, B0) &&
370
4/4
✓ Branch 0 taken 1160209 times.
✓ Branch 1 taken 8468 times.
✓ Branch 2 taken 963684 times.
✓ Branch 3 taken 196525 times.
2328886 xB0 < s->ps.sps->width &&
371
4/4
✓ Branch 0 taken 1326412 times.
✓ Branch 1 taken 344906 times.
✓ Branch 3 taken 909279 times.
✓ Branch 4 taken 54405 times.
4157939 PRED_BLOCK_AVAILABLE(B0) &&
372 963684 !is_diff_mer(s, xB0, yB0, x0, y0);
373
374
4/4
✓ Branch 0 taken 909279 times.
✓ Branch 1 taken 762039 times.
✓ Branch 2 taken 856503 times.
✓ Branch 3 taken 52776 times.
1671318 if (is_available_b0 &&
375
2/2
✓ Branch 1 taken 488116 times.
✓ Branch 2 taken 368387 times.
856503 !(is_available_b1 && COMPARE_MV_REFIDX(B0, B1))) {
376 540892 mergecandlist[nb_merge_cand] = TAB_MVF_PU(B0);
377
2/2
✓ Branch 0 taken 308089 times.
✓ Branch 1 taken 232803 times.
540892 if (merge_idx == nb_merge_cand)
378 308089 return;
379 232803 nb_merge_cand++;
380 }
381
382 // left bottom spatial merge candidate
383
2/2
✓ Branch 0 taken 783816 times.
✓ Branch 1 taken 187071 times.
970887 is_available_a0 = AVAILABLE(cand_bottom_left, A0) &&
384
3/4
✓ Branch 0 taken 783816 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 344140 times.
✓ Branch 3 taken 439676 times.
1567632 yA0 < s->ps.sps->height &&
385
4/4
✓ Branch 0 taken 970887 times.
✓ Branch 1 taken 392342 times.
✓ Branch 3 taken 325672 times.
✓ Branch 4 taken 18468 times.
3117932 PRED_BLOCK_AVAILABLE(A0) &&
386 344140 !is_diff_mer(s, xA0, yA0, x0, y0);
387
388
4/4
✓ Branch 0 taken 325672 times.
✓ Branch 1 taken 1037557 times.
✓ Branch 2 taken 312254 times.
✓ Branch 3 taken 13418 times.
1363229 if (is_available_a0 &&
389
2/2
✓ Branch 1 taken 132509 times.
✓ Branch 2 taken 179745 times.
312254 !(is_available_a1 && COMPARE_MV_REFIDX(A0, A1))) {
390 145927 mergecandlist[nb_merge_cand] = TAB_MVF_PU(A0);
391
2/2
✓ Branch 0 taken 80520 times.
✓ Branch 1 taken 65407 times.
145927 if (merge_idx == nb_merge_cand)
392 80520 return;
393 65407 nb_merge_cand++;
394 }
395
396 // above left spatial merge candidate
397
6/6
✓ Branch 0 taken 1150575 times.
✓ Branch 1 taken 132134 times.
✓ Branch 2 taken 1032666 times.
✓ Branch 3 taken 117909 times.
✓ Branch 4 taken 950480 times.
✓ Branch 5 taken 82186 times.
2315375 is_available_b2 = AVAILABLE(cand_up_left, B2) &&
398 1032666 !is_diff_mer(s, xB2, yB2, x0, y0);
399
400
4/4
✓ Branch 0 taken 950480 times.
✓ Branch 1 taken 332229 times.
✓ Branch 2 taken 796418 times.
✓ Branch 3 taken 154062 times.
1282709 if (is_available_b2 &&
401
4/4
✓ Branch 1 taken 450914 times.
✓ Branch 2 taken 345504 times.
✓ Branch 3 taken 536270 times.
✓ Branch 4 taken 68706 times.
950480 !(is_available_a1 && COMPARE_MV_REFIDX(B2, A1)) &&
402
4/4
✓ Branch 1 taken 326599 times.
✓ Branch 2 taken 209671 times.
✓ Branch 3 taken 390987 times.
✓ Branch 4 taken 4318 times.
604976 !(is_available_b1 && COMPARE_MV_REFIDX(B2, B1)) &&
403 nb_merge_cand != 4) {
404 390987 mergecandlist[nb_merge_cand] = TAB_MVF_PU(B2);
405
2/2
✓ Branch 0 taken 192073 times.
✓ Branch 1 taken 198914 times.
390987 if (merge_idx == nb_merge_cand)
406 192073 return;
407 198914 nb_merge_cand++;
408 }
409
410 // temporal motion vector candidate
411
2/2
✓ Branch 0 taken 851129 times.
✓ Branch 1 taken 239507 times.
1090636 if (s->sh.slice_temporal_mvp_enabled_flag &&
412
1/2
✓ Branch 0 taken 851129 times.
✗ Branch 1 not taken.
851129 nb_merge_cand < s->sh.max_num_merge_cand) {
413 851129 Mv mv_l0_col = { 0 }, mv_l1_col = { 0 };
414 851129 int available_l0 = temporal_luma_motion_vector(s, x0, y0, nPbW, nPbH,
415 0, &mv_l0_col, 0);
416 1702258 int available_l1 = (s->sh.slice_type == HEVC_SLICE_B) ?
417 759850 temporal_luma_motion_vector(s, x0, y0, nPbW, nPbH,
418
2/2
✓ Branch 0 taken 759850 times.
✓ Branch 1 taken 91279 times.
851129 0, &mv_l1_col, 1) : 0;
419
420
4/4
✓ Branch 0 taken 76206 times.
✓ Branch 1 taken 774923 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 76169 times.
851129 if (available_l0 || available_l1) {
421 774960 mergecandlist[nb_merge_cand].pred_flag = available_l0 + (available_l1 << 1);
422 774960 AV_ZERO16(mergecandlist[nb_merge_cand].ref_idx);
423 774960 mergecandlist[nb_merge_cand].mv[0] = mv_l0_col;
424 774960 mergecandlist[nb_merge_cand].mv[1] = mv_l1_col;
425
426
2/2
✓ Branch 0 taken 485671 times.
✓ Branch 1 taken 289289 times.
774960 if (merge_idx == nb_merge_cand)
427 485671 return;
428 289289 nb_merge_cand++;
429 }
430 }
431
432 604965 nb_orig_merge_cand = nb_merge_cand;
433
434 // combined bi-predictive merge candidates (applies for B slices)
435
4/4
✓ Branch 0 taken 494030 times.
✓ Branch 1 taken 110935 times.
✓ Branch 2 taken 331331 times.
✓ Branch 3 taken 162699 times.
604965 if (s->sh.slice_type == HEVC_SLICE_B && nb_orig_merge_cand > 1 &&
436
1/2
✓ Branch 0 taken 331331 times.
✗ Branch 1 not taken.
331331 nb_orig_merge_cand < s->sh.max_num_merge_cand) {
437 331331 int comb_idx = 0;
438
439
1/2
✓ Branch 0 taken 699021 times.
✗ Branch 1 not taken.
699021 for (comb_idx = 0; nb_merge_cand < s->sh.max_num_merge_cand &&
440
2/2
✓ Branch 0 taken 650653 times.
✓ Branch 1 taken 48368 times.
1066711 comb_idx < nb_orig_merge_cand * (nb_orig_merge_cand - 1); comb_idx++) {
441 650653 int l0_cand_idx = l0_l1_cand_idx[comb_idx][0];
442 650653 int l1_cand_idx = l0_l1_cand_idx[comb_idx][1];
443 650653 MvField l0_cand = mergecandlist[l0_cand_idx];
444 650653 MvField l1_cand = mergecandlist[l1_cand_idx];
445
446
4/4
✓ Branch 0 taken 581722 times.
✓ Branch 1 taken 68931 times.
✓ Branch 2 taken 432638 times.
✓ Branch 3 taken 149084 times.
650653 if ((l0_cand.pred_flag & PF_L0) && (l1_cand.pred_flag & PF_L1) &&
447 432638 (refPicList[0].list[l0_cand.ref_idx[0]] !=
448
2/2
✓ Branch 0 taken 108522 times.
✓ Branch 1 taken 324116 times.
432638 refPicList[1].list[l1_cand.ref_idx[1]] ||
449
2/2
✓ Branch 0 taken 94306 times.
✓ Branch 1 taken 14216 times.
108522 AV_RN32A(&l0_cand.mv[0]) != AV_RN32A(&l1_cand.mv[1]))) {
450 418422 mergecandlist[nb_merge_cand].ref_idx[0] = l0_cand.ref_idx[0];
451 418422 mergecandlist[nb_merge_cand].ref_idx[1] = l1_cand.ref_idx[1];
452 418422 mergecandlist[nb_merge_cand].pred_flag = PF_BI;
453 418422 AV_COPY32(&mergecandlist[nb_merge_cand].mv[0], &l0_cand.mv[0]);
454 418422 AV_COPY32(&mergecandlist[nb_merge_cand].mv[1], &l1_cand.mv[1]);
455
2/2
✓ Branch 0 taken 282963 times.
✓ Branch 1 taken 135459 times.
418422 if (merge_idx == nb_merge_cand)
456 282963 return;
457 135459 nb_merge_cand++;
458 }
459 }
460 }
461
462 // append Zero motion vector candidates
463
1/2
✓ Branch 0 taken 534101 times.
✗ Branch 1 not taken.
534101 while (nb_merge_cand < s->sh.max_num_merge_cand) {
464
2/2
✓ Branch 0 taken 357775 times.
✓ Branch 1 taken 176326 times.
534101 mergecandlist[nb_merge_cand].pred_flag = PF_L0 + ((s->sh.slice_type == HEVC_SLICE_B) << 1);
465 534101 AV_ZERO32(mergecandlist[nb_merge_cand].mv + 0);
466 534101 AV_ZERO32(mergecandlist[nb_merge_cand].mv + 1);
467
2/2
✓ Branch 0 taken 485344 times.
✓ Branch 1 taken 48757 times.
534101 mergecandlist[nb_merge_cand].ref_idx[0] = zero_idx < nb_refs ? zero_idx : 0;
468
2/2
✓ Branch 0 taken 485344 times.
✓ Branch 1 taken 48757 times.
534101 mergecandlist[nb_merge_cand].ref_idx[1] = zero_idx < nb_refs ? zero_idx : 0;
469
470
2/2
✓ Branch 0 taken 322002 times.
✓ Branch 1 taken 212099 times.
534101 if (merge_idx == nb_merge_cand)
471 322002 return;
472 212099 nb_merge_cand++;
473 212099 zero_idx++;
474 }
475 }
476
477 /*
478 * 8.5.3.1.1 Derivation process of luma Mvs for merge mode
479 */
480 6229489 void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW,
481 int nPbH, int log2_cb_size, int part_idx,
482 int merge_idx, MvField *mv)
483 {
484 6229489 const HEVCContext *const s = lc->parent;
485 6229489 int singleMCLFlag = 0;
486 6229489 int nCS = 1 << log2_cb_size;
487 MvField mergecand_list[MRG_MAX_NUM_CANDS];
488 6229489 int nPbW2 = nPbW;
489 6229489 int nPbH2 = nPbH;
490
491
4/4
✓ Branch 0 taken 326043 times.
✓ Branch 1 taken 5903446 times.
✓ Branch 2 taken 214635 times.
✓ Branch 3 taken 111408 times.
6229489 if (s->ps.pps->log2_parallel_merge_level > 2 && nCS == 8) {
492 214635 singleMCLFlag = 1;
493 214635 x0 = lc->cu.x;
494 214635 y0 = lc->cu.y;
495 214635 nPbW = nCS;
496 214635 nPbH = nCS;
497 214635 part_idx = 0;
498 }
499
500 6229489 ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH);
501 6229489 derive_spatial_merge_candidates(lc, s, x0, y0, nPbW, nPbH, log2_cb_size,
502 singleMCLFlag, part_idx,
503 merge_idx, mergecand_list);
504
505
2/2
✓ Branch 0 taken 3506451 times.
✓ Branch 1 taken 2723038 times.
6229489 if (mergecand_list[merge_idx].pred_flag == PF_BI &&
506
2/2
✓ Branch 0 taken 124136 times.
✓ Branch 1 taken 3382315 times.
3506451 (nPbW2 + nPbH2) == 12) {
507 124136 mergecand_list[merge_idx].pred_flag = PF_L0;
508 }
509
510 6229489 *mv = mergecand_list[merge_idx];
511 6229489 }
512
513 1000859 static av_always_inline void dist_scale(const HEVCContext *s, Mv *mv,
514 int min_pu_width, int x, int y,
515 int elist, int ref_idx_curr, int ref_idx)
516 {
517 1000859 const RefPicList *refPicList = s->ref->refPicList;
518 1000859 const MvField *tab_mvf = s->ref->tab_mvf;
519 1000859 int ref_pic_elist = refPicList[elist].list[TAB_MVF(x, y).ref_idx[elist]];
520 1000859 int ref_pic_curr = refPicList[ref_idx_curr].list[ref_idx];
521
522
2/2
✓ Branch 0 taken 842796 times.
✓ Branch 1 taken 158063 times.
1000859 if (ref_pic_elist != ref_pic_curr) {
523 842796 int poc_diff = s->poc - ref_pic_elist;
524
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 842796 times.
842796 if (!poc_diff)
525 poc_diff = 1;
526 842796 mv_scale(mv, mv, poc_diff, s->poc - ref_pic_curr);
527 }
528 1000859 }
529
530 9085249 static int mv_mp_mode_mx(const HEVCContext *s, int x, int y, int pred_flag_index,
531 Mv *mv, int ref_idx_curr, int ref_idx)
532 {
533 9085249 const MvField *tab_mvf = s->ref->tab_mvf;
534 9085249 int min_pu_width = s->ps.sps->min_pu_width;
535
536 9085249 const RefPicList *refPicList = s->ref->refPicList;
537
538
2/2
✓ Branch 0 taken 7054200 times.
✓ Branch 1 taken 2031049 times.
9085249 if (((TAB_MVF(x, y).pred_flag) & (1 << pred_flag_index)) &&
539
2/2
✓ Branch 0 taken 3728737 times.
✓ Branch 1 taken 3325463 times.
7054200 refPicList[pred_flag_index].list[TAB_MVF(x, y).ref_idx[pred_flag_index]] == refPicList[ref_idx_curr].list[ref_idx]) {
540 3728737 *mv = TAB_MVF(x, y).mv[pred_flag_index];
541 3728737 return 1;
542 }
543 5356512 return 0;
544 }
545
546 1271590 static int mv_mp_mode_mx_lt(const HEVCContext *s, int x, int y, int pred_flag_index,
547 Mv *mv, int ref_idx_curr, int ref_idx)
548 {
549 1271590 const MvField *tab_mvf = s->ref->tab_mvf;
550 1271590 int min_pu_width = s->ps.sps->min_pu_width;
551
552 1271590 const RefPicList *refPicList = s->ref->refPicList;
553
554
2/2
✓ Branch 0 taken 1009916 times.
✓ Branch 1 taken 261674 times.
1271590 if ((TAB_MVF(x, y).pred_flag) & (1 << pred_flag_index)) {
555 1009916 int currIsLongTerm = refPicList[ref_idx_curr].isLongTerm[ref_idx];
556
557 1009916 int colIsLongTerm =
558 1009916 refPicList[pred_flag_index].isLongTerm[(TAB_MVF(x, y).ref_idx[pred_flag_index])];
559
560
2/2
✓ Branch 0 taken 1005199 times.
✓ Branch 1 taken 4717 times.
1009916 if (colIsLongTerm == currIsLongTerm) {
561 1005199 *mv = TAB_MVF(x, y).mv[pred_flag_index];
562
2/2
✓ Branch 0 taken 1000859 times.
✓ Branch 1 taken 4340 times.
1005199 if (!currIsLongTerm)
563 1000859 dist_scale(s, mv, min_pu_width, x, y,
564 pred_flag_index, ref_idx_curr, ref_idx);
565 1005199 return 1;
566 }
567 }
568 266391 return 0;
569 }
570
571 #define MP_MX(v, pred, mx) \
572 mv_mp_mode_mx(s, \
573 (x ## v) >> s->ps.sps->log2_min_pu_size, \
574 (y ## v) >> s->ps.sps->log2_min_pu_size, \
575 pred, &mx, ref_idx_curr, ref_idx)
576
577 #define MP_MX_LT(v, pred, mx) \
578 mv_mp_mode_mx_lt(s, \
579 (x ## v) >> s->ps.sps->log2_min_pu_size, \
580 (y ## v) >> s->ps.sps->log2_min_pu_size, \
581 pred, &mx, ref_idx_curr, ref_idx)
582
583 2787839 void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, int x0, int y0, int nPbW,
584 int nPbH, int log2_cb_size, int part_idx,
585 int merge_idx, MvField *mv,
586 int mvp_lx_flag, int LX)
587 {
588 2787839 const HEVCContext *const s = lc->parent;
589 2787839 const MvField *const tab_mvf = s->ref->tab_mvf;
590 2787839 int isScaledFlag_L0 = 0;
591 2787839 int availableFlagLXA0 = 1;
592 2787839 int availableFlagLXB0 = 1;
593 2787839 int numMVPCandLX = 0;
594 2787839 int min_pu_width = s->ps.sps->min_pu_width;
595
596 int xA0, yA0;
597 int is_available_a0;
598 int xA1, yA1;
599 int is_available_a1;
600 int xB0, yB0;
601 int is_available_b0;
602 int xB1, yB1;
603 int is_available_b1;
604 int xB2, yB2;
605 int is_available_b2;
606
607 2787839 Mv mvpcand_list[2] = { { 0 } };
608 Mv mxA;
609 Mv mxB;
610 int ref_idx_curr;
611 2787839 int ref_idx = 0;
612 int pred_flag_index_l0;
613 int pred_flag_index_l1;
614
615 2787839 const int cand_bottom_left = lc->na.cand_bottom_left;
616 2787839 const int cand_left = lc->na.cand_left;
617 2787839 const int cand_up_left = lc->na.cand_up_left;
618 2787839 const int cand_up = lc->na.cand_up;
619 2787839 const int cand_up_right = lc->na.cand_up_right_sap;
620 2787839 ref_idx_curr = LX;
621 2787839 ref_idx = mv->ref_idx[LX];
622 2787839 pred_flag_index_l0 = LX;
623 2787839 pred_flag_index_l1 = !LX;
624
625 // left bottom spatial candidate
626 2787839 xA0 = x0 - 1;
627 2787839 yA0 = y0 + nPbH;
628
629
2/2
✓ Branch 0 taken 1541831 times.
✓ Branch 1 taken 407697 times.
1949528 is_available_a0 = AVAILABLE(cand_bottom_left, A0) &&
630
5/6
✓ Branch 0 taken 1949528 times.
✓ Branch 1 taken 838311 times.
✓ Branch 2 taken 1541831 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 732592 times.
✓ Branch 5 taken 809239 times.
6279198 yA0 < s->ps.sps->height &&
631 1541831 PRED_BLOCK_AVAILABLE(A0);
632
633 //left spatial merge candidate
634 2787839 xA1 = x0 - 1;
635 2787839 yA1 = y0 + nPbH - 1;
636
637
4/4
✓ Branch 0 taken 2707813 times.
✓ Branch 1 taken 80026 times.
✓ Branch 2 taken 2460193 times.
✓ Branch 3 taken 247620 times.
2787839 is_available_a1 = AVAILABLE(cand_left, A1);
638
4/4
✓ Branch 0 taken 2055247 times.
✓ Branch 1 taken 732592 times.
✓ Branch 2 taken 1752238 times.
✓ Branch 3 taken 303009 times.
2787839 if (is_available_a0 || is_available_a1)
639 2484830 isScaledFlag_L0 = 1;
640
641
2/2
✓ Branch 0 taken 732592 times.
✓ Branch 1 taken 2055247 times.
2787839 if (is_available_a0) {
642
2/2
✓ Branch 1 taken 446621 times.
✓ Branch 2 taken 285971 times.
732592 if (MP_MX(A0, pred_flag_index_l0, mxA)) {
643 446621 goto b_candidates;
644 }
645
2/2
✓ Branch 1 taken 47482 times.
✓ Branch 2 taken 238489 times.
285971 if (MP_MX(A0, pred_flag_index_l1, mxA)) {
646 47482 goto b_candidates;
647 }
648 }
649
650
2/2
✓ Branch 0 taken 1981405 times.
✓ Branch 1 taken 312331 times.
2293736 if (is_available_a1) {
651
2/2
✓ Branch 1 taken 1119660 times.
✓ Branch 2 taken 861745 times.
1981405 if (MP_MX(A1, pred_flag_index_l0, mxA)) {
652 1119660 goto b_candidates;
653 }
654
2/2
✓ Branch 1 taken 113885 times.
✓ Branch 2 taken 747860 times.
861745 if (MP_MX(A1, pred_flag_index_l1, mxA)) {
655 113885 goto b_candidates;
656 }
657 }
658
659
2/2
✓ Branch 0 taken 193618 times.
✓ Branch 1 taken 866573 times.
1060191 if (is_available_a0) {
660
2/2
✓ Branch 1 taken 141578 times.
✓ Branch 2 taken 52040 times.
193618 if (MP_MX_LT(A0, pred_flag_index_l0, mxA)) {
661 141578 goto b_candidates;
662 }
663
2/2
✓ Branch 1 taken 51218 times.
✓ Branch 2 taken 822 times.
52040 if (MP_MX_LT(A0, pred_flag_index_l1, mxA)) {
664 51218 goto b_candidates;
665 }
666 }
667
668
2/2
✓ Branch 0 taken 564168 times.
✓ Branch 1 taken 303227 times.
867395 if (is_available_a1) {
669
2/2
✓ Branch 1 taken 384860 times.
✓ Branch 2 taken 179308 times.
564168 if (MP_MX_LT(A1, pred_flag_index_l0, mxA)) {
670 384860 goto b_candidates;
671 }
672
2/2
✓ Branch 1 taken 176539 times.
✓ Branch 2 taken 2769 times.
179308 if (MP_MX_LT(A1, pred_flag_index_l1, mxA)) {
673 176539 goto b_candidates;
674 }
675 }
676 305996 availableFlagLXA0 = 0;
677
678 2787839 b_candidates:
679 // B candidates
680 // above right spatial merge candidate
681 2787839 xB0 = x0 + nPbW;
682 2787839 yB0 = y0 - 1;
683
684
2/2
✓ Branch 0 taken 1827806 times.
✓ Branch 1 taken 307496 times.
2135302 is_available_b0 = AVAILABLE(cand_up_right, B0) &&
685
6/6
✓ Branch 0 taken 2135302 times.
✓ Branch 1 taken 652537 times.
✓ Branch 2 taken 1813661 times.
✓ Branch 3 taken 14145 times.
✓ Branch 4 taken 1463331 times.
✓ Branch 5 taken 350330 times.
6736802 xB0 < s->ps.sps->width &&
686 1813661 PRED_BLOCK_AVAILABLE(B0);
687
688 // above spatial merge candidate
689 2787839 xB1 = x0 + nPbW - 1;
690 2787839 yB1 = y0 - 1;
691
4/4
✓ Branch 0 taken 2596567 times.
✓ Branch 1 taken 191272 times.
✓ Branch 2 taken 2368135 times.
✓ Branch 3 taken 228432 times.
2787839 is_available_b1 = AVAILABLE(cand_up, B1);
692
693 // above left spatial merge candidate
694 2787839 xB2 = x0 - 1;
695 2787839 yB2 = y0 - 1;
696
4/4
✓ Branch 0 taken 2529994 times.
✓ Branch 1 taken 257845 times.
✓ Branch 2 taken 2253754 times.
✓ Branch 3 taken 276240 times.
2787839 is_available_b2 = AVAILABLE(cand_up_left, B2);
697
698 // above right spatial merge candidate
699
2/2
✓ Branch 0 taken 1463331 times.
✓ Branch 1 taken 1324508 times.
2787839 if (is_available_b0) {
700
2/2
✓ Branch 1 taken 911493 times.
✓ Branch 2 taken 551838 times.
1463331 if (MP_MX(B0, pred_flag_index_l0, mxB)) {
701 911493 goto scalef;
702 }
703
2/2
✓ Branch 1 taken 93879 times.
✓ Branch 2 taken 457959 times.
551838 if (MP_MX(B0, pred_flag_index_l1, mxB)) {
704 93879 goto scalef;
705 }
706 }
707
708 // above spatial merge candidate
709
2/2
✓ Branch 0 taken 1407960 times.
✓ Branch 1 taken 374507 times.
1782467 if (is_available_b1) {
710
2/2
✓ Branch 1 taken 713625 times.
✓ Branch 2 taken 694335 times.
1407960 if (MP_MX(B1, pred_flag_index_l0, mxB)) {
711 713625 goto scalef;
712 }
713
2/2
✓ Branch 1 taken 71087 times.
✓ Branch 2 taken 623248 times.
694335 if (MP_MX(B1, pred_flag_index_l1, mxB)) {
714 71087 goto scalef;
715 }
716 }
717
718 // above left spatial merge candidate
719
2/2
✓ Branch 0 taken 646619 times.
✓ Branch 1 taken 351136 times.
997755 if (is_available_b2) {
720
2/2
✓ Branch 1 taken 187166 times.
✓ Branch 2 taken 459453 times.
646619 if (MP_MX(B2, pred_flag_index_l0, mxB)) {
721 187166 goto scalef;
722 }
723
2/2
✓ Branch 1 taken 23839 times.
✓ Branch 2 taken 435614 times.
459453 if (MP_MX(B2, pred_flag_index_l1, mxB)) {
724 23839 goto scalef;
725 }
726 }
727 786750 availableFlagLXB0 = 0;
728
729 2787839 scalef:
730
2/2
✓ Branch 0 taken 303009 times.
✓ Branch 1 taken 2484830 times.
2787839 if (!isScaledFlag_L0) {
731
2/2
✓ Branch 0 taken 185879 times.
✓ Branch 1 taken 117130 times.
303009 if (availableFlagLXB0) {
732 185879 availableFlagLXA0 = 1;
733 185879 mxA = mxB;
734 }
735 303009 availableFlagLXB0 = 0;
736
737 // XB0 and L1
738
2/2
✓ Branch 0 taken 139283 times.
✓ Branch 1 taken 163726 times.
303009 if (is_available_b0) {
739 139283 availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l0, mxB);
740
2/2
✓ Branch 0 taken 16174 times.
✓ Branch 1 taken 123109 times.
139283 if (!availableFlagLXB0)
741 16174 availableFlagLXB0 = MP_MX_LT(B0, pred_flag_index_l1, mxB);
742 }
743
744
4/4
✓ Branch 0 taken 220437 times.
✓ Branch 1 taken 82572 times.
✓ Branch 2 taken 98351 times.
✓ Branch 3 taken 122086 times.
303009 if (is_available_b1 && !availableFlagLXB0) {
745 98351 availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l0, mxB);
746
2/2
✓ Branch 0 taken 12532 times.
✓ Branch 1 taken 85819 times.
98351 if (!availableFlagLXB0)
747 12532 availableFlagLXB0 = MP_MX_LT(B1, pred_flag_index_l1, mxB);
748 }
749
750
4/4
✓ Branch 0 taken 96588 times.
✓ Branch 1 taken 206421 times.
✓ Branch 2 taken 14403 times.
✓ Branch 3 taken 82185 times.
303009 if (is_available_b2 && !availableFlagLXB0) {
751 14403 availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l0, mxB);
752
2/2
✓ Branch 0 taken 1713 times.
✓ Branch 1 taken 12690 times.
14403 if (!availableFlagLXB0)
753 1713 availableFlagLXB0 = MP_MX_LT(B2, pred_flag_index_l1, mxB);
754 }
755 }
756
757
2/2
✓ Branch 0 taken 2667722 times.
✓ Branch 1 taken 120117 times.
2787839 if (availableFlagLXA0)
758 2667722 mvpcand_list[numMVPCandLX++] = mxA;
759
760
8/8
✓ Branch 0 taken 2066214 times.
✓ Branch 1 taken 721625 times.
✓ Branch 2 taken 1999326 times.
✓ Branch 3 taken 66888 times.
✓ Branch 4 taken 686869 times.
✓ Branch 5 taken 1312457 times.
✓ Branch 6 taken 132517 times.
✓ Branch 7 taken 554352 times.
2787839 if (availableFlagLXB0 && (!availableFlagLXA0 || mxA.x != mxB.x || mxA.y != mxB.y))
761 1511862 mvpcand_list[numMVPCandLX++] = mxB;
762
763 //temporal motion vector prediction candidate
764
6/6
✓ Branch 0 taken 1342865 times.
✓ Branch 1 taken 1444974 times.
✓ Branch 2 taken 1093422 times.
✓ Branch 3 taken 249443 times.
✓ Branch 4 taken 389702 times.
✓ Branch 5 taken 703720 times.
2787839 if (numMVPCandLX < 2 && s->sh.slice_temporal_mvp_enabled_flag &&
765 mvp_lx_flag == numMVPCandLX) {
766 Mv mv_col;
767 389702 int available_col = temporal_luma_motion_vector(s, x0, y0, nPbW,
768 nPbH, ref_idx,
769 &mv_col, LX);
770
2/2
✓ Branch 0 taken 321190 times.
✓ Branch 1 taken 68512 times.
389702 if (available_col)
771 321190 mvpcand_list[numMVPCandLX++] = mv_col;
772 }
773
774 2787839 mv->mv[LX] = mvpcand_list[mvp_lx_flag];
775 2787839 }
776