64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  Copyright (c) 2016 The WebM project authors. All Rights Reserved.
 | |
|  *
 | |
|  *  Use of this source code is governed by a BSD-style license
 | |
|  *  that can be found in the LICENSE file in the root of the source
 | |
|  *  tree. An additional intellectual property rights grant can be found
 | |
|  *  in the file PATENTS.  All contributing project authors may
 | |
|  *  be found in the AUTHORS file in the root of the source tree.
 | |
|  */
 | |
| 
 | |
| #include "vp10/encoder/variance_tree.h"
 | |
| #include "vp10/encoder/encoder.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| void vp10_setup_var_tree(struct VP10Common *cm, ThreadData *td) {
 | |
|   int i, j;
 | |
| #if CONFIG_EXT_PARTITION
 | |
|   const int leaf_nodes = 1024;
 | |
|   const int tree_nodes = 1024 + 256 + 64 + 16 + 4 + 1;
 | |
| #else
 | |
|   const int leaf_nodes = 256;
 | |
|   const int tree_nodes = 256 + 64 + 16 + 4 + 1;
 | |
| #endif  // CONFIG_EXT_PARTITION
 | |
|   int index = 0;
 | |
|   VAR_TREE *this_var;
 | |
|   int nodes;
 | |
| 
 | |
|   vpx_free(td->var_tree);
 | |
|   CHECK_MEM_ERROR(cm, td->var_tree, vpx_calloc(tree_nodes,
 | |
|                                               sizeof(*td->var_tree)));
 | |
| 
 | |
|   this_var = &td->var_tree[0];
 | |
| 
 | |
|   // Sets up all the leaf nodes in the tree.
 | |
|   for (index = 0; index < leaf_nodes; ++index) {
 | |
|     VAR_TREE *const leaf = &td->var_tree[index];
 | |
|     leaf->split[0] = NULL;
 | |
|   }
 | |
| 
 | |
|   // Each node has 4 leaf nodes, fill in the child pointers
 | |
|   // from leafs to the root.
 | |
|   for (nodes = leaf_nodes >> 2; nodes > 0; nodes >>= 2) {
 | |
|     for (i = 0; i < nodes; ++i, ++index) {
 | |
|       VAR_TREE *const node = &td->var_tree[index];
 | |
|       for (j = 0; j < 4; j++)
 | |
|         node->split[j] = this_var++;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // Set up the root node for the largest superblock size
 | |
|   i = MAX_MIB_SIZE_LOG2 - MIN_MIB_SIZE_LOG2;
 | |
|   td->var_root[i] = &td->var_tree[tree_nodes - 1];
 | |
|   // Set up the root nodes for the rest of the possible superblock sizes
 | |
|   while (--i >= 0) {
 | |
|     td->var_root[i] = td->var_root[i+1]->split[0];
 | |
|   }
 | |
| }
 | |
| 
 | |
| void vp10_free_var_tree(ThreadData *td) {
 | |
|   vpx_free(td->var_tree);
 | |
|   td->var_tree = NULL;
 | |
| }
 | 
