scan.h 3.8 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
Yaowu Xu's avatar
Yaowu Xu committed
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
Yaowu Xu's avatar
Yaowu Xu committed
4 5 6 7 8 9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Jingning Han's avatar
Jingning Han committed
10 11
 */

Yaowu Xu's avatar
Yaowu Xu committed
12 13
#ifndef AV1_COMMON_SCAN_H_
#define AV1_COMMON_SCAN_H_
Jingning Han's avatar
Jingning Han committed
14

Yaowu Xu's avatar
Yaowu Xu committed
15
#include "aom/aom_integer.h"
16
#include "aom_ports/mem.h"
Jingning Han's avatar
Jingning Han committed
17

18
#include "av1/common/enums.h"
19
#include "av1/common/onyxc_int.h"
20
#include "av1/common/blockd.h"
Jingning Han's avatar
Jingning Han committed
21 22 23 24 25 26 27

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_NEIGHBORS 2

28 29
extern const SCAN_ORDER av1_default_scan_orders[TX_SIZES];
extern const SCAN_ORDER av1_intra_scan_orders[TX_SIZES][TX_TYPES];
30
extern const SCAN_ORDER av1_inter_scan_orders[TX_SIZES_ALL][TX_TYPES];
Jingning Han's avatar
Jingning Han committed
31

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#if CONFIG_ADAPT_SCAN
void av1_update_scan_prob(AV1_COMMON *cm, TX_SIZE tx_size, TX_TYPE tx_type,
                          int rate_16);
void av1_update_scan_count_facade(AV1_COMMON *cm, TX_SIZE tx_size,
                                  TX_TYPE tx_type, const tran_low_t *dqcoeffs,
                                  int max_scan);

// embed r + c and coeff_idx info with nonzero probabilities. When sorting the
// nonzero probabilities, if there is a tie, the coefficient with smaller r + c
// will be scanned first
void av1_augment_prob(uint32_t *prob, int size, int tx1d_size);

// apply quick sort on nonzero probabilities to obtain a sort order
void av1_update_sort_order(TX_SIZE tx_size, const uint32_t *non_zero_prob,
                           int16_t *sort_order);

// apply topological sort on the nonzero probabilities sorting order to
// guarantee each to-be-scanned coefficient's upper and left coefficient will be
// scanned before the to-be-scanned coefficient.
void av1_update_scan_order(TX_SIZE tx_size, int16_t *sort_order, int16_t *scan,
                           int16_t *iscan);

// For each coeff_idx in scan[], update its above and left neighbors in
// neighbors[] accordingly.
void av1_update_neighbors(int tx_size, const int16_t *scan,
                          const int16_t *iscan, int16_t *neighbors);
void av1_update_scan_order_facade(AV1_COMMON *cm, TX_SIZE tx_size,
                                  TX_TYPE tx_type);
void av1_init_scan_order(AV1_COMMON *cm);
#endif

Jingning Han's avatar
Jingning Han committed
63 64 65
static INLINE int get_coef_context(const int16_t *neighbors,
                                   const uint8_t *token_cache, int c) {
  return (1 + token_cache[neighbors[MAX_NEIGHBORS * c + 0]] +
clang-format's avatar
clang-format committed
66 67
          token_cache[neighbors[MAX_NEIGHBORS * c + 1]]) >>
         1;
Jingning Han's avatar
Jingning Han committed
68 69
}

70
static INLINE const SCAN_ORDER *get_intra_scan(TX_SIZE tx_size,
71
                                               TX_TYPE tx_type) {
Yaowu Xu's avatar
Yaowu Xu committed
72
  return &av1_intra_scan_orders[tx_size][tx_type];
73 74 75
}

#if CONFIG_EXT_TX
76
extern const SCAN_ORDER av1_inter_scan_orders[TX_SIZES_ALL][TX_TYPES];
77

78
static INLINE const SCAN_ORDER *get_inter_scan(TX_SIZE tx_size,
79
                                               TX_TYPE tx_type) {
Yaowu Xu's avatar
Yaowu Xu committed
80
  return &av1_inter_scan_orders[tx_size][tx_type];
81 82 83
}
#endif  // CONFIG_EXT_TX

Angie Chiang's avatar
Angie Chiang committed
84 85
static INLINE const SCAN_ORDER *get_scan(const AV1_COMMON *cm, TX_SIZE tx_size,
                                         TX_TYPE tx_type, int is_inter) {
Angie Chiang's avatar
Angie Chiang committed
86 87 88 89
#if CONFIG_ADAPT_SCAN
  (void)is_inter;
  return &cm->fc->sc[tx_size][tx_type];
#else  // CONFIG_ADAPT_SCAN
Angie Chiang's avatar
Angie Chiang committed
90
  (void)cm;
91
#if CONFIG_EXT_TX || CONFIG_VAR_TX
Yaowu Xu's avatar
Yaowu Xu committed
92 93
  return is_inter ? &av1_inter_scan_orders[tx_size][tx_type]
                  : &av1_intra_scan_orders[tx_size][tx_type];
94
#else
clang-format's avatar
clang-format committed
95
  (void)is_inter;
Yaowu Xu's avatar
Yaowu Xu committed
96
  return &av1_intra_scan_orders[tx_size][tx_type];
97
#endif  // CONFIG_EXT_TX
Angie Chiang's avatar
Angie Chiang committed
98
#endif  // CONFIG_ADAPT_SCAN
Jingning Han's avatar
Jingning Han committed
99 100 101 102 103 104
}

#ifdef __cplusplus
}  // extern "C"
#endif

Yaowu Xu's avatar
Yaowu Xu committed
105
#endif  // AV1_COMMON_SCAN_H_