From d72dfab29667cc1dff7472699856d568a1dbb1b1 Mon Sep 17 00:00:00 2001 From: James Zern <jzern@google.com> Date: Thu, 24 Oct 2013 18:10:59 +0200 Subject: [PATCH] vp9: add above/left_seg_context to encoder Change-Id: I969406574c6658936e9f6db5752f1b295025aab5 --- vp9/encoder/vp9_bitstream.c | 8 +++--- vp9/encoder/vp9_encodeframe.c | 51 +++++++++++++++++++---------------- vp9/encoder/vp9_onyx_if.c | 8 ++++++ vp9/encoder/vp9_onyx_int.h | 3 +++ 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 3d0d25e69c..f0595434a8 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -618,7 +618,7 @@ static void write_modes_sb(VP9_COMP *cpi, MODE_INFO **mi_8x8, vp9_writer *bc, int pl; const int idx = check_bsize_coverage(bs, cm->mi_rows, cm->mi_cols, mi_row, mi_col); - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, bsize); // encode the partition information if (idx == 0) @@ -662,7 +662,7 @@ static void write_modes_sb(VP9_COMP *cpi, MODE_INFO **mi_8x8, vp9_writer *bc, // update partition context if (bsize >= BLOCK_8X8 && (bsize == BLOCK_8X8 || partition != PARTITION_SPLIT)) - update_partition_context(cm->above_seg_context, cm->left_seg_context, + update_partition_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, subsize, bsize); } @@ -679,7 +679,7 @@ static void write_modes(VP9_COMP *cpi, vp9_writer* const bc, for (mi_row = cm->cur_tile_mi_row_start; mi_row < cm->cur_tile_mi_row_end; mi_row += 8, mi_8x8 += 8 * mis) { m_8x8 = mi_8x8; - vp9_zero(cm->left_seg_context); + vp9_zero(cpi->left_seg_context); for (mi_col = cm->cur_tile_mi_col_start; mi_col < cm->cur_tile_mi_col_end; mi_col += MI_BLOCK_SIZE, m_8x8 += MI_BLOCK_SIZE) { write_modes_sb(cpi, m_8x8, bc, tok, tok_end, mi_row, mi_col, @@ -1203,7 +1203,7 @@ static size_t encode_tiles(VP9_COMP *cpi, uint8_t *data_ptr) { const int tile_cols = 1 << cm->log2_tile_cols; const int tile_rows = 1 << cm->log2_tile_rows; - vpx_memset(cm->above_seg_context, 0, sizeof(PARTITION_CONTEXT) * + vpx_memset(cpi->above_seg_context, 0, sizeof(*cpi->above_seg_context) * mi_cols_aligned_to_sb(cm->mi_cols)); tok[0][0] = cpi->tok; diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index e793d10cc1..aac9d28f22 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -732,10 +732,10 @@ static void restore_context(VP9_COMP *cpi, int mi_row, int mi_col, (sizeof(ENTROPY_CONTEXT) * num_4x4_blocks_high) >> xd->plane[p].subsampling_y); } - vpx_memcpy(cm->above_seg_context + mi_col, sa, - sizeof(PARTITION_CONTEXT) * mi_width); - vpx_memcpy(cm->left_seg_context + (mi_row & MI_MASK), sl, - sizeof(PARTITION_CONTEXT) * mi_height); + vpx_memcpy(cpi->above_seg_context + mi_col, sa, + sizeof(*cpi->above_seg_context) * mi_width); + vpx_memcpy(cpi->left_seg_context + (mi_row & MI_MASK), sl, + sizeof(cpi->left_seg_context[0]) * mi_height); } static void save_context(VP9_COMP *cpi, int mi_row, int mi_col, ENTROPY_CONTEXT a[16 * MAX_MB_PLANE], @@ -765,10 +765,10 @@ static void save_context(VP9_COMP *cpi, int mi_row, int mi_col, (sizeof(ENTROPY_CONTEXT) * num_4x4_blocks_high) >> xd->plane[p].subsampling_y); } - vpx_memcpy(sa, cm->above_seg_context + mi_col, - sizeof(PARTITION_CONTEXT) * mi_width); - vpx_memcpy(sl, cm->left_seg_context + (mi_row & MI_MASK), - sizeof(PARTITION_CONTEXT) * mi_height); + vpx_memcpy(sa, cpi->above_seg_context + mi_col, + sizeof(*cpi->above_seg_context) * mi_width); + vpx_memcpy(sl, cpi->left_seg_context + (mi_row & MI_MASK), + sizeof(cpi->left_seg_context[0]) * mi_height); } static void encode_b(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, int mi_col, @@ -818,7 +818,7 @@ static void encode_sb(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, int mi_col, c1 = BLOCK_4X4; if (bsize >= BLOCK_8X8) { - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, bsize); c1 = *(get_sb_partitioning(x, bsize)); } @@ -862,7 +862,7 @@ static void encode_sb(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, int mi_col, } if (partition != PARTITION_SPLIT || bsize == BLOCK_8X8) - update_partition_context(cm->above_seg_context, cm->left_seg_context, + update_partition_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, c1, bsize); } @@ -1054,7 +1054,8 @@ static void rd_use_partition(VP9_COMP *cpi, MODE_INFO **mi_8x8, pick_sb_modes(cpi, mi_row, mi_col, &none_rate, &none_dist, bsize, get_block_context(x, bsize), INT64_MAX); - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, + cpi->left_seg_context, mi_row, mi_col, bsize); none_rate += x->partition_cost[pl][PARTITION_NONE]; @@ -1146,7 +1147,7 @@ static void rd_use_partition(VP9_COMP *cpi, MODE_INFO **mi_8x8, assert(0); } - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, bsize); if (last_part_rate < INT_MAX) last_part_rate += x->partition_cost[pl][partition]; @@ -1197,11 +1198,12 @@ static void rd_use_partition(VP9_COMP *cpi, MODE_INFO **mi_8x8, split_rate += rt; split_dist += dt; - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, + cpi->left_seg_context, mi_row + y_idx, mi_col + x_idx, bsize); split_rate += x->partition_cost[pl][PARTITION_NONE]; } - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, bsize); if (split_rate < INT_MAX) { split_rate += x->partition_cost[pl][PARTITION_SPLIT]; @@ -1531,8 +1533,8 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, get_block_context(x, bsize), best_rd); if (this_rate != INT_MAX) { if (bsize >= BLOCK_8X8) { - pl = partition_plane_context(cm->above_seg_context, - cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, + cpi->left_seg_context, mi_row, mi_col, bsize); this_rate += x->partition_cost[pl][PARTITION_NONE]; } @@ -1593,7 +1595,8 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, } } if (sum_rd < best_rd && i == 4) { - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, + cpi->left_seg_context, mi_row, mi_col, bsize); sum_rate += x->partition_cost[pl][PARTITION_SPLIT]; sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); @@ -1650,7 +1653,8 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, } } if (sum_rd < best_rd) { - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, + cpi->left_seg_context, mi_row, mi_col, bsize); sum_rate += x->partition_cost[pl][PARTITION_HORZ]; sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); @@ -1693,7 +1697,8 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row, } } if (sum_rd < best_rd) { - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, + cpi->left_seg_context, mi_row, mi_col, bsize); sum_rate += x->partition_cost[pl][PARTITION_VERT]; sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); @@ -1745,7 +1750,7 @@ static void rd_pick_reference_frame(VP9_COMP *cpi, int mi_row, int mi_col) { cpi->set_ref_frame_mask = 1; pick_sb_modes(cpi, mi_row, mi_col, &r, &d, BLOCK_64X64, get_block_context(x, BLOCK_64X64), INT64_MAX); - pl = partition_plane_context(cm->above_seg_context, cm->left_seg_context, + pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, BLOCK_64X64); r += x->partition_cost[pl][PARTITION_NONE]; @@ -1763,7 +1768,7 @@ static void encode_sb_row(VP9_COMP *cpi, int mi_row, TOKENEXTRA **tp, // Initialize the left context for the new SB row vpx_memset(&cm->left_context, 0, sizeof(cm->left_context)); - vpx_memset(cm->left_seg_context, 0, sizeof(cm->left_seg_context)); + vpx_memset(cpi->left_seg_context, 0, sizeof(cpi->left_seg_context)); // Code each SB in the row for (mi_col = cm->cur_tile_mi_col_start; mi_col < cm->cur_tile_mi_col_end; @@ -1870,8 +1875,8 @@ static void init_encode_frame_mb_context(VP9_COMP *cpi) { // are allocated as part of the same buffer. vpx_memset(cm->above_context[0], 0, sizeof(ENTROPY_CONTEXT) * 2 * MAX_MB_PLANE * aligned_mi_cols); - vpx_memset(cm->above_seg_context, 0, - sizeof(PARTITION_CONTEXT) * aligned_mi_cols); + vpx_memset(cpi->above_seg_context, 0, + sizeof(*cpi->above_seg_context) * aligned_mi_cols); } static void switch_lossless_mode(VP9_COMP *cpi, int lossless) { diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index afd6fc5fa3..9d46307062 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -312,6 +312,9 @@ static void dealloc_compressor_data(VP9_COMP *cpi) { cpi->mb_activity_map = 0; vpx_free(cpi->mb_norm_activity_map); cpi->mb_norm_activity_map = 0; + + vpx_free(cpi->above_seg_context); + cpi->above_seg_context = NULL; } // Computes a q delta (in "q index" terms) to get from a starting q value @@ -1040,6 +1043,11 @@ void vp9_alloc_compressor_data(VP9_COMP *cpi) { CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map, vpx_calloc(sizeof(unsigned int), cm->mb_rows * cm->mb_cols)); + + vpx_free(cpi->above_seg_context); + CHECK_MEM_ERROR(cm, cpi->above_seg_context, + vpx_calloc(mi_cols_aligned_to_sb(cm->mi_cols), + sizeof(*cpi->above_seg_context))); } diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h index b1dfcbb9cc..14f315d247 100644 --- a/vp9/encoder/vp9_onyx_int.h +++ b/vp9/encoder/vp9_onyx_int.h @@ -675,6 +675,9 @@ typedef struct VP9_COMP { // Debug / test stats int64_t mode_test_hits[BLOCK_SIZES]; #endif + + PARTITION_CONTEXT *above_seg_context; + PARTITION_CONTEXT left_seg_context[8]; } VP9_COMP; static int get_ref_frame_idx(VP9_COMP *cpi, MV_REFERENCE_FRAME ref_frame) { -- GitLab