diff --git a/av1/common/blockd.c b/av1/common/blockd.c index 4eb6f01eafa32d655b3cb71714d85d14a16d734e..602cef409e814d692aaf107a467c938ed0b4371d 100644 --- a/av1/common/blockd.c +++ b/av1/common/blockd.c @@ -259,6 +259,36 @@ void av1_set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd, } #endif +void av1_reset_skip_context(MACROBLOCKD *xd, int mi_row, int mi_col, + BLOCK_SIZE bsize) { + int i; + int nplanes; +#if CONFIG_CB4X4 + int chroma_ref; + chroma_ref = + is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y); + nplanes = 1 + (MAX_MB_PLANE - 1) * chroma_ref; +#else + (void)mi_row; + (void)mi_col; + nplanes = MAX_MB_PLANE; +#endif + for (i = 0; i < nplanes; i++) { + struct macroblockd_plane *const pd = &xd->plane[i]; +#if CONFIG_CHROMA_2X2 || !CONFIG_CB4X4 + const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); +#else + const BLOCK_SIZE plane_bsize = + AOMMAX(BLOCK_4X4, get_plane_block_size(bsize, pd)); +#endif + const int txs_wide = block_size_wide[plane_bsize] >> tx_size_wide_log2[0]; + const int txs_high = block_size_high[plane_bsize] >> tx_size_high_log2[0]; + memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) * txs_wide); + memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) * txs_high); + } +} + void av1_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y) { int i; diff --git a/av1/common/blockd.h b/av1/common/blockd.h index 76e0cec621ef3aa1883721ce273c390e99d337c0..bbe780e7e77069941f8580011315772af067708c 100644 --- a/av1/common/blockd.h +++ b/av1/common/blockd.h @@ -1137,17 +1137,8 @@ get_plane_block_size(BLOCK_SIZE bsize, const struct macroblockd_plane *pd) { return ss_size_lookup[bsize][pd->subsampling_x][pd->subsampling_y]; } -static INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) { - int i; - for (i = 0; i < MAX_MB_PLANE; i++) { - struct macroblockd_plane *const pd = &xd->plane[i]; - const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); - const int txs_wide = block_size_wide[plane_bsize] >> tx_size_wide_log2[0]; - const int txs_high = block_size_high[plane_bsize] >> tx_size_high_log2[0]; - memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) * txs_wide); - memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) * txs_high); - } -} +void av1_reset_skip_context(MACROBLOCKD *xd, int mi_row, int mi_col, + BLOCK_SIZE bsize); typedef void (*foreach_transformed_block_visitor)(int plane, int block, int blk_row, int blk_col, diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 06a8efdc7cdf2ead1603d25be0a47e6324d55a07..3c11437437748048e606d698ce06d243579eab01 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c @@ -1709,9 +1709,11 @@ static void decode_token_and_recon_block(AV1Decoder *const pbi, #endif #if CONFIG_CB4X4 - if (mbmi->skip) reset_skip_context(xd, bsize); + if (mbmi->skip) av1_reset_skip_context(xd, mi_row, mi_col, bsize); #else - if (mbmi->skip) reset_skip_context(xd, AOMMAX(BLOCK_8X8, bsize)); + if (mbmi->skip) { + av1_reset_skip_context(xd, mi_row, mi_col, AOMMAX(BLOCK_8X8, bsize)); + } #endif #if CONFIG_COEF_INTERLEAVE @@ -2408,7 +2410,7 @@ static void decode_partition(AV1Decoder *const pbi, MACROBLOCKD *const xd, set_skip_context(xd, mi_row, mi_col); skip = read_skip(cm, xd, xd->mi[0]->mbmi.segment_id_supertx, r); if (skip) { - reset_skip_context(xd, bsize); + av1_reset_skip_context(xd, mi_row, mi_col, bsize); } else { #if CONFIG_EXT_TX if (get_ext_tx_types(supertx_size, bsize, 1, cm->reduced_tx_set_used) > diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 549c230d7398ec7e4cda2d603e1315c640d63927..6544ec6484c463d158083bc0ea9a5310f27af869 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c @@ -2522,12 +2522,13 @@ static void encode_sb(const AV1_COMP *const cpi, ThreadData *td, if (!x->skip) { int this_rate = 0; av1_encode_sb_supertx((AV1_COMMON *)cm, x, bsize); - av1_tokenize_sb_supertx(cpi, td, tp, dry_run, bsize, rate); + av1_tokenize_sb_supertx(cpi, td, tp, dry_run, mi_row, mi_col, bsize, + rate); if (rate) *rate += this_rate; } else { xd->mi[0]->mbmi.skip = 1; if (!dry_run) td->counts->skip[av1_get_skip_context(xd)][1]++; - reset_skip_context(xd, bsize); + av1_reset_skip_context(xd, mi_row, mi_col, bsize); } if (!dry_run) { for (y_idx = 0; y_idx < mi_height; y_idx++) diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c index 06d04a13ef55d69cc0cd087bb4d2d668c58f11d7..a5d1dce90e696ae73a8c12fb68db30a4d03bf338 100644 --- a/av1/encoder/encodetxb.c +++ b/av1/encoder/encodetxb.c @@ -568,7 +568,7 @@ void av1_update_txb_context(const AV1_COMP *cpi, ThreadData *td, (void)mi_col; if (mbmi->skip) { if (!dry_run) td->counts->skip[ctx][1] += skip_inc; - reset_skip_context(xd, bsize); + av1_reset_skip_context(xd, mi_row, mi_col, bsize); return; } diff --git a/av1/encoder/tokenize.c b/av1/encoder/tokenize.c index d92528713829468393e03647497d44c7dab9464d..a52e2b52bacc4c0a51f1533d1c01a55fe36c96a5 100644 --- a/av1/encoder/tokenize.c +++ b/av1/encoder/tokenize.c @@ -689,7 +689,7 @@ void av1_tokenize_sb_vartx(const AV1_COMP *cpi, ThreadData *td, TOKENEXTRA **t, if (mbmi->skip) { if (!dry_run) td->counts->skip[ctx][1] += skip_inc; - reset_skip_context(xd, bsize); + av1_reset_skip_context(xd, mi_row, mi_col, bsize); #if !CONFIG_LV_MAP if (dry_run) *t = t_backup; #endif @@ -764,7 +764,7 @@ void av1_tokenize_sb(const AV1_COMP *cpi, ThreadData *td, TOKENEXTRA **t, struct tokenize_b_args arg = { cpi, td, t, 0 }; if (mbmi->skip) { if (!dry_run) td->counts->skip[ctx][1] += skip_inc; - reset_skip_context(xd, bsize); + av1_reset_skip_context(xd, mi_row, mi_col, bsize); return; } @@ -839,8 +839,8 @@ void av1_tokenize_sb(const AV1_COMP *cpi, ThreadData *td, TOKENEXTRA **t, #if CONFIG_SUPERTX void av1_tokenize_sb_supertx(const AV1_COMP *cpi, ThreadData *td, - TOKENEXTRA **t, RUN_TYPE dry_run, BLOCK_SIZE bsize, - int *rate) { + TOKENEXTRA **t, RUN_TYPE dry_run, int mi_row, + int mi_col, BLOCK_SIZE bsize, int *rate) { const AV1_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &td->mb.e_mbd; MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; @@ -851,7 +851,7 @@ void av1_tokenize_sb_supertx(const AV1_COMP *cpi, ThreadData *td, struct tokenize_b_args arg = { cpi, td, t, 0 }; if (mbmi->skip) { if (!dry_run) td->counts->skip[ctx][1] += skip_inc; - reset_skip_context(xd, bsize); + av1_reset_skip_context(xd, mi_row, mi_col, bsize); if (dry_run) *t = t_backup; return; } diff --git a/av1/encoder/tokenize.h b/av1/encoder/tokenize.h index 11dd0a088a1c7a5f3ae54344ed71c64ccbbad989..c3e8cef9cd0680d72220b959360fd3035c8a489f 100644 --- a/av1/encoder/tokenize.h +++ b/av1/encoder/tokenize.h @@ -90,8 +90,8 @@ void av1_tokenize_sb(const struct AV1_COMP *cpi, struct ThreadData *td, int *rate, const int mi_row, const int mi_col); #if CONFIG_SUPERTX void av1_tokenize_sb_supertx(const struct AV1_COMP *cpi, struct ThreadData *td, - TOKENEXTRA **t, RUN_TYPE dry_run, BLOCK_SIZE bsize, - int *rate); + TOKENEXTRA **t, RUN_TYPE dry_run, int mi_row, + int mi_col, BLOCK_SIZE bsize, int *rate); #endif extern const int16_t *av1_dct_value_cost_ptr;