blob: 9a32815d2380f503aed9ef9528b74d3e68391045 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * 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.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
Yaowu Xuf883b422016-08-30 14:01:10 -070012#ifndef AV1_COMMON_PRED_COMMON_H_
13#define AV1_COMMON_PRED_COMMON_H_
Yaowu Xuc27fc142016-08-22 16:08:15 -070014
15#include "av1/common/blockd.h"
16#include "av1/common/onyxc_int.h"
Yaowu Xuf883b422016-08-30 14:01:10 -070017#include "aom_dsp/aom_dsp_common.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070018
19#ifdef __cplusplus
20extern "C" {
21#endif
22
Urvang Joshi52648442016-10-13 17:27:51 -070023static INLINE int get_segment_id(const AV1_COMMON *const cm,
Yaowu Xuc27fc142016-08-22 16:08:15 -070024 const uint8_t *segment_ids, BLOCK_SIZE bsize,
25 int mi_row, int mi_col) {
26 const int mi_offset = mi_row * cm->mi_cols + mi_col;
Jingning Hanc709e1f2016-12-06 14:48:09 -080027 const int bw = mi_size_wide[bsize];
28 const int bh = mi_size_high[bsize];
Yaowu Xuf883b422016-08-30 14:01:10 -070029 const int xmis = AOMMIN(cm->mi_cols - mi_col, bw);
30 const int ymis = AOMMIN(cm->mi_rows - mi_row, bh);
Yaowu Xuc27fc142016-08-22 16:08:15 -070031 int x, y, segment_id = MAX_SEGMENTS;
32
33 for (y = 0; y < ymis; ++y)
34 for (x = 0; x < xmis; ++x)
35 segment_id =
Yaowu Xuf883b422016-08-30 14:01:10 -070036 AOMMIN(segment_id, segment_ids[mi_offset + y * cm->mi_cols + x]);
Yaowu Xuc27fc142016-08-22 16:08:15 -070037
38 assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
39 return segment_id;
40}
41
Yaowu Xuf883b422016-08-30 14:01:10 -070042static INLINE int av1_get_pred_context_seg_id(const MACROBLOCKD *xd) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070043 const MODE_INFO *const above_mi = xd->above_mi;
44 const MODE_INFO *const left_mi = xd->left_mi;
45 const int above_sip =
46 (above_mi != NULL) ? above_mi->mbmi.seg_id_predicted : 0;
47 const int left_sip = (left_mi != NULL) ? left_mi->mbmi.seg_id_predicted : 0;
48
49 return above_sip + left_sip;
50}
51
Yaowu Xuf883b422016-08-30 14:01:10 -070052static INLINE aom_prob av1_get_pred_prob_seg_id(
Yaowu Xuc27fc142016-08-22 16:08:15 -070053 const struct segmentation_probs *segp, const MACROBLOCKD *xd) {
Yaowu Xuf883b422016-08-30 14:01:10 -070054 return segp->pred_probs[av1_get_pred_context_seg_id(xd)];
Yaowu Xuc27fc142016-08-22 16:08:15 -070055}
56
Yaowu Xuf883b422016-08-30 14:01:10 -070057static INLINE int av1_get_skip_context(const MACROBLOCKD *xd) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070058 const MODE_INFO *const above_mi = xd->above_mi;
59 const MODE_INFO *const left_mi = xd->left_mi;
60 const int above_skip = (above_mi != NULL) ? above_mi->mbmi.skip : 0;
61 const int left_skip = (left_mi != NULL) ? left_mi->mbmi.skip : 0;
62 return above_skip + left_skip;
63}
64
Yaowu Xuf883b422016-08-30 14:01:10 -070065static INLINE aom_prob av1_get_skip_prob(const AV1_COMMON *cm,
66 const MACROBLOCKD *xd) {
67 return cm->fc->skip_probs[av1_get_skip_context(xd)];
Yaowu Xuc27fc142016-08-22 16:08:15 -070068}
69
70#if CONFIG_DUAL_FILTER
Yaowu Xuf883b422016-08-30 14:01:10 -070071int av1_get_pred_context_switchable_interp(const MACROBLOCKD *xd, int dir);
Yaowu Xuc27fc142016-08-22 16:08:15 -070072#else
Yaowu Xuf883b422016-08-30 14:01:10 -070073int av1_get_pred_context_switchable_interp(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -070074#endif
75
76#if CONFIG_EXT_INTRA
hui sueda3d762016-12-06 16:58:23 -080077#if CONFIG_INTRA_INTERP
Yaowu Xuf883b422016-08-30 14:01:10 -070078int av1_get_pred_context_intra_interp(const MACROBLOCKD *xd);
hui sueda3d762016-12-06 16:58:23 -080079#endif // CONFIG_INTRA_INTERP
Yaowu Xuc27fc142016-08-22 16:08:15 -070080#endif // CONFIG_EXT_INTRA
81
hui su33567b22017-04-30 16:40:19 -070082#if CONFIG_PALETTE && CONFIG_PALETTE_DELTA_ENCODING
83// Get a list of palette base colors that are used in the above and left blocks,
84// referred to as "color cache". The return value is the number of colors in the
85// cache (<= 2 * PALETTE_MAX_SIZE). The color values are stored in "cache"
86// in ascending order.
87int av1_get_palette_cache(const MODE_INFO *above_mi, const MODE_INFO *left_mi,
88 int plane, uint16_t *cache);
89#endif // CONFIG_PALETTE && CONFIG_PALETTE_DELTA_ENCODING
90
Yaowu Xuf883b422016-08-30 14:01:10 -070091int av1_get_intra_inter_context(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -070092
Yaowu Xuf883b422016-08-30 14:01:10 -070093static INLINE aom_prob av1_get_intra_inter_prob(const AV1_COMMON *cm,
94 const MACROBLOCKD *xd) {
95 return cm->fc->intra_inter_prob[av1_get_intra_inter_context(xd)];
Yaowu Xuc27fc142016-08-22 16:08:15 -070096}
97
Yaowu Xuf883b422016-08-30 14:01:10 -070098int av1_get_reference_mode_context(const AV1_COMMON *cm, const MACROBLOCKD *xd);
99
100static INLINE aom_prob av1_get_reference_mode_prob(const AV1_COMMON *cm,
101 const MACROBLOCKD *xd) {
102 return cm->fc->comp_inter_prob[av1_get_reference_mode_context(cm, xd)];
103}
Thomas Davies860def62017-06-14 10:00:03 +0100104#if CONFIG_NEW_MULTISYMBOL
105static INLINE aom_cdf_prob *av1_get_reference_mode_cdf(const AV1_COMMON *cm,
106 const MACROBLOCKD *xd) {
107 return xd->tile_ctx->comp_inter_cdf[av1_get_reference_mode_context(cm, xd)];
108}
109#endif
Yaowu Xuf883b422016-08-30 14:01:10 -0700110
Zoe Liuc082bbc2017-05-17 13:31:37 -0700111#if CONFIG_EXT_COMP_REFS
112int av1_get_comp_reference_type_context(const AV1_COMMON *cm,
113 const MACROBLOCKD *xd);
114
115static INLINE aom_prob av1_get_comp_reference_type_prob(const AV1_COMMON *cm,
116 const MACROBLOCKD *xd) {
117 return cm->fc
118 ->comp_ref_type_prob[av1_get_comp_reference_type_context(cm, xd)];
119}
120
121int av1_get_pred_context_uni_comp_ref_p(const AV1_COMMON *cm,
122 const MACROBLOCKD *xd);
123
124static INLINE aom_prob av1_get_pred_prob_uni_comp_ref_p(const AV1_COMMON *cm,
125 const MACROBLOCKD *xd) {
126 const int pred_context = av1_get_pred_context_uni_comp_ref_p(cm, xd);
127 return cm->fc->uni_comp_ref_prob[pred_context][0];
128}
129
130int av1_get_pred_context_uni_comp_ref_p1(const AV1_COMMON *cm,
131 const MACROBLOCKD *xd);
132
133static INLINE aom_prob
134av1_get_pred_prob_uni_comp_ref_p1(const AV1_COMMON *cm, const MACROBLOCKD *xd) {
135 const int pred_context = av1_get_pred_context_uni_comp_ref_p1(cm, xd);
136 return cm->fc->uni_comp_ref_prob[pred_context][1];
137}
138#endif // CONFIG_EXT_COMP_REFS
139
Yaowu Xuf883b422016-08-30 14:01:10 -0700140int av1_get_pred_context_comp_ref_p(const AV1_COMMON *cm,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700141 const MACROBLOCKD *xd);
142
Yaowu Xuf883b422016-08-30 14:01:10 -0700143static INLINE aom_prob av1_get_pred_prob_comp_ref_p(const AV1_COMMON *cm,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700144 const MACROBLOCKD *xd) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700145 const int pred_context = av1_get_pred_context_comp_ref_p(cm, xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700146 return cm->fc->comp_ref_prob[pred_context][0];
147}
148
149#if CONFIG_EXT_REFS
Yaowu Xuf883b422016-08-30 14:01:10 -0700150int av1_get_pred_context_comp_ref_p1(const AV1_COMMON *cm,
151 const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700152
Yaowu Xuf883b422016-08-30 14:01:10 -0700153static INLINE aom_prob av1_get_pred_prob_comp_ref_p1(const AV1_COMMON *cm,
154 const MACROBLOCKD *xd) {
155 const int pred_context = av1_get_pred_context_comp_ref_p1(cm, xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700156 return cm->fc->comp_ref_prob[pred_context][1];
157}
158
Yaowu Xuf883b422016-08-30 14:01:10 -0700159int av1_get_pred_context_comp_ref_p2(const AV1_COMMON *cm,
160 const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700161
Yaowu Xuf883b422016-08-30 14:01:10 -0700162static INLINE aom_prob av1_get_pred_prob_comp_ref_p2(const AV1_COMMON *cm,
163 const MACROBLOCKD *xd) {
164 const int pred_context = av1_get_pred_context_comp_ref_p2(cm, xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700165 return cm->fc->comp_ref_prob[pred_context][2];
166}
167
Yaowu Xuf883b422016-08-30 14:01:10 -0700168int av1_get_pred_context_comp_bwdref_p(const AV1_COMMON *cm,
169 const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700170
Yaowu Xuf883b422016-08-30 14:01:10 -0700171static INLINE aom_prob av1_get_pred_prob_comp_bwdref_p(const AV1_COMMON *cm,
172 const MACROBLOCKD *xd) {
173 const int pred_context = av1_get_pred_context_comp_bwdref_p(cm, xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700174 return cm->fc->comp_bwdref_prob[pred_context][0];
175}
Yaowu Xuc27fc142016-08-22 16:08:15 -0700176#endif // CONFIG_EXT_REFS
177
Yaowu Xuf883b422016-08-30 14:01:10 -0700178int av1_get_pred_context_single_ref_p1(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700179
Yaowu Xuf883b422016-08-30 14:01:10 -0700180static INLINE aom_prob av1_get_pred_prob_single_ref_p1(const AV1_COMMON *cm,
181 const MACROBLOCKD *xd) {
182 return cm->fc->single_ref_prob[av1_get_pred_context_single_ref_p1(xd)][0];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700183}
184
Yaowu Xuf883b422016-08-30 14:01:10 -0700185int av1_get_pred_context_single_ref_p2(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700186
Yaowu Xuf883b422016-08-30 14:01:10 -0700187static INLINE aom_prob av1_get_pred_prob_single_ref_p2(const AV1_COMMON *cm,
188 const MACROBLOCKD *xd) {
189 return cm->fc->single_ref_prob[av1_get_pred_context_single_ref_p2(xd)][1];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700190}
191
192#if CONFIG_EXT_REFS
Yaowu Xuf883b422016-08-30 14:01:10 -0700193int av1_get_pred_context_single_ref_p3(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700194
Yaowu Xuf883b422016-08-30 14:01:10 -0700195static INLINE aom_prob av1_get_pred_prob_single_ref_p3(const AV1_COMMON *cm,
196 const MACROBLOCKD *xd) {
197 return cm->fc->single_ref_prob[av1_get_pred_context_single_ref_p3(xd)][2];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700198}
199
Yaowu Xuf883b422016-08-30 14:01:10 -0700200int av1_get_pred_context_single_ref_p4(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700201
Yaowu Xuf883b422016-08-30 14:01:10 -0700202static INLINE aom_prob av1_get_pred_prob_single_ref_p4(const AV1_COMMON *cm,
203 const MACROBLOCKD *xd) {
204 return cm->fc->single_ref_prob[av1_get_pred_context_single_ref_p4(xd)][3];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700205}
206
Yaowu Xuf883b422016-08-30 14:01:10 -0700207int av1_get_pred_context_single_ref_p5(const MACROBLOCKD *xd);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700208
Yaowu Xuf883b422016-08-30 14:01:10 -0700209static INLINE aom_prob av1_get_pred_prob_single_ref_p5(const AV1_COMMON *cm,
210 const MACROBLOCKD *xd) {
211 return cm->fc->single_ref_prob[av1_get_pred_context_single_ref_p5(xd)][4];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700212}
213#endif // CONFIG_EXT_REFS
214
Thomas Davies315f5782017-06-14 15:14:55 +0100215#if CONFIG_NEW_MULTISYMBOL
216static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p1(
217 const MACROBLOCKD *xd) {
218 return xd->tile_ctx
219 ->single_ref_cdf[av1_get_pred_context_single_ref_p1(xd)][0];
220}
221static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p2(
222 const MACROBLOCKD *xd) {
223 return xd->tile_ctx
224 ->single_ref_cdf[av1_get_pred_context_single_ref_p2(xd)][1];
225}
226static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p3(
227 const MACROBLOCKD *xd) {
228 return xd->tile_ctx
229 ->single_ref_cdf[av1_get_pred_context_single_ref_p3(xd)][2];
230}
231static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p4(
232 const MACROBLOCKD *xd) {
233 return xd->tile_ctx
234 ->single_ref_cdf[av1_get_pred_context_single_ref_p4(xd)][3];
235}
236static INLINE aom_cdf_prob *av1_get_pred_cdf_single_ref_p5(
237 const MACROBLOCKD *xd) {
238 return xd->tile_ctx
239 ->single_ref_cdf[av1_get_pred_context_single_ref_p5(xd)][4];
240}
241#endif
242
Zoe Liu239f06b2017-04-20 13:10:55 -0700243#if CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
244int av1_get_inter_mode_context(const MACROBLOCKD *xd);
245
246static INLINE aom_prob av1_get_inter_mode_prob(const AV1_COMMON *cm,
247 const MACROBLOCKD *xd) {
248 return cm->fc->comp_inter_mode_prob[av1_get_inter_mode_context(xd)];
249}
250#endif // CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
251
Yaowu Xuc27fc142016-08-22 16:08:15 -0700252// Returns a context number for the given MB prediction signal
253// The mode info data structure has a one element border above and to the
254// left of the entries corresponding to real blocks.
255// The prediction flags in these dummy entries are initialized to 0.
256static INLINE int get_tx_size_context(const MACROBLOCKD *xd) {
257 const int max_tx_size = max_txsize_lookup[xd->mi[0]->mbmi.sb_type];
258 const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
259 const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
260 const int has_above = xd->up_available;
261 const int has_left = xd->left_available;
262 int above_ctx = (has_above && !above_mbmi->skip)
263 ? (int)txsize_sqr_map[above_mbmi->tx_size]
264 : max_tx_size;
265 int left_ctx = (has_left && !left_mbmi->skip)
266 ? (int)txsize_sqr_map[left_mbmi->tx_size]
267 : max_tx_size;
Jingning Han3daa4fd2017-01-20 10:33:50 -0800268
Yaowu Xuc27fc142016-08-22 16:08:15 -0700269 if (!has_left) left_ctx = above_ctx;
270
271 if (!has_above) above_ctx = left_ctx;
Timothy B. Terriberryfe67ed62017-04-26 16:53:47 -0700272 return (above_ctx + left_ctx) > max_tx_size + TX_SIZE_LUMA_MIN;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700273}
274
275#if CONFIG_VAR_TX
Yaowu Xuf883b422016-08-30 14:01:10 -0700276static void update_tx_counts(AV1_COMMON *cm, MACROBLOCKD *xd,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700277 MB_MODE_INFO *mbmi, BLOCK_SIZE plane_bsize,
278 TX_SIZE tx_size, int blk_row, int blk_col,
279 TX_SIZE max_tx_size, int ctx) {
280 const struct macroblockd_plane *const pd = &xd->plane[0];
281 const BLOCK_SIZE bsize = txsize_to_bsize[tx_size];
282 const int tx_row = blk_row >> (1 - pd->subsampling_y);
283 const int tx_col = blk_col >> (1 - pd->subsampling_x);
284 const TX_SIZE plane_tx_size = mbmi->inter_tx_size[tx_row][tx_col];
Jingning Hanf65b8702016-10-31 12:13:20 -0700285 const int max_blocks_high = max_block_high(xd, plane_bsize, 0);
286 const int max_blocks_wide = max_block_wide(xd, plane_bsize, 0);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700287
288 if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
289
290 if (tx_size == plane_tx_size) {
Timothy B. Terriberryfe0fb1d2017-05-18 12:15:16 -0700291 int depth;
292 depth = tx_size_to_depth(tx_size);
293 ++xd->counts->tx_size[max_tx_size - TX_SIZE_CTX_MIN][ctx][depth];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700294 mbmi->tx_size = tx_size;
295 } else {
296 int bsl = b_width_log2_lookup[bsize];
297 int i;
298
299 assert(bsl > 0);
300 --bsl;
301
302 for (i = 0; i < 4; ++i) {
303 const int offsetr = blk_row + ((i >> 1) << bsl);
304 const int offsetc = blk_col + ((i & 0x01) << bsl);
305
306 if (offsetr >= max_blocks_high || offsetc >= max_blocks_wide) continue;
Urvang Joshicb586f32016-09-20 11:36:33 -0700307 update_tx_counts(cm, xd, mbmi, plane_bsize, (TX_SIZE)(tx_size - 1),
308 offsetr, offsetc, max_tx_size, ctx);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700309 }
310 }
311}
312
Yaowu Xuf883b422016-08-30 14:01:10 -0700313static INLINE void inter_block_tx_count_update(AV1_COMMON *cm, MACROBLOCKD *xd,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700314 MB_MODE_INFO *mbmi,
315 BLOCK_SIZE plane_bsize,
316 int ctx) {
Jingning Han9ca05b72017-01-03 14:41:36 -0800317 const int mi_width = block_size_wide[plane_bsize] >> tx_size_wide_log2[0];
318 const int mi_height = block_size_high[plane_bsize] >> tx_size_wide_log2[0];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700319 TX_SIZE max_tx_size = max_txsize_lookup[plane_bsize];
Jingning Han9ca05b72017-01-03 14:41:36 -0800320 int bh = tx_size_wide_unit[max_tx_size];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700321 int idx, idy;
322
323 for (idy = 0; idy < mi_height; idy += bh)
324 for (idx = 0; idx < mi_width; idx += bh)
325 update_tx_counts(cm, xd, mbmi, plane_bsize, max_tx_size, idy, idx,
326 max_tx_size, ctx);
327}
328#endif
329
330#ifdef __cplusplus
331} // extern "C"
332#endif
333
Yaowu Xuf883b422016-08-30 14:01:10 -0700334#endif // AV1_COMMON_PRED_COMMON_H_