EC_MULTISYMBOL: split off token packing. This will make refactoring to support EOB_TOKEN easier. Change-Id: I8c7e37d090fd142f6b95d997116b84e6e10f3db5
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 5f7c42b..018f88a 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -762,6 +762,7 @@ } #endif // CONFIG_SUPERTX +#if CONFIG_EC_MULTISYMBOL static void pack_mb_tokens(aom_writer *w, const TOKENEXTRA **tp, const TOKENEXTRA *const stop, aom_bit_depth_t bit_depth, const TX_SIZE tx_size, @@ -784,15 +785,8 @@ while (p < stop && p->token != EOSB_TOKEN) { const int token = p->token; aom_tree_index index = 0; -#if !CONFIG_EC_MULTISYMBOL - const struct av1_token *const coef_encoding = &av1_coef_encodings[token]; - int coef_value = coef_encoding->value; - int coef_length = coef_encoding->len; -#endif // !CONFIG_EC_MULTISYMBOL const av1_extra_bit *const extra_bits = &extra_bits_table[token]; -#if CONFIG_EC_MULTISYMBOL - /* skip one or two nodes */ if (!p->skip_eob_node) aom_write_record(w, token != EOB_TOKEN, p->context_tree[0], token_stats); @@ -803,30 +797,6 @@ CATEGORY6_TOKEN + 1 - 2); } } -#else - /* skip one or two nodes */ - if (p->skip_eob_node) - coef_length -= p->skip_eob_node; - else - aom_write_record(w, token != EOB_TOKEN, p->context_tree[0], token_stats); - - if (token != EOB_TOKEN) { - aom_write_record(w, token != ZERO_TOKEN, p->context_tree[1], token_stats); - - if (token != ZERO_TOKEN) { - aom_write_record(w, token != ONE_TOKEN, p->context_tree[2], - token_stats); - - if (token != ONE_TOKEN) { - const int unconstrained_len = UNCONSTRAINED_NODES - p->skip_eob_node; - aom_write_tree_record( - w, av1_coef_con_tree, - av1_pareto8_full[p->context_tree[PIVOT_NODE] - 1], coef_value, - coef_length - unconstrained_len, 0, token_stats); - } - } - } -#endif // CONFIG_EC_MULTISYMBOL if (extra_bits->base_val) { const int bit_string = p->extra; @@ -867,6 +837,97 @@ *tp = p; } +#else +static void pack_mb_tokens(aom_writer *w, const TOKENEXTRA **tp, + const TOKENEXTRA *const stop, + aom_bit_depth_t bit_depth, const TX_SIZE tx_size, + TOKEN_STATS *token_stats) { + const TOKENEXTRA *p = *tp; +#if CONFIG_VAR_TX + int count = 0; + const int seg_eob = tx_size_2d[tx_size]; +#endif +#if CONFIG_AOM_HIGHBITDEPTH + const av1_extra_bit *const extra_bits_table = + (bit_depth == AOM_BITS_12) + ? av1_extra_bits_high12 + : (bit_depth == AOM_BITS_10) ? av1_extra_bits_high10 : av1_extra_bits; +#else + const av1_extra_bit *const extra_bits_table = av1_extra_bits; + (void)bit_depth; +#endif // CONFIG_AOM_HIGHBITDEPTH + + while (p < stop && p->token != EOSB_TOKEN) { + const int token = p->token; + aom_tree_index index = 0; + const struct av1_token *const coef_encoding = &av1_coef_encodings[token]; + int coef_value = coef_encoding->value; + int coef_length = coef_encoding->len; + const av1_extra_bit *const extra_bits = &extra_bits_table[token]; + + /* skip one or two nodes */ + if (p->skip_eob_node) + coef_length -= p->skip_eob_node; + else + aom_write_record(w, token != EOB_TOKEN, p->context_tree[0], token_stats); + + if (token != EOB_TOKEN) { + aom_write_record(w, token != ZERO_TOKEN, p->context_tree[1], token_stats); + + if (token != ZERO_TOKEN) { + aom_write_record(w, token != ONE_TOKEN, p->context_tree[2], + token_stats); + + if (token != ONE_TOKEN) { + const int unconstrained_len = UNCONSTRAINED_NODES - p->skip_eob_node; + aom_write_tree_record( + w, av1_coef_con_tree, + av1_pareto8_full[p->context_tree[PIVOT_NODE] - 1], coef_value, + coef_length - unconstrained_len, 0, token_stats); + } + } + } + + if (extra_bits->base_val) { + const int bit_string = p->extra; + const int bit_string_length = extra_bits->len; // Length of extra bits to + // be written excluding + // the sign bit. + int skip_bits = (extra_bits->base_val == CAT6_MIN_VAL) + ? TX_SIZES - 1 - txsize_sqr_up_map[tx_size] + : 0; + + if (bit_string_length > 0) { + const unsigned char *pb = extra_bits->prob; + const int value = bit_string >> 1; + const int num_bits = bit_string_length; // number of bits in value + assert(num_bits > 0); + + for (index = 0; index < num_bits; ++index) { + const int shift = num_bits - index - 1; + const int bb = (value >> shift) & 1; + if (skip_bits) { + --skip_bits; + assert(!bb); + } else { + aom_write_record(w, bb, pb[index], token_stats); + } + } + } + + aom_write_bit_record(w, bit_string & 1, token_stats); + } + ++p; + +#if CONFIG_VAR_TX + ++count; + if (token == EOB_TOKEN || count == seg_eob) break; +#endif + } + + *tp = p; +} +#endif #endif // !CONFIG_PVG #if CONFIG_VAR_TX static void pack_txb_tokens(aom_writer *w, const TOKENEXTRA **tp,