1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_BLOCKD_H_ 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_BLOCKD_H_ 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 1691037db265ecdd914a26e056cf69207b4f50924ehkuang 1791037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vpx_ports/mem.h" 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_scale/yv12config.h" 1991037db265ecdd914a26e056cf69207b4f50924ehkuang 2091037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_common.h" 2191037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_common_data.h" 2291037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_enums.h" 235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_filter.h" 24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_mv.h" 251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "vp9/common/vp9_scale.h" 2691037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_seg_common.h" 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define BLOCK_SIZE_GROUPS 4 33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define SKIP_CONTEXTS 3 34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define INTER_MODE_CONTEXTS 7 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* Segment Feature Masks */ 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAX_MV_REF_CANDIDATES 2 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define INTRA_INTER_CONTEXTS 4 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define COMP_INTER_CONTEXTS 5 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define REF_CONTEXTS 5 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum { 44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PLANE_TYPE_Y = 0, 45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PLANE_TYPE_UV = 1, 46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PLANE_TYPES 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} PLANE_TYPE; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef char ENTROPY_CONTEXT; 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef char PARTITION_CONTEXT; 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic INLINE int combine_entropy_contexts(ENTROPY_CONTEXT a, 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ENTROPY_CONTEXT b) { 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return (a != 0) + (b != 0); 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum { 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang KEY_FRAME = 0, 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang INTER_FRAME = 1, 615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang FRAME_TYPES, 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} FRAME_TYPE; 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum { 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang DC_PRED, // Average of above and left pixels 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang V_PRED, // Vertical 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang H_PRED, // Horizontal 68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang D45_PRED, // Directional 45 deg = round(arctan(1/1) * 180/pi) 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang D135_PRED, // Directional 135 deg = 180 - 45 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang D117_PRED, // Directional 117 deg = 180 - 63 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang D153_PRED, // Directional 153 deg = 180 - 27 721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang D207_PRED, // Directional 207 deg = 180 + 27 73ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang D63_PRED, // Directional 63 deg = round(arctan(2/1) * 180/pi) 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang TM_PRED, // True-motion 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NEARESTMV, 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NEARMV, 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ZEROMV, 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NEWMV, 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MB_MODE_COUNT 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} MB_PREDICTION_MODE; 81ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic INLINE int is_inter_mode(MB_PREDICTION_MODE mode) { 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return mode >= NEARESTMV && mode <= NEWMV; 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#define INTRA_MODES (TM_PRED + 1) 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#define INTER_MODES (1 + NEWMV - NEARESTMV) 89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 909b35249446b07f40ac5fcc3205f2c048616efacchkuang#define INTER_OFFSET(mode) ((mode) - NEARESTMV) 919b35249446b07f40ac5fcc3205f2c048616efacchkuang 92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* For keyframes, intra block modes are predicted by the (already decoded) 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang modes for the Y blocks to the left and above us; for interframes, there 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang is a single probability table. */ 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef struct { 9791037db265ecdd914a26e056cf69207b4f50924ehkuang MB_PREDICTION_MODE as_mode; 98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int_mv as_mv[2]; // first, second inter predictor motion vectors 995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} b_mode_info; 100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef enum { 102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang NONE = -1, 103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang INTRA_FRAME = 0, 104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang LAST_FRAME = 1, 105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang GOLDEN_FRAME = 2, 106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ALTREF_FRAME = 3, 107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MAX_REF_FRAMES = 4 108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} MV_REFERENCE_FRAME; 109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1101184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE int b_width_log2(BLOCK_SIZE sb_type) { 11191037db265ecdd914a26e056cf69207b4f50924ehkuang return b_width_log2_lookup[sb_type]; 112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 1131184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE int b_height_log2(BLOCK_SIZE sb_type) { 11491037db265ecdd914a26e056cf69207b4f50924ehkuang return b_height_log2_lookup[sb_type]; 115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1171184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE int mi_width_log2(BLOCK_SIZE sb_type) { 11891037db265ecdd914a26e056cf69207b4f50924ehkuang return mi_width_log2_lookup[sb_type]; 119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang// This structure now relates to 8x8 block regions. 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct { 1236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Common for both INTER and INTRA blocks 1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang BLOCK_SIZE sb_type; 1256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MB_PREDICTION_MODE mode; 1261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang TX_SIZE tx_size; 1276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint8_t skip; 1286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint8_t segment_id; 1296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint8_t seg_id_predicted; // valid only when temporal_update is enabled 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Only for INTRA blocks 1326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MB_PREDICTION_MODE uv_mode; 133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang // Only for INTER blocks 1356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MV_REFERENCE_FRAME ref_frame[2]; 1366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int_mv mv[2]; 1376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES]; 1386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang uint8_t mode_context[MAX_REF_FRAMES]; 139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian INTERP_FILTER interp_filter; 140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} MB_MODE_INFO; 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct { 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MB_MODE_INFO mbmi; 1445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang b_mode_info bmi[4]; 145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} MODE_INFO; 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE MB_PREDICTION_MODE get_y_mode(const MODE_INFO *mi, int block) { 148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return mi->mbmi.sb_type < BLOCK_8X8 ? mi->bmi[block].as_mode 149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian : mi->mbmi.mode; 150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 151b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1521184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE int is_inter_block(const MB_MODE_INFO *mbmi) { 153f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang return mbmi->ref_frame[0] > INTRA_FRAME; 154f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang} 155f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 1561184aebb761cbeac9124c37189a80a1a58f04b6bhkuangstatic INLINE int has_second_ref(const MB_MODE_INFO *mbmi) { 1571184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return mbmi->ref_frame[1] > INTRA_FRAME; 1581184aebb761cbeac9124c37189a80a1a58f04b6bhkuang} 159f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 160b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianMB_PREDICTION_MODE vp9_left_block_mode(const MODE_INFO *cur_mi, 161b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const MODE_INFO *left_mi, int b); 162b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 163b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh VenkatasubramanianMB_PREDICTION_MODE vp9_above_block_mode(const MODE_INFO *cur_mi, 164b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const MODE_INFO *above_mi, int b); 165b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 16691037db265ecdd914a26e056cf69207b4f50924ehkuangenum mv_precision { 16791037db265ecdd914a26e056cf69207b4f50924ehkuang MV_PRECISION_Q3, 16891037db265ecdd914a26e056cf69207b4f50924ehkuang MV_PRECISION_Q4 16991037db265ecdd914a26e056cf69207b4f50924ehkuang}; 17091037db265ecdd914a26e056cf69207b4f50924ehkuang 171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if CONFIG_ALPHA 172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangenum { MAX_MB_PLANE = 4 }; 173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangenum { MAX_MB_PLANE = 3 }; 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct buf_2d { 178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang uint8_t *buf; 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int stride; 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct macroblockd_plane { 1839b35249446b07f40ac5fcc3205f2c048616efacchkuang int16_t *dqcoeff; 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang PLANE_TYPE plane_type; 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int subsampling_x; 186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int subsampling_y; 187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct buf_2d dst; 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct buf_2d pre[2]; 189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int16_t *dequant; 190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ENTROPY_CONTEXT *above_context; 191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ENTROPY_CONTEXT *left_context; 192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}; 193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#define BLOCK_OFFSET(x, i) ((x) + (i) * 16) 19591037db265ecdd914a26e056cf69207b4f50924ehkuang 196b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct RefBuffer { 197b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // TODO(dkovalev): idx is not really required and should be removed, now it 198b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // is used in vp9_onyxd_if.c 199b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int idx; 200b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian YV12_BUFFER_CONFIG *buf; 201b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct scale_factors sf; 202b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} RefBuffer; 203b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct macroblockd { 205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang struct macroblockd_plane plane[MAX_MB_PLANE]; 206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang int mi_stride; 208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2091184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // A NULL indicates that the 8x8 is not part of the image 2106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang MODE_INFO **mi; 2111184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int up_available; 213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int left_available; 214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Distance of MB away from frame edges */ 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int mb_to_left_edge; 217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int mb_to_right_edge; 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int mb_to_top_edge; 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int mb_to_bottom_edge; 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 221b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian /* pointers to reference frames */ 222b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian RefBuffer *block_refs[2]; 223b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 224b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian /* pointer to current frame */ 225b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const YV12_BUFFER_CONFIG *cur_buf; 226b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 227b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian /* mc buffer */ 228b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian DECLARE_ALIGNED(16, uint8_t, mc_buf[80 * 2 * 80 * 2]); 229b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int lossless; 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Inverse transform function pointers. */ 2325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang void (*itxm_add)(const int16_t *input, uint8_t *dest, int stride, int eob); 233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int corrupted; 235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang DECLARE_ALIGNED(16, int16_t, dqcoeff[MAX_MB_PLANE][64 * 64]); 2376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang 2385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ENTROPY_CONTEXT *above_context[MAX_MB_PLANE]; 2395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ENTROPY_CONTEXT left_context[MAX_MB_PLANE][16]; 240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PARTITION_CONTEXT *above_seg_context; 2425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang PARTITION_CONTEXT left_seg_context[8]; 2435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} MACROBLOCKD; 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 245b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE BLOCK_SIZE get_subsize(BLOCK_SIZE bsize, 246b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian PARTITION_TYPE partition) { 2471184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const BLOCK_SIZE subsize = subsize_lookup[partition][bsize]; 2481184aebb761cbeac9124c37189a80a1a58f04b6bhkuang assert(subsize < BLOCK_SIZES); 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return subsize; 250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 252a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanianextern const TX_TYPE intra_mode_to_tx_type_lookup[INTRA_MODES]; 253b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 254b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE TX_TYPE get_tx_type(PLANE_TYPE plane_type, 255b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const MACROBLOCKD *xd) { 2566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; 257b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 258b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (plane_type != PLANE_TYPE_Y || is_inter_block(mbmi)) 259b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return DCT_DCT; 260a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return intra_mode_to_tx_type_lookup[mbmi->mode]; 261b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 26391037db265ecdd914a26e056cf69207b4f50924ehkuangstatic INLINE TX_TYPE get_tx_type_4x4(PLANE_TYPE plane_type, 26491037db265ecdd914a26e056cf69207b4f50924ehkuang const MACROBLOCKD *xd, int ib) { 2656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang const MODE_INFO *const mi = xd->mi[0]; 266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 267b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (plane_type != PLANE_TYPE_Y || xd->lossless || is_inter_block(&mi->mbmi)) 26891037db265ecdd914a26e056cf69207b4f50924ehkuang return DCT_DCT; 269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 270a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian return intra_mode_to_tx_type_lookup[get_y_mode(mi, ib)]; 271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 273b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y); 27491037db265ecdd914a26e056cf69207b4f50924ehkuang 275b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE TX_SIZE get_uv_tx_size_impl(TX_SIZE y_tx_size, BLOCK_SIZE bsize) { 276b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (bsize < BLOCK_8X8) { 277b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return TX_4X4; 278b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } else { 279b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // TODO(dkovalev): Assuming YUV420 (ss_x == 1, ss_y == 1) 280b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const BLOCK_SIZE plane_bsize = ss_size_lookup[bsize][1][1]; 281b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return MIN(y_tx_size, max_txsize_lookup[plane_bsize]); 282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 28591037db265ecdd914a26e056cf69207b4f50924ehkuangstatic INLINE TX_SIZE get_uv_tx_size(const MB_MODE_INFO *mbmi) { 286b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return get_uv_tx_size_impl(mbmi->tx_size, mbmi->sb_type); 287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 289b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE BLOCK_SIZE get_plane_block_size(BLOCK_SIZE bsize, 290b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const struct macroblockd_plane *pd) { 2911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang BLOCK_SIZE bs = ss_size_lookup[bsize][pd->subsampling_x][pd->subsampling_y]; 2921184aebb761cbeac9124c37189a80a1a58f04b6bhkuang assert(bs < BLOCK_SIZES); 2931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return bs; 294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 296ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef void (*foreach_transformed_block_visitor)(int plane, int block, 2971184aebb761cbeac9124c37189a80a1a58f04b6bhkuang BLOCK_SIZE plane_bsize, 2981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang TX_SIZE tx_size, 299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang void *arg); 300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 301b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_foreach_transformed_block_in_plane( 3021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MACROBLOCKD *const xd, BLOCK_SIZE bsize, int plane, 303b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian foreach_transformed_block_visitor visit, void *arg); 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 305ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 306b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_foreach_transformed_block( 3071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const MACROBLOCKD* const xd, BLOCK_SIZE bsize, 308b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian foreach_transformed_block_visitor visit, void *arg); 309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 310b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic INLINE void txfrm_block_to_raster_xy(BLOCK_SIZE plane_bsize, 311b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian TX_SIZE tx_size, int block, 312b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int *x, int *y) { 3131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int bwl = b_width_log2(plane_bsize); 3141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int tx_cols_log2 = bwl - tx_size; 31591037db265ecdd914a26e056cf69207b4f50924ehkuang const int tx_cols = 1 << tx_cols_log2; 3161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang const int raster_mb = block >> (tx_size << 1); 3171184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *x = (raster_mb & (tx_cols - 1)) << tx_size; 3181184aebb761cbeac9124c37189a80a1a58f04b6bhkuang *y = (raster_mb >> tx_cols_log2) << tx_size; 319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 321b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd, 322b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian BLOCK_SIZE plane_bsize, TX_SIZE tx_size, int has_eob, 323b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int aoff, int loff); 324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 325b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 326b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} // extern "C" 327b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif // VP9_COMMON_VP9_BLOCKD_H_ 330