/src/aom/av1/common/pred_common.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2016, Alliance for Open Media. All rights reserved. |
3 | | * |
4 | | * This source code is subject to the terms of the BSD 2 Clause License and |
5 | | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
6 | | * was not distributed with this source code in the LICENSE file, you can |
7 | | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
8 | | * Media Patent License 1.0 was not distributed with this source code in the |
9 | | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
10 | | */ |
11 | | |
12 | | #include "av1/common/common.h" |
13 | | #include "av1/common/pred_common.h" |
14 | | #include "av1/common/reconinter.h" |
15 | | #include "av1/common/reconintra.h" |
16 | | #include "av1/common/seg_common.h" |
17 | | |
18 | | // Returns a context number for the given MB prediction signal |
19 | | static InterpFilter get_ref_filter_type(const MB_MODE_INFO *ref_mbmi, |
20 | | const MACROBLOCKD *xd, int dir, |
21 | 6.04M | MV_REFERENCE_FRAME ref_frame) { |
22 | 6.04M | (void)xd; |
23 | | |
24 | 6.04M | return ((ref_mbmi->ref_frame[0] == ref_frame || |
25 | 6.04M | ref_mbmi->ref_frame[1] == ref_frame) |
26 | 6.04M | ? av1_extract_interp_filter(ref_mbmi->interp_filters, dir & 0x01) |
27 | 6.04M | : SWITCHABLE_FILTERS); |
28 | 6.04M | } |
29 | | |
30 | 3.10M | int av1_get_pred_context_switchable_interp(const MACROBLOCKD *xd, int dir) { |
31 | 3.10M | const MB_MODE_INFO *const mbmi = xd->mi[0]; |
32 | 3.10M | const int ctx_offset = |
33 | 3.10M | (mbmi->ref_frame[1] > INTRA_FRAME) * INTER_FILTER_COMP_OFFSET; |
34 | 3.10M | assert(dir == 0 || dir == 1); |
35 | 3.10M | const MV_REFERENCE_FRAME ref_frame = mbmi->ref_frame[0]; |
36 | | // Note: |
37 | | // The mode info data structure has a one element border above and to the |
38 | | // left of the entries corresponding to real macroblocks. |
39 | | // The prediction flags in these dummy entries are initialized to 0. |
40 | 3.10M | int filter_type_ctx = ctx_offset + (dir & 0x01) * INTER_FILTER_DIR_OFFSET; |
41 | 3.10M | int left_type = SWITCHABLE_FILTERS; |
42 | 3.10M | int above_type = SWITCHABLE_FILTERS; |
43 | | |
44 | 3.10M | if (xd->left_available) |
45 | 3.03M | left_type = get_ref_filter_type(xd->mi[-1], xd, dir, ref_frame); |
46 | | |
47 | 3.10M | if (xd->up_available) |
48 | 3.01M | above_type = |
49 | 3.01M | get_ref_filter_type(xd->mi[-xd->mi_stride], xd, dir, ref_frame); |
50 | | |
51 | 3.10M | if (left_type == above_type) { |
52 | 2.03M | filter_type_ctx += left_type; |
53 | 2.03M | } else if (left_type == SWITCHABLE_FILTERS) { |
54 | 483k | assert(above_type != SWITCHABLE_FILTERS); |
55 | 483k | filter_type_ctx += above_type; |
56 | 583k | } else if (above_type == SWITCHABLE_FILTERS) { |
57 | 498k | assert(left_type != SWITCHABLE_FILTERS); |
58 | 498k | filter_type_ctx += left_type; |
59 | 498k | } else { |
60 | 85.3k | filter_type_ctx += SWITCHABLE_FILTERS; |
61 | 85.3k | } |
62 | | |
63 | 3.10M | return filter_type_ctx; |
64 | 3.10M | } |
65 | | |
66 | 441k | static void palette_add_to_cache(uint16_t *cache, int *n, uint16_t val) { |
67 | | // Do not add an already existing value |
68 | 441k | if (*n > 0 && val == cache[*n - 1]) return; |
69 | | |
70 | 397k | cache[(*n)++] = val; |
71 | 397k | } |
72 | | |
73 | | int av1_get_palette_cache(const MACROBLOCKD *const xd, int plane, |
74 | 161k | uint16_t *cache) { |
75 | 161k | const int row = -xd->mb_to_top_edge >> 3; |
76 | | // Do not refer to above SB row when on SB boundary. |
77 | 161k | const MB_MODE_INFO *const above_mi = |
78 | 161k | (row % (1 << MIN_SB_SIZE_LOG2)) ? xd->above_mbmi : NULL; |
79 | 161k | const MB_MODE_INFO *const left_mi = xd->left_mbmi; |
80 | 161k | int above_n = 0, left_n = 0; |
81 | 161k | if (above_mi) above_n = above_mi->palette_mode_info.palette_size[plane != 0]; |
82 | 161k | if (left_mi) left_n = left_mi->palette_mode_info.palette_size[plane != 0]; |
83 | 161k | if (above_n == 0 && left_n == 0) return 0; |
84 | 78.2k | int above_idx = plane * PALETTE_MAX_SIZE; |
85 | 78.2k | int left_idx = plane * PALETTE_MAX_SIZE; |
86 | 78.2k | int n = 0; |
87 | 78.2k | const uint16_t *above_colors = |
88 | 78.2k | above_mi ? above_mi->palette_mode_info.palette_colors : NULL; |
89 | 78.2k | const uint16_t *left_colors = |
90 | 78.2k | left_mi ? left_mi->palette_mode_info.palette_colors : NULL; |
91 | | // Merge the sorted lists of base colors from above and left to get |
92 | | // combined sorted color cache. |
93 | 227k | while (above_n > 0 && left_n > 0) { |
94 | 149k | uint16_t v_above = above_colors[above_idx]; |
95 | 149k | uint16_t v_left = left_colors[left_idx]; |
96 | 149k | if (v_left < v_above) { |
97 | 60.3k | palette_add_to_cache(cache, &n, v_left); |
98 | 60.3k | ++left_idx, --left_n; |
99 | 88.7k | } else { |
100 | 88.7k | palette_add_to_cache(cache, &n, v_above); |
101 | 88.7k | ++above_idx, --above_n; |
102 | 88.7k | if (v_left == v_above) ++left_idx, --left_n; |
103 | 88.7k | } |
104 | 149k | } |
105 | 223k | while (above_n-- > 0) { |
106 | 145k | uint16_t val = above_colors[above_idx++]; |
107 | 145k | palette_add_to_cache(cache, &n, val); |
108 | 145k | } |
109 | 225k | while (left_n-- > 0) { |
110 | 147k | uint16_t val = left_colors[left_idx++]; |
111 | 147k | palette_add_to_cache(cache, &n, val); |
112 | 147k | } |
113 | 78.2k | assert(n <= 2 * PALETTE_MAX_SIZE); |
114 | 78.3k | return n; |
115 | 78.2k | } |
116 | | |
117 | | // The mode info data structure has a one element border above and to the |
118 | | // left of the entries corresponding to real macroblocks. |
119 | | // The prediction flags in these dummy entries are initialized to 0. |
120 | | // 0 - inter/inter, inter/--, --/inter, --/-- |
121 | | // 1 - intra/inter, inter/intra |
122 | | // 2 - intra/--, --/intra |
123 | | // 3 - intra/intra |
124 | 5.70M | int av1_get_intra_inter_context(const MACROBLOCKD *xd) { |
125 | 5.70M | const MB_MODE_INFO *const above_mbmi = xd->above_mbmi; |
126 | 5.70M | const MB_MODE_INFO *const left_mbmi = xd->left_mbmi; |
127 | 5.70M | const int has_above = xd->up_available; |
128 | 5.70M | const int has_left = xd->left_available; |
129 | | |
130 | 5.70M | if (has_above && has_left) { // both edges available |
131 | 5.47M | const int above_intra = !is_inter_block(above_mbmi); |
132 | 5.47M | const int left_intra = !is_inter_block(left_mbmi); |
133 | 5.47M | return left_intra && above_intra ? 3 : left_intra || above_intra; |
134 | 5.47M | } else if (has_above || has_left) { // one edge available |
135 | 201k | return 2 * !is_inter_block(has_above ? above_mbmi : left_mbmi); |
136 | 201k | } else { |
137 | 31.3k | return 0; |
138 | 31.3k | } |
139 | 5.70M | } |
140 | | |
141 | | #define CHECK_BACKWARD_REFS(ref_frame) \ |
142 | 1.45M | (((ref_frame) >= BWDREF_FRAME) && ((ref_frame) <= ALTREF_FRAME)) |
143 | 1.16M | #define IS_BACKWARD_REF_FRAME(ref_frame) CHECK_BACKWARD_REFS(ref_frame) |
144 | | |
145 | 989k | int av1_get_reference_mode_context(const MACROBLOCKD *xd) { |
146 | 989k | int ctx; |
147 | 989k | const MB_MODE_INFO *const above_mbmi = xd->above_mbmi; |
148 | 989k | const MB_MODE_INFO *const left_mbmi = xd->left_mbmi; |
149 | 989k | const int has_above = xd->up_available; |
150 | 989k | const int has_left = xd->left_available; |
151 | | |
152 | | // Note: |
153 | | // The mode info data structure has a one element border above and to the |
154 | | // left of the entries corresponding to real macroblocks. |
155 | | // The prediction flags in these dummy entries are initialized to 0. |
156 | 989k | if (has_above && has_left) { // both edges available |
157 | 879k | if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi)) |
158 | | // neither edge uses comp pred (0/1) |
159 | 350k | ctx = IS_BACKWARD_REF_FRAME(above_mbmi->ref_frame[0]) ^ |
160 | 350k | IS_BACKWARD_REF_FRAME(left_mbmi->ref_frame[0]); |
161 | 529k | else if (!has_second_ref(above_mbmi)) |
162 | | // one of two edges uses comp pred (2/3) |
163 | 144k | ctx = 2 + (IS_BACKWARD_REF_FRAME(above_mbmi->ref_frame[0]) || |
164 | 144k | !is_inter_block(above_mbmi)); |
165 | 385k | else if (!has_second_ref(left_mbmi)) |
166 | | // one of two edges uses comp pred (2/3) |
167 | 137k | ctx = 2 + (IS_BACKWARD_REF_FRAME(left_mbmi->ref_frame[0]) || |
168 | 137k | !is_inter_block(left_mbmi)); |
169 | 248k | else // both edges use comp pred (4) |
170 | 248k | ctx = 4; |
171 | 879k | } else if (has_above || has_left) { // one edge available |
172 | 96.2k | const MB_MODE_INFO *edge_mbmi = has_above ? above_mbmi : left_mbmi; |
173 | | |
174 | 96.2k | if (!has_second_ref(edge_mbmi)) |
175 | | // edge does not use comp pred (0/1) |
176 | 44.7k | ctx = IS_BACKWARD_REF_FRAME(edge_mbmi->ref_frame[0]); |
177 | 51.5k | else |
178 | | // edge uses comp pred (3) |
179 | 51.5k | ctx = 3; |
180 | 96.2k | } else { // no edges available (1) |
181 | 13.9k | ctx = 1; |
182 | 13.9k | } |
183 | 989k | assert(ctx >= 0 && ctx < COMP_INTER_CONTEXTS); |
184 | 989k | return ctx; |
185 | 989k | } |
186 | | |
187 | 524k | int av1_get_comp_reference_type_context(const MACROBLOCKD *xd) { |
188 | 524k | int pred_context; |
189 | 524k | const MB_MODE_INFO *const above_mbmi = xd->above_mbmi; |
190 | 524k | const MB_MODE_INFO *const left_mbmi = xd->left_mbmi; |
191 | 524k | const int above_in_image = xd->up_available; |
192 | 524k | const int left_in_image = xd->left_available; |
193 | | |
194 | 524k | if (above_in_image && left_in_image) { // both edges available |
195 | 463k | const int above_intra = !is_inter_block(above_mbmi); |
196 | 463k | const int left_intra = !is_inter_block(left_mbmi); |
197 | | |
198 | 463k | if (above_intra && left_intra) { // intra/intra |
199 | 6.59k | pred_context = 2; |
200 | 456k | } else if (above_intra || left_intra) { // intra/inter |
201 | 57.0k | const MB_MODE_INFO *inter_mbmi = above_intra ? left_mbmi : above_mbmi; |
202 | | |
203 | 57.0k | if (!has_second_ref(inter_mbmi)) // single pred |
204 | 23.1k | pred_context = 2; |
205 | 33.9k | else // comp pred |
206 | 33.9k | pred_context = 1 + 2 * has_uni_comp_refs(inter_mbmi); |
207 | 399k | } else { // inter/inter |
208 | 399k | const int a_sg = !has_second_ref(above_mbmi); |
209 | 399k | const int l_sg = !has_second_ref(left_mbmi); |
210 | 399k | const MV_REFERENCE_FRAME frfa = above_mbmi->ref_frame[0]; |
211 | 399k | const MV_REFERENCE_FRAME frfl = left_mbmi->ref_frame[0]; |
212 | | |
213 | 399k | if (a_sg && l_sg) { // single/single |
214 | 47.9k | pred_context = 1 + 2 * (!(IS_BACKWARD_REF_FRAME(frfa) ^ |
215 | 47.9k | IS_BACKWARD_REF_FRAME(frfl))); |
216 | 351k | } else if (l_sg || a_sg) { // single/comp |
217 | 132k | const int uni_rfc = |
218 | 132k | a_sg ? has_uni_comp_refs(left_mbmi) : has_uni_comp_refs(above_mbmi); |
219 | | |
220 | 132k | if (!uni_rfc) // comp bidir |
221 | 108k | pred_context = 1; |
222 | 23.7k | else // comp unidir |
223 | 23.7k | pred_context = 3 + (!(IS_BACKWARD_REF_FRAME(frfa) ^ |
224 | 23.7k | IS_BACKWARD_REF_FRAME(frfl))); |
225 | 219k | } else { // comp/comp |
226 | 219k | const int a_uni_rfc = has_uni_comp_refs(above_mbmi); |
227 | 219k | const int l_uni_rfc = has_uni_comp_refs(left_mbmi); |
228 | | |
229 | 219k | if (!a_uni_rfc && !l_uni_rfc) // bidir/bidir |
230 | 173k | pred_context = 0; |
231 | 45.9k | else if (!a_uni_rfc || !l_uni_rfc) // unidir/bidir |
232 | 31.7k | pred_context = 2; |
233 | 14.2k | else // unidir/unidir |
234 | 14.2k | pred_context = |
235 | 14.2k | 3 + (!((frfa == BWDREF_FRAME) ^ (frfl == BWDREF_FRAME))); |
236 | 219k | } |
237 | 399k | } |
238 | 463k | } else if (above_in_image || left_in_image) { // one edge available |
239 | 50.3k | const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; |
240 | | |
241 | 50.3k | if (!is_inter_block(edge_mbmi)) { // intra |
242 | 863 | pred_context = 2; |
243 | 49.5k | } else { // inter |
244 | 49.5k | if (!has_second_ref(edge_mbmi)) // single pred |
245 | 8.57k | pred_context = 2; |
246 | 40.9k | else // comp pred |
247 | 40.9k | pred_context = 4 * has_uni_comp_refs(edge_mbmi); |
248 | 49.5k | } |
249 | 50.3k | } else { // no edges available |
250 | 10.8k | pred_context = 2; |
251 | 10.8k | } |
252 | | |
253 | 524k | assert(pred_context >= 0 && pred_context < COMP_REF_TYPE_CONTEXTS); |
254 | 524k | return pred_context; |
255 | 524k | } |
256 | | |
257 | | // Returns a context number for the given MB prediction signal |
258 | | // |
259 | | // Signal the uni-directional compound reference frame pair as either |
260 | | // (BWDREF, ALTREF), or (LAST, LAST2) / (LAST, LAST3) / (LAST, GOLDEN), |
261 | | // conditioning on the pair is known as uni-directional. |
262 | | // |
263 | | // 3 contexts: Voting is used to compare the count of forward references with |
264 | | // that of backward references from the spatial neighbors. |
265 | 87.2k | int av1_get_pred_context_uni_comp_ref_p(const MACROBLOCKD *xd) { |
266 | 87.2k | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
267 | | |
268 | | // Count of forward references (L, L2, L3, or G) |
269 | 87.2k | const int frf_count = ref_counts[LAST_FRAME] + ref_counts[LAST2_FRAME] + |
270 | 87.2k | ref_counts[LAST3_FRAME] + ref_counts[GOLDEN_FRAME]; |
271 | | // Count of backward references (B or A) |
272 | 87.2k | const int brf_count = ref_counts[BWDREF_FRAME] + ref_counts[ALTREF2_FRAME] + |
273 | 87.2k | ref_counts[ALTREF_FRAME]; |
274 | | |
275 | 87.2k | const int pred_context = |
276 | 87.2k | (frf_count == brf_count) ? 1 : ((frf_count < brf_count) ? 0 : 2); |
277 | | |
278 | 87.2k | assert(pred_context >= 0 && pred_context < UNI_COMP_REF_CONTEXTS); |
279 | 87.2k | return pred_context; |
280 | 87.2k | } |
281 | | |
282 | | // Returns a context number for the given MB prediction signal |
283 | | // |
284 | | // Signal the uni-directional compound reference frame pair as |
285 | | // either (LAST, LAST2), or (LAST, LAST3) / (LAST, GOLDEN), |
286 | | // conditioning on the pair is known as one of the above three. |
287 | | // |
288 | | // 3 contexts: Voting is used to compare the count of LAST2_FRAME with the |
289 | | // total count of LAST3/GOLDEN from the spatial neighbors. |
290 | 65.9k | int av1_get_pred_context_uni_comp_ref_p1(const MACROBLOCKD *xd) { |
291 | 65.9k | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
292 | | |
293 | | // Count of LAST2 |
294 | 65.9k | const int last2_count = ref_counts[LAST2_FRAME]; |
295 | | // Count of LAST3 or GOLDEN |
296 | 65.9k | const int last3_or_gld_count = |
297 | 65.9k | ref_counts[LAST3_FRAME] + ref_counts[GOLDEN_FRAME]; |
298 | | |
299 | 65.9k | const int pred_context = (last2_count == last3_or_gld_count) |
300 | 65.9k | ? 1 |
301 | 65.9k | : ((last2_count < last3_or_gld_count) ? 0 : 2); |
302 | | |
303 | 65.9k | assert(pred_context >= 0 && pred_context < UNI_COMP_REF_CONTEXTS); |
304 | 65.9k | return pred_context; |
305 | 65.9k | } |
306 | | |
307 | | // Returns a context number for the given MB prediction signal |
308 | | // |
309 | | // Signal the uni-directional compound reference frame pair as |
310 | | // either (LAST, LAST3) or (LAST, GOLDEN), |
311 | | // conditioning on the pair is known as one of the above two. |
312 | | // |
313 | | // 3 contexts: Voting is used to compare the count of LAST3_FRAME with the |
314 | | // total count of GOLDEN_FRAME from the spatial neighbors. |
315 | 39.6k | int av1_get_pred_context_uni_comp_ref_p2(const MACROBLOCKD *xd) { |
316 | 39.6k | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
317 | | |
318 | | // Count of LAST3 |
319 | 39.6k | const int last3_count = ref_counts[LAST3_FRAME]; |
320 | | // Count of GOLDEN |
321 | 39.6k | const int gld_count = ref_counts[GOLDEN_FRAME]; |
322 | | |
323 | 39.6k | const int pred_context = |
324 | 39.6k | (last3_count == gld_count) ? 1 : ((last3_count < gld_count) ? 0 : 2); |
325 | | |
326 | 39.6k | assert(pred_context >= 0 && pred_context < UNI_COMP_REF_CONTEXTS); |
327 | 39.6k | return pred_context; |
328 | 39.6k | } |
329 | | |
330 | | // == Common context functions for both comp and single ref == |
331 | | // |
332 | | // Obtain contexts to signal a reference frame to be either LAST/LAST2 or |
333 | | // LAST3/GOLDEN. |
334 | 3.29M | static int get_pred_context_ll2_or_l3gld(const MACROBLOCKD *xd) { |
335 | 3.29M | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
336 | | |
337 | | // Count of LAST + LAST2 |
338 | 3.29M | const int last_last2_count = ref_counts[LAST_FRAME] + ref_counts[LAST2_FRAME]; |
339 | | // Count of LAST3 + GOLDEN |
340 | 3.29M | const int last3_gld_count = |
341 | 3.29M | ref_counts[LAST3_FRAME] + ref_counts[GOLDEN_FRAME]; |
342 | | |
343 | 3.29M | const int pred_context = (last_last2_count == last3_gld_count) |
344 | 3.29M | ? 1 |
345 | 3.29M | : ((last_last2_count < last3_gld_count) ? 0 : 2); |
346 | | |
347 | 3.29M | assert(pred_context >= 0 && pred_context < REF_CONTEXTS); |
348 | 3.29M | return pred_context; |
349 | 3.29M | } |
350 | | |
351 | | // Obtain contexts to signal a reference frame to be either LAST or LAST2. |
352 | 2.94M | static int get_pred_context_last_or_last2(const MACROBLOCKD *xd) { |
353 | 2.94M | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
354 | | |
355 | | // Count of LAST |
356 | 2.94M | const int last_count = ref_counts[LAST_FRAME]; |
357 | | // Count of LAST2 |
358 | 2.94M | const int last2_count = ref_counts[LAST2_FRAME]; |
359 | | |
360 | 2.94M | const int pred_context = |
361 | 2.94M | (last_count == last2_count) ? 1 : ((last_count < last2_count) ? 0 : 2); |
362 | | |
363 | 2.94M | assert(pred_context >= 0 && pred_context < REF_CONTEXTS); |
364 | 2.94M | return pred_context; |
365 | 2.94M | } |
366 | | |
367 | | // Obtain contexts to signal a reference frame to be either LAST3 or GOLDEN. |
368 | 347k | static int get_pred_context_last3_or_gld(const MACROBLOCKD *xd) { |
369 | 347k | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
370 | | |
371 | | // Count of LAST3 |
372 | 347k | const int last3_count = ref_counts[LAST3_FRAME]; |
373 | | // Count of GOLDEN |
374 | 347k | const int gld_count = ref_counts[GOLDEN_FRAME]; |
375 | | |
376 | 347k | const int pred_context = |
377 | 347k | (last3_count == gld_count) ? 1 : ((last3_count < gld_count) ? 0 : 2); |
378 | | |
379 | 347k | assert(pred_context >= 0 && pred_context < REF_CONTEXTS); |
380 | 347k | return pred_context; |
381 | 347k | } |
382 | | |
383 | | // Obtain contexts to signal a reference frame be either BWDREF/ALTREF2, or |
384 | | // ALTREF. |
385 | 909k | static int get_pred_context_brfarf2_or_arf(const MACROBLOCKD *xd) { |
386 | 909k | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
387 | | |
388 | | // Counts of BWDREF, ALTREF2, or ALTREF frames (B, A2, or A) |
389 | 909k | const int brfarf2_count = |
390 | 909k | ref_counts[BWDREF_FRAME] + ref_counts[ALTREF2_FRAME]; |
391 | 909k | const int arf_count = ref_counts[ALTREF_FRAME]; |
392 | | |
393 | 909k | const int pred_context = |
394 | 909k | (brfarf2_count == arf_count) ? 1 : ((brfarf2_count < arf_count) ? 0 : 2); |
395 | | |
396 | 909k | assert(pred_context >= 0 && pred_context < REF_CONTEXTS); |
397 | 909k | return pred_context; |
398 | 909k | } |
399 | | |
400 | | // Obtain contexts to signal a reference frame be either BWDREF or ALTREF2. |
401 | 398k | static int get_pred_context_brf_or_arf2(const MACROBLOCKD *xd) { |
402 | 398k | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
403 | | |
404 | | // Count of BWDREF frames (B) |
405 | 398k | const int brf_count = ref_counts[BWDREF_FRAME]; |
406 | | // Count of ALTREF2 frames (A2) |
407 | 398k | const int arf2_count = ref_counts[ALTREF2_FRAME]; |
408 | | |
409 | 398k | const int pred_context = |
410 | 398k | (brf_count == arf2_count) ? 1 : ((brf_count < arf2_count) ? 0 : 2); |
411 | | |
412 | 398k | assert(pred_context >= 0 && pred_context < REF_CONTEXTS); |
413 | 398k | return pred_context; |
414 | 398k | } |
415 | | |
416 | | // == Context functions for comp ref == |
417 | | // |
418 | | // Returns a context number for the given MB prediction signal |
419 | | // Signal the first reference frame for a compound mode be either |
420 | | // GOLDEN/LAST3, or LAST/LAST2. |
421 | 437k | int av1_get_pred_context_comp_ref_p(const MACROBLOCKD *xd) { |
422 | 437k | return get_pred_context_ll2_or_l3gld(xd); |
423 | 437k | } |
424 | | |
425 | | // Returns a context number for the given MB prediction signal |
426 | | // Signal the first reference frame for a compound mode be LAST, |
427 | | // conditioning on that it is known either LAST/LAST2. |
428 | 335k | int av1_get_pred_context_comp_ref_p1(const MACROBLOCKD *xd) { |
429 | 335k | return get_pred_context_last_or_last2(xd); |
430 | 335k | } |
431 | | |
432 | | // Returns a context number for the given MB prediction signal |
433 | | // Signal the first reference frame for a compound mode be GOLDEN, |
434 | | // conditioning on that it is known either GOLDEN or LAST3. |
435 | 101k | int av1_get_pred_context_comp_ref_p2(const MACROBLOCKD *xd) { |
436 | 101k | return get_pred_context_last3_or_gld(xd); |
437 | 101k | } |
438 | | |
439 | | // Signal the 2nd reference frame for a compound mode be either |
440 | | // ALTREF, or ALTREF2/BWDREF. |
441 | 437k | int av1_get_pred_context_comp_bwdref_p(const MACROBLOCKD *xd) { |
442 | 437k | return get_pred_context_brfarf2_or_arf(xd); |
443 | 437k | } |
444 | | |
445 | | // Signal the 2nd reference frame for a compound mode be either |
446 | | // ALTREF2 or BWDREF. |
447 | 183k | int av1_get_pred_context_comp_bwdref_p1(const MACROBLOCKD *xd) { |
448 | 183k | return get_pred_context_brf_or_arf2(xd); |
449 | 183k | } |
450 | | |
451 | | // == Context functions for single ref == |
452 | | // |
453 | | // For the bit to signal whether the single reference is a forward reference |
454 | | // frame or a backward reference frame. |
455 | 3.32M | int av1_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) { |
456 | 3.32M | const uint8_t *const ref_counts = &xd->neighbors_ref_counts[0]; |
457 | | |
458 | | // Count of forward reference frames |
459 | 3.32M | const int fwd_count = ref_counts[LAST_FRAME] + ref_counts[LAST2_FRAME] + |
460 | 3.32M | ref_counts[LAST3_FRAME] + ref_counts[GOLDEN_FRAME]; |
461 | | // Count of backward reference frames |
462 | 3.32M | const int bwd_count = ref_counts[BWDREF_FRAME] + ref_counts[ALTREF2_FRAME] + |
463 | 3.32M | ref_counts[ALTREF_FRAME]; |
464 | | |
465 | 3.32M | const int pred_context = |
466 | 3.32M | (fwd_count == bwd_count) ? 1 : ((fwd_count < bwd_count) ? 0 : 2); |
467 | | |
468 | 3.32M | assert(pred_context >= 0 && pred_context < REF_CONTEXTS); |
469 | 3.32M | return pred_context; |
470 | 3.32M | } |
471 | | |
472 | | // For the bit to signal whether the single reference is ALTREF_FRAME or |
473 | | // non-ALTREF backward reference frame, knowing that it shall be either of |
474 | | // these 2 choices. |
475 | 472k | int av1_get_pred_context_single_ref_p2(const MACROBLOCKD *xd) { |
476 | 472k | return get_pred_context_brfarf2_or_arf(xd); |
477 | 472k | } |
478 | | |
479 | | // For the bit to signal whether the single reference is LAST3/GOLDEN or |
480 | | // LAST2/LAST, knowing that it shall be either of these 2 choices. |
481 | 2.85M | int av1_get_pred_context_single_ref_p3(const MACROBLOCKD *xd) { |
482 | 2.85M | return get_pred_context_ll2_or_l3gld(xd); |
483 | 2.85M | } |
484 | | |
485 | | // For the bit to signal whether the single reference is LAST2_FRAME or |
486 | | // LAST_FRAME, knowing that it shall be either of these 2 choices. |
487 | 2.60M | int av1_get_pred_context_single_ref_p4(const MACROBLOCKD *xd) { |
488 | 2.60M | return get_pred_context_last_or_last2(xd); |
489 | 2.60M | } |
490 | | |
491 | | // For the bit to signal whether the single reference is GOLDEN_FRAME or |
492 | | // LAST3_FRAME, knowing that it shall be either of these 2 choices. |
493 | 245k | int av1_get_pred_context_single_ref_p5(const MACROBLOCKD *xd) { |
494 | 245k | return get_pred_context_last3_or_gld(xd); |
495 | 245k | } |
496 | | |
497 | | // For the bit to signal whether the single reference is ALTREF2_FRAME or |
498 | | // BWDREF_FRAME, knowing that it shall be either of these 2 choices. |
499 | 215k | int av1_get_pred_context_single_ref_p6(const MACROBLOCKD *xd) { |
500 | 215k | return get_pred_context_brf_or_arf2(xd); |
501 | 215k | } |