TUT HEVC Encoder
cabac.h
Go to the documentation of this file.
1#ifndef CABAC_H_
2#define CABAC_H_
3/*****************************************************************************
4 * This file is part of Kvazaar HEVC encoder.
5 *
6 * Copyright (c) 2021, Tampere University, ITU/ISO/IEC, project contributors
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without modification,
10 * are permitted provided that the following conditions are met:
11 *
12 * * Redistributions of source code must retain the above copyright notice, this
13 * list of conditions and the following disclaimer.
14 *
15 * * Redistributions in binary form must reproduce the above copyright notice, this
16 * list of conditions and the following disclaimer in the documentation and/or
17 * other materials provided with the distribution.
18 *
19 * * Neither the name of the Tampere University or ITU/ISO/IEC nor the names of its
20 * contributors may be used to endorse or promote products derived from
21 * this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND ON
30 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
33 ****************************************************************************/
34
41#include "global.h" // IWYU pragma: keep
42
43#include "bitstream.h"
44
45struct encoder_state_t;
46
47// Types
48typedef struct
49{
50 uint8_t uc_state;
52
53typedef struct
54{
56 uint32_t low;
57 uint32_t range;
58 uint32_t buffered_byte;
60 int32_t bits_left;
61 int8_t only_count : 4;
62 int8_t update : 4;
64
65 // CONTEXTS
66 struct {
69 cabac_ctx_t split_flag_model[3];
71 cabac_ctx_t chroma_pred_model[2];
72 cabac_ctx_t inter_dir[5];
73 cabac_ctx_t trans_subdiv_model[3];
74 cabac_ctx_t qt_cbf_model_luma[4];
75 cabac_ctx_t qt_cbf_model_chroma[4];
76 cabac_ctx_t cu_qp_delta_abs[4];
77 cabac_ctx_t part_size_model[4];
78 cabac_ctx_t cu_sig_coeff_group_model[4];
79 cabac_ctx_t cu_sig_model_luma[27];
80 cabac_ctx_t cu_sig_model_chroma[15];
81 cabac_ctx_t cu_ctx_last_y_luma[15];
82 cabac_ctx_t cu_ctx_last_y_chroma[15];
83 cabac_ctx_t cu_ctx_last_x_luma[15];
84 cabac_ctx_t cu_ctx_last_x_chroma[15];
85 cabac_ctx_t cu_one_model_luma[16];
86 cabac_ctx_t cu_one_model_chroma[8];
87 cabac_ctx_t cu_abs_model_luma[4];
88 cabac_ctx_t cu_abs_model_chroma[2];
90 cabac_ctx_t cu_skip_flag_model[3];
94 cabac_ctx_t cu_mvd_model[2];
95 cabac_ctx_t cu_ref_pic_model[2];
96 cabac_ctx_t mvp_idx_model[2];
100 } ctx;
102
103
104// Globals
105extern const uint8_t kvz_g_auc_next_state_mps[128];
106extern const uint8_t kvz_g_auc_next_state_lps[128];
107extern const uint8_t kvz_g_auc_lpst_table[64][4];
108extern const uint8_t kvz_g_auc_renorm_table[32];
109
110
111// Functions
113void kvz_cabac_encode_bin(cabac_data_t *data, uint32_t bin_value);
114void kvz_cabac_encode_bin_ep(cabac_data_t *data, uint32_t bin_value);
115void kvz_cabac_encode_bins_ep(cabac_data_t *data, uint32_t bin_values, int num_bins);
116void kvz_cabac_encode_bin_trm(cabac_data_t *data, uint8_t bin_value);
119int kvz_cabac_write_coeff_remain(cabac_data_t* cabac, uint32_t symbol,
120 uint32_t r_param);
121void kvz_cabac_write_coeff_remain_encry(struct encoder_state_t * const state, cabac_data_t * const cabac, const uint32_t symbol,
122 const uint32_t r_param, int32_t base_level);
123uint32_t kvz_cabac_write_ep_ex_golomb(struct encoder_state_t * const state, cabac_data_t *data,
124 uint32_t symbol, uint32_t count);
126 uint32_t symbol, int32_t offset,
127 uint32_t max_symbol, double* bits_out);
128void kvz_cabac_write_unary_max_symbol_ep(cabac_data_t *data, unsigned int symbol, unsigned int max_symbol);
129
130extern const float kvz_f_entropy_bits[128];
131#define CTX_ENTROPY_FBITS(ctx, val) kvz_f_entropy_bits[(ctx)->uc_state ^ (val)]
132
133#define CABAC_FBITS_UPDATE(cabac, ctx, val, bits, name) do { \
134 if((cabac)->only_count) (bits) += kvz_f_entropy_bits[(ctx)->uc_state ^ (val)]; \
135 if((cabac)->update) {\
136 (cabac)->cur_ctx = ctx;\
137 CABAC_BIN((cabac), (val), (name));\
138 } \
139} while(0)
140
141// Macros
142#define CTX_STATE(ctx) ((ctx)->uc_state >> 1)
143#define CTX_MPS(ctx) ((ctx)->uc_state & 1)
144#define CTX_UPDATE_LPS(ctx) { (ctx)->uc_state = kvz_g_auc_next_state_lps[ (ctx)->uc_state ]; }
145#define CTX_UPDATE_MPS(ctx) { (ctx)->uc_state = kvz_g_auc_next_state_mps[ (ctx)->uc_state ]; }
146
147
148#ifdef VERBOSE
149 #define CABAC_BIN(data, value, name) { \
150 uint32_t prev_state = (data)->cur_ctx->uc_state; \
151 kvz_cabac_encode_bin((data), (value)); \
152 if(!(data)->only_count) printf("%s = %u, state = %u -> %u MPS = %u\n", \
153 (name), (uint32_t)(value), prev_state, (data)->cur_ctx->uc_state, CTX_MPS((data)->cur_ctx)); }
154
155 #define CABAC_BINS_EP(data, value, bins, name) { \
156 uint32_t prev_state = (data)->cur_ctx->uc_state; \
157 kvz_cabac_encode_bins_ep((data), (value), (bins)); \
158 if(!(data)->only_count) printf("%s = %u(%u bins), state = %u -> %u\n", \
159 (name), (uint32_t)(value), (bins), prev_state, (data)->cur_ctx->uc_state); }
160
161 #define CABAC_BIN_EP(data, value, name) { \
162 uint32_t prev_state = (data)->cur_ctx->uc_state; \
163 kvz_cabac_encode_bin_ep((data), (value)); \
164 if(!(data)->only_count) printf("%s = %u, state = %u -> %u\n", \
165 (name), (uint32_t)(value), prev_state, (data)->cur_ctx->uc_state); }
166#else
167 #define CABAC_BIN(data, value, name) \
168 kvz_cabac_encode_bin((data), (value));
169 #define CABAC_BINS_EP(data, value, bins, name) \
170 kvz_cabac_encode_bins_ep((data), (value), (bins));
171 #define CABAC_BIN_EP(data, value, name) \
172 kvz_cabac_encode_bin_ep((data), (value));
173#endif
174
175#endif
Appending bits into an Annex-B coded bitstream.
const uint8_t kvz_g_auc_lpst_table[64][4]
Definition: cabac.c:64
void kvz_cabac_write_coeff_remain_encry(struct encoder_state_t *const state, cabac_data_t *const cabac, const uint32_t symbol, const uint32_t r_param, int32_t base_level)
Definition: cabac.c:303
void kvz_cabac_write_unary_max_symbol_ep(cabac_data_t *data, unsigned int symbol, unsigned int max_symbol)
This can be used for Truncated Rice binarization with cRiceParam=0.
Definition: cabac.c:526
void kvz_cabac_write(cabac_data_t *data)
Definition: cabac.c:137
void kvz_cabac_encode_bin_ep(cabac_data_t *data, uint32_t bin_value)
Definition: cabac.c:228
void kvz_cabac_encode_bins_ep(cabac_data_t *data, uint32_t bin_values, int num_bins)
Definition: cabac.c:244
int kvz_cabac_write_coeff_remain(cabac_data_t *cabac, uint32_t symbol, uint32_t r_param)
Coding of coeff_abs_level_minus3.
Definition: cabac.c:275
void kvz_cabac_encode_bin_trm(cabac_data_t *data, uint8_t bin_value)
Encode terminating bin.
Definition: cabac.c:204
const uint8_t kvz_g_auc_next_state_lps[128]
Definition: cabac.c:52
void kvz_cabac_encode_bin(cabac_data_t *data, uint32_t bin_value)
Definition: cabac.c:104
void kvz_cabac_start(cabac_data_t *data)
Initialize struct cabac_data.
Definition: cabac.c:90
const uint8_t kvz_g_auc_next_state_mps[128]
Definition: cabac.c:40
void kvz_cabac_write_unary_max_symbol(cabac_data_t *data, cabac_ctx_t *ctx, uint32_t symbol, int32_t offset, uint32_t max_symbol, double *bits_out)
Definition: cabac.c:498
uint32_t kvz_cabac_write_ep_ex_golomb(struct encoder_state_t *const state, cabac_data_t *data, uint32_t symbol, uint32_t count)
Definition: cabac.c:556
const uint8_t kvz_g_auc_renorm_table[32]
Definition: cabac.c:81
const float kvz_f_entropy_bits[128]
Definition: rdo.c:83
void kvz_cabac_finish(cabac_data_t *data)
Definition: cabac.c:173
Header that is included in every other header.
static kvz_rc_data * data
Definition: rate_control.c:48
A stream of bits.
Definition: bitstream.h:50
Definition: cabac.h:49
uint8_t uc_state
Definition: cabac.h:50
Definition: cabac.h:54
int8_t only_count
Definition: cabac.h:61
int32_t num_buffered_bytes
Definition: cabac.h:59
cabac_ctx_t cu_qt_root_cbf_model
Definition: cabac.h:97
cabac_ctx_t sao_merge_flag_model
Definition: cabac.h:67
cabac_ctx_t cu_merge_flag_ext_model
Definition: cabac.h:92
int8_t update
Definition: cabac.h:62
cabac_ctx_t * cur_ctx
Definition: cabac.h:55
bitstream_t * stream
Definition: cabac.h:63
int32_t bits_left
Definition: cabac.h:60
cabac_ctx_t intra_mode_model
intra mode context models
Definition: cabac.h:70
cabac_ctx_t transform_skip_model_chroma
Definition: cabac.h:99
cabac_ctx_t cu_merge_idx_ext_model
Definition: cabac.h:91
uint32_t low
Definition: cabac.h:56
uint32_t buffered_byte
Definition: cabac.h:58
cabac_ctx_t cu_transquant_bypass
Definition: cabac.h:93
uint32_t range
Definition: cabac.h:57
cabac_ctx_t transform_skip_model_luma
Definition: cabac.h:98
cabac_ctx_t sao_type_idx_model
Definition: cabac.h:68
cabac_ctx_t cu_pred_mode_model
Definition: cabac.h:89
Definition: encoderstate.h:274