Add av1_write_coeffs_mb This function go through each transform block in the prediction block and call av1_write_coeffs_txb to pack coefficients into the bitstream Change-Id: I6dedebef6cf8957f9173241a7de60e9936bc0be8
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 3a45f47..7ff1e16 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -43,6 +43,9 @@ #if CONFIG_ANS #include "aom_dsp/buf_ans.h" #endif // CONFIG_ANS +#if CONFIG_LV_MAP +#include "av1/encoder/encodetxb.h" +#endif // CONFIG_LV_MAP #include "av1/encoder/bitstream.h" #include "av1/encoder/cost.h" #include "av1/encoder/encodemv.h" @@ -881,7 +884,8 @@ *tp = p; } -#else +#else // CONFIG_NEW_TOKENSET +#if !CONFIG_LV_MAP 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, @@ -977,7 +981,8 @@ *tp = p; } -#endif +#endif // !CONFIG_LV_MAP +#endif // CONFIG_NEW_TOKENSET #else // !CONFIG_PVQ static PVQ_INFO *get_pvq_block(PVQ_QUEUE *pvq_q) { PVQ_INFO *pvq; @@ -2142,7 +2147,7 @@ MB_MODE_INFO *const mbmi = &m->mbmi; int plane; int bh, bw; -#if CONFIG_PVQ +#if CONFIG_PVQ || CONFIG_LV_MAP MACROBLOCK *const x = &cpi->td.mb; (void)tok; (void)tok_end; @@ -2329,7 +2334,13 @@ TOKEN_STATS token_stats; #if !CONFIG_PVQ init_token_stats(&token_stats); +#if CONFIG_LV_MAP + (void)tx; + av1_write_coeffs_mb(cm, x, w, plane); +#else // CONFIG_LV_MAP pack_mb_tokens(w, tok, tok_end, cm->bit_depth, tx, &token_stats); +#endif // CONFIG_LV_MAP + #else (void)token_stats; pack_pvq_tokens(w, x, xd, plane, mbmi->sb_type, tx);
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c index 9942be8..5a6455d 100644 --- a/av1/encoder/encodetxb.c +++ b/av1/encoder/encodetxb.c
@@ -13,7 +13,6 @@ #include "av1/common/blockd.h" #include "av1/common/pred_common.h" #include "av1/encoder/cost.h" -#include "av1/encoder/encoder.h" #include "av1/encoder/encodetxb.h" #include "av1/encoder/tokenize.h" @@ -188,6 +187,39 @@ } } +void av1_write_coeffs_mb(const AV1_COMMON *const cm, MACROBLOCK *x, + aom_writer *w, int plane) { + MACROBLOCKD *xd = &x->e_mbd; + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; + BLOCK_SIZE bsize = mbmi->sb_type; + struct macroblockd_plane *pd = &xd->plane[plane]; + +#if CONFIG_CB4X4 + const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); +#else + const BLOCK_SIZE plane_bsize = + get_plane_block_size(AOMMAX(bsize, BLOCK_8X8), pd); +#endif + const int num_4x4_w = block_size_wide[plane_bsize] >> tx_size_wide_log2[0]; + const int num_4x4_h = block_size_high[plane_bsize] >> tx_size_high_log2[0]; + TX_SIZE tx_size = get_tx_size(plane, xd); + const int bkw = tx_size_wide_unit[tx_size]; + const int bkh = tx_size_high_unit[tx_size]; + const int step = tx_size_wide_unit[tx_size] * tx_size_high_unit[tx_size]; + int row, col; + int block = 0; + for (row = 0; row < num_4x4_h; row += bkh) { + for (col = 0; col < num_4x4_w; col += bkw) { + tran_low_t *tcoeff = BLOCK_OFFSET(x->mbmi_ext->tcoeff[plane], block); + uint16_t eob = x->mbmi_ext->eobs[plane][block]; + TXB_CTX txb_ctx = { x->mbmi_ext->txb_skip_ctx[plane][block], + x->mbmi_ext->dc_sign_ctx[plane][block] }; + av1_write_coeffs_txb(cm, xd, w, block, plane, tcoeff, eob, &txb_ctx); + block += step; + } + } +} + static INLINE void get_base_ctx_set(const tran_low_t *tcoeffs, int c, // raster order const int bwl, @@ -539,7 +571,10 @@ td->counts->skip[ctx][0] += skip_inc; av1_foreach_transformed_block(xd, bsize, update_and_record_txb_context, &arg); - } else { + } else if (dry_run == DRY_RUN_NORMAL) { av1_foreach_transformed_block(xd, bsize, update_txb_context, &arg); + } else { + printf("DRY_RUN_COSTCOEFFS is not supported yet\n"); + assert(0); } }
diff --git a/av1/encoder/encodetxb.h b/av1/encoder/encodetxb.h index 142b402..45c0659 100644 --- a/av1/encoder/encodetxb.h +++ b/av1/encoder/encodetxb.h
@@ -17,6 +17,7 @@ #include "av1/common/onyxc_int.h" #include "av1/common/txb_common.h" #include "av1/encoder/block.h" +#include "av1/encoder/encoder.h" #include "aom_dsp/bitwriter.h" #ifdef __cplusplus extern "C" { @@ -28,7 +29,8 @@ aom_writer *w, int block, int plane, const tran_low_t *tcoeff, uint16_t eob, TXB_CTX *txb_ctx); - +void av1_write_coeffs_mb(const AV1_COMMON *const cm, MACROBLOCK *x, + aom_writer *w, int plane); void av1_update_txb_context(const AV1_COMP *cpi, ThreadData *td, RUN_TYPE dry_run, BLOCK_SIZE bsize, int *rate, const int mi_row, const int mi_col);