From ca86546fe1dc686f452880af7e0a0ee9eaf3a748 Mon Sep 17 00:00:00 2001 From: RogerZhou Date: Thu, 5 Oct 2017 15:06:27 -0700 Subject: [PATCH] Extend IntraBC to 4x4 Change-Id: I3f30c35bcd1bc623ad0c34c4b954ff71b2fcfd00 --- av1/common/reconinter.c | 7 +++++++ av1/common/reconintra.h | 8 ++++++++ av1/decoder/decodemv.c | 2 +- av1/encoder/bitstream.c | 2 +- av1/encoder/encodeframe.c | 5 ++++- av1/encoder/hash_motion.c | 17 +++++++++-------- av1/encoder/mcomp.c | 4 ++-- av1/encoder/rdopt.c | 2 +- 8 files changed, 33 insertions(+), 14 deletions(-) diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index 5d79560b5..d7e39b45c 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c @@ -1225,6 +1225,13 @@ static INLINE void build_inter_predictors( const int ss_x = pd->subsampling_x; const int ss_y = pd->subsampling_y; int sub8x8_inter = bsize < BLOCK_8X8 && (ss_x || ss_y); + +#if CONFIG_INTRABC + if (is_intrabc) { + sub8x8_inter = 0; + } +#endif + #if CONFIG_MOTION_VAR sub8x8_inter = sub8x8_inter && !build_for_obmc; #endif // CONFIG_MOTION_VAR diff --git a/av1/common/reconintra.h b/av1/common/reconintra.h index 160d0f713..42797e310 100644 --- a/av1/common/reconintra.h +++ b/av1/common/reconintra.h @@ -71,6 +71,14 @@ static INLINE int av1_use_angle_delta(BLOCK_SIZE bsize) { } #endif // CONFIG_EXT_INTRA +#if CONFIG_INTRABC +static INLINE int av1_allow_intrabc(BLOCK_SIZE bsize, + const AV1_COMMON *const cm) { + return (bsize >= BLOCK_8X8 || bsize == BLOCK_4X4) && + cm->allow_screen_content_tools; +} +#endif // CONFIG_INTRABC + #ifdef __cplusplus } // extern "C" #endif diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 3748083fc..e06e016a6 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c @@ -1163,7 +1163,7 @@ static void read_intra_frame_mode_info(AV1_COMMON *const cm, mbmi->ref_frame[1] = NONE_FRAME; #if CONFIG_INTRABC - if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) { + if (av1_allow_intrabc(bsize, cm)) { mbmi->use_intrabc = aom_read_symbol(r, ec_ctx->intrabc_cdf, 2, ACCT_STR); if (mbmi->use_intrabc) { mbmi->tx_size = read_tx_size(cm, xd, 1, !mbmi->skip, r); diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index dd0e43b66..799ee8178 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c @@ -2169,7 +2169,7 @@ static void write_mb_modes_kf(AV1_COMMON *cm, MACROBLOCKD *xd, !xd->lossless[mbmi->segment_id]; #if CONFIG_INTRABC - if (bsize >= BLOCK_8X8 && cm->allow_screen_content_tools) { + if (av1_allow_intrabc(bsize, cm)) { int use_intrabc = is_intrabc_block(mbmi); aom_write_symbol(w, use_intrabc, ec_ctx->intrabc_cdf, 2); if (use_intrabc) { diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index c961222b5..c5a4b633f 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c @@ -1984,7 +1984,7 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, } #if CONFIG_INTRABC } else { - if (cm->allow_screen_content_tools && bsize >= BLOCK_8X8) { + if (av1_allow_intrabc(bsize, cm)) { FRAME_COUNTS *const counts = td->counts; ++counts->intrabc[mbmi->use_intrabc]; } else { @@ -5278,6 +5278,9 @@ static void encode_frame_internal(AV1_COMP *cpi) { av1_generate_block_hash_value(cpi->source, 4, block_hash_values[0], block_hash_values[1], is_block_same[0], is_block_same[1]); + av1_add_to_hash_map_by_row_with_precal_data( + &cm->cur_frame->hash_table, block_hash_values[1], is_block_same[1][2], + pic_width, pic_height, 4); av1_generate_block_hash_value(cpi->source, 8, block_hash_values[1], block_hash_values[0], is_block_same[1], is_block_same[0]); diff --git a/av1/encoder/hash_motion.c b/av1/encoder/hash_motion.c index 08925026f..2378597ad 100644 --- a/av1/encoder/hash_motion.c +++ b/av1/encoder/hash_motion.c @@ -4,7 +4,7 @@ #include "./av1_rtcd.h" static const int crc_bits = 16; -static const int block_size_bits = 2; +static const int block_size_bits = 3; static CRC_CALCULATOR crc_calculator1; static CRC_CALCULATOR crc_calculator2; static int g_crc_initialized = 0; @@ -53,15 +53,16 @@ static int is_block_2x2_col_same_value(uint8_t *p) { return 1; } -// the hash value (hash_value1 consists two parts, the first 2 bits relate to +// the hash value (hash_value1 consists two parts, the first 3 bits relate to // the block size and the remaining 16 bits are the crc values. This fuction -// is used to get the first 2 bits. +// is used to get the first 3 bits. static int hash_block_size_to_index(int block_size) { switch (block_size) { - case 8: return 0; - case 16: return 1; - case 32: return 2; - case 64: return 3; + case 4: return 0; + case 8: return 1; + case 16: return 2; + case 32: return 3; + case 64: return 4; default: return -1; } } @@ -220,7 +221,7 @@ void av1_generate_block_hash_value(const YV12_BUFFER_CONFIG *picture, pos += block_size - 1; } - if (block_size >= 8) { + if (block_size >= 4) { const int size_minus1 = block_size - 1; pos = 0; for (int y_pos = 0; y_pos < y_end; y_pos++) { diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c index 9f649a658..49d6e67ec 100644 --- a/av1/encoder/mcomp.c +++ b/av1/encoder/mcomp.c @@ -2573,8 +2573,8 @@ int av1_full_pixel_search(const AV1_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize, const int block_height = block_size_high[bsize]; const int block_width = block_size_wide[bsize]; if (block_height == block_width && x_pos >= 0 && y_pos >= 0) { - if (block_width == 8 || block_width == 16 || block_width == 32 || - block_width == 64) { + if (block_width == 4 || block_width == 8 || block_width == 16 || + block_width == 32 || block_width == 64) { uint8_t *what = x->plane[0].src.buf; const int what_stride = x->plane[0].src.stride; block_hash block_hashes[MAX_HASH_MV_TABLE_SIZE]; diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 6d1c69ff9..fadd930bb 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c @@ -9424,7 +9424,7 @@ static int64_t rd_pick_intrabc_mode_sb(const AV1_COMP *cpi, MACROBLOCK *x, RD_STATS *rd_cost, BLOCK_SIZE bsize, int64_t best_rd) { const AV1_COMMON *const cm = &cpi->common; - if (bsize < BLOCK_8X8 || !cm->allow_screen_content_tools) return INT64_MAX; + if (!av1_allow_intrabc(bsize, cm)) return INT64_MAX; MACROBLOCKD *const xd = &x->e_mbd; const TileInfo *tile = &xd->tile; -- GitLab