Moving txfm_size bits before prediction mode bits.
Hardware implementation needs to load coeff probs based on the transform size. For selectable transform size, moving these bits earlier in the bitstream adds some delay giving time to preload the probs and speeds up the decoding process. Change-Id: I3bfc1f662ae6f219c9286fe9ae6310c7d8a63ea7
This commit is contained in:
Родитель
5cac66078e
Коммит
80812829c2
|
@ -118,6 +118,24 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
|
|||
if (!m->mbmi.mb_skip_coeff)
|
||||
m->mbmi.mb_skip_coeff = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_MBSKIP));
|
||||
|
||||
if (cm->txfm_mode == TX_MODE_SELECT &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
|
||||
const int allow_16x16 = m->mbmi.sb_type >= BLOCK_SIZE_MB16X16;
|
||||
const int allow_32x32 = m->mbmi.sb_type >= BLOCK_SIZE_SB32X32;
|
||||
m->mbmi.txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32);
|
||||
} else if (cm->txfm_mode >= ALLOW_32X32 &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) {
|
||||
m->mbmi.txfm_size = TX_32X32;
|
||||
} else if (cm->txfm_mode >= ALLOW_16X16 &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_MB16X16) {
|
||||
m->mbmi.txfm_size = TX_16X16;
|
||||
} else if (cm->txfm_mode >= ALLOW_8X8 &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
|
||||
m->mbmi.txfm_size = TX_8X8;
|
||||
} else {
|
||||
m->mbmi.txfm_size = TX_4X4;
|
||||
}
|
||||
|
||||
// luma mode
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
|
||||
const MB_PREDICTION_MODE A = above_block_mode(m, 0, mis);
|
||||
|
@ -153,25 +171,6 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
|
|||
}
|
||||
|
||||
m->mbmi.uv_mode = read_uv_mode(r, cm->kf_uv_mode_prob[m->mbmi.mode]);
|
||||
|
||||
if (cm->txfm_mode == TX_MODE_SELECT &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
|
||||
const int allow_16x16 = m->mbmi.sb_type >= BLOCK_SIZE_MB16X16;
|
||||
const int allow_32x32 = m->mbmi.sb_type >= BLOCK_SIZE_SB32X32;
|
||||
m->mbmi.txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32);
|
||||
} else if (cm->txfm_mode >= ALLOW_32X32 &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) {
|
||||
m->mbmi.txfm_size = TX_32X32;
|
||||
} else if (cm->txfm_mode >= ALLOW_16X16 &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 &&
|
||||
m->mbmi.mode <= TM_PRED) {
|
||||
m->mbmi.txfm_size = TX_16X16;
|
||||
} else if (cm->txfm_mode >= ALLOW_8X8 &&
|
||||
m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
|
||||
m->mbmi.txfm_size = TX_8X8;
|
||||
} else {
|
||||
m->mbmi.txfm_size = TX_4X4;
|
||||
}
|
||||
}
|
||||
|
||||
static int read_mv_component(vp9_reader *r,
|
||||
|
@ -569,6 +568,24 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
|
|||
// Read the reference frame
|
||||
mbmi->ref_frame = read_ref_frame(pbi, r, mbmi->segment_id);
|
||||
|
||||
if (cm->txfm_mode == TX_MODE_SELECT &&
|
||||
(mbmi->mb_skip_coeff == 0 || mbmi->ref_frame == INTRA_FRAME) &&
|
||||
bsize >= BLOCK_SIZE_SB8X8) {
|
||||
const int allow_16x16 = bsize >= BLOCK_SIZE_MB16X16;
|
||||
const int allow_32x32 = bsize >= BLOCK_SIZE_SB32X32;
|
||||
mbmi->txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32);
|
||||
} else if (bsize >= BLOCK_SIZE_SB32X32 &&
|
||||
cm->txfm_mode >= ALLOW_32X32) {
|
||||
mbmi->txfm_size = TX_32X32;
|
||||
} else if (cm->txfm_mode >= ALLOW_16X16 &&
|
||||
bsize >= BLOCK_SIZE_MB16X16) {
|
||||
mbmi->txfm_size = TX_16X16;
|
||||
} else if (cm->txfm_mode >= ALLOW_8X8 && (bsize >= BLOCK_SIZE_SB8X8)) {
|
||||
mbmi->txfm_size = TX_8X8;
|
||||
} else {
|
||||
mbmi->txfm_size = TX_4X4;
|
||||
}
|
||||
|
||||
// If reference frame is an Inter frame
|
||||
if (mbmi->ref_frame) {
|
||||
int_mv nearest, nearby, best_mv;
|
||||
|
@ -833,24 +850,6 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
|
|||
mbmi->uv_mode = read_uv_mode(r, cm->fc.uv_mode_prob[mbmi->mode]);
|
||||
cm->fc.uv_mode_counts[mbmi->mode][mbmi->uv_mode]++;
|
||||
}
|
||||
|
||||
if (cm->txfm_mode == TX_MODE_SELECT &&
|
||||
(mbmi->mb_skip_coeff == 0 || mbmi->ref_frame == INTRA_FRAME) &&
|
||||
bsize >= BLOCK_SIZE_SB8X8) {
|
||||
const int allow_16x16 = bsize >= BLOCK_SIZE_MB16X16;
|
||||
const int allow_32x32 = bsize >= BLOCK_SIZE_SB32X32;
|
||||
mbmi->txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32);
|
||||
} else if (bsize >= BLOCK_SIZE_SB32X32 &&
|
||||
cm->txfm_mode >= ALLOW_32X32) {
|
||||
mbmi->txfm_size = TX_32X32;
|
||||
} else if (cm->txfm_mode >= ALLOW_16X16 &&
|
||||
bsize >= BLOCK_SIZE_MB16X16) {
|
||||
mbmi->txfm_size = TX_16X16;
|
||||
} else if (cm->txfm_mode >= ALLOW_8X8 && (bsize >= BLOCK_SIZE_SB8X8)) {
|
||||
mbmi->txfm_size = TX_8X8;
|
||||
} else {
|
||||
mbmi->txfm_size = TX_4X4;
|
||||
}
|
||||
}
|
||||
|
||||
void vp9_decode_mode_mvs_init(VP9D_COMP* const pbi, vp9_reader *r) {
|
||||
|
|
|
@ -700,6 +700,19 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
|
|||
// Encode the reference frame.
|
||||
encode_ref_frame(bc, pc, xd, segment_id, rf);
|
||||
|
||||
if (mi->sb_type >= BLOCK_SIZE_SB8X8 && pc->txfm_mode == TX_MODE_SELECT &&
|
||||
!(rf != INTRA_FRAME &&
|
||||
(skip_coeff || vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) {
|
||||
TX_SIZE sz = mi->txfm_size;
|
||||
// FIXME(rbultje) code ternary symbol once all experiments are merged
|
||||
vp9_write(bc, sz != TX_4X4, pc->prob_tx[0]);
|
||||
if (mi->sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) {
|
||||
vp9_write(bc, sz != TX_8X8, pc->prob_tx[1]);
|
||||
if (mi->sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8)
|
||||
vp9_write(bc, sz != TX_16X16, pc->prob_tx[2]);
|
||||
}
|
||||
}
|
||||
|
||||
if (rf == INTRA_FRAME) {
|
||||
#ifdef ENTROPY_STATS
|
||||
active_section = 6;
|
||||
|
@ -807,19 +820,6 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mi->sb_type >= BLOCK_SIZE_SB8X8 && pc->txfm_mode == TX_MODE_SELECT &&
|
||||
!(rf != INTRA_FRAME &&
|
||||
(skip_coeff || vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) {
|
||||
TX_SIZE sz = mi->txfm_size;
|
||||
// FIXME(rbultje) code ternary symbol once all experiments are merged
|
||||
vp9_write(bc, sz != TX_4X4, pc->prob_tx[0]);
|
||||
if (mi->sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) {
|
||||
vp9_write(bc, sz != TX_8X8, pc->prob_tx[1]);
|
||||
if (mi->sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8)
|
||||
vp9_write(bc, sz != TX_16X16, pc->prob_tx[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void write_mb_modes_kf(const VP9_COMP *cpi,
|
||||
|
@ -842,6 +842,17 @@ static void write_mb_modes_kf(const VP9_COMP *cpi,
|
|||
vp9_write(bc, skip_coeff, vp9_get_pred_prob(c, xd, PRED_MBSKIP));
|
||||
}
|
||||
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8 && c->txfm_mode == TX_MODE_SELECT) {
|
||||
TX_SIZE sz = m->mbmi.txfm_size;
|
||||
// FIXME(rbultje) code ternary symbol once all experiments are merged
|
||||
vp9_write(bc, sz != TX_4X4, c->prob_tx[0]);
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) {
|
||||
vp9_write(bc, sz != TX_8X8, c->prob_tx[1]);
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8)
|
||||
vp9_write(bc, sz != TX_16X16, c->prob_tx[2]);
|
||||
}
|
||||
}
|
||||
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) {
|
||||
const B_PREDICTION_MODE A = above_block_mode(m, 0, mis);
|
||||
const B_PREDICTION_MODE L = xd->left_available ?
|
||||
|
@ -866,17 +877,6 @@ static void write_mb_modes_kf(const VP9_COMP *cpi,
|
|||
}
|
||||
|
||||
write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob[ym]);
|
||||
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8 && c->txfm_mode == TX_MODE_SELECT) {
|
||||
TX_SIZE sz = m->mbmi.txfm_size;
|
||||
// FIXME(rbultje) code ternary symbol once all experiments are merged
|
||||
vp9_write(bc, sz != TX_4X4, c->prob_tx[0]);
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) {
|
||||
vp9_write(bc, sz != TX_8X8, c->prob_tx[1]);
|
||||
if (m->mbmi.sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8)
|
||||
vp9_write(bc, sz != TX_16X16, c->prob_tx[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void write_modes_b(VP9_COMP *cpi, MODE_INFO *m, vp9_writer *bc,
|
||||
|
|
Загрузка…
Ссылка в новой задаче