blockd.h 8.73 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
4 5 6 7 8 9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Jingning Han's avatar
Jingning Han committed
10 11
 */

12 13
#ifndef AV1_COMMON_BLOCKD_H_
#define AV1_COMMON_BLOCKD_H_
Jingning Han's avatar
Jingning Han committed
14

Adrian Grange's avatar
Adrian Grange committed
15
#include "./aom_config.h"
Jingning Han's avatar
Jingning Han committed
16

Adrian Grange's avatar
Adrian Grange committed
17
#include "aom_dsp/aom_dsp_common.h"
Yaowu Xu's avatar
Yaowu Xu committed
18 19
#include "aom_ports/mem.h"
#include "aom_scale/yv12config.h"
Jingning Han's avatar
Jingning Han committed
20

Yaowu Xu's avatar
Yaowu Xu committed
21 22 23 24
#include "av1/common/common_data.h"
#include "av1/common/entropy.h"
#include "av1/common/entropymode.h"
#include "av1/common/mv.h"
25
#if CONFIG_AOM_QM
Yaowu Xu's avatar
Yaowu Xu committed
26
#include "av1/common/quant_common.h"
27
#endif
Yaowu Xu's avatar
Yaowu Xu committed
28 29 30
#include "av1/common/scale.h"
#include "av1/common/seg_common.h"
#include "av1/common/tile_common.h"
Jingning Han's avatar
Jingning Han committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_MB_PLANE 3

typedef enum {
  KEY_FRAME = 0,
  INTER_FRAME = 1,
  FRAME_TYPES,
} FRAME_TYPE;

static INLINE int is_inter_mode(PREDICTION_MODE mode) {
  return mode >= NEARESTMV && mode <= NEWMV;
}

/* For keyframes, intra block modes are predicted by the (already decoded)
   modes for the Y blocks to the left and above us; for interframes, there
   is a single probability table. */

typedef struct {
  PREDICTION_MODE as_mode;
  int_mv as_mv[2];  // first, second inter predictor motion vectors
55 56 57
#if CONFIG_REF_MV
  int_mv pred_mv[2];
#endif
Jingning Han's avatar
Jingning Han committed
58 59 60 61 62 63
} b_mode_info;

// Note that the rate-distortion optimization loop, bit-stream writer, and
// decoder implementation modules critically rely on the defined entry values
// specified herein. They should be refactored concurrently.

clang-format's avatar
clang-format committed
64 65 66 67 68 69
#define NONE -1
#define INTRA_FRAME 0
#define LAST_FRAME 1
#define GOLDEN_FRAME 2
#define ALTREF_FRAME 3
#define MAX_REF_FRAMES 4
Jingning Han's avatar
Jingning Han committed
70 71
typedef int8_t MV_REFERENCE_FRAME;

72 73 74 75 76 77
#if CONFIG_REF_MV
#define MODE_CTX_REF_FRAMES (MAX_REF_FRAMES + (ALTREF_FRAME - LAST_FRAME))
#else
#define MODE_CTX_REF_FRAMES MAX_REF_FRAMES
#endif

Jingning Han's avatar
Jingning Han committed
78 79 80 81 82 83 84
// This structure now relates to 8x8 block regions.
typedef struct {
  // Common for both INTER and INTRA blocks
  BLOCK_SIZE sb_type;
  PREDICTION_MODE mode;
  TX_SIZE tx_size;
  int8_t skip;
85 86 87
#if CONFIG_MISC_FIXES
  int8_t has_no_coeffs;
#endif
Jingning Han's avatar
Jingning Han committed
88 89 90 91 92 93 94 95 96
  int8_t segment_id;
  int8_t seg_id_predicted;  // valid only when temporal_update is enabled

  // Only for INTRA blocks
  PREDICTION_MODE uv_mode;

  // Only for INTER blocks
  INTERP_FILTER interp_filter;
  MV_REFERENCE_FRAME ref_frame[2];
97
  TX_TYPE tx_type;
Jingning Han's avatar
Jingning Han committed
98

99
#if CONFIG_REF_MV
100
  int_mv pred_mv[2];
101 102
  uint8_t ref_mv_idx;
#endif
Jingning Han's avatar
Jingning Han committed
103 104
  // TODO(slavarnway): Delete and use bmi[3].as_mv[] instead.
  int_mv mv[2];
105 106
  /* deringing gain *per-superblock* */
  int8_t dering_gain;
Jingning Han's avatar
Jingning Han committed
107 108 109 110 111 112 113 114
} MB_MODE_INFO;

typedef struct MODE_INFO {
  MB_MODE_INFO mbmi;
  b_mode_info bmi[4];
} MODE_INFO;

static INLINE PREDICTION_MODE get_y_mode(const MODE_INFO *mi, int block) {
clang-format's avatar
clang-format committed
115
  return mi->mbmi.sb_type < BLOCK_8X8 ? mi->bmi[block].as_mode : mi->mbmi.mode;
Jingning Han's avatar
Jingning Han committed
116 117 118 119 120 121 122 123 124 125
}

