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

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

Issue 54923004: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 1 month 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_temporal_filter.c ('k') | source/libvpx/vp9/encoder/vp9_vaq.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 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 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
(...skipping 11 matching lines...) Expand all
22 #include "vp9/common/vp9_entropy.h" 22 #include "vp9/common/vp9_entropy.h"
23 23
24 /* Global event counters used for accumulating statistics across several 24 /* Global event counters used for accumulating statistics across several
25 compressions, then generating vp9_context.c = initial stats. */ 25 compressions, then generating vp9_context.c = initial stats. */
26 26
27 #ifdef ENTROPY_STATS 27 #ifdef ENTROPY_STATS
28 vp9_coeff_accum context_counters[TX_SIZES][BLOCK_TYPES]; 28 vp9_coeff_accum context_counters[TX_SIZES][BLOCK_TYPES];
29 extern vp9_coeff_stats tree_update_hist[TX_SIZES][BLOCK_TYPES]; 29 extern vp9_coeff_stats tree_update_hist[TX_SIZES][BLOCK_TYPES];
30 #endif /* ENTROPY_STATS */ 30 #endif /* ENTROPY_STATS */
31 31
32 DECLARE_ALIGNED(16, extern const uint8_t,
33 vp9_pt_energy_class[MAX_ENTROPY_TOKENS]);
34
35 static TOKENVALUE dct_value_tokens[DCT_MAX_VALUE * 2]; 32 static TOKENVALUE dct_value_tokens[DCT_MAX_VALUE * 2];
36 const TOKENVALUE *vp9_dct_value_tokens_ptr; 33 const TOKENVALUE *vp9_dct_value_tokens_ptr;
37 static int dct_value_cost[DCT_MAX_VALUE * 2]; 34 static int dct_value_cost[DCT_MAX_VALUE * 2];
38 const int *vp9_dct_value_cost_ptr; 35 const int *vp9_dct_value_cost_ptr;
39 36
40 static void fill_value_tokens() { 37 static void fill_value_tokens() {
41
42 TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE; 38 TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE;
43 const vp9_extra_bit *const e = vp9_extra_bits; 39 const vp9_extra_bit *const e = vp9_extra_bits;
44 40
45 int i = -DCT_MAX_VALUE; 41 int i = -DCT_MAX_VALUE;
46 int sign = 1; 42 int sign = 1;
47 43
48 do { 44 do {
49 if (!i) 45 if (!i)
50 sign = 0; 46 sign = 0;
51 47
52 { 48 {
53 const int a = sign ? -i : i; 49 const int a = sign ? -i : i;
54 int eb = sign; 50 int eb = sign;
55 51
56 if (a > 4) { 52 if (a > 4) {
57 int j = 4; 53 int j = 4;
58 54
59 while (++j < 11 && e[j].base_val <= a) {} 55 while (++j < 11 && e[j].base_val <= a) {}
60 56
61 t[i].token = --j; 57 t[i].token = --j;
62 eb |= (a - e[j].base_val) << 1; 58 eb |= (a - e[j].base_val) << 1;
63 } else 59 } else {
64 t[i].token = a; 60 t[i].token = a;
65 61 }
66 t[i].extra = eb; 62 t[i].extra = eb;
67 } 63 }
68 64
69 // initialize the cost for extra bits for all possible coefficient value. 65 // initialize the cost for extra bits for all possible coefficient value.
70 { 66 {
71 int cost = 0; 67 int cost = 0;
72 const vp9_extra_bit *p = vp9_extra_bits + t[i].token; 68 const vp9_extra_bit *p = vp9_extra_bits + t[i].token;
73 69
74 if (p->base_val) { 70 if (p->base_val) {
75 const int extra = t[i].extra; 71 const int extra = t[i].extra;
76 const int length = p->len; 72 const int length = p->len;
77 73
78 if (length) 74 if (length)
79 cost += treed_cost(p->tree, p->prob, extra >> 1, length); 75 cost += treed_cost(p->tree, p->prob, extra >> 1, length);
80 76
81 cost += vp9_cost_bit(vp9_prob_half, extra & 1); /* sign */ 77 cost += vp9_cost_bit(vp9_prob_half, extra & 1); /* sign */
82 dct_value_cost[i + DCT_MAX_VALUE] = cost; 78 dct_value_cost[i + DCT_MAX_VALUE] = cost;
83 } 79 }
84
85 } 80 }
86
87 } while (++i < DCT_MAX_VALUE); 81 } while (++i < DCT_MAX_VALUE);
88 82
89 vp9_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE; 83 vp9_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
90 vp9_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; 84 vp9_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE;
91 } 85 }
92 86
93 struct tokenize_b_args { 87 struct tokenize_b_args {
94 VP9_COMP *cpi; 88 VP9_COMP *cpi;
95 MACROBLOCKD *xd; 89 MACROBLOCKD *xd;
96 TOKENEXTRA **tp; 90 TOKENEXTRA **tp;
(...skipping 10 matching lines...) Expand all
107 set_contexts(xd, pd, plane_bsize, tx_size, pd->eobs[block] > 0, aoff, loff); 101 set_contexts(xd, pd, plane_bsize, tx_size, pd->eobs[block] > 0, aoff, loff);
108 } 102 }
109 103
110 static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, 104 static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize,
111 TX_SIZE tx_size, void *arg) { 105 TX_SIZE tx_size, void *arg) {
112 struct tokenize_b_args* const args = arg; 106 struct tokenize_b_args* const args = arg;
113 VP9_COMP *cpi = args->cpi; 107 VP9_COMP *cpi = args->cpi;
114 MACROBLOCKD *xd = args->xd; 108 MACROBLOCKD *xd = args->xd;
115 TOKENEXTRA **tp = args->tp; 109 TOKENEXTRA **tp = args->tp;
116 struct macroblockd_plane *pd = &xd->plane[plane]; 110 struct macroblockd_plane *pd = &xd->plane[plane];
117 MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; 111 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
118 int pt; /* near block/prev token context index */ 112 int pt; /* near block/prev token context index */
119 int c = 0, rc = 0; 113 int c = 0, rc = 0;
120 TOKENEXTRA *t = *tp; /* store tokens starting here */ 114 TOKENEXTRA *t = *tp; /* store tokens starting here */
121 const int eob = pd->eobs[block]; 115 const int eob = pd->eobs[block];
122 const PLANE_TYPE type = pd->plane_type; 116 const PLANE_TYPE type = pd->plane_type;
123 const int16_t *qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block); 117 const int16_t *qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block);
124 118
125 const int segment_id = mbmi->segment_id; 119 const int segment_id = mbmi->segment_id;
126 const int16_t *scan, *nb; 120 const int16_t *scan, *nb;
127 vp9_coeff_count *const counts = cpi->coef_counts[tx_size]; 121 vp9_coeff_count *const counts = cpi->coef_counts[tx_size];
128 vp9_coeff_probs_model *const coef_probs = cpi->common.fc.coef_probs[tx_size]; 122 vp9_coeff_probs_model *const coef_probs = cpi->common.fc.coef_probs[tx_size];
129 const int ref = is_inter_block(mbmi); 123 const int ref = is_inter_block(mbmi);
130 uint8_t token_cache[1024]; 124 uint8_t token_cache[1024];
131 const uint8_t *band_translate; 125 const uint8_t *const band_translate = get_band_translate(tx_size);
132 ENTROPY_CONTEXT *A, *L;
133 const int seg_eob = get_tx_eob(&cpi->common.seg, segment_id, tx_size); 126 const int seg_eob = get_tx_eob(&cpi->common.seg, segment_id, tx_size);
134 int aoff, loff; 127 int aoff, loff;
135 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff); 128 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &aoff, &loff);
136 129
137 A = pd->above_context + aoff;
138 L = pd->left_context + loff;
139
140 assert((!type && !plane) || (type && plane)); 130 assert((!type && !plane) || (type && plane));
141 131
142 pt = get_entropy_context(xd, tx_size, type, block, A, L, 132 pt = get_entropy_context(tx_size, pd->above_context + aoff,
143 &scan, &band_translate); 133 pd->left_context + loff);
144 nb = vp9_get_coef_neighbors_handle(scan); 134 get_scan(xd, tx_size, type, block, &scan, &nb);
145 c = 0; 135 c = 0;
146 do { 136 do {
147 const int band = get_coef_band(band_translate, c); 137 const int band = get_coef_band(band_translate, c);
148 int token; 138 int token;
149 int v = 0; 139 int v = 0;
150 rc = scan[c]; 140 rc = scan[c];
151 if (c) 141 if (c)
152 pt = get_coef_context(nb, token_cache, c); 142 pt = get_coef_context(nb, token_cache, c);
153 if (c < eob) { 143 if (c < eob) {
154 v = qcoeff_ptr[rc]; 144 v = qcoeff_ptr[rc];
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 int result = 1; 193 int result = 1;
204 struct is_skippable_args args = {xd, &result}; 194 struct is_skippable_args args = {xd, &result};
205 foreach_transformed_block_in_plane(xd, bsize, plane, is_skippable, &args); 195 foreach_transformed_block_in_plane(xd, bsize, plane, is_skippable, &args);
206 return result; 196 return result;
207 } 197 }
208 198
209 void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run, 199 void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run,
210 BLOCK_SIZE bsize) { 200 BLOCK_SIZE bsize) {
211 VP9_COMMON *const cm = &cpi->common; 201 VP9_COMMON *const cm = &cpi->common;
212 MACROBLOCKD *const xd = &cpi->mb.e_mbd; 202 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
213 MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; 203 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
214 TOKENEXTRA *t_backup = *t; 204 TOKENEXTRA *t_backup = *t;
215 const int mb_skip_context = vp9_get_pred_context_mbskip(xd); 205 const int mb_skip_context = vp9_get_pred_context_mbskip(xd);
216 const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id, 206 const int skip_inc = !vp9_segfeature_active(&cm->seg, mbmi->segment_id,
217 SEG_LVL_SKIP); 207 SEG_LVL_SKIP);
218 struct tokenize_b_args arg = {cpi, xd, t, mbmi->tx_size}; 208 struct tokenize_b_args arg = {cpi, xd, t, mbmi->tx_size};
219 209
220 mbmi->skip_coeff = vp9_sb_is_skippable(xd, bsize); 210 mbmi->skip_coeff = vp9_sb_is_skippable(xd, bsize);
221 if (mbmi->skip_coeff) { 211 if (mbmi->skip_coeff) {
222 if (!dry_run) 212 if (!dry_run)
223 cm->counts.mbskip[mb_skip_context][1] += skip_inc; 213 cm->counts.mbskip[mb_skip_context][1] += skip_inc;
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 365
376 f = fopen("context.bin", "wb"); 366 f = fopen("context.bin", "wb");
377 fwrite(context_counters, sizeof(context_counters), 1, f); 367 fwrite(context_counters, sizeof(context_counters), 1, f);
378 fclose(f); 368 fclose(f);
379 } 369 }
380 #endif 370 #endif
381 371
382 void vp9_tokenize_initialize() { 372 void vp9_tokenize_initialize() {
383 fill_value_tokens(); 373 fill_value_tokens();
384 } 374 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_temporal_filter.c ('k') | source/libvpx/vp9/encoder/vp9_vaq.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698