Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(386)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_context_tree.c

Issue 341293003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_context_tree.h ('k') | source/libvpx/vp9/encoder/vp9_dct.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "vp9/encoder/vp9_context_tree.h" 11 #include "vp9/encoder/vp9_context_tree.h"
12 #include "vp9/encoder/vp9_encoder.h"
12 13
13 static const BLOCK_SIZE square[] = { 14 static const BLOCK_SIZE square[] = {
14 BLOCK_8X8, 15 BLOCK_8X8,
15 BLOCK_16X16, 16 BLOCK_16X16,
16 BLOCK_32X32, 17 BLOCK_32X32,
17 BLOCK_64X64, 18 BLOCK_64X64,
18 }; 19 };
19 20
20 static void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk, 21 static void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk,
21 PICK_MODE_CONTEXT *ctx) { 22 PICK_MODE_CONTEXT *ctx) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 free_mode_context(&tree->horizontal[0]); 80 free_mode_context(&tree->horizontal[0]);
80 free_mode_context(&tree->horizontal[1]); 81 free_mode_context(&tree->horizontal[1]);
81 free_mode_context(&tree->vertical[0]); 82 free_mode_context(&tree->vertical[0]);
82 free_mode_context(&tree->vertical[1]); 83 free_mode_context(&tree->vertical[1]);
83 } 84 }
84 85
85 // This function sets up a tree of contexts such that at each square 86 // This function sets up a tree of contexts such that at each square
86 // partition level. There are contexts for none, horizontal, vertical, and 87 // partition level. There are contexts for none, horizontal, vertical, and
87 // split. Along with a block_size value and a selected block_size which 88 // split. Along with a block_size value and a selected block_size which
88 // represents the state of our search. 89 // represents the state of our search.
89 void vp9_setup_pc_tree(VP9_COMMON *cm, MACROBLOCK *x) { 90 void vp9_setup_pc_tree(VP9_COMMON *cm, VP9_COMP *cpi) {
90 int i, j; 91 int i, j;
91 const int leaf_nodes = 64; 92 const int leaf_nodes = 64;
92 const int tree_nodes = 64 + 16 + 4 + 1; 93 const int tree_nodes = 64 + 16 + 4 + 1;
93 int pc_tree_index = 0; 94 int pc_tree_index = 0;
94 PC_TREE *this_pc; 95 PC_TREE *this_pc;
95 PICK_MODE_CONTEXT *this_leaf; 96 PICK_MODE_CONTEXT *this_leaf;
96 int square_index = 1; 97 int square_index = 1;
97 int nodes; 98 int nodes;
98 99
99 vpx_free(x->leaf_tree); 100 vpx_free(cpi->leaf_tree);
100 CHECK_MEM_ERROR(cm, x->leaf_tree, vpx_calloc(leaf_nodes, 101 CHECK_MEM_ERROR(cm, cpi->leaf_tree, vpx_calloc(leaf_nodes,
101 sizeof(*x->leaf_tree))); 102 sizeof(*cpi->leaf_tree)));
102 vpx_free(x->pc_tree); 103 vpx_free(cpi->pc_tree);
103 CHECK_MEM_ERROR(cm, x->pc_tree, vpx_calloc(tree_nodes, sizeof(*x->pc_tree))); 104 CHECK_MEM_ERROR(cm, cpi->pc_tree, vpx_calloc(tree_nodes,
105 sizeof(*cpi->pc_tree)));
104 106
105 this_pc = &x->pc_tree[0]; 107 this_pc = &cpi->pc_tree[0];
106 this_leaf = &x->leaf_tree[0]; 108 this_leaf = &cpi->leaf_tree[0];
107 109
108 // 4x4 blocks smaller than 8x8 but in the same 8x8 block share the same 110 // 4x4 blocks smaller than 8x8 but in the same 8x8 block share the same
109 // context so we only need to allocate 1 for each 8x8 block. 111 // context so we only need to allocate 1 for each 8x8 block.
110 for (i = 0; i < leaf_nodes; ++i) 112 for (i = 0; i < leaf_nodes; ++i)
111 alloc_mode_context(cm, 1, &x->leaf_tree[i]); 113 alloc_mode_context(cm, 1, &cpi->leaf_tree[i]);
112 114
113 // Sets up all the leaf nodes in the tree. 115 // Sets up all the leaf nodes in the tree.
114 for (pc_tree_index = 0; pc_tree_index < leaf_nodes; ++pc_tree_index) { 116 for (pc_tree_index = 0; pc_tree_index < leaf_nodes; ++pc_tree_index) {
115 PC_TREE *const tree = &x->pc_tree[pc_tree_index]; 117 PC_TREE *const tree = &cpi->pc_tree[pc_tree_index];
116 tree->block_size = square[0]; 118 tree->block_size = square[0];
117 alloc_tree_contexts(cm, tree, 4); 119 alloc_tree_contexts(cm, tree, 4);
118 tree->leaf_split[0] = this_leaf++; 120 tree->leaf_split[0] = this_leaf++;
119 for (j = 1; j < 4; j++) 121 for (j = 1; j < 4; j++)
120 tree->leaf_split[j] = tree->leaf_split[0]; 122 tree->leaf_split[j] = tree->leaf_split[0];
121 } 123 }
122 124
123 // Each node has 4 leaf nodes, fill each block_size level of the tree 125 // Each node has 4 leaf nodes, fill each block_size level of the tree
124 // from leafs to the root. 126 // from leafs to the root.
125 for (nodes = 16; nodes > 0; nodes >>= 2) { 127 for (nodes = 16; nodes > 0; nodes >>= 2) {
126 for (i = 0; i < nodes; ++i) { 128 for (i = 0; i < nodes; ++i) {
127 PC_TREE *const tree = &x->pc_tree[pc_tree_index]; 129 PC_TREE *const tree = &cpi->pc_tree[pc_tree_index];
128 alloc_tree_contexts(cm, tree, 4 << (2 * square_index)); 130 alloc_tree_contexts(cm, tree, 4 << (2 * square_index));
129 tree->block_size = square[square_index]; 131 tree->block_size = square[square_index];
130 for (j = 0; j < 4; j++) 132 for (j = 0; j < 4; j++)
131 tree->split[j] = this_pc++; 133 tree->split[j] = this_pc++;
132 ++pc_tree_index; 134 ++pc_tree_index;
133 } 135 }
134 ++square_index; 136 ++square_index;
135 } 137 }
136 x->pc_root = &x->pc_tree[tree_nodes - 1]; 138 cpi->pc_root = &cpi->pc_tree[tree_nodes - 1];
137 x->pc_root[0].none.best_mode_index = 2; 139 cpi->pc_root[0].none.best_mode_index = 2;
138 } 140 }
139 141
140 void vp9_free_pc_tree(MACROBLOCK *x) { 142 void vp9_free_pc_tree(VP9_COMP *cpi) {
141 const int tree_nodes = 64 + 16 + 4 + 1; 143 const int tree_nodes = 64 + 16 + 4 + 1;
142 int i; 144 int i;
143 145
144 // Set up all 4x4 mode contexts 146 // Set up all 4x4 mode contexts
145 for (i = 0; i < 64; ++i) 147 for (i = 0; i < 64; ++i)
146 free_mode_context(&x->leaf_tree[i]); 148 free_mode_context(&cpi->leaf_tree[i]);
147 149
148 // Sets up all the leaf nodes in the tree. 150 // Sets up all the leaf nodes in the tree.
149 for (i = 0; i < tree_nodes; ++i) 151 for (i = 0; i < tree_nodes; ++i)
150 free_tree_contexts(&x->pc_tree[i]); 152 free_tree_contexts(&cpi->pc_tree[i]);
151 153
152 vpx_free(x->pc_tree); 154 vpx_free(cpi->pc_tree);
153 x->pc_tree = NULL; 155 cpi->pc_tree = NULL;
154 vpx_free(x->leaf_tree); 156 vpx_free(cpi->leaf_tree);
155 x->leaf_tree = NULL; 157 cpi->leaf_tree = NULL;
156 } 158 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_context_tree.h ('k') | source/libvpx/vp9/encoder/vp9_dct.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698