vp9_tokenize.h 3.27 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
 */

11
12
#ifndef VP9_ENCODER_VP9_TOKENIZE_H_
#define VP9_ENCODER_VP9_TOKENIZE_H_
John Koleszar's avatar
John Koleszar committed
13

14
#include "vp9/common/vp9_entropy.h"
15

16
#include "vp9/encoder/vp9_block.h"
17
#include "vp9/encoder/vp9_treewriter.h"
John Koleszar's avatar
John Koleszar committed
18

19
20
21
22
#ifdef __cplusplus
extern "C" {
#endif

23
24
#define EOSB_TOKEN 127     // Not signalled, encoder only

Deb Mukherjee's avatar
Deb Mukherjee committed
25
#if CONFIG_VP9_HIGHBITDEPTH
26
  typedef int32_t EXTRABIT;
Deb Mukherjee's avatar
Deb Mukherjee committed
27
#else
28
  typedef int16_t EXTRABIT;
Deb Mukherjee's avatar
Deb Mukherjee committed
29
#endif
30
31
32
33
34


typedef struct {
  int16_t token;
  EXTRABIT extra;
35
36
} TOKENVALUE;

John Koleszar's avatar
John Koleszar committed
37
typedef struct {
38
  const vp9_prob *context_tree;
39
40
41
  EXTRABIT extra;
  uint8_t token;
  uint8_t skip_eob_node;
John Koleszar's avatar
John Koleszar committed
42
43
} TOKENEXTRA;

44
45
extern const vp9_tree_index vp9_coef_tree[];
extern const vp9_tree_index vp9_coef_con_tree[];
Jim Bankoski's avatar
Jim Bankoski committed
46
extern const struct vp9_token vp9_coef_encodings[];
47

48
int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);
49
int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);
50

51
struct VP9_COMP;
52
struct ThreadData;
53

54
55
void vp9_tokenize_sb(struct VP9_COMP *cpi, struct ThreadData *td,
                     TOKENEXTRA **t, int dry_run, BLOCK_SIZE bsize);
56

57
extern const int16_t *vp9_dct_value_cost_ptr;
58
59
60
61
/* TODO: The Token field should be broken out into a separate char array to
 *  improve cache locality, since it's needed for costing when the rest of the
 *  fields are not.
 */
62
extern const TOKENVALUE *vp9_dct_value_tokens_ptr;
63
extern const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens;
64
65
66
67
extern const int16_t vp9_cat6_low_cost[256];
extern const int16_t vp9_cat6_high_cost[128];
extern const int16_t vp9_cat6_high10_high_cost[512];
extern const int16_t vp9_cat6_high12_high_cost[2048];
Yaowu Xu's avatar
Yaowu Xu committed
68
static INLINE int16_t vp9_get_cost(int16_t token, EXTRABIT extrabits,
69
70
71
72
73
74
75
                                   const int16_t *cat6_high_table) {
  if (token != CATEGORY6_TOKEN)
    return vp9_extra_bits[token].cost[extrabits];
  return vp9_cat6_low_cost[extrabits & 0xff]
      + cat6_high_table[extrabits >> 8];
}

76
#if CONFIG_VP9_HIGHBITDEPTH
77
78
79
80
81
82
83
84
85
86
static INLINE const int16_t* vp9_get_high_cost_table(int bit_depth) {
  return bit_depth == 8 ? vp9_cat6_high_cost
      : (bit_depth == 10 ? vp9_cat6_high10_high_cost :
         vp9_cat6_high12_high_cost);
}
#else
static INLINE const int16_t* vp9_get_high_cost_table(int bit_depth) {
  (void) bit_depth;
  return vp9_cat6_high_cost;
}
87
#endif  // CONFIG_VP9_HIGHBITDEPTH
John Koleszar's avatar
John Koleszar committed
88

89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
static INLINE void vp9_get_token_extra(int v, int16_t *token, EXTRABIT *extra) {
  if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL) {
    *token = CATEGORY6_TOKEN;
    if (v >= CAT6_MIN_VAL)
      *extra = 2 * v - 2 * CAT6_MIN_VAL;
    else
      *extra = -2 * v - 2 * CAT6_MIN_VAL + 1;
    return;
  }
  *token = vp9_dct_cat_lt_10_value_tokens[v].token;
  *extra = vp9_dct_cat_lt_10_value_tokens[v].extra;
}
static INLINE int16_t vp9_get_token(int v) {
  if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL)
    return 10;
  return vp9_dct_cat_lt_10_value_tokens[v].token;
}


108
109
110
111
#ifdef __cplusplus
}  // extern "C"
#endif

112
#endif  // VP9_ENCODER_VP9_TOKENIZE_H_