1ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian/*
2ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *
4ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  Use of this source code is governed by a BSD-style license
5ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  that can be found in the LICENSE file in the root of the source
6ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  tree. An additional intellectual property rights grant can be found
7ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  in the file PATENTS.  All contributing project authors may
8ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian *  be found in the AUTHORS file in the root of the source tree.
9ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian */
10ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
11ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifndef VP9_ENCODER_VP9_CONTEXT_TREE_H_
12ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#define VP9_ENCODER_VP9_CONTEXT_TREE_H_
13ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp9/common/vp9_blockd.h"
157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vp9/encoder/vp9_block.h"
16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
17c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#ifdef __cplusplus
18c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohannextern "C" {
19c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#endif
20c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
21ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstruct VP9_COMP;
227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstruct VP9Common;
237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstruct ThreadData;
24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// Structure to hold snapshot of coding context during the mode picking process
26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct {
27ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  MODE_INFO mic;
287ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  MB_MODE_INFO_EXT mbmi_ext;
29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint8_t *zcoeff_blk;
307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  tran_low_t *coeff[MAX_MB_PLANE][3];
317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  tran_low_t *qcoeff[MAX_MB_PLANE][3];
327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  tran_low_t *dqcoeff[MAX_MB_PLANE][3];
33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint16_t *eobs[MAX_MB_PLANE][3];
34ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
35ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  // dual buffer pointers, 0: in use, 1: best in store
367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  tran_low_t *coeff_pbuf[MAX_MB_PLANE][3];
377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  tran_low_t *qcoeff_pbuf[MAX_MB_PLANE][3];
387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  tran_low_t *dqcoeff_pbuf[MAX_MB_PLANE][3];
39ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  uint16_t *eobs_pbuf[MAX_MB_PLANE][3];
40ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int is_coded;
42ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int num_4x4_blk;
43ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int skip;
447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int pred_pixel_ready;
457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // For current partition, only if all Y, U, and V transform blocks'
467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // coefficients are quantized to 0, skippable is set to 0.
477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int skippable;
487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  uint8_t skip_txfm[MAX_MB_PLANE << 2];
49ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int best_mode_index;
50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int hybrid_pred_diff;
51ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int comp_pred_diff;
52ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int single_pred_diff;
53ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
54ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // TODO(jingning) Use RD_COST struct here instead. This involves a boarder
567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  // scope of refactoring.
577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int rate;
587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int64_t dist;
597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
60ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if CONFIG_VP9_TEMPORAL_DENOISING
61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  unsigned int newmv_sse;
62ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  unsigned int zeromv_sse;
6368e1c830ade592be74773e249bf94e2bbfb50de7Johann  unsigned int zeromv_lastref_sse;
64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  PREDICTION_MODE best_sse_inter_mode;
65ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int_mv best_sse_mv;
66ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  MV_REFERENCE_FRAME best_reference_frame;
67ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  MV_REFERENCE_FRAME best_zeromv_reference_frame;
68df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  int sb_skip_denoising;
69ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  // motion vector cache for adaptive motion search control in partition
72ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  // search loop
73ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  MV pred_mv[MAX_REF_FRAMES];
74ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  INTERP_FILTER pred_interp_filter;
750a39d0a697ff3603e8c100300fda363658e10b23James Zern
760a39d0a697ff3603e8c100300fda363658e10b23James Zern  // Used for the machine learning-based early termination
770a39d0a697ff3603e8c100300fda363658e10b23James Zern  int32_t sum_y_eobs;
78ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} PICK_MODE_CONTEXT;
79ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
80ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct PC_TREE {
81ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int index;
82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  PARTITION_TYPE partitioning;
83ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  BLOCK_SIZE block_size;
84ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  PICK_MODE_CONTEXT none;
85ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  PICK_MODE_CONTEXT horizontal[2];
86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  PICK_MODE_CONTEXT vertical[2];
87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  union {
88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    struct PC_TREE *split[4];
89ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    PICK_MODE_CONTEXT *leaf_split[4];
90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  };
91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} PC_TREE;
92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vp9_setup_pc_tree(struct VP9Common *cm, struct ThreadData *td);
947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vp9_free_pc_tree(struct ThreadData *td);
95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
96c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#ifdef __cplusplus
97c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann}  // extern "C"
98c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#endif
99c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann
100ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif /* VP9_ENCODER_VP9_CONTEXT_TREE_H_ */
101