static INLINE int is_inter_block(const MB_MODE_INFO *mbmi) {
  return mbmi->ref_frame[0] > INTRA_FRAME;
}

static INLINE int has_second_ref(const MB_MODE_INFO *mbmi) {
  return mbmi->ref_frame[1] > INTRA_FRAME;
}

126
PREDICTION_MODE av1_left_block_mode(const MODE_INFO *cur_mi,
clang-format's avatar
clang-format committed
127
                                     const MODE_INFO *left_mi, int b);
Jingning Han's avatar
Jingning Han committed
128

129
PREDICTION_MODE av1_above_block_mode(const MODE_INFO *cur_mi,
clang-format's avatar
clang-format committed
130
                                      const MODE_INFO *above_mi, int b);
Jingning Han's avatar
Jingning Han committed
131

clang-format's avatar
clang-format committed
132
enum mv_precision { MV_PRECISION_Q3, MV_PRECISION_Q4 };
Jingning Han's avatar
Jingning Han committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

struct buf_2d {
  uint8_t *buf;
  int stride;
};

struct macroblockd_plane {
  tran_low_t *dqcoeff;
  PLANE_TYPE plane_type;
  int subsampling_x;
  int subsampling_y;
  struct buf_2d dst;
  struct buf_2d pre[2];
  ENTROPY_CONTEXT *above_context;
  ENTROPY_CONTEXT *left_context;
  int16_t seg_dequant[MAX_SEGMENTS][2];
hui su's avatar
hui su committed
149
  uint8_t *color_index_map;
Jingning Han's avatar
Jingning Han committed
150 151 152 153 154 155

  // number of 4x4s in current block
  uint16_t n4_w, n4_h;
  // log2 of n4_w, n4_h
  uint8_t n4_wl, n4_hl;

156 157 158
#if CONFIG_AOM_QM
  const qm_val_t *seg_iqmatrix[MAX_SEGMENTS][2][TX_SIZES];
#endif
Jingning Han's avatar
Jingning Han committed
159 160
  // encoder
  const int16_t *dequant;
161 162 163
#if CONFIG_AOM_QM
  const qm_val_t *seg_qmatrix[MAX_SEGMENTS][2][TX_SIZES];
#endif
Jingning Han's avatar
Jingning Han committed
164 165
};

clang-format's avatar
clang-format committed
166
#define BLOCK_OFFSET(x, i) ((x) + (i)*16)
Jingning Han's avatar
Jingning Han committed
167 168 169

typedef struct RefBuffer {
  // TODO(dkovalev): idx is not really required and should be removed, now it
170
  // is used in av1_onyxd_if.c
Jingning Han's avatar
Jingning Han committed
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
  int idx;
  YV12_BUFFER_CONFIG *buf;
  struct scale_factors sf;
} RefBuffer;

typedef struct macroblockd {
  struct macroblockd_plane plane[MAX_MB_PLANE];
  uint8_t bmode_blocks_wl;
  uint8_t bmode_blocks_hl;

  FRAME_COUNTS *counts;
  TileInfo tile;

  int mi_stride;

  MODE_INFO **mi;
  MODE_INFO *left_mi;
  MODE_INFO *above_mi;
  MB_MODE_INFO *left_mbmi;
  MB_MODE_INFO *above_mbmi;

  int up_available;
  int left_available;

  /* Distance of MB away from frame edges */
  int mb_to_left_edge;
  int mb_to_right_edge;
  int mb_to_top_edge;
  int mb_to_bottom_edge;

Jingning Han's avatar
Jingning Han committed
201 202
  uint8_t n8_w, n8_h;

Jingning Han's avatar
Jingning Han committed
203 204 205 206 207 208 209 210
  FRAME_CONTEXT *fc;

  /* pointers to reference frames */
  RefBuffer *block_refs[2];

  /* pointer to current frame */
  const YV12_BUFFER_CONFIG *cur_buf;

211
#if CONFIG_REF_MV
212 213
  uint8_t ref_mv_count[MODE_CTX_REF_FRAMES];
  CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
214
  uint8_t is_sec_rect;
215 216
#endif

Jingning Han's avatar
Jingning Han committed
217 218 219 220 221 222
  ENTROPY_CONTEXT *above_context[MAX_MB_PLANE];
  ENTROPY_CONTEXT left_context[MAX_MB_PLANE][16];

  PARTITION_CONTEXT *above_seg_context;
  PARTITION_CONTEXT left_seg_context[8];

223
#if CONFIG_AOM_HIGHBITDEPTH
Jingning Han's avatar
Jingning Han committed
224 225 226 227
  /* Bit depth: 8, 10, 12 */
  int bd;
#endif

228
  int lossless[MAX_SEGMENTS];
Jingning Han's avatar
Jingning Han committed
229 230
  int corrupted;

Adrian Grange's avatar
Adrian Grange committed
231
  struct aom_internal_error_info *error_info;
Jingning Han's avatar
Jingning Han committed
232 233 234 235 236 237 238
} MACROBLOCKD;

