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

Side by Side Diff: source/libvpx/vp9/common/vp9_pred_common.c

Issue 23600008: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 3 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/common/vp9_pred_common.h ('k') | source/libvpx/vp9/common/vp9_quant_common.h » ('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 /* 2 /*
3 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license 5 * Use of this source code is governed by a BSD-style license
6 * that can be found in the LICENSE file in the root of the source 6 * that can be found in the LICENSE file in the root of the source
7 * tree. An additional intellectual property rights grant can be found 7 * tree. An additional intellectual property rights grant can be found
8 * in the file PATENTS. All contributing project authors may 8 * in the file PATENTS. All contributing project authors may
9 * be found in the AUTHORS file in the root of the source tree. 9 * be found in the AUTHORS file in the root of the source tree.
10 */ 10 */
11 11
12 #include <limits.h> 12 #include <limits.h>
13 13
14 #include "vp9/common/vp9_common.h" 14 #include "vp9/common/vp9_common.h"
15 #include "vp9/common/vp9_pred_common.h" 15 #include "vp9/common/vp9_pred_common.h"
16 #include "vp9/common/vp9_seg_common.h" 16 #include "vp9/common/vp9_seg_common.h"
17 #include "vp9/common/vp9_treecoder.h" 17 #include "vp9/common/vp9_treecoder.h"
18 18
19 // Returns a context number for the given MB prediction signal 19 // Returns a context number for the given MB prediction signal
20 unsigned char vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd) { 20 unsigned char vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd) {
21 const MODE_INFO *const mi = xd->mode_info_context; 21 const MODE_INFO *const mi = xd->mode_info_context;
22 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi; 22 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi;
23 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 23 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
24 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 24 const int left_in_image = xd->left_available && left_mbmi->in_image;
25 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 25 const int above_in_image = xd->up_available && above_mbmi->in_image;
26 // Note: 26 // Note:
27 // The mode info data structure has a one element border above and to the 27 // The mode info data structure has a one element border above and to the
28 // left of the entries correpsonding to real macroblocks. 28 // left of the entries correpsonding to real macroblocks.
29 // The prediction flags in these dummy entries are initialised to 0. 29 // The prediction flags in these dummy entries are initialised to 0.
30 // left 30 // left
31 const int left_mv_pred = is_inter_mode(left_mbmi->mode); 31 const int left_mv_pred = is_inter_mode(left_mbmi->mode);
32 const int left_interp = left_in_image && left_mv_pred ? 32 const int left_interp = left_in_image && left_mv_pred
33 vp9_switchable_interp_map[left_mbmi->interp_filter] : 33 ? left_mbmi->interp_filter
34 VP9_SWITCHABLE_FILTERS; 34 : SWITCHABLE_FILTERS;
35 35
36 // above 36 // above
37 const int above_mv_pred = is_inter_mode(above_mbmi->mode); 37 const int above_mv_pred = is_inter_mode(above_mbmi->mode);
38 const int above_interp = above_in_image && above_mv_pred ? 38 const int above_interp = above_in_image && above_mv_pred
39 vp9_switchable_interp_map[above_mbmi->interp_filter] : 39 ? above_mbmi->interp_filter
40 VP9_SWITCHABLE_FILTERS; 40 : SWITCHABLE_FILTERS;
41 41
42 assert(left_interp != -1);
43 assert(above_interp != -1);
44 42
45 if (left_interp == above_interp) 43 if (left_interp == above_interp)
46 return left_interp; 44 return left_interp;
47 else if (left_interp == VP9_SWITCHABLE_FILTERS && 45 else if (left_interp == SWITCHABLE_FILTERS &&
48 above_interp != VP9_SWITCHABLE_FILTERS) 46 above_interp != SWITCHABLE_FILTERS)
49 return above_interp; 47 return above_interp;
50 else if (left_interp != VP9_SWITCHABLE_FILTERS && 48 else if (left_interp != SWITCHABLE_FILTERS &&
51 above_interp == VP9_SWITCHABLE_FILTERS) 49 above_interp == SWITCHABLE_FILTERS)
52 return left_interp; 50 return left_interp;
53 else 51 else
54 return VP9_SWITCHABLE_FILTERS; 52 return SWITCHABLE_FILTERS;
55 } 53 }
56 // Returns a context number for the given MB prediction signal 54 // Returns a context number for the given MB prediction signal
57 unsigned char vp9_get_pred_context_intra_inter(const MACROBLOCKD *xd) { 55 unsigned char vp9_get_pred_context_intra_inter(const MACROBLOCKD *xd) {
58 int pred_context;
59 const MODE_INFO *const mi = xd->mode_info_context; 56 const MODE_INFO *const mi = xd->mode_info_context;
60 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi; 57 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi;
61 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 58 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
62 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 59 const int left_in_image = xd->left_available && left_mbmi->in_image;
63 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 60 const int above_in_image = xd->up_available && above_mbmi->in_image;
64 // Note: 61 const int left_intra = !is_inter_block(left_mbmi);
62 const int above_intra = !is_inter_block(above_mbmi);
63
65 // The mode info data structure has a one element border above and to the 64 // The mode info data structure has a one element border above and to the
66 // left of the entries correpsonding to real macroblocks. 65 // left of the entries corresponding to real macroblocks.
67 // The prediction flags in these dummy entries are initialised to 0. 66 // The prediction flags in these dummy entries are initialized to 0.
68 if (above_in_image && left_in_image) { // both edges available 67 // 0 - inter/inter, inter/--, --/inter, --/--
69 if (left_mbmi->ref_frame[0] == INTRA_FRAME && 68 // 1 - intra/inter, inter/intra
70 above_mbmi->ref_frame[0] == INTRA_FRAME) { // intra/intra (3) 69 // 2 - intra/--, --/intra
71 pred_context = 3; 70 // 3 - intra/intra
72 } else { // intra/inter (1) or inter/inter (0) 71 if (above_in_image && left_in_image) // both edges available
73 pred_context = left_mbmi->ref_frame[0] == INTRA_FRAME || 72 return left_intra && above_intra ? 3
74 above_mbmi->ref_frame[0] == INTRA_FRAME; 73 : left_intra || above_intra;
75 } 74 else if (above_in_image || left_in_image) // one edge available
76 } else if (above_in_image || left_in_image) { // one edge available 75 return 2 * (above_in_image ? above_intra : left_intra);
77 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; 76 else
78 77 return 0;
79 // inter: 0, intra: 2
80 pred_context = 2 * (edge_mbmi->ref_frame[0] == INTRA_FRAME);
81 } else {
82 pred_context = 0;
83 }
84 assert(pred_context >= 0 && pred_context < INTRA_INTER_CONTEXTS);
85 return pred_context;
86 } 78 }
87 // Returns a context number for the given MB prediction signal 79 // Returns a context number for the given MB prediction signal
88 unsigned char vp9_get_pred_context_comp_inter_inter(const VP9_COMMON *cm, 80 unsigned char vp9_get_pred_context_comp_inter_inter(const VP9_COMMON *cm,
89 const MACROBLOCKD *xd) { 81 const MACROBLOCKD *xd) {
90 int pred_context; 82 int pred_context;
91 const MODE_INFO *const mi = xd->mode_info_context; 83 const MODE_INFO *const mi = xd->mode_info_context;
92 const MB_MODE_INFO *const above_mbmi = &mi[-cm->mode_info_stride].mbmi; 84 const MB_MODE_INFO *const above_mbmi = &mi[-cm->mode_info_stride].mbmi;
93 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 85 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
94 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 86 const int left_in_image = xd->left_available && left_mbmi->in_image;
95 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 87 const int above_in_image = xd->up_available && above_mbmi->in_image;
96 // Note: 88 // Note:
97 // The mode info data structure has a one element border above and to the 89 // The mode info data structure has a one element border above and to the
98 // left of the entries correpsonding to real macroblocks. 90 // left of the entries correpsonding to real macroblocks.
99 // The prediction flags in these dummy entries are initialised to 0. 91 // The prediction flags in these dummy entries are initialised to 0.
100 if (above_in_image && left_in_image) { // both edges available 92 if (above_in_image && left_in_image) { // both edges available
101 if (above_mbmi->ref_frame[1] <= INTRA_FRAME && 93 if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi))
102 left_mbmi->ref_frame[1] <= INTRA_FRAME)
103 // neither edge uses comp pred (0/1) 94 // neither edge uses comp pred (0/1)
104 pred_context = (above_mbmi->ref_frame[0] == cm->comp_fixed_ref) ^ 95 pred_context = (above_mbmi->ref_frame[0] == cm->comp_fixed_ref) ^
105 (left_mbmi->ref_frame[0] == cm->comp_fixed_ref); 96 (left_mbmi->ref_frame[0] == cm->comp_fixed_ref);
106 else if (above_mbmi->ref_frame[1] <= INTRA_FRAME) 97 else if (!has_second_ref(above_mbmi))
107 // one of two edges uses comp pred (2/3) 98 // one of two edges uses comp pred (2/3)
108 pred_context = 2 + (above_mbmi->ref_frame[0] == cm->comp_fixed_ref || 99 pred_context = 2 + (above_mbmi->ref_frame[0] == cm->comp_fixed_ref ||
109 above_mbmi->ref_frame[0] == INTRA_FRAME); 100 !is_inter_block(above_mbmi));
110 else if (left_mbmi->ref_frame[1] <= INTRA_FRAME) 101 else if (!has_second_ref(left_mbmi))
111 // one of two edges uses comp pred (2/3) 102 // one of two edges uses comp pred (2/3)
112 pred_context = 2 + (left_mbmi->ref_frame[0] == cm->comp_fixed_ref || 103 pred_context = 2 + (left_mbmi->ref_frame[0] == cm->comp_fixed_ref ||
113 left_mbmi->ref_frame[0] == INTRA_FRAME); 104 !is_inter_block(left_mbmi));
114 else // both edges use comp pred (4) 105 else // both edges use comp pred (4)
115 pred_context = 4; 106 pred_context = 4;
116 } else if (above_in_image || left_in_image) { // one edge available 107 } else if (above_in_image || left_in_image) { // one edge available
117 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; 108 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi;
118 109
119 if (edge_mbmi->ref_frame[1] <= INTRA_FRAME) 110 if (!has_second_ref(edge_mbmi))
120 // edge does not use comp pred (0/1) 111 // edge does not use comp pred (0/1)
121 pred_context = edge_mbmi->ref_frame[0] == cm->comp_fixed_ref; 112 pred_context = edge_mbmi->ref_frame[0] == cm->comp_fixed_ref;
122 else 113 else
123 // edge uses comp pred (3) 114 // edge uses comp pred (3)
124 pred_context = 3; 115 pred_context = 3;
125 } else { // no edges available (1) 116 } else { // no edges available (1)
126 pred_context = 1; 117 pred_context = 1;
127 } 118 }
128 assert(pred_context >= 0 && pred_context < COMP_INTER_CONTEXTS); 119 assert(pred_context >= 0 && pred_context < COMP_INTER_CONTEXTS);
129 return pred_context; 120 return pred_context;
130 } 121 }
131 122
132 // Returns a context number for the given MB prediction signal 123 // Returns a context number for the given MB prediction signal
133 unsigned char vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm, 124 unsigned char vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm,
134 const MACROBLOCKD *xd) { 125 const MACROBLOCKD *xd) {
135 int pred_context; 126 int pred_context;
136 const MODE_INFO *const mi = xd->mode_info_context; 127 const MODE_INFO *const mi = xd->mode_info_context;
137 const MB_MODE_INFO *const above_mbmi = &mi[-cm->mode_info_stride].mbmi; 128 const MB_MODE_INFO *const above_mbmi = &mi[-cm->mode_info_stride].mbmi;
138 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 129 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
139 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 130 const int left_in_image = xd->left_available && left_mbmi->in_image;
140 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 131 const int above_in_image = xd->up_available && above_mbmi->in_image;
132 const int left_intra = !is_inter_block(left_mbmi);
133 const int above_intra = !is_inter_block(above_mbmi);
134
141 // Note: 135 // Note:
142 // The mode info data structure has a one element border above and to the 136 // The mode info data structure has a one element border above and to the
143 // left of the entries correpsonding to real macroblocks. 137 // left of the entries correpsonding to real macroblocks.
144 // The prediction flags in these dummy entries are initialised to 0. 138 // The prediction flags in these dummy entries are initialised to 0.
145 const int fix_ref_idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref]; 139 const int fix_ref_idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref];
146 const int var_ref_idx = !fix_ref_idx; 140 const int var_ref_idx = !fix_ref_idx;
147 141
148 if (above_in_image && left_in_image) { // both edges available 142 if (above_in_image && left_in_image) { // both edges available
149 if (above_mbmi->ref_frame[0] == INTRA_FRAME && 143 if (above_intra && left_intra) { // intra/intra (2)
150 left_mbmi->ref_frame[0] == INTRA_FRAME) { // intra/intra (2)
151 pred_context = 2; 144 pred_context = 2;
152 } else if (above_mbmi->ref_frame[0] == INTRA_FRAME || 145 } else if (above_intra || left_intra) { // intra/inter
153 left_mbmi->ref_frame[0] == INTRA_FRAME) { // intra/inter 146 const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi;
154 const MB_MODE_INFO *edge_mbmi = above_mbmi->ref_frame[0] == INTRA_FRAME ?
155 left_mbmi : above_mbmi;
156 147
157 if (edge_mbmi->ref_frame[1] <= INTRA_FRAME) // single pred (1/3) 148 if (!has_second_ref(edge_mbmi)) // single pred (1/3)
158 pred_context = 1 + 2 * (edge_mbmi->ref_frame[0] != cm->comp_var_ref[1]); 149 pred_context = 1 + 2 * (edge_mbmi->ref_frame[0] != cm->comp_var_ref[1]);
159 else // comp pred (1/3) 150 else // comp pred (1/3)
160 pred_context = 1 + 2 * (edge_mbmi->ref_frame[var_ref_idx] 151 pred_context = 1 + 2 * (edge_mbmi->ref_frame[var_ref_idx]
161 != cm->comp_var_ref[1]); 152 != cm->comp_var_ref[1]);
162 } else { // inter/inter 153 } else { // inter/inter
163 int l_sg = left_mbmi->ref_frame[1] <= INTRA_FRAME; 154 const int l_sg = !has_second_ref(left_mbmi);
164 int a_sg = above_mbmi->ref_frame[1] <= INTRA_FRAME; 155 const int a_sg = !has_second_ref(above_mbmi);
165 MV_REFERENCE_FRAME vrfa = a_sg ? above_mbmi->ref_frame[0] 156 MV_REFERENCE_FRAME vrfa = a_sg ? above_mbmi->ref_frame[0]
166 : above_mbmi->ref_frame[var_ref_idx]; 157 : above_mbmi->ref_frame[var_ref_idx];
167 MV_REFERENCE_FRAME vrfl = l_sg ? left_mbmi->ref_frame[0] 158 MV_REFERENCE_FRAME vrfl = l_sg ? left_mbmi->ref_frame[0]
168 : left_mbmi->ref_frame[var_ref_idx]; 159 : left_mbmi->ref_frame[var_ref_idx];
169 160
170 if (vrfa == vrfl && cm->comp_var_ref[1] == vrfa) { 161 if (vrfa == vrfl && cm->comp_var_ref[1] == vrfa) {
171 pred_context = 0; 162 pred_context = 0;
172 } else if (l_sg && a_sg) { // single/single 163 } else if (l_sg && a_sg) { // single/single
173 if ((vrfa == cm->comp_fixed_ref && vrfl == cm->comp_var_ref[0]) || 164 if ((vrfa == cm->comp_fixed_ref && vrfl == cm->comp_var_ref[0]) ||
174 (vrfl == cm->comp_fixed_ref && vrfa == cm->comp_var_ref[0])) 165 (vrfl == cm->comp_fixed_ref && vrfa == cm->comp_var_ref[0]))
(...skipping 13 matching lines...) Expand all
188 pred_context = 4; 179 pred_context = 4;
189 } else if (vrfa == vrfl) { // comp/comp 180 } else if (vrfa == vrfl) { // comp/comp
190 pred_context = 4; 181 pred_context = 4;
191 } else { 182 } else {
192 pred_context = 2; 183 pred_context = 2;
193 } 184 }
194 } 185 }
195 } else if (above_in_image || left_in_image) { // one edge available 186 } else if (above_in_image || left_in_image) { // one edge available
196 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; 187 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi;
197 188
198 if (edge_mbmi->ref_frame[0] == INTRA_FRAME) 189 if (!is_inter_block(edge_mbmi)) {
199 pred_context = 2; 190 pred_context = 2;
200 else if (edge_mbmi->ref_frame[1] > INTRA_FRAME) 191 } else {
201 pred_context = 4 * (edge_mbmi->ref_frame[var_ref_idx] 192 if (has_second_ref(edge_mbmi))
193 pred_context = 4 * (edge_mbmi->ref_frame[var_ref_idx]
202 != cm->comp_var_ref[1]); 194 != cm->comp_var_ref[1]);
203 else 195 else
204 pred_context = 3 * (edge_mbmi->ref_frame[0] != cm->comp_var_ref[1]); 196 pred_context = 3 * (edge_mbmi->ref_frame[0] != cm->comp_var_ref[1]);
197 }
205 } else { // no edges available (2) 198 } else { // no edges available (2)
206 pred_context = 2; 199 pred_context = 2;
207 } 200 }
208 assert(pred_context >= 0 && pred_context < REF_CONTEXTS); 201 assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
209 202
210 return pred_context; 203 return pred_context;
211 } 204 }
212 unsigned char vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) { 205 unsigned char vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) {
213 int pred_context; 206 int pred_context;
214 const MODE_INFO *const mi = xd->mode_info_context; 207 const MODE_INFO *const mi = xd->mode_info_context;
215 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi; 208 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi;
216 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 209 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
217 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 210 const int left_in_image = xd->left_available && left_mbmi->in_image;
218 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 211 const int above_in_image = xd->up_available && above_mbmi->in_image;
212 const int left_intra = !is_inter_block(left_mbmi);
213 const int above_intra = !is_inter_block(above_mbmi);
214
219 // Note: 215 // Note:
220 // The mode info data structure has a one element border above and to the 216 // The mode info data structure has a one element border above and to the
221 // left of the entries correpsonding to real macroblocks. 217 // left of the entries correpsonding to real macroblocks.
222 // The prediction flags in these dummy entries are initialised to 0. 218 // The prediction flags in these dummy entries are initialised to 0.
223 if (above_in_image && left_in_image) { // both edges available 219 if (above_in_image && left_in_image) { // both edges available
224 if (above_mbmi->ref_frame[0] == INTRA_FRAME && 220 if (above_intra && left_intra) { // intra/intra
225 left_mbmi->ref_frame[0] == INTRA_FRAME) {
226 pred_context = 2; 221 pred_context = 2;
227 } else if (above_mbmi->ref_frame[0] == INTRA_FRAME || 222 } else if (above_intra || left_intra) { // intra/inter or inter/intra
228 left_mbmi->ref_frame[0] == INTRA_FRAME) { 223 const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi;
229 const MB_MODE_INFO *edge_mbmi = above_mbmi->ref_frame[0] == INTRA_FRAME ? 224 if (!has_second_ref(edge_mbmi))
230 left_mbmi : above_mbmi;
231
232 if (edge_mbmi->ref_frame[1] <= INTRA_FRAME)
233 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME); 225 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME);
234 else 226 else
235 pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME || 227 pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME ||
236 edge_mbmi->ref_frame[1] == LAST_FRAME); 228 edge_mbmi->ref_frame[1] == LAST_FRAME);
237 } else if (above_mbmi->ref_frame[1] <= INTRA_FRAME && 229 } else { // inter/inter
238 left_mbmi->ref_frame[1] <= INTRA_FRAME) { 230 if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi)) {
239 pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) + 231 pred_context = 2 * (above_mbmi->ref_frame[0] == LAST_FRAME) +
240 2 * (left_mbmi->ref_frame[0] == LAST_FRAME); 232 2 * (left_mbmi->ref_frame[0] == LAST_FRAME);
241 } else if (above_mbmi->ref_frame[1] > INTRA_FRAME && 233 } else if (has_second_ref(above_mbmi) && has_second_ref(left_mbmi)) {
242 left_mbmi->ref_frame[1] > INTRA_FRAME) { 234 pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME ||
243 pred_context = 1 + (above_mbmi->ref_frame[0] == LAST_FRAME || 235 above_mbmi->ref_frame[1] == LAST_FRAME ||
244 above_mbmi->ref_frame[1] == LAST_FRAME || 236 left_mbmi->ref_frame[0] == LAST_FRAME ||
245 left_mbmi->ref_frame[0] == LAST_FRAME || 237 left_mbmi->ref_frame[1] == LAST_FRAME);
246 left_mbmi->ref_frame[1] == LAST_FRAME); 238 } else {
247 } else { 239 const MV_REFERENCE_FRAME rfs = !has_second_ref(above_mbmi) ?
248 MV_REFERENCE_FRAME rfs = above_mbmi->ref_frame[1] <= INTRA_FRAME ? 240 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
249 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0]; 241 const MV_REFERENCE_FRAME crf1 = has_second_ref(above_mbmi) ?
250 MV_REFERENCE_FRAME crf1 = above_mbmi->ref_frame[1] > INTRA_FRAME ? 242 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
251 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0]; 243 const MV_REFERENCE_FRAME crf2 = has_second_ref(above_mbmi) ?
252 MV_REFERENCE_FRAME crf2 = above_mbmi->ref_frame[1] > INTRA_FRAME ? 244 above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1];
253 above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1];
254 245
255 if (rfs == LAST_FRAME) 246 if (rfs == LAST_FRAME)
256 pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME); 247 pred_context = 3 + (crf1 == LAST_FRAME || crf2 == LAST_FRAME);
257 else 248 else
258 pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME; 249 pred_context = crf1 == LAST_FRAME || crf2 == LAST_FRAME;
250 }
259 } 251 }
260 } else if (above_in_image || left_in_image) { // one edge available 252 } else if (above_in_image || left_in_image) { // one edge available
261 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; 253 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi;
262 254 if (!is_inter_block(edge_mbmi)) { // intra
263 if (edge_mbmi->ref_frame[0] == INTRA_FRAME)
264 pred_context = 2; 255 pred_context = 2;
265 else if (edge_mbmi->ref_frame[1] <= INTRA_FRAME) 256 } else { // inter
266 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME); 257 if (!has_second_ref(edge_mbmi))
267 else 258 pred_context = 4 * (edge_mbmi->ref_frame[0] == LAST_FRAME);
268 pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME || 259 else
269 edge_mbmi->ref_frame[1] == LAST_FRAME); 260 pred_context = 1 + (edge_mbmi->ref_frame[0] == LAST_FRAME ||
270 } else { // no edges available (2) 261 edge_mbmi->ref_frame[1] == LAST_FRAME);
262 }
263 } else { // no edges available
271 pred_context = 2; 264 pred_context = 2;
272 } 265 }
266
273 assert(pred_context >= 0 && pred_context < REF_CONTEXTS); 267 assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
274 return pred_context; 268 return pred_context;
275 } 269 }
276 270
277 unsigned char vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd) { 271 unsigned char vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd) {
278 int pred_context; 272 int pred_context;
279 const MODE_INFO *const mi = xd->mode_info_context; 273 const MODE_INFO *const mi = xd->mode_info_context;
280 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi; 274 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi;
281 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 275 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
282 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 276 const int left_in_image = xd->left_available && left_mbmi->in_image;
283 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 277 const int above_in_image = xd->up_available && above_mbmi->in_image;
278 const int left_intra = !is_inter_block(left_mbmi);
279 const int above_intra = !is_inter_block(above_mbmi);
284 280
285 // Note: 281 // Note:
286 // The mode info data structure has a one element border above and to the 282 // The mode info data structure has a one element border above and to the
287 // left of the entries correpsonding to real macroblocks. 283 // left of the entries correpsonding to real macroblocks.
288 // The prediction flags in these dummy entries are initialised to 0. 284 // The prediction flags in these dummy entries are initialised to 0.
289 if (above_in_image && left_in_image) { // both edges available 285 if (above_in_image && left_in_image) { // both edges available
290 if (above_mbmi->ref_frame[0] == INTRA_FRAME && 286 if (above_intra && left_intra) { // intra/intra
291 left_mbmi->ref_frame[0] == INTRA_FRAME) {
292 pred_context = 2; 287 pred_context = 2;
293 } else if (above_mbmi->ref_frame[0] == INTRA_FRAME || 288 } else if (above_intra || left_intra) { // intra/inter or inter/intra
294 left_mbmi->ref_frame[0] == INTRA_FRAME) { 289 const MB_MODE_INFO *edge_mbmi = above_intra ? left_mbmi : above_mbmi;
295 const MB_MODE_INFO *edge_mbmi = above_mbmi->ref_frame[0] == INTRA_FRAME ? 290 if (!has_second_ref(edge_mbmi)) {
296 left_mbmi : above_mbmi;
297
298 if (edge_mbmi->ref_frame[1] <= INTRA_FRAME) {
299 if (edge_mbmi->ref_frame[0] == LAST_FRAME) 291 if (edge_mbmi->ref_frame[0] == LAST_FRAME)
300 pred_context = 3; 292 pred_context = 3;
301 else 293 else
302 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME); 294 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME);
303 } else { 295 } else {
304 pred_context = 1 + 2 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME || 296 pred_context = 1 + 2 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME ||
305 edge_mbmi->ref_frame[1] == GOLDEN_FRAME); 297 edge_mbmi->ref_frame[1] == GOLDEN_FRAME);
306 } 298 }
307 } else if (above_mbmi->ref_frame[1] <= INTRA_FRAME && 299 } else { // inter/inter
308 left_mbmi->ref_frame[1] <= INTRA_FRAME) { 300 if (!has_second_ref(above_mbmi) && !has_second_ref(left_mbmi)) {
309 if (above_mbmi->ref_frame[0] == LAST_FRAME && 301 if (above_mbmi->ref_frame[0] == LAST_FRAME &&
310 left_mbmi->ref_frame[0] == LAST_FRAME) { 302 left_mbmi->ref_frame[0] == LAST_FRAME) {
311 pred_context = 3; 303 pred_context = 3;
312 } else if (above_mbmi->ref_frame[0] == LAST_FRAME || 304 } else if (above_mbmi->ref_frame[0] == LAST_FRAME ||
313 left_mbmi->ref_frame[0] == LAST_FRAME) { 305 left_mbmi->ref_frame[0] == LAST_FRAME) {
314 const MB_MODE_INFO *edge_mbmi = above_mbmi->ref_frame[0] == LAST_FRAME ? 306 const MB_MODE_INFO *edge_mbmi =
315 left_mbmi : above_mbmi; 307 above_mbmi->ref_frame[0] == LAST_FRAME ? left_mbmi : above_mbmi;
316 308
317 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME); 309 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME);
310 } else {
311 pred_context = 2 * (above_mbmi->ref_frame[0] == GOLDEN_FRAME) +
312 2 * (left_mbmi->ref_frame[0] == GOLDEN_FRAME);
313 }
314 } else if (has_second_ref(above_mbmi) && has_second_ref(left_mbmi)) {
315 if (above_mbmi->ref_frame[0] == left_mbmi->ref_frame[0] &&
316 above_mbmi->ref_frame[1] == left_mbmi->ref_frame[1])
317 pred_context = 3 * (above_mbmi->ref_frame[0] == GOLDEN_FRAME ||
318 above_mbmi->ref_frame[1] == GOLDEN_FRAME ||
319 left_mbmi->ref_frame[0] == GOLDEN_FRAME ||
320 left_mbmi->ref_frame[1] == GOLDEN_FRAME);
321 else
322 pred_context = 2;
318 } else { 323 } else {
319 pred_context = 2 * (above_mbmi->ref_frame[0] == GOLDEN_FRAME) + 324 const MV_REFERENCE_FRAME rfs = !has_second_ref(above_mbmi) ?
320 2 * (left_mbmi->ref_frame[0] == GOLDEN_FRAME); 325 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
326 const MV_REFERENCE_FRAME crf1 = has_second_ref(above_mbmi) ?
327 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
328 const MV_REFERENCE_FRAME crf2 = has_second_ref(above_mbmi) ?
329 above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1];
330
331 if (rfs == GOLDEN_FRAME)
332 pred_context = 3 + (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
333 else if (rfs == ALTREF_FRAME)
334 pred_context = crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME;
335 else
336 pred_context = 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
321 } 337 }
322 } else if (above_mbmi->ref_frame[1] > INTRA_FRAME &&
323 left_mbmi->ref_frame[1] > INTRA_FRAME) {
324 if (above_mbmi->ref_frame[0] == left_mbmi->ref_frame[0] &&
325 above_mbmi->ref_frame[1] == left_mbmi->ref_frame[1])
326 pred_context = 3 * (above_mbmi->ref_frame[0] == GOLDEN_FRAME ||
327 above_mbmi->ref_frame[1] == GOLDEN_FRAME ||
328 left_mbmi->ref_frame[0] == GOLDEN_FRAME ||
329 left_mbmi->ref_frame[1] == GOLDEN_FRAME);
330 else
331 pred_context = 2;
332 } else {
333 MV_REFERENCE_FRAME rfs = above_mbmi->ref_frame[1] <= INTRA_FRAME ?
334 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
335 MV_REFERENCE_FRAME crf1 = above_mbmi->ref_frame[1] > INTRA_FRAME ?
336 above_mbmi->ref_frame[0] : left_mbmi->ref_frame[0];
337 MV_REFERENCE_FRAME crf2 = above_mbmi->ref_frame[1] > INTRA_FRAME ?
338 above_mbmi->ref_frame[1] : left_mbmi->ref_frame[1];
339
340 if (rfs == GOLDEN_FRAME)
341 pred_context = 3 + (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
342 else if (rfs == ALTREF_FRAME)
343 pred_context = crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME;
344 else
345 pred_context = 1 + 2 * (crf1 == GOLDEN_FRAME || crf2 == GOLDEN_FRAME);
346 } 338 }
347 } else if (above_in_image || left_in_image) { // one edge available 339 } else if (above_in_image || left_in_image) { // one edge available
348 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi; 340 const MB_MODE_INFO *edge_mbmi = above_in_image ? above_mbmi : left_mbmi;
349 341
350 if (edge_mbmi->ref_frame[0] == INTRA_FRAME || 342 if (!is_inter_block(edge_mbmi) ||
351 (edge_mbmi->ref_frame[0] == LAST_FRAME && 343 (edge_mbmi->ref_frame[0] == LAST_FRAME && !has_second_ref(edge_mbmi)))
352 edge_mbmi->ref_frame[1] <= INTRA_FRAME))
353 pred_context = 2; 344 pred_context = 2;
354 else if (edge_mbmi->ref_frame[1] <= INTRA_FRAME) 345 else if (!has_second_ref(edge_mbmi))
355 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME); 346 pred_context = 4 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME);
356 else 347 else
357 pred_context = 3 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME || 348 pred_context = 3 * (edge_mbmi->ref_frame[0] == GOLDEN_FRAME ||
358 edge_mbmi->ref_frame[1] == GOLDEN_FRAME); 349 edge_mbmi->ref_frame[1] == GOLDEN_FRAME);
359 } else { // no edges available (2) 350 } else { // no edges available (2)
360 pred_context = 2; 351 pred_context = 2;
361 } 352 }
362 assert(pred_context >= 0 && pred_context < REF_CONTEXTS); 353 assert(pred_context >= 0 && pred_context < REF_CONTEXTS);
363 return pred_context; 354 return pred_context;
364 } 355 }
365 // Returns a context number for the given MB prediction signal 356 // Returns a context number for the given MB prediction signal
366 // The mode info data structure has a one element border above and to the 357 // The mode info data structure has a one element border above and to the
367 // left of the entries corresponding to real blocks. 358 // left of the entries corresponding to real blocks.
368 // The prediction flags in these dummy entries are initialized to 0. 359 // The prediction flags in these dummy entries are initialized to 0.
369 unsigned char vp9_get_pred_context_tx_size(const MACROBLOCKD *xd) { 360 unsigned char vp9_get_pred_context_tx_size(const MACROBLOCKD *xd) {
370 const MODE_INFO *const mi = xd->mode_info_context; 361 const MODE_INFO *const mi = xd->mode_info_context;
371 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi; 362 const MB_MODE_INFO *const above_mbmi = &mi[-xd->mode_info_stride].mbmi;
372 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi; 363 const MB_MODE_INFO *const left_mbmi = &mi[-1].mbmi;
373 const int left_in_image = xd->left_available && left_mbmi->mb_in_image; 364 const int left_in_image = xd->left_available && left_mbmi->in_image;
374 const int above_in_image = xd->up_available && above_mbmi->mb_in_image; 365 const int above_in_image = xd->up_available && above_mbmi->in_image;
375 const int max_tx_size = max_txsize_lookup[mi->mbmi.sb_type]; 366 const int max_tx_size = max_txsize_lookup[mi->mbmi.sb_type];
376 int above_context = max_tx_size; 367 int above_context = max_tx_size;
377 int left_context = max_tx_size; 368 int left_context = max_tx_size;
378 369
379 if (above_in_image) 370 if (above_in_image)
380 above_context = above_mbmi->mb_skip_coeff ? max_tx_size 371 above_context = above_mbmi->skip_coeff ? max_tx_size
381 : above_mbmi->txfm_size; 372 : above_mbmi->txfm_size;
382 373
383 if (left_in_image) 374 if (left_in_image)
384 left_context = left_mbmi->mb_skip_coeff ? max_tx_size 375 left_context = left_mbmi->skip_coeff ? max_tx_size
385 : left_mbmi->txfm_size; 376 : left_mbmi->txfm_size;
386 377
387 if (!left_in_image) 378 if (!left_in_image)
388 left_context = above_context; 379 left_context = above_context;
389 380
390 if (!above_in_image) 381 if (!above_in_image)
391 above_context = left_context; 382 above_context = left_context;
392 383
393 return above_context + left_context > max_tx_size; 384 return above_context + left_context > max_tx_size;
394 } 385 }
395 386
396 void vp9_set_pred_flag_seg_id(VP9_COMMON *cm, BLOCK_SIZE_TYPE bsize, 387 void vp9_set_pred_flag_seg_id(VP9_COMMON *cm, BLOCK_SIZE bsize,
397 int mi_row, int mi_col, uint8_t pred_flag) { 388 int mi_row, int mi_col, uint8_t pred_flag) {
398 MODE_INFO *mi = &cm->mi[mi_row * cm->mode_info_stride + mi_col]; 389 MODE_INFO *mi = &cm->mi[mi_row * cm->mode_info_stride + mi_col];
399 const int bw = 1 << mi_width_log2(bsize); 390 const int bw = 1 << mi_width_log2(bsize);
400 const int bh = 1 << mi_height_log2(bsize); 391 const int bh = 1 << mi_height_log2(bsize);
401 const int xmis = MIN(cm->mi_cols - mi_col, bw); 392 const int xmis = MIN(cm->mi_cols - mi_col, bw);
402 const int ymis = MIN(cm->mi_rows - mi_row, bh); 393 const int ymis = MIN(cm->mi_rows - mi_row, bh);
403 int x, y; 394 int x, y;
404 395
405 for (y = 0; y < ymis; y++) 396 for (y = 0; y < ymis; y++)
406 for (x = 0; x < xmis; x++) 397 for (x = 0; x < xmis; x++)
407 mi[y * cm->mode_info_stride + x].mbmi.seg_id_predicted = pred_flag; 398 mi[y * cm->mode_info_stride + x].mbmi.seg_id_predicted = pred_flag;
408 } 399 }
409 400
410 void vp9_set_pred_flag_mbskip(VP9_COMMON *cm, BLOCK_SIZE_TYPE bsize, 401 void vp9_set_pred_flag_mbskip(VP9_COMMON *cm, BLOCK_SIZE bsize,
411 int mi_row, int mi_col, uint8_t pred_flag) { 402 int mi_row, int mi_col, uint8_t pred_flag) {
412 MODE_INFO *mi = &cm->mi[mi_row * cm->mode_info_stride + mi_col]; 403 MODE_INFO *mi = &cm->mi[mi_row * cm->mode_info_stride + mi_col];
413 const int bw = 1 << mi_width_log2(bsize); 404 const int bw = 1 << mi_width_log2(bsize);
414 const int bh = 1 << mi_height_log2(bsize); 405 const int bh = 1 << mi_height_log2(bsize);
415 const int xmis = MIN(cm->mi_cols - mi_col, bw); 406 const int xmis = MIN(cm->mi_cols - mi_col, bw);
416 const int ymis = MIN(cm->mi_rows - mi_row, bh); 407 const int ymis = MIN(cm->mi_rows - mi_row, bh);
417 int x, y; 408 int x, y;
418 409
419 for (y = 0; y < ymis; y++) 410 for (y = 0; y < ymis; y++)
420 for (x = 0; x < xmis; x++) 411 for (x = 0; x < xmis; x++)
421 mi[y * cm->mode_info_stride + x].mbmi.mb_skip_coeff = pred_flag; 412 mi[y * cm->mode_info_stride + x].mbmi.skip_coeff = pred_flag;
422 } 413 }
423 414
424 int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids, 415 int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids,
425 BLOCK_SIZE_TYPE bsize, int mi_row, int mi_col) { 416 BLOCK_SIZE bsize, int mi_row, int mi_col) {
426 const int mi_offset = mi_row * cm->mi_cols + mi_col; 417 const int mi_offset = mi_row * cm->mi_cols + mi_col;
427 const int bw = 1 << mi_width_log2(bsize); 418 const int bw = 1 << mi_width_log2(bsize);
428 const int bh = 1 << mi_height_log2(bsize); 419 const int bh = 1 << mi_height_log2(bsize);
429 const int xmis = MIN(cm->mi_cols - mi_col, bw); 420 const int xmis = MIN(cm->mi_cols - mi_col, bw);
430 const int ymis = MIN(cm->mi_rows - mi_row, bh); 421 const int ymis = MIN(cm->mi_rows - mi_row, bh);
431 int x, y, segment_id = INT_MAX; 422 int x, y, segment_id = INT_MAX;
432 423
433 for (y = 0; y < ymis; y++) 424 for (y = 0; y < ymis; y++)
434 for (x = 0; x < xmis; x++) 425 for (x = 0; x < xmis; x++)
435 segment_id = MIN(segment_id, 426 segment_id = MIN(segment_id,
436 segment_ids[mi_offset + y * cm->mi_cols + x]); 427 segment_ids[mi_offset + y * cm->mi_cols + x]);
437 428
438 assert(segment_id >= 0 && segment_id < MAX_SEGMENTS); 429 assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
439 return segment_id; 430 return segment_id;
440 } 431 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/common/vp9_pred_common.h ('k') | source/libvpx/vp9/common/vp9_quant_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698