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

11 12
#ifndef VP10_ENCODER_TOKENIZE_H_
#define VP10_ENCODER_TOKENIZE_H_
Jingning Han's avatar
Jingning Han committed
13

14
#include "vp10/common/entropy.h"
Jingning Han's avatar
Jingning Han committed
15

16 17
#include "vp10/encoder/block.h"
#include "vp10/encoder/treewriter.h"
Jingning Han's avatar
Jingning Han committed
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

#ifdef __cplusplus
extern "C" {
#endif

#define EOSB_TOKEN 127     // Not signalled, encoder only

#if CONFIG_VP9_HIGHBITDEPTH
  typedef int32_t EXTRABIT;
#else
  typedef int16_t EXTRABIT;
#endif


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

typedef struct {
  const vpx_prob *context_tree;
  EXTRABIT extra;
  uint8_t token;
  uint8_t skip_eob_node;
} TOKENEXTRA;

extern const vpx_tree_index vp10_coef_tree[];
extern const vpx_tree_index vp10_coef_con_tree[];
Alex Converse's avatar
Alex Converse committed
46
#if !CONFIG_ANS
Jingning Han's avatar
Jingning Han committed
47
extern const struct vp10_token vp10_coef_encodings[];
Alex Converse's avatar
Alex Converse committed
48
#endif  // !CONFIG_ANS
Jingning Han's avatar
Jingning Han committed
49 50 51 52

int vp10_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);
int vp10_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);

Yaowu Xu's avatar
Yaowu Xu committed
53
struct VP10_COMP;
Jingning Han's avatar
Jingning Han committed
54
struct ThreadData;
55 56 57 58 59 60

#if CONFIG_VAR_TX
void vp10_tokenize_sb_inter(struct VP10_COMP *cpi, struct ThreadData *td,
                            TOKENEXTRA **t, int dry_run, int mi_row, int mi_col,
                            BLOCK_SIZE bsize);
#endif
Jingning Han's avatar
Jingning Han committed
61

hui su's avatar
hui su committed
62 63 64
void vp10_tokenize_palette_sb(struct ThreadData *const td,
                              BLOCK_SIZE bsize, int plane,
                              TOKENEXTRA **t);
Yaowu Xu's avatar
Yaowu Xu committed
65
void vp10_tokenize_sb(struct VP10_COMP *cpi, struct ThreadData *td,
Jingning Han's avatar
Jingning Han committed
66
                     TOKENEXTRA **t, int dry_run, BLOCK_SIZE bsize);
67 68 69 70
#if CONFIG_SUPERTX
void vp10_tokenize_sb_supertx(struct VP10_COMP *cpi, struct ThreadData *td,
                              TOKENEXTRA **t, int dry_run, BLOCK_SIZE bsize);
#endif
Jingning Han's avatar
Jingning Han committed
71 72 73 74 75 76 77 78

extern const int16_t *vp10_dct_value_cost_ptr;
/* 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.
 */
extern const TOKENVALUE *vp10_dct_value_tokens_ptr;
extern const TOKENVALUE *vp10_dct_cat_lt_10_value_tokens;
Julia Robson's avatar
Julia Robson committed
79
extern const int *vp10_dct_cat_lt_10_value_cost;
Jingning Han's avatar
Jingning Han committed
80
extern const int16_t vp10_cat6_low_cost[256];
81 82 83 84 85
extern const int vp10_cat6_high_cost[64];
extern const int vp10_cat6_high10_high_cost[256];
extern const int vp10_cat6_high12_high_cost[1024];
static INLINE int vp10_get_cost(int16_t token, EXTRABIT extrabits,
                               const int *cat6_high_table) {
Jingning Han's avatar
Jingning Han committed
86
  if (token != CATEGORY6_TOKEN)
87 88 89
    return vp10_extra_bits[token].cost[extrabits >> 1];
  return vp10_cat6_low_cost[(extrabits >> 1) & 0xff]
      + cat6_high_table[extrabits >> 9];
Jingning Han's avatar
Jingning Han committed
90 91 92
}

#if CONFIG_VP9_HIGHBITDEPTH
93
static INLINE const int* vp10_get_high_cost_table(int bit_depth) {
Jingning Han's avatar
Jingning Han committed
94 95 96 97 98
  return bit_depth == 8 ? vp10_cat6_high_cost
      : (bit_depth == 10 ? vp10_cat6_high10_high_cost :
         vp10_cat6_high12_high_cost);
}
#else
99
static INLINE const int* vp10_get_high_cost_table(int bit_depth) {
Jingning Han's avatar
Jingning Han committed
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
  (void) bit_depth;
  return vp10_cat6_high_cost;
}
#endif  // CONFIG_VP9_HIGHBITDEPTH

static INLINE void vp10_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 = vp10_dct_cat_lt_10_value_tokens[v].token;
  *extra = vp10_dct_cat_lt_10_value_tokens[v].extra;
}
static INLINE int16_t vp10_get_token(int v) {
  if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL)
    return 10;
  return vp10_dct_cat_lt_10_value_tokens[v].token;
}

Julia Robson's avatar
Julia Robson committed
123 124 125 126 127 128 129 130 131 132 133 134
static INLINE int vp10_get_token_cost(int v, int16_t *token,
                                          const int *cat6_high_table) {
  if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL) {
    EXTRABIT extrabits;
    *token = CATEGORY6_TOKEN;
    extrabits = abs(v) - CAT6_MIN_VAL;
    return vp10_cat6_low_cost[extrabits & 0xff]
        + cat6_high_table[extrabits >> 8];
  }
  *token = vp10_dct_cat_lt_10_value_tokens[v].token;
  return vp10_dct_cat_lt_10_value_cost[v];
}
Jingning Han's avatar
Jingning Han committed
135 136 137 138 139

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

140
#endif  // VP10_ENCODER_TOKENIZE_H_