Skip to content

Commit

Permalink
Merge branch 'rd-cost-inter-final' into 'master'
Browse files Browse the repository at this point in the history
Update cabac context during search and add missing bits during rd search

See merge request cs/ultravideo/kvazaar!9
  • Loading branch information
Jovasa committed Mar 18, 2022
2 parents 8ff1c51 + 9b7dc20 commit 6918ab8
Show file tree
Hide file tree
Showing 20 changed files with 960 additions and 400 deletions.
1 change: 1 addition & 0 deletions src/bitstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "bitstream.h"

#include <math.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

Expand Down
27 changes: 15 additions & 12 deletions src/cabac.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ void kvz_cabac_start(cabac_data_t * const data)
data->num_buffered_bytes = 0;
data->buffered_byte = 0xff;
data->only_count = 0; // By default, write bits out
data->update = 0;
}

/**
Expand All @@ -103,8 +104,7 @@ void kvz_cabac_start(cabac_data_t * const data)
void kvz_cabac_encode_bin(cabac_data_t * const data, const uint32_t bin_value)
{
uint32_t lps;



lps = kvz_g_auc_lpst_table[CTX_STATE(data->cur_ctx)][(data->range >> 6) & 3];
data->range -= lps;

Expand Down Expand Up @@ -488,26 +488,28 @@ void kvz_cabac_write_coeff_remain_encry(struct encoder_state_t * const state, ca
/**
* \brief
*/
void kvz_cabac_write_unary_max_symbol(cabac_data_t * const data, cabac_ctx_t * const ctx, uint32_t symbol, const int32_t offset, const uint32_t max_symbol)
void kvz_cabac_write_unary_max_symbol(cabac_data_t * const data,
cabac_ctx_t * const ctx,
uint32_t symbol,
const int32_t offset,
const uint32_t max_symbol,
double* bits_out)
{
int8_t code_last = max_symbol > symbol;

assert(symbol <= max_symbol);

if (!max_symbol) return;

data->cur_ctx = &ctx[0];
CABAC_BIN(data, symbol, "ums");

CABAC_FBITS_UPDATE(data, &ctx[0], symbol, *bits_out, "ums");

if (!symbol) return;

while (--symbol) {
data->cur_ctx = &ctx[offset];
CABAC_BIN(data, 1, "ums");
CABAC_FBITS_UPDATE(data, &ctx[offset], 1, *bits_out, "ums");
}
if (code_last) {
data->cur_ctx = &ctx[offset];
CABAC_BIN(data, 0, "ums");
CABAC_FBITS_UPDATE(data, &ctx[offset], 0,*bits_out, "ums");
}
}

Expand Down Expand Up @@ -544,7 +546,7 @@ void kvz_cabac_write_unary_max_symbol_ep(cabac_data_t * const data, unsigned int
/**
* \brief
*/
void kvz_cabac_write_ep_ex_golomb(encoder_state_t * const state,
uint32_t kvz_cabac_write_ep_ex_golomb(encoder_state_t * const state,
cabac_data_t * const data,
uint32_t symbol,
uint32_t count)
Expand Down Expand Up @@ -572,5 +574,6 @@ void kvz_cabac_write_ep_ex_golomb(encoder_state_t * const state,
bins = ( (bins >> (num_bins >>1) ) << (num_bins >>1) ) | state->crypto_prev_pos;
}
}
kvz_cabac_encode_bins_ep(data, bins, num_bins);
CABAC_BINS_EP(data, bins, num_bins, "ep_ex_golomb");
return num_bins;
}
40 changes: 26 additions & 14 deletions src/cabac.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ typedef struct
uint32_t buffered_byte;
int32_t num_buffered_bytes;
int32_t bits_left;
int8_t only_count;
int8_t only_count : 4;
int8_t update : 4;
bitstream_t *stream;

// CONTEXTS
Expand Down Expand Up @@ -119,38 +120,49 @@ void kvz_cabac_write_coeff_remain(cabac_data_t *cabac, uint32_t symbol,
uint32_t r_param);
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);
void kvz_cabac_write_ep_ex_golomb(struct encoder_state_t * const state, cabac_data_t *data,
uint32_t kvz_cabac_write_ep_ex_golomb(struct encoder_state_t * const state, 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);
uint32_t symbol, int32_t offset,
uint32_t max_symbol, double* bits_out);
void kvz_cabac_write_unary_max_symbol_ep(cabac_data_t *data, unsigned int symbol, unsigned int max_symbol);

extern const float kvz_f_entropy_bits[128];
#define CTX_ENTROPY_FBITS(ctx, val) kvz_f_entropy_bits[(ctx)->uc_state ^ (val)]

#define CABAC_FBITS_UPDATE(cabac, ctx, val, bits, name) do { \
if((cabac)->only_count) (bits) += kvz_f_entropy_bits[(ctx)->uc_state ^ (val)]; \
if((cabac)->update) {\
(cabac)->cur_ctx = ctx;\
CABAC_BIN((cabac), (val), (name));\
} \
} while(0)

// 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), prev_state, (data)->ctx->uc_state); }
uint32_t prev_state = (data)->cur_ctx->uc_state; \
kvz_cabac_encode_bin((data), (value)); \
if(!(data)->only_count) printf("%s = %u, state = %u -> %u MPS = %u\n", \
(name), (uint32_t)(value), prev_state, (data)->cur_ctx->uc_state, CTX_MPS((data)->cur_ctx)); }

#define CABAC_BINS_EP(data, value, bins, name) { \
uint32_t prev_state = (data)->ctx->uc_state; \
uint32_t prev_state = (data)->cur_ctx->uc_state; \
kvz_cabac_encode_bins_ep((data), (value), (bins)); \
printf("%s = %u(%u bins), state = %u -> %u\n", \
(name), (uint32_t)(value), (bins), prev_state, (data)->ctx->uc_state); }
if(!(data)->only_count) printf("%s = %u(%u bins), state = %u -> %u\n", \
(name), (uint32_t)(value), (bins), prev_state, (data)->cur_ctx->uc_state); }

#define CABAC_BIN_EP(data, value, name) { \
uint32_t prev_state = (data)->ctx->uc_state; \
uint32_t prev_state = (data)->cur_ctx->uc_state; \
kvz_cabac_encode_bin_ep((data), (value)); \
printf("%s = %u, state = %u -> %u\n", \
(name), (uint32_t)(value), prev_state, (data)->ctx->uc_state); }
if(!(data)->only_count) printf("%s = %u, state = %u -> %u\n", \
(name), (uint32_t)(value), prev_state, (data)->cur_ctx->uc_state); }
#else
#define CABAC_BIN(data, value, name) \
kvz_cabac_encode_bin((data), (value));
Expand Down

0 comments on commit 6918ab8

Please sign in to comment.