diff --git a/vp9/common/vp9_scan.c b/vp9/common/vp9_scan.c index f17da91104bc05e578779ee13d95a5fbadf78c59..f62150fd466f1ab84054df2ecfbee485814f253a 100644 --- a/vp9/common/vp9_scan.c +++ b/vp9/common/vp9_scan.c @@ -266,6 +266,62 @@ DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_16x16[256]); DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_16x16[256]); DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_32x32[1024]); +const scan_order inter_scan_orders[TX_SIZES] = { + {vp9_default_scan_4x4, vp9_default_scan_4x4_neighbors}, // NEWMV + {vp9_default_scan_8x8, vp9_default_scan_8x8_neighbors}, // NEWMV + {vp9_default_scan_16x16, vp9_default_scan_16x16_neighbors}, // NEWMV + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // NEWMV +}; + +const scan_order intra_scan_orders[TX_SIZES][INTRA_MODES] = { + { // 4X4 + {vp9_default_scan_4x4, vp9_default_scan_4x4_neighbors}, // DC + {vp9_row_scan_4x4, vp9_row_scan_4x4_neighbors}, // V + {vp9_col_scan_4x4, vp9_col_scan_4x4_neighbors}, // H + {vp9_default_scan_4x4, vp9_default_scan_4x4_neighbors}, // D45 + {vp9_default_scan_4x4, vp9_default_scan_4x4_neighbors}, // D135 + {vp9_row_scan_4x4, vp9_row_scan_4x4_neighbors}, // D117 + {vp9_col_scan_4x4, vp9_col_scan_4x4_neighbors}, // D153 + {vp9_col_scan_4x4, vp9_col_scan_4x4_neighbors}, // D207 + {vp9_row_scan_4x4, vp9_row_scan_4x4_neighbors}, // D63 + {vp9_default_scan_4x4, vp9_default_scan_4x4_neighbors}, // TM + }, { // 8x8 + {vp9_default_scan_8x8, vp9_default_scan_8x8_neighbors}, // DC + {vp9_row_scan_8x8, vp9_row_scan_8x8_neighbors}, // V + {vp9_col_scan_8x8, vp9_col_scan_8x8_neighbors}, // H + {vp9_default_scan_8x8, vp9_default_scan_8x8_neighbors}, // D45 + {vp9_default_scan_8x8, vp9_default_scan_8x8_neighbors}, // D135 + {vp9_row_scan_8x8, vp9_row_scan_8x8_neighbors}, // D117 + {vp9_col_scan_8x8, vp9_col_scan_8x8_neighbors}, // D153 + {vp9_col_scan_8x8, vp9_col_scan_8x8_neighbors}, // D207 + {vp9_row_scan_8x8, vp9_row_scan_8x8_neighbors}, // D63 + {vp9_default_scan_8x8, vp9_default_scan_8x8_neighbors}, // TM + }, { // 16x16 + {vp9_default_scan_16x16, vp9_default_scan_16x16_neighbors}, // DC + {vp9_row_scan_16x16, vp9_row_scan_16x16_neighbors}, // V + {vp9_col_scan_16x16, vp9_col_scan_16x16_neighbors}, // H + {vp9_default_scan_16x16, vp9_default_scan_16x16_neighbors}, // D45 + {vp9_default_scan_16x16, vp9_default_scan_16x16_neighbors}, // D135 + {vp9_row_scan_16x16, vp9_row_scan_16x16_neighbors}, // D117 + {vp9_col_scan_16x16, vp9_col_scan_16x16_neighbors}, // D153 + {vp9_col_scan_16x16, vp9_col_scan_16x16_neighbors}, // D207 + {vp9_row_scan_16x16, vp9_row_scan_16x16_neighbors}, // D63 + {vp9_default_scan_16x16, vp9_default_scan_16x16_neighbors}, // TM + }, { // 32x32 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // DC + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // V + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // H + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // D45 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // D135 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // D117 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // D153 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // D207 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // D63 + {vp9_default_scan_32x32, vp9_default_scan_32x32_neighbors}, // TM + } +}; + + static int find_in_scan(const int16_t *scan, int l, int idx) { int n, l2 = l * l; for (n = 0; n < l2; n++) { diff --git a/vp9/common/vp9_scan.h b/vp9/common/vp9_scan.h index 14a1a7eb02fd8d7b4b598865bbc25caea92233d4..98fc607cafc7db04156fce9b2a485c5b138498a3 100644 --- a/vp9/common/vp9_scan.h +++ b/vp9/common/vp9_scan.h @@ -15,6 +15,7 @@ #include "vpx_ports/mem.h" #include "vp9/common/vp9_enums.h" +#include "vp9/common/vp9_blockd.h" #define MAX_NEIGHBORS 2 @@ -67,9 +68,16 @@ extern DECLARE_ALIGNED(16, int16_t, extern DECLARE_ALIGNED(16, int16_t, vp9_default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]); - void vp9_init_neighbors(); +typedef struct { + const int16_t *scan; + const int16_t *neighbors; +} scan_order; + +extern const scan_order intra_scan_orders[TX_SIZES][INTRA_MODES]; +extern const scan_order inter_scan_orders[TX_SIZES]; + static INLINE const int16_t* get_scan_4x4(TX_TYPE tx_type) { switch (tx_type) { case ADST_DCT: diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c index 05a2b427bb01706be3da79a8292e244b786bc3a1..f6b97bb77aa79d8fb7e9bb99653165efb1105bfd 100644 --- a/vp9/decoder/vp9_detokenize.c +++ b/vp9/decoder/vp9_detokenize.c @@ -110,8 +110,20 @@ static int decode_coefs(VP9_COMMON *cm, const MACROBLOCKD *xd, const int16_t *scan, *nb; const uint8_t *cat6; const uint8_t *band_translate = get_band_translate(tx_size); - get_scan(xd, tx_size, type, block_idx, &scan, &nb); - + const MODE_INFO *const mi = xd->mi_8x8[0]; + const MB_MODE_INFO *const mbmi = &mi->mbmi; + scan_order const *so; + + if (mbmi->ref_frame[0] > 0 || type != PLANE_TYPE_Y_WITH_DC || xd->lossless) { + so = &inter_scan_orders[tx_size]; + } else { + MB_PREDICTION_MODE mode = mbmi->mode; + if (mbmi->sb_type < BLOCK_8X8) + mode = mi->bmi[block_idx].as_mode; + so = &intra_scan_orders[tx_size][mode]; + } + scan = so->scan; + nb = so->neighbors; while (c < seg_eob) { int val; if (c)