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