Commit d3a2e55a authored by Dmitry Kovalev's avatar Dmitry Kovalev
Browse files

Removing qcoeff buffers from the decoder.

We only need qcoeff buffers in the encoder. Reducing TileWorkerData struct
and VP9Decompressor struct sizes by 24K.

Change-Id: Id148868461f7ffa3d3dd634b371503ae9c57e207
parent b60293e1
...@@ -198,7 +198,6 @@ struct buf_2d { ...@@ -198,7 +198,6 @@ struct buf_2d {
}; };
struct macroblockd_plane { struct macroblockd_plane {
int16_t *qcoeff;
int16_t *dqcoeff; int16_t *dqcoeff;
uint16_t *eobs; uint16_t *eobs;
PLANE_TYPE plane_type; PLANE_TYPE plane_type;
......
...@@ -42,7 +42,6 @@ typedef struct TileWorkerData { ...@@ -42,7 +42,6 @@ typedef struct TileWorkerData {
vp9_reader bit_reader; vp9_reader bit_reader;
DECLARE_ALIGNED(16, MACROBLOCKD, xd); DECLARE_ALIGNED(16, MACROBLOCKD, xd);
DECLARE_ALIGNED(16, unsigned char, token_cache[1024]); DECLARE_ALIGNED(16, unsigned char, token_cache[1024]);
DECLARE_ALIGNED(16, int16_t, qcoeff[MAX_MB_PLANE][64 * 64]);
DECLARE_ALIGNED(16, int16_t, dqcoeff[MAX_MB_PLANE][64 * 64]); DECLARE_ALIGNED(16, int16_t, dqcoeff[MAX_MB_PLANE][64 * 64]);
DECLARE_ALIGNED(16, uint16_t, eobs[MAX_MB_PLANE][256]); DECLARE_ALIGNED(16, uint16_t, eobs[MAX_MB_PLANE][256]);
} TileWorkerData; } TileWorkerData;
...@@ -952,7 +951,6 @@ static void setup_tile_macroblockd(TileWorkerData *const tile_data) { ...@@ -952,7 +951,6 @@ static void setup_tile_macroblockd(TileWorkerData *const tile_data) {
int i; int i;
for (i = 0; i < MAX_MB_PLANE; ++i) { for (i = 0; i < MAX_MB_PLANE; ++i) {
pd[i].qcoeff = tile_data->qcoeff[i];
pd[i].dqcoeff = tile_data->dqcoeff[i]; pd[i].dqcoeff = tile_data->dqcoeff[i];
pd[i].eobs = tile_data->eobs[i]; pd[i].eobs = tile_data->eobs[i];
vpx_memset(xd->plane[i].dqcoeff, 0, 64 * 64 * sizeof(int16_t)); vpx_memset(xd->plane[i].dqcoeff, 0, 64 * 64 * sizeof(int16_t));
......
...@@ -113,7 +113,6 @@ static void init_macroblockd(VP9D_COMP *const pbi) { ...@@ -113,7 +113,6 @@ static void init_macroblockd(VP9D_COMP *const pbi) {
int i; int i;
for (i = 0; i < MAX_MB_PLANE; ++i) { for (i = 0; i < MAX_MB_PLANE; ++i) {
pd[i].qcoeff = pbi->qcoeff[i];
pd[i].dqcoeff = pbi->dqcoeff[i]; pd[i].dqcoeff = pbi->dqcoeff[i];
pd[i].eobs = pbi->eobs[i]; pd[i].eobs = pbi->eobs[i];
} }
......
...@@ -22,7 +22,6 @@ typedef struct VP9Decompressor { ...@@ -22,7 +22,6 @@ typedef struct VP9Decompressor {
DECLARE_ALIGNED(16, VP9_COMMON, common); DECLARE_ALIGNED(16, VP9_COMMON, common);
DECLARE_ALIGNED(16, int16_t, qcoeff[MAX_MB_PLANE][64 * 64]);
DECLARE_ALIGNED(16, int16_t, dqcoeff[MAX_MB_PLANE][64 * 64]); DECLARE_ALIGNED(16, int16_t, dqcoeff[MAX_MB_PLANE][64 * 64]);
DECLARE_ALIGNED(16, uint16_t, eobs[MAX_MB_PLANE][256]); DECLARE_ALIGNED(16, uint16_t, eobs[MAX_MB_PLANE][256]);
......
...@@ -69,6 +69,7 @@ typedef struct { ...@@ -69,6 +69,7 @@ typedef struct {
struct macroblock_plane { struct macroblock_plane {
DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]); DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]);
int16_t *qcoeff;
int16_t *coeff; int16_t *coeff;
struct buf_2d src; struct buf_2d src;
......
...@@ -439,14 +439,14 @@ static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, ...@@ -439,14 +439,14 @@ static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
max_plane = is_inter_block(mbmi) ? MAX_MB_PLANE : 1; max_plane = is_inter_block(mbmi) ? MAX_MB_PLANE : 1;
for (i = 0; i < max_plane; ++i) { for (i = 0; i < max_plane; ++i) {
p[i].coeff = ctx->coeff_pbuf[i][1]; p[i].coeff = ctx->coeff_pbuf[i][1];
pd[i].qcoeff = ctx->qcoeff_pbuf[i][1]; p[i].qcoeff = ctx->qcoeff_pbuf[i][1];
pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
pd[i].eobs = ctx->eobs_pbuf[i][1]; pd[i].eobs = ctx->eobs_pbuf[i][1];
} }
for (i = max_plane; i < MAX_MB_PLANE; ++i) { for (i = max_plane; i < MAX_MB_PLANE; ++i) {
p[i].coeff = ctx->coeff_pbuf[i][2]; p[i].coeff = ctx->coeff_pbuf[i][2];
pd[i].qcoeff = ctx->qcoeff_pbuf[i][2]; p[i].qcoeff = ctx->qcoeff_pbuf[i][2];
pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2]; pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2];
pd[i].eobs = ctx->eobs_pbuf[i][2]; pd[i].eobs = ctx->eobs_pbuf[i][2];
} }
...@@ -675,7 +675,7 @@ static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile, ...@@ -675,7 +675,7 @@ static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
for (i = 0; i < MAX_MB_PLANE; ++i) { for (i = 0; i < MAX_MB_PLANE; ++i) {
p[i].coeff = ctx->coeff_pbuf[i][0]; p[i].coeff = ctx->coeff_pbuf[i][0];
pd[i].qcoeff = ctx->qcoeff_pbuf[i][0]; p[i].qcoeff = ctx->qcoeff_pbuf[i][0];
pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][0]; pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][0];
pd[i].eobs = ctx->eobs_pbuf[i][0]; pd[i].eobs = ctx->eobs_pbuf[i][0];
} }
......
...@@ -136,6 +136,7 @@ static void optimize_b(MACROBLOCK *mb, ...@@ -136,6 +136,7 @@ static void optimize_b(MACROBLOCK *mb,
ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
TX_SIZE tx_size) { TX_SIZE tx_size) {
MACROBLOCKD *const xd = &mb->e_mbd; MACROBLOCKD *const xd = &mb->e_mbd;
struct macroblock_plane *p = &mb->plane[plane];
struct macroblockd_plane *pd = &xd->plane[plane]; struct macroblockd_plane *pd = &xd->plane[plane];
const int ref = is_inter_block(&xd->mi_8x8[0]->mbmi); const int ref = is_inter_block(&xd->mi_8x8[0]->mbmi);
vp9_token_state tokens[1025][2]; vp9_token_state tokens[1025][2];
...@@ -163,7 +164,7 @@ static void optimize_b(MACROBLOCK *mb, ...@@ -163,7 +164,7 @@ static void optimize_b(MACROBLOCK *mb,
assert((!type && !plane) || (type && plane)); assert((!type && !plane) || (type && plane));
dqcoeff_ptr = BLOCK_OFFSET(pd->dqcoeff, block); dqcoeff_ptr = BLOCK_OFFSET(pd->dqcoeff, block);
qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block); qcoeff_ptr = BLOCK_OFFSET(p->qcoeff, block);
assert(eob <= default_eob); assert(eob <= default_eob);
/* Now set up a Viterbi trellis to evaluate alternative roundings. */ /* Now set up a Viterbi trellis to evaluate alternative roundings. */
...@@ -368,7 +369,7 @@ void vp9_xform_quant(int plane, int block, BLOCK_SIZE plane_bsize, ...@@ -368,7 +369,7 @@ void vp9_xform_quant(int plane, int block, BLOCK_SIZE plane_bsize,
struct macroblock_plane *const p = &x->plane[plane]; struct macroblock_plane *const p = &x->plane[plane];
struct macroblockd_plane *const pd = &xd->plane[plane]; struct macroblockd_plane *const pd = &xd->plane[plane];
int16_t *coeff = BLOCK_OFFSET(p->coeff, block); int16_t *coeff = BLOCK_OFFSET(p->coeff, block);
int16_t *qcoeff = BLOCK_OFFSET(pd->qcoeff, block); int16_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
int16_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); int16_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
const scan_order *so; const scan_order *so;
uint16_t *eob = &pd->eobs[block]; uint16_t *eob = &pd->eobs[block];
...@@ -530,7 +531,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, ...@@ -530,7 +531,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize,
struct macroblock_plane *const p = &x->plane[plane]; struct macroblock_plane *const p = &x->plane[plane];
struct macroblockd_plane *const pd = &xd->plane[plane]; struct macroblockd_plane *const pd = &xd->plane[plane];
int16_t *coeff = BLOCK_OFFSET(p->coeff, block); int16_t *coeff = BLOCK_OFFSET(p->coeff, block);
int16_t *qcoeff = BLOCK_OFFSET(pd->qcoeff, block); int16_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
int16_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); int16_t *dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
const scan_order *so; const scan_order *so;
TX_TYPE tx_type; TX_TYPE tx_type;
......
...@@ -530,7 +530,7 @@ void vp9_first_pass(VP9_COMP *cpi) { ...@@ -530,7 +530,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
for (i = 0; i < MAX_MB_PLANE; ++i) { for (i = 0; i < MAX_MB_PLANE; ++i) {
p[i].coeff = ctx->coeff_pbuf[i][1]; p[i].coeff = ctx->coeff_pbuf[i][1];
pd[i].qcoeff = ctx->qcoeff_pbuf[i][1]; p[i].qcoeff = ctx->qcoeff_pbuf[i][1];
pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
pd[i].eobs = ctx->eobs_pbuf[i][1]; pd[i].eobs = ctx->eobs_pbuf[i][1];
} }
......
...@@ -173,7 +173,7 @@ void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int y_blocks, int b_idx, ...@@ -173,7 +173,7 @@ void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int y_blocks, int b_idx,
vp9_quantize_b(BLOCK_OFFSET(p->coeff, pb_idx.block), vp9_quantize_b(BLOCK_OFFSET(p->coeff, pb_idx.block),
16, x->skip_block, 16, x->skip_block,
p->zbin, p->round, p->quant, p->quant_shift, p->zbin, p->round, p->quant, p->quant_shift,
BLOCK_OFFSET(pd->qcoeff, pb_idx.block), BLOCK_OFFSET(p->qcoeff, pb_idx.block),
BLOCK_OFFSET(pd->dqcoeff, pb_idx.block), BLOCK_OFFSET(pd->dqcoeff, pb_idx.block),
pd->dequant, p->zbin_extra, &pd->eobs[pb_idx.block], scan, iscan); pd->dequant, p->zbin_extra, &pd->eobs[pb_idx.block], scan, iscan);
} }
......
...@@ -514,11 +514,12 @@ static INLINE int cost_coeffs(MACROBLOCK *x, ...@@ -514,11 +514,12 @@ static INLINE int cost_coeffs(MACROBLOCK *x,
const int16_t *scan, const int16_t *nb) { const int16_t *scan, const int16_t *nb) {
MACROBLOCKD *const xd = &x->e_mbd; MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
struct macroblock_plane *p = &x->plane[plane];
struct macroblockd_plane *pd = &xd->plane[plane]; struct macroblockd_plane *pd = &xd->plane[plane];
const PLANE_TYPE type = pd->plane_type; const PLANE_TYPE type = pd->plane_type;
const int16_t *band_count = &band_counts[tx_size][1]; const int16_t *band_count = &band_counts[tx_size][1];
const int eob = pd->eobs[block]; const int eob = pd->eobs[block];
const int16_t *const qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block); const int16_t *const qcoeff_ptr = BLOCK_OFFSET(p->qcoeff, block);
const int ref = mbmi->ref_frame[0] != INTRA_FRAME; const int ref = mbmi->ref_frame[0] != INTRA_FRAME;
unsigned int (*token_costs)[2][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS] = unsigned int (*token_costs)[2][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS] =
x->token_costs[tx_size][type][ref]; x->token_costs[tx_size][type][ref];
...@@ -1380,7 +1381,7 @@ static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x, ...@@ -1380,7 +1381,7 @@ static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x,
struct macroblockd_plane *const pd = x->e_mbd.plane; struct macroblockd_plane *const pd = x->e_mbd.plane;
for (i = 1; i < MAX_MB_PLANE; ++i) { for (i = 1; i < MAX_MB_PLANE; ++i) {
p[i].coeff = ctx->coeff_pbuf[i][2]; p[i].coeff = ctx->coeff_pbuf[i][2];
pd[i].qcoeff = ctx->qcoeff_pbuf[i][2]; p[i].qcoeff = ctx->qcoeff_pbuf[i][2];
pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2]; pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2];
pd[i].eobs = ctx->eobs_pbuf[i][2]; pd[i].eobs = ctx->eobs_pbuf[i][2];
...@@ -1390,7 +1391,7 @@ static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x, ...@@ -1390,7 +1391,7 @@ static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x,
ctx->eobs_pbuf[i][2] = ctx->eobs_pbuf[i][0]; ctx->eobs_pbuf[i][2] = ctx->eobs_pbuf[i][0];
ctx->coeff_pbuf[i][0] = p[i].coeff; ctx->coeff_pbuf[i][0] = p[i].coeff;
ctx->qcoeff_pbuf[i][0] = pd[i].qcoeff; ctx->qcoeff_pbuf[i][0] = p[i].qcoeff;
ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff; ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff;
ctx->eobs_pbuf[i][0] = pd[i].eobs; ctx->eobs_pbuf[i][0] = pd[i].eobs;
} }
...@@ -3057,7 +3058,7 @@ static void swap_block_ptr(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx, ...@@ -3057,7 +3058,7 @@ static void swap_block_ptr(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx,
for (i = 0; i < max_plane; ++i) { for (i = 0; i < max_plane; ++i) {
p[i].coeff = ctx->coeff_pbuf[i][1]; p[i].coeff = ctx->coeff_pbuf[i][1];
pd[i].qcoeff = ctx->qcoeff_pbuf[i][1]; p[i].qcoeff = ctx->qcoeff_pbuf[i][1];
pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
pd[i].eobs = ctx->eobs_pbuf[i][1]; pd[i].eobs = ctx->eobs_pbuf[i][1];
...@@ -3067,7 +3068,7 @@ static void swap_block_ptr(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx, ...@@ -3067,7 +3068,7 @@ static void swap_block_ptr(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx,
ctx->eobs_pbuf[i][1] = ctx->eobs_pbuf[i][0]; ctx->eobs_pbuf[i][1] = ctx->eobs_pbuf[i][0];
ctx->coeff_pbuf[i][0] = p[i].coeff; ctx->coeff_pbuf[i][0] = p[i].coeff;
ctx->qcoeff_pbuf[i][0] = pd[i].qcoeff; ctx->qcoeff_pbuf[i][0] = p[i].qcoeff;
ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff; ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff;
ctx->eobs_pbuf[i][0] = pd[i].eobs; ctx->eobs_pbuf[i][0] = pd[i].eobs;
} }
......
...@@ -108,7 +108,8 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, ...@@ -108,7 +108,8 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize,
TOKENEXTRA *t = *tp; /* store tokens starting here */ TOKENEXTRA *t = *tp; /* store tokens starting here */
const int eob = pd->eobs[block]; const int eob = pd->eobs[block];
const PLANE_TYPE type = pd->plane_type; const PLANE_TYPE type = pd->plane_type;
const int16_t *qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block); struct macroblock_plane *p = &cpi->mb.plane[plane];
const int16_t *qcoeff_ptr = BLOCK_OFFSET(p->qcoeff, block);
const int segment_id = mbmi->segment_id; const int segment_id = mbmi->segment_id;
const int16_t *scan, *nb; const int16_t *scan, *nb;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment