uvg266/src/cabac.h
Ari Koivula 947bae24f9 Update Doxygen documentation
Add module information to all header files.

Update all header file documentations to briefly say what they are, and
to use the javadoc format so the brief actually gets included into the
doxygen documentation.

Remove \file from implementation files, in order to not repeat the info
from the header files.

Add files under strategies and tools to Doxygen and update the Doxygen
settings to be just plain better.

Make README be the main page of Doxygen documentation.
2015-12-17 14:05:50 +02:00

148 lines
5.3 KiB
C

#ifndef CABAC_H_
#define CABAC_H_
/*****************************************************************************
* This file is part of Kvazaar HEVC encoder.
*
* Copyright (C) 2013-2015 Tampere University of Technology and others (see
* COPYING file).
*
* Kvazaar is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* Kvazaar is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with Kvazaar. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
/**
* \ingroup CABAC
* \file
* Coding bins using CABAC.
*/
#include "global.h"
#include "bitstream.h"
// Types
typedef struct
{
uint8_t uc_state;
} cabac_ctx_t;
typedef struct
{
cabac_ctx_t *cur_ctx;
uint32_t low;
uint32_t range;
uint32_t buffered_byte;
int32_t num_buffered_bytes;
int32_t bits_left;
int8_t only_count;
bitstream_t *stream;
// CONTEXTS
struct {
cabac_ctx_t sao_merge_flag_model;
cabac_ctx_t sao_type_idx_model;
cabac_ctx_t split_flag_model[3]; //!< \brief split flag context models
cabac_ctx_t intra_mode_model; //!< \brief intra mode context models
cabac_ctx_t chroma_pred_model[2];
cabac_ctx_t inter_dir[5];
cabac_ctx_t trans_subdiv_model[3]; //!< \brief intra mode context models
cabac_ctx_t qt_cbf_model_luma[4];
cabac_ctx_t qt_cbf_model_chroma[4];
cabac_ctx_t part_size_model[4];
cabac_ctx_t cu_sig_coeff_group_model[4];
cabac_ctx_t cu_sig_model_luma[27];
cabac_ctx_t cu_sig_model_chroma[15];
cabac_ctx_t cu_ctx_last_y_luma[15];
cabac_ctx_t cu_ctx_last_y_chroma[15];
cabac_ctx_t cu_ctx_last_x_luma[15];
cabac_ctx_t cu_ctx_last_x_chroma[15];
cabac_ctx_t cu_one_model_luma[16];
cabac_ctx_t cu_one_model_chroma[8];
cabac_ctx_t cu_abs_model_luma[4];
cabac_ctx_t cu_abs_model_chroma[2];
cabac_ctx_t cu_pred_mode_model;
cabac_ctx_t cu_skip_flag_model[3];
cabac_ctx_t cu_merge_idx_ext_model;
cabac_ctx_t cu_merge_flag_ext_model;
cabac_ctx_t cu_mvd_model[2];
cabac_ctx_t cu_ref_pic_model[2];
cabac_ctx_t mvp_idx_model[2];
cabac_ctx_t cu_qt_root_cbf_model;
cabac_ctx_t transform_skip_model_luma;
cabac_ctx_t transform_skip_model_chroma;
} ctx;
} cabac_data_t;
// Globals
extern const uint8_t kvz_g_auc_next_state_mps[128];
extern const uint8_t kvz_g_auc_next_state_lps[128];
extern const uint8_t kvz_g_auc_lpst_table[64][4];
extern const uint8_t kvz_g_auc_renorm_table[32];
// Functions
void kvz_cabac_start(cabac_data_t *data);
void kvz_cabac_encode_bin(cabac_data_t *data, uint32_t bin_value);
void kvz_cabac_encode_bin_ep(cabac_data_t *data, uint32_t bin_value);
void kvz_cabac_encode_bins_ep(cabac_data_t *data, uint32_t bin_values, int num_bins);
void kvz_cabac_encode_bin_trm(cabac_data_t *data, uint8_t bin_value);
void kvz_cabac_write(cabac_data_t *data);
void kvz_cabac_finish(cabac_data_t *data);
void kvz_cabac_flush(cabac_data_t *data);
void kvz_cabac_write_coeff_remain(cabac_data_t *cabac, uint32_t symbol,
uint32_t r_param);
void kvz_cabac_write_ep_ex_golomb(cabac_data_t *data, uint32_t symbol,
uint32_t count);
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);
void kvz_cabac_write_unary_max_symbol_ep(cabac_data_t *data, unsigned int symbol, unsigned int max_symbol);
// Macros
#define CTX_STATE(ctx) (ctx->uc_state >> 1)
#define CTX_MPS(ctx) (ctx->uc_state & 1)
#define CTX_UPDATE_LPS(ctx) { (ctx)->uc_state = kvz_g_auc_next_state_lps[ (ctx)->uc_state ]; }
#define CTX_UPDATE_MPS(ctx) { (ctx)->uc_state = kvz_g_auc_next_state_mps[ (ctx)->uc_state ]; }
#ifdef VERBOSE
#define CABAC_BIN(data, value, name) { \
uint32_t prev_state = (data)->ctx->uc_state; \
kvz_cabac_encode_bin(data, value); \
printf("%s = %u, state = %u -> %u\n", \
name, (uint32_t)value, (uint32_t)prev_state, (data)->ctx->uc_state); }
#define CABAC_BINS_EP(data, value, bins, name) { \
uint32_t prev_state = (data)->ctx->uc_state; \
kvz_cabac_encode_bins_ep(data, value, bins); \
printf("%s = %u(%u bins), state = %u -> %u\n", \
name, (uint32_t)value, (uint32_t)bins, prev_state, (data)->ctx->uc_state); }
#define CABAC_BIN_EP(data, value, name) { \
uint32_t prev_state = (data)->ctx->uc_state; \
kvz_cabac_encode_bin_ep(data, value); \
printf("%s = %u, state = %u -> %u\n", \
name, (uint32_t)value, (uint32_t)prev_state, (data)->ctx->uc_state); }
#else
#define CABAC_BIN(data, value, name) \
kvz_cabac_encode_bin(data, value);
#define CABAC_BINS_EP(data, value, bins, name) \
kvz_cabac_encode_bins_ep(data, value, bins);
#define CABAC_BIN_EP(data, value, name) \
kvz_cabac_encode_bin_ep(data, value);
#endif
#endif