vp9: add above/left_seg_context to encoder
Change-Id: I969406574c6658936e9f6db5752f1b295025aab5
This commit is contained in:
parent
d2bf696ee0
commit
d72dfab296
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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)));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user