static INLINE BLOCK_SIZE get_subsize(BLOCK_SIZE bsize,
                                     PARTITION_TYPE partition) {
  return subsize_lookup[partition][bsize];
}

239
static const TX_TYPE intra_mode_to_tx_type_context[INTRA_MODES] = {
Jingning Han's avatar
Jingning Han committed
240 241 242 243 244 245 246 247 248 249 250 251
  DCT_DCT,    // DC
  ADST_DCT,   // V
  DCT_ADST,   // H
  DCT_DCT,    // D45
  ADST_ADST,  // D135
  ADST_DCT,   // D117
  DCT_ADST,   // D153
  DCT_ADST,   // D207
  ADST_DCT,   // D63
  ADST_ADST,  // TM
};

hui su's avatar
hui su committed
252 253
static INLINE TX_TYPE get_tx_type(PLANE_TYPE plane_type, const MACROBLOCKD *xd,
                                  int block_idx) {
Jingning Han's avatar
Jingning Han committed
254
  const MODE_INFO *const mi = xd->mi[0];
hui su's avatar
hui su committed
255
  const MB_MODE_INFO *const mbmi = &mi->mbmi;
Jingning Han's avatar
Jingning Han committed
256

clang-format's avatar
clang-format committed
257
  (void)block_idx;
258 259 260 261 262
  if (plane_type != PLANE_TYPE_Y || xd->lossless[mbmi->segment_id] ||
      mbmi->tx_size >= TX_32X32)
    return DCT_DCT;

  return mbmi->tx_type;
Jingning Han's avatar
Jingning Han committed
263 264
}

265
void av1_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y);
Jingning Han's avatar
Jingning Han committed
266 267 268 269 270 271 272

static INLINE TX_SIZE get_uv_tx_size_impl(TX_SIZE y_tx_size, BLOCK_SIZE bsize,
                                          int xss, int yss) {
  if (bsize < BLOCK_8X8) {
    return TX_4X4;
  } else {
    const BLOCK_SIZE plane_bsize = ss_size_lookup[bsize][xss][yss];
Adrian Grange's avatar
Adrian Grange committed
273
    return AOMMIN(y_tx_size, max_txsize_lookup[plane_bsize]);
Jingning Han's avatar
Jingning Han committed
274 275 276 277 278 279 280 281 282
  }
}

static INLINE TX_SIZE get_uv_tx_size(const MB_MODE_INFO *mbmi,
                                     const struct macroblockd_plane *pd) {
  return get_uv_tx_size_impl(mbmi->tx_size, mbmi->sb_type, pd->subsampling_x,
                             pd->subsampling_y);
}

clang-format's avatar
clang-format committed
283 284
static INLINE BLOCK_SIZE
get_plane_block_size(BLOCK_SIZE bsize, const struct macroblockd_plane *pd) {
Jingning Han's avatar
Jingning Han committed
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
  return ss_size_lookup[bsize][pd->subsampling_x][pd->subsampling_y];
}

static INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) {
  int i;
  for (i = 0; i < MAX_MB_PLANE; i++) {
    struct macroblockd_plane *const pd = &xd->plane[i];
    const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
    memset(pd->above_context, 0,
           sizeof(ENTROPY_CONTEXT) * num_4x4_blocks_wide_lookup[plane_bsize]);
    memset(pd->left_context, 0,
           sizeof(ENTROPY_CONTEXT) * num_4x4_blocks_high_lookup[plane_bsize]);
  }
}

typedef void (*foreach_transformed_block_visitor)(int plane, int block,
301
                                                  int blk_row, int blk_col,
Jingning Han's avatar
Jingning Han committed
302
                                                  BLOCK_SIZE plane_bsize,
clang-format's avatar
clang-format committed
303
                                                  TX_SIZE tx_size, void *arg);
Jingning Han's avatar
Jingning Han committed
304

305
void av1_foreach_transformed_block_in_plane(
Jingning Han's avatar
Jingning Han committed
306 307 308
    const MACROBLOCKD *const xd, BLOCK_SIZE bsize, int plane,
    foreach_transformed_block_visitor visit, void *arg);

309
void av1_foreach_transformed_block(const MACROBLOCKD *const xd,
clang-format's avatar
clang-format committed
310 311 312
                                    BLOCK_SIZE bsize,
                                    foreach_transformed_block_visitor visit,
                                    void *arg);
Jingning Han's avatar
Jingning Han committed
313

314
void av1_set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd,
clang-format's avatar
clang-format committed
315 316
                       BLOCK_SIZE plane_bsize, TX_SIZE tx_size, int has_eob,
                       int aoff, int loff);
Jingning Han's avatar
Jingning Han committed
317 318 319 320 321

#ifdef __cplusplus
}  // extern "C"
#endif

322
#endif  // AV1_COMMON_BLOCKD_H_