summaryrefslogtreecommitdiff
path: root/vp9/decoder
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2015-07-07 13:52:56 -0700
committerJingning Han <jingning@google.com>2015-07-07 15:03:21 -0700
commit97d1f1aaaeead02e59b4124b29de65fb49cf05a7 (patch)
treec6cccbe386a76b6e9ffbae2fcfab506422bf9a5e /vp9/decoder
parenta652048efd22c8fff6ffd659ca7cd48004b8a18c (diff)
downloadlibvpx-97d1f1aaaeead02e59b4124b29de65fb49cf05a7.tar
libvpx-97d1f1aaaeead02e59b4124b29de65fb49cf05a7.tar.gz
libvpx-97d1f1aaaeead02e59b4124b29de65fb49cf05a7.tar.bz2
libvpx-97d1f1aaaeead02e59b4124b29de65fb49cf05a7.zip
Rework scan order fetch logic for decoder
Save redundant call for getting prediction mode to obtain scan order for detokenization. Change-Id: I0683ef119f1579d1261ed5d59052a1745b68ef6f
Diffstat (limited to 'vp9/decoder')
-rw-r--r--vp9/decoder/vp9_decodeframe.c8
-rw-r--r--vp9/decoder/vp9_detokenize.c6
-rw-r--r--vp9/decoder/vp9_detokenize.h3
3 files changed, 10 insertions, 7 deletions
diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c
index 7631e4d09..6c6454050 100644
--- a/vp9/decoder/vp9_decodeframe.c
+++ b/vp9/decoder/vp9_decodeframe.c
@@ -315,7 +315,10 @@ static void predict_and_reconstruct_intra_block(int plane, int block,
x, y, plane);
if (!mi->mbmi.skip) {
- const int eob = vp9_decode_block_tokens(xd, plane, block,
+ const scan_order *sc = (plane || xd->lossless) ?
+ &vp9_default_scan_orders[tx_size] :
+ &vp9_scan_orders[tx_size][intra_mode_to_tx_type_lookup[mode]];
+ const int eob = vp9_decode_block_tokens(xd, plane, sc,
plane_bsize, x, y, tx_size,
args->r, args->seg_id);
inverse_transform_block(xd, plane, block, tx_size, dst, pd->dst.stride,
@@ -337,8 +340,9 @@ static void reconstruct_inter_block(int plane, int block,
MACROBLOCKD *const xd = args->xd;
struct macroblockd_plane *const pd = &xd->plane[plane];
int x, y, eob;
+ const scan_order *sc = &vp9_default_scan_orders[tx_size];
txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &x, &y);
- eob = vp9_decode_block_tokens(xd, plane, block, plane_bsize,
+ eob = vp9_decode_block_tokens(xd, plane, sc, plane_bsize,
x, y, tx_size, args->r, args->seg_id);
inverse_transform_block(xd, plane, block, tx_size,
&pd->dst.buf[4 * y * pd->dst.stride + 4 * x],
diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c
index 2e2605903..4e3ab8257 100644
--- a/vp9/decoder/vp9_detokenize.c
+++ b/vp9/decoder/vp9_detokenize.c
@@ -17,7 +17,6 @@
#if CONFIG_COEFFICIENT_RANGE_CHECKING
#include "vp9/common/vp9_idct.h"
#endif
-#include "vp9/common/vp9_scan.h"
#include "vp9/decoder/vp9_detokenize.h"
@@ -207,7 +206,7 @@ static int decode_coefs(const MACROBLOCKD *xd,
}
int vp9_decode_block_tokens(MACROBLOCKD *xd,
- int plane, int block,
+ int plane, const scan_order *sc,
BLOCK_SIZE plane_bsize, int x, int y,
TX_SIZE tx_size, vp9_reader *r,
int seg_id) {
@@ -215,10 +214,9 @@ int vp9_decode_block_tokens(MACROBLOCKD *xd,
const int16_t *const dequant = pd->seg_dequant[seg_id];
const int ctx = get_entropy_context(tx_size, pd->above_context + x,
pd->left_context + y);
- const scan_order *so = get_scan(xd, tx_size, pd->plane_type, block);
const int eob = decode_coefs(xd, pd->plane_type,
pd->dqcoeff, tx_size,
- dequant, ctx, so->scan, so->neighbors, r);
+ dequant, ctx, sc->scan, sc->neighbors, r);
vp9_set_contexts(xd, pd, plane_bsize, tx_size, eob > 0, x, y);
return eob;
}
diff --git a/vp9/decoder/vp9_detokenize.h b/vp9/decoder/vp9_detokenize.h
index df1760668..ed826a40c 100644
--- a/vp9/decoder/vp9_detokenize.h
+++ b/vp9/decoder/vp9_detokenize.h
@@ -14,13 +14,14 @@
#include "vp9/decoder/vp9_decoder.h"
#include "vp9/decoder/vp9_reader.h"
+#include "vp9/common/vp9_scan.h"
#ifdef __cplusplus
extern "C" {
#endif
int vp9_decode_block_tokens(MACROBLOCKD *xd,
- int plane, int block,
+ int plane, const scan_order *sc,
BLOCK_SIZE plane_bsize, int x, int y,
TX_SIZE tx_size, vp9_reader *r,
int seg_id);