summaryrefslogtreecommitdiff
path: root/vp9/decoder
diff options
context:
space:
mode:
authorSami Pietila <samipietila@google.com>2013-05-27 10:14:53 +0300
committerSami Pietila <samipietila@google.com>2013-05-27 10:32:05 +0300
commit80812829c2d45d9f5597e619b8759e9562d6f1c0 (patch)
treecbed932a593eb372ac10e6fa60218a6df12922e2 /vp9/decoder
parent5cac66078eb39ecf7328d58479bae6222853ab39 (diff)
downloadlibvpx-80812829c2d45d9f5597e619b8759e9562d6f1c0.tar
libvpx-80812829c2d45d9f5597e619b8759e9562d6f1c0.tar.gz
libvpx-80812829c2d45d9f5597e619b8759e9562d6f1c0.tar.bz2
libvpx-80812829c2d45d9f5597e619b8759e9562d6f1c0.zip
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
Diffstat (limited to 'vp9/decoder')
-rw-r--r--vp9/decoder/vp9_decodemv.c73
1 files changed, 36 insertions, 37 deletions
diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c
index 2bf308669..9f6a0f2cc 100644
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -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) {