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

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

Issue 11974002: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 11 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_encodemb.h ('k') | source/libvpx/vp9/encoder/vp9_encodemv.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
11 #include "vpx_ports/config.h" 11 #include "./vpx_config.h"
12 #include "vp9/encoder/vp9_encodemb.h" 12 #include "vp9/encoder/vp9_encodemb.h"
13 #include "vp9/common/vp9_reconinter.h" 13 #include "vp9/common/vp9_reconinter.h"
14 #include "vp9/encoder/vp9_quantize.h" 14 #include "vp9/encoder/vp9_quantize.h"
15 #include "vp9/encoder/vp9_tokenize.h" 15 #include "vp9/encoder/vp9_tokenize.h"
16 #include "vp9/common/vp9_invtrans.h" 16 #include "vp9/common/vp9_invtrans.h"
17 #include "vp9/common/vp9_reconintra.h" 17 #include "vp9/common/vp9_reconintra.h"
18 #include "vpx_mem/vpx_mem.h" 18 #include "vpx_mem/vpx_mem.h"
19 #include "vp9/encoder/vp9_rdopt.h" 19 #include "vp9/encoder/vp9_rdopt.h"
20 #include "vp9/common/vp9_systemdependent.h" 20 #include "vp9/common/vp9_systemdependent.h"
21 #include "vp9_rtcd.h" 21 #include "vp9_rtcd.h"
22 22
23 void vp9_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch) { 23 void vp9_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch) {
24 unsigned char *src_ptr = (*(be->base_src) + be->src); 24 uint8_t *src_ptr = (*(be->base_src) + be->src);
25 short *diff_ptr = be->src_diff; 25 int16_t *diff_ptr = be->src_diff;
26 unsigned char *pred_ptr = bd->predictor; 26 uint8_t *pred_ptr = bd->predictor;
27 int src_stride = be->src_stride; 27 int src_stride = be->src_stride;
28 28
29 int r, c; 29 int r, c;
30 30
31 for (r = 0; r < 4; r++) { 31 for (r = 0; r < 4; r++) {
32 for (c = 0; c < 4; c++) { 32 for (c = 0; c < 4; c++) {
33 diff_ptr[c] = src_ptr[c] - pred_ptr[c]; 33 diff_ptr[c] = src_ptr[c] - pred_ptr[c];
34 } 34 }
35 35
36 diff_ptr += pitch; 36 diff_ptr += pitch;
37 pred_ptr += pitch; 37 pred_ptr += pitch;
38 src_ptr += src_stride; 38 src_ptr += src_stride;
39 } 39 }
40 } 40 }
41 41
42 void vp9_subtract_4b_c(BLOCK *be, BLOCKD *bd, int pitch) { 42 void vp9_subtract_4b_c(BLOCK *be, BLOCKD *bd, int pitch) {
43 unsigned char *src_ptr = (*(be->base_src) + be->src); 43 uint8_t *src_ptr = (*(be->base_src) + be->src);
44 short *diff_ptr = be->src_diff; 44 int16_t *diff_ptr = be->src_diff;
45 unsigned char *pred_ptr = bd->predictor; 45 uint8_t *pred_ptr = bd->predictor;
46 int src_stride = be->src_stride; 46 int src_stride = be->src_stride;
47 int r, c; 47 int r, c;
48 48
49 for (r = 0; r < 8; r++) { 49 for (r = 0; r < 8; r++) {
50 for (c = 0; c < 8; c++) { 50 for (c = 0; c < 8; c++) {
51 diff_ptr[c] = src_ptr[c] - pred_ptr[c]; 51 diff_ptr[c] = src_ptr[c] - pred_ptr[c];
52 } 52 }
53 diff_ptr += pitch; 53 diff_ptr += pitch;
54 pred_ptr += pitch; 54 pred_ptr += pitch;
55 src_ptr += src_stride; 55 src_ptr += src_stride;
56 } 56 }
57 } 57 }
58 58
59 void vp9_subtract_mbuv_s_c(short *diff, const unsigned char *usrc, 59 void vp9_subtract_mbuv_s_c(int16_t *diff, const uint8_t *usrc,
60 const unsigned char *vsrc, int src_stride, 60 const uint8_t *vsrc, int src_stride,
61 const unsigned char *upred, 61 const uint8_t *upred,
62 const unsigned char *vpred, int dst_stride) { 62 const uint8_t *vpred, int dst_stride) {
63 short *udiff = diff + 256; 63 int16_t *udiff = diff + 256;
64 short *vdiff = diff + 320; 64 int16_t *vdiff = diff + 320;
65 int r, c; 65 int r, c;
66 66
67 for (r = 0; r < 8; r++) { 67 for (r = 0; r < 8; r++) {
68 for (c = 0; c < 8; c++) { 68 for (c = 0; c < 8; c++) {
69 udiff[c] = usrc[c] - upred[c]; 69 udiff[c] = usrc[c] - upred[c];
70 } 70 }
71 71
72 udiff += 8; 72 udiff += 8;
73 upred += dst_stride; 73 upred += dst_stride;
74 usrc += src_stride; 74 usrc += src_stride;
75 } 75 }
76 76
77 for (r = 0; r < 8; r++) { 77 for (r = 0; r < 8; r++) {
78 for (c = 0; c < 8; c++) { 78 for (c = 0; c < 8; c++) {
79 vdiff[c] = vsrc[c] - vpred[c]; 79 vdiff[c] = vsrc[c] - vpred[c];
80 } 80 }
81 81
82 vdiff += 8; 82 vdiff += 8;
83 vpred += dst_stride; 83 vpred += dst_stride;
84 vsrc += src_stride; 84 vsrc += src_stride;
85 } 85 }
86 } 86 }
87 87
88 void vp9_subtract_mbuv_c(short *diff, unsigned char *usrc, 88 void vp9_subtract_mbuv_c(int16_t *diff, uint8_t *usrc,
89 unsigned char *vsrc, unsigned char *pred, int stride) { 89 uint8_t *vsrc, uint8_t *pred, int stride) {
90 unsigned char *upred = pred + 256; 90 uint8_t *upred = pred + 256;
91 unsigned char *vpred = pred + 320; 91 uint8_t *vpred = pred + 320;
92 92
93 vp9_subtract_mbuv_s_c(diff, usrc, vsrc, stride, upred, vpred, 8); 93 vp9_subtract_mbuv_s_c(diff, usrc, vsrc, stride, upred, vpred, 8);
94 } 94 }
95 95
96 void vp9_subtract_mby_s_c(short *diff, const unsigned char *src, int src_stride, 96 void vp9_subtract_mby_s_c(int16_t *diff, const uint8_t *src, int src_stride,
97 const unsigned char *pred, int dst_stride) { 97 const uint8_t *pred, int dst_stride) {
98 int r, c; 98 int r, c;
99 99
100 for (r = 0; r < 16; r++) { 100 for (r = 0; r < 16; r++) {
101 for (c = 0; c < 16; c++) { 101 for (c = 0; c < 16; c++) {
102 diff[c] = src[c] - pred[c]; 102 diff[c] = src[c] - pred[c];
103 } 103 }
104 104
105 diff += 16; 105 diff += 16;
106 pred += dst_stride; 106 pred += dst_stride;
107 src += src_stride; 107 src += src_stride;
108 } 108 }
109 } 109 }
110 110
111 void vp9_subtract_mby_c(short *diff, unsigned char *src, 111 void vp9_subtract_sby_s_c(int16_t *diff, const uint8_t *src, int src_stride,
112 unsigned char *pred, int stride) { 112 const uint8_t *pred, int dst_stride) {
113 int r, c;
114
115 for (r = 0; r < 32; r++) {
116 for (c = 0; c < 32; c++) {
117 diff[c] = src[c] - pred[c];
118 }
119
120 diff += 32;
121 pred += dst_stride;
122 src += src_stride;
123 }
124 }
125
126 void vp9_subtract_sbuv_s_c(int16_t *diff, const uint8_t *usrc,
127 const uint8_t *vsrc, int src_stride,
128 const uint8_t *upred,
129 const uint8_t *vpred, int dst_stride) {
130 int16_t *udiff = diff + 1024;
131 int16_t *vdiff = diff + 1024 + 256;
132 int r, c;
133
134 for (r = 0; r < 16; r++) {
135 for (c = 0; c < 16; c++) {
136 udiff[c] = usrc[c] - upred[c];
137 }
138
139 udiff += 16;
140 upred += dst_stride;
141 usrc += src_stride;
142 }
143
144 for (r = 0; r < 16; r++) {
145 for (c = 0; c < 16; c++) {
146 vdiff[c] = vsrc[c] - vpred[c];
147 }
148
149 vdiff += 16;
150 vpred += dst_stride;
151 vsrc += src_stride;
152 }
153 }
154
155 void vp9_subtract_mby_c(int16_t *diff, uint8_t *src,
156 uint8_t *pred, int stride) {
113 vp9_subtract_mby_s_c(diff, src, stride, pred, 16); 157 vp9_subtract_mby_s_c(diff, src, stride, pred, 16);
114 } 158 }
115 159
116 static void subtract_mb(MACROBLOCK *x) { 160 static void subtract_mb(MACROBLOCK *x) {
117 BLOCK *b = &x->block[0]; 161 BLOCK *b = &x->block[0];
118 162
119 vp9_subtract_mby(x->src_diff, *(b->base_src), x->e_mbd.predictor, 163 vp9_subtract_mby(x->src_diff, *(b->base_src), x->e_mbd.predictor,
120 b->src_stride); 164 b->src_stride);
121 vp9_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer, 165 vp9_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
122 x->e_mbd.predictor, x->src.uv_stride); 166 x->e_mbd.predictor, x->src.uv_stride);
123 } 167 }
124 168
125 static void build_dcblock_4x4(MACROBLOCK *x) { 169 static void build_dcblock_4x4(MACROBLOCK *x) {
126 short *src_diff_ptr = &x->src_diff[384]; 170 int16_t *src_diff_ptr = &x->src_diff[384];
127 int i; 171 int i;
128 172
129 for (i = 0; i < 16; i++) { 173 for (i = 0; i < 16; i++) {
130 src_diff_ptr[i] = x->coeff[i * 16]; 174 src_diff_ptr[i] = x->coeff[i * 16];
131 x->coeff[i * 16] = 0; 175 x->coeff[i * 16] = 0;
132 } 176 }
133 } 177 }
134 178
135 void vp9_transform_mby_4x4(MACROBLOCK *x) { 179 void vp9_transform_mby_4x4(MACROBLOCK *x) {
136 int i; 180 int i;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 x->vp9_short_fdct16x16(&x->block[0].src_diff[0], 302 x->vp9_short_fdct16x16(&x->block[0].src_diff[0],
259 &x->block[0].coeff[0], 32); 303 &x->block[0].coeff[0], 32);
260 } 304 }
261 } 305 }
262 306
263 void vp9_transform_mb_16x16(MACROBLOCK *x) { 307 void vp9_transform_mb_16x16(MACROBLOCK *x) {
264 vp9_transform_mby_16x16(x); 308 vp9_transform_mby_16x16(x);
265 vp9_transform_mbuv_8x8(x); 309 vp9_transform_mbuv_8x8(x);
266 } 310 }
267 311
312 void vp9_transform_sby_32x32(MACROBLOCK *x) {
313 SUPERBLOCK * const x_sb = &x->sb_coeff_data;
314 vp9_short_fdct32x32(x_sb->src_diff, x_sb->coeff, 64);
315 }
316
317 void vp9_transform_sbuv_16x16(MACROBLOCK *x) {
318 SUPERBLOCK * const x_sb = &x->sb_coeff_data;
319 vp9_clear_system_state();
320 x->vp9_short_fdct16x16(x_sb->src_diff + 1024,
321 x_sb->coeff + 1024, 32);
322 x->vp9_short_fdct16x16(x_sb->src_diff + 1280,
323 x_sb->coeff + 1280, 32);
324 }
325
268 #define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF ) 326 #define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF )
269 #define RDTRUNC_8x8(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF ) 327 #define RDTRUNC_8x8(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF )
270 typedef struct vp9_token_state vp9_token_state; 328 typedef struct vp9_token_state vp9_token_state;
271 329
272 struct vp9_token_state { 330 struct vp9_token_state {
273 int rate; 331 int rate;
274 int error; 332 int error;
275 int next; 333 int next;
276 signed char token; 334 signed char token;
277 short qc; 335 short qc;
(...skipping 17 matching lines...) Expand all
295 rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);\ 353 rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);\
296 if (rd_cost0 == rd_cost1) {\ 354 if (rd_cost0 == rd_cost1) {\
297 rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);\ 355 rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);\
298 rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);\ 356 rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);\
299 }\ 357 }\
300 } 358 }
301 359
302 static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type, 360 static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
303 ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, 361 ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
304 int tx_size) { 362 int tx_size) {
305 BLOCK *b; 363 BLOCK *b = &mb->block[i];
306 BLOCKD *d; 364 BLOCKD *d = &mb->e_mbd.block[i];
307 vp9_token_state tokens[65][2]; 365 vp9_token_state tokens[257][2];
308 uint64_t best_mask[2]; 366 unsigned best_index[257][2];
309 const short *dequant_ptr; 367 const int16_t *dequant_ptr = d->dequant, *coeff_ptr = b->coeff;
310 const short *coeff_ptr; 368 int16_t *qcoeff_ptr = d->qcoeff;
311 short *qcoeff_ptr; 369 int16_t *dqcoeff_ptr = d->dqcoeff;
312 short *dqcoeff_ptr; 370 int eob = d->eob, final_eob, sz = 0;
313 int eob; 371 int i0 = (type == PLANE_TYPE_Y_NO_DC);
314 int i0; 372 int rc, x, next;
315 int rc; 373 int64_t rdmult, rddiv, rd_cost0, rd_cost1;
316 int x; 374 int rate0, rate1, error0, error1, t0, t1;
317 int sz = 0; 375 int best, band, pt;
318 int next;
319 int rdmult;
320 int rddiv;
321 int final_eob;
322 int64_t rd_cost0, rd_cost1;
323 int rate0, rate1;
324 int error0, error1;
325 int t0, t1;
326 int best;
327 int band;
328 int pt;
329 int err_mult = plane_rd_mult[type]; 376 int err_mult = plane_rd_mult[type];
330 int default_eob; 377 int default_eob;
331 int const *scan, *bands; 378 int const *scan, *bands;
379 #if CONFIG_NEWCOEFCONTEXT
380 const int *neighbors;
381 #endif
332 382
333 b = &mb->block[i];
334 d = &mb->e_mbd.block[i];
335 switch (tx_size) { 383 switch (tx_size) {
336 default: 384 default:
337 case TX_4X4: 385 case TX_4X4:
338 scan = vp9_default_zig_zag1d; 386 scan = vp9_default_zig_zag1d_4x4;
339 bands = vp9_coef_bands; 387 bands = vp9_coef_bands_4x4;
340 default_eob = 16; 388 default_eob = 16;
341 // TODO: this isn't called (for intra4x4 modes), but will be left in 389 // TODO: this isn't called (for intra4x4 modes), but will be left in
342 // since it could be used later 390 // since it could be used later
343 { 391 {
344 TX_TYPE tx_type = get_tx_type_4x4(&mb->e_mbd, d); 392 TX_TYPE tx_type = get_tx_type_4x4(&mb->e_mbd, d);
345 if (tx_type != DCT_DCT) { 393 if (tx_type != DCT_DCT) {
346 switch (tx_type) { 394 switch (tx_type) {
347 case ADST_DCT: 395 case ADST_DCT:
348 scan = vp9_row_scan; 396 scan = vp9_row_scan_4x4;
349 break; 397 break;
350 398
351 case DCT_ADST: 399 case DCT_ADST:
352 scan = vp9_col_scan; 400 scan = vp9_col_scan_4x4;
353 break; 401 break;
354 402
355 default: 403 default:
356 scan = vp9_default_zig_zag1d; 404 scan = vp9_default_zig_zag1d_4x4;
357 break; 405 break;
358 } 406 }
359 } else { 407 } else {
360 scan = vp9_default_zig_zag1d; 408 scan = vp9_default_zig_zag1d_4x4;
361 } 409 }
362 } 410 }
363 break; 411 break;
364 case TX_8X8: 412 case TX_8X8:
365 scan = vp9_default_zig_zag1d_8x8; 413 scan = vp9_default_zig_zag1d_8x8;
366 bands = vp9_coef_bands_8x8; 414 bands = vp9_coef_bands_8x8;
367 default_eob = 64; 415 default_eob = 64;
368 break; 416 break;
417 case TX_16X16:
418 scan = vp9_default_zig_zag1d_16x16;
419 bands = vp9_coef_bands_16x16;
420 default_eob = 256;
421 break;
369 } 422 }
370 423 #if CONFIG_NEWCOEFCONTEXT
371 dequant_ptr = d->dequant; 424 neighbors = vp9_get_coef_neighbors_handle(scan);
372 coeff_ptr = b->coeff; 425 #endif
373 qcoeff_ptr = d->qcoeff;
374 dqcoeff_ptr = d->dqcoeff;
375 i0 = (type == PLANE_TYPE_Y_NO_DC);
376 eob = d->eob;
377 426
378 /* Now set up a Viterbi trellis to evaluate alternative roundings. */ 427 /* Now set up a Viterbi trellis to evaluate alternative roundings. */
379 rdmult = mb->rdmult * err_mult; 428 rdmult = mb->rdmult * err_mult;
380 if (mb->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) 429 if (mb->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME)
381 rdmult = (rdmult * 9) >> 4; 430 rdmult = (rdmult * 9) >> 4;
382 rddiv = mb->rddiv; 431 rddiv = mb->rddiv;
383 best_mask[0] = best_mask[1] = 0; 432 memset(best_index, 0, sizeof(best_index));
384 /* Initialize the sentinel node of the trellis. */ 433 /* Initialize the sentinel node of the trellis. */
385 tokens[eob][0].rate = 0; 434 tokens[eob][0].rate = 0;
386 tokens[eob][0].error = 0; 435 tokens[eob][0].error = 0;
387 tokens[eob][0].next = default_eob; 436 tokens[eob][0].next = default_eob;
388 tokens[eob][0].token = DCT_EOB_TOKEN; 437 tokens[eob][0].token = DCT_EOB_TOKEN;
389 tokens[eob][0].qc = 0; 438 tokens[eob][0].qc = 0;
390 *(tokens[eob] + 1) = *(tokens[eob] + 0); 439 *(tokens[eob] + 1) = *(tokens[eob] + 0);
391 next = eob; 440 next = eob;
392 for (i = eob; i-- > i0;) { 441 for (i = eob; i-- > i0;) {
393 int base_bits; 442 int base_bits, d2, dx;
394 int d2;
395 int dx;
396 443
397 rc = scan[i]; 444 rc = scan[i];
398 x = qcoeff_ptr[rc]; 445 x = qcoeff_ptr[rc];
399 /* Only add a trellis state for non-zero coefficients. */ 446 /* Only add a trellis state for non-zero coefficients. */
400 if (x) { 447 if (x) {
401 int shortcut = 0; 448 int shortcut = 0;
402 error0 = tokens[next][0].error; 449 error0 = tokens[next][0].error;
403 error1 = tokens[next][1].error; 450 error1 = tokens[next][1].error;
404 /* Evaluate the first possibility for this state. */ 451 /* Evaluate the first possibility for this state. */
405 rate0 = tokens[next][0].rate; 452 rate0 = tokens[next][0].rate;
406 rate1 = tokens[next][1].rate; 453 rate1 = tokens[next][1].rate;
407 t0 = (vp9_dct_value_tokens_ptr + x)->Token; 454 t0 = (vp9_dct_value_tokens_ptr + x)->Token;
408 /* Consider both possible successor states. */ 455 /* Consider both possible successor states. */
409 if (next < default_eob) { 456 if (next < default_eob) {
410 band = bands[i + 1]; 457 band = bands[i + 1];
411 pt = vp9_prev_token_class[t0]; 458 pt = vp9_prev_token_class[t0];
459 #if CONFIG_NEWCOEFCONTEXT
460 if (NEWCOEFCONTEXT_BAND_COND(band))
461 pt = vp9_get_coef_neighbor_context(
462 qcoeff_ptr, i0, neighbors, scan[i + 1]);
463 #endif
412 rate0 += 464 rate0 +=
413 mb->token_costs[tx_size][type][band][pt][tokens[next][0].token]; 465 mb->token_costs[tx_size][type][band][pt][tokens[next][0].token];
414 rate1 += 466 rate1 +=
415 mb->token_costs[tx_size][type][band][pt][tokens[next][1].token]; 467 mb->token_costs[tx_size][type][band][pt][tokens[next][1].token];
416 } 468 }
417 UPDATE_RD_COST(); 469 UPDATE_RD_COST();
418 /* And pick the best. */ 470 /* And pick the best. */
419 best = rd_cost1 < rd_cost0; 471 best = rd_cost1 < rd_cost0;
420 base_bits = *(vp9_dct_value_cost_ptr + x); 472 base_bits = *(vp9_dct_value_cost_ptr + x);
421 dx = dqcoeff_ptr[rc] - coeff_ptr[rc]; 473 dx = dqcoeff_ptr[rc] - coeff_ptr[rc];
422 d2 = dx * dx; 474 d2 = dx * dx;
423 tokens[i][0].rate = base_bits + (best ? rate1 : rate0); 475 tokens[i][0].rate = base_bits + (best ? rate1 : rate0);
424 tokens[i][0].error = d2 + (best ? error1 : error0); 476 tokens[i][0].error = d2 + (best ? error1 : error0);
425 tokens[i][0].next = next; 477 tokens[i][0].next = next;
426 tokens[i][0].token = t0; 478 tokens[i][0].token = t0;
427 tokens[i][0].qc = x; 479 tokens[i][0].qc = x;
428 best_mask[0] |= best << i; 480 best_index[i][0] = best;
429 /* Evaluate the second possibility for this state. */ 481 /* Evaluate the second possibility for this state. */
430 rate0 = tokens[next][0].rate; 482 rate0 = tokens[next][0].rate;
431 rate1 = tokens[next][1].rate; 483 rate1 = tokens[next][1].rate;
432 484
433 if ((abs(x)*dequant_ptr[rc != 0] > abs(coeff_ptr[rc])) && 485 if ((abs(x)*dequant_ptr[rc != 0] > abs(coeff_ptr[rc])) &&
434 (abs(x)*dequant_ptr[rc != 0] < abs(coeff_ptr[rc]) + dequant_ptr[rc != 0])) 486 (abs(x)*dequant_ptr[rc != 0] < abs(coeff_ptr[rc]) + dequant_ptr[rc != 0]))
435 shortcut = 1; 487 shortcut = 1;
436 else 488 else
437 shortcut = 0; 489 shortcut = 0;
438 490
(...skipping 10 matching lines...) Expand all
449 t0 = tokens[next][0].token == DCT_EOB_TOKEN ? 501 t0 = tokens[next][0].token == DCT_EOB_TOKEN ?
450 DCT_EOB_TOKEN : ZERO_TOKEN; 502 DCT_EOB_TOKEN : ZERO_TOKEN;
451 t1 = tokens[next][1].token == DCT_EOB_TOKEN ? 503 t1 = tokens[next][1].token == DCT_EOB_TOKEN ?
452 DCT_EOB_TOKEN : ZERO_TOKEN; 504 DCT_EOB_TOKEN : ZERO_TOKEN;
453 } else { 505 } else {
454 t0 = t1 = (vp9_dct_value_tokens_ptr + x)->Token; 506 t0 = t1 = (vp9_dct_value_tokens_ptr + x)->Token;
455 } 507 }
456 if (next < default_eob) { 508 if (next < default_eob) {
457 band = bands[i + 1]; 509 band = bands[i + 1];
458 if (t0 != DCT_EOB_TOKEN) { 510 if (t0 != DCT_EOB_TOKEN) {
511 #if CONFIG_NEWCOEFCONTEXT
512 int tmp = qcoeff_ptr[scan[i]];
513 qcoeff_ptr[scan[i]] = x;
514 if (NEWCOEFCONTEXT_BAND_COND(band))
515 pt = vp9_get_coef_neighbor_context(
516 qcoeff_ptr, i0, neighbors, scan[i + 1]);
517 else
518 pt = vp9_prev_token_class[t0];
519 qcoeff_ptr[scan[i]] = tmp;
520 #else
459 pt = vp9_prev_token_class[t0]; 521 pt = vp9_prev_token_class[t0];
522 #endif
460 rate0 += mb->token_costs[tx_size][type][band][pt][ 523 rate0 += mb->token_costs[tx_size][type][band][pt][
461 tokens[next][0].token]; 524 tokens[next][0].token];
462 } 525 }
463 if (t1 != DCT_EOB_TOKEN) { 526 if (t1 != DCT_EOB_TOKEN) {
527 #if CONFIG_NEWCOEFCONTEXT
528 int tmp = qcoeff_ptr[scan[i]];
529 qcoeff_ptr[scan[i]] = x;
530 if (NEWCOEFCONTEXT_BAND_COND(band))
531 pt = vp9_get_coef_neighbor_context(
532 qcoeff_ptr, i0, neighbors, scan[i + 1]);
533 else
534 pt = vp9_prev_token_class[t1];
535 qcoeff_ptr[scan[i]] = tmp;
536 #else
464 pt = vp9_prev_token_class[t1]; 537 pt = vp9_prev_token_class[t1];
538 #endif
465 rate1 += mb->token_costs[tx_size][type][band][pt][ 539 rate1 += mb->token_costs[tx_size][type][band][pt][
466 tokens[next][1].token]; 540 tokens[next][1].token];
467 } 541 }
468 } 542 }
469 543
470 UPDATE_RD_COST(); 544 UPDATE_RD_COST();
471 /* And pick the best. */ 545 /* And pick the best. */
472 best = rd_cost1 < rd_cost0; 546 best = rd_cost1 < rd_cost0;
473 base_bits = *(vp9_dct_value_cost_ptr + x); 547 base_bits = *(vp9_dct_value_cost_ptr + x);
474 548
475 if (shortcut) { 549 if (shortcut) {
476 dx -= (dequant_ptr[rc != 0] + sz) ^ sz; 550 dx -= (dequant_ptr[rc != 0] + sz) ^ sz;
477 d2 = dx * dx; 551 d2 = dx * dx;
478 } 552 }
479 tokens[i][1].rate = base_bits + (best ? rate1 : rate0); 553 tokens[i][1].rate = base_bits + (best ? rate1 : rate0);
480 tokens[i][1].error = d2 + (best ? error1 : error0); 554 tokens[i][1].error = d2 + (best ? error1 : error0);
481 tokens[i][1].next = next; 555 tokens[i][1].next = next;
482 tokens[i][1].token = best ? t1 : t0; 556 tokens[i][1].token = best ? t1 : t0;
483 tokens[i][1].qc = x; 557 tokens[i][1].qc = x;
484 best_mask[1] |= best << i; 558 best_index[i][1] = best;
485 /* Finally, make this the new head of the trellis. */ 559 /* Finally, make this the new head of the trellis. */
486 next = i; 560 next = i;
487 } 561 }
488 /* There's no choice to make for a zero coefficient, so we don't 562 /* There's no choice to make for a zero coefficient, so we don't
489 * add a new trellis node, but we do need to update the costs. 563 * add a new trellis node, but we do need to update the costs.
490 */ 564 */
491 else { 565 else {
492 band = bands[i + 1]; 566 band = bands[i + 1];
493 t0 = tokens[next][0].token; 567 t0 = tokens[next][0].token;
494 t1 = tokens[next][1].token; 568 t1 = tokens[next][1].token;
(...skipping 26 matching lines...) Expand all
521 final_eob = i0 - 1; 595 final_eob = i0 - 1;
522 for (i = next; i < eob; i = next) { 596 for (i = next; i < eob; i = next) {
523 x = tokens[i][best].qc; 597 x = tokens[i][best].qc;
524 if (x) 598 if (x)
525 final_eob = i; 599 final_eob = i;
526 rc = scan[i]; 600 rc = scan[i];
527 qcoeff_ptr[rc] = x; 601 qcoeff_ptr[rc] = x;
528 dqcoeff_ptr[rc] = (x * dequant_ptr[rc != 0]); 602 dqcoeff_ptr[rc] = (x * dequant_ptr[rc != 0]);
529 603
530 next = tokens[i][best].next; 604 next = tokens[i][best].next;
531 best = (best_mask[best] >> i) & 1; 605 best = best_index[i][best];
532 } 606 }
533 final_eob++; 607 final_eob++;
534 608
535 d->eob = final_eob; 609 d->eob = final_eob;
536 *a = *l = (d->eob > !type); 610 *a = *l = (d->eob > !type);
537 } 611 }
538 612
539 /************************************************************************** 613 /**************************************************************************
540 our inverse hadamard transform effectively is weighted sum of all 16 inputs 614 our inverse hadamard transform effectively is weighted sum of all 16 inputs
541 with weight either 1 or -1. It has a last stage scaling of (sum+1)>>2. And 615 with weight either 1 or -1. It has a last stage scaling of (sum+1)>>2. And
542 dc only idct is (dc+16)>>5. So if all the sums are between -65 and 63 the 616 dc only idct is (dc+16)>>5. So if all the sums are between -65 and 63 the
543 output after inverse wht and idct will be all zero. A sum of absolute value 617 output after inverse wht and idct will be all zero. A sum of absolute value
544 smaller than 65 guarantees all 16 different (+1/-1) weighted sums in wht 618 smaller than 65 guarantees all 16 different (+1/-1) weighted sums in wht
545 fall between -65 and +65. 619 fall between -65 and +65.
546 **************************************************************************/ 620 **************************************************************************/
547 #define SUM_2ND_COEFF_THRESH 65 621 #define SUM_2ND_COEFF_THRESH 65
548 622
549 static void check_reset_2nd_coeffs(MACROBLOCKD *xd, 623 static void check_reset_2nd_coeffs(MACROBLOCKD *xd,
550 ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) { 624 ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) {
551 int sum = 0; 625 int sum = 0;
552 int i; 626 int i;
553 BLOCKD *bd = &xd->block[24]; 627 BLOCKD *bd = &xd->block[24];
554 if (bd->dequant[0] >= SUM_2ND_COEFF_THRESH 628 if (bd->dequant[0] >= SUM_2ND_COEFF_THRESH
555 && bd->dequant[1] >= SUM_2ND_COEFF_THRESH) 629 && bd->dequant[1] >= SUM_2ND_COEFF_THRESH)
556 return; 630 return;
557 631
558 for (i = 0; i < bd->eob; i++) { 632 for (i = 0; i < bd->eob; i++) {
559 int coef = bd->dqcoeff[vp9_default_zig_zag1d[i]]; 633 int coef = bd->dqcoeff[vp9_default_zig_zag1d_4x4[i]];
560 sum += (coef >= 0) ? coef : -coef; 634 sum += (coef >= 0) ? coef : -coef;
561 if (sum >= SUM_2ND_COEFF_THRESH) 635 if (sum >= SUM_2ND_COEFF_THRESH)
562 return; 636 return;
563 } 637 }
564 638
565 if (sum < SUM_2ND_COEFF_THRESH) { 639 if (sum < SUM_2ND_COEFF_THRESH) {
566 for (i = 0; i < bd->eob; i++) { 640 for (i = 0; i < bd->eob; i++) {
567 int rc = vp9_default_zig_zag1d[i]; 641 int rc = vp9_default_zig_zag1d_4x4[i];
568 bd->qcoeff[rc] = 0; 642 bd->qcoeff[rc] = 0;
569 bd->dqcoeff[rc] = 0; 643 bd->dqcoeff[rc] = 0;
570 } 644 }
571 bd->eob = 0; 645 bd->eob = 0;
572 *a = *l = (bd->eob != 0); 646 *a = *l = (bd->eob != 0);
573 } 647 }
574 } 648 }
575 649
576 #define SUM_2ND_COEFF_THRESH_8X8 32 650 #define SUM_2ND_COEFF_THRESH_8X8 32
577 static void check_reset_8x8_2nd_coeffs(MACROBLOCKD *xd, 651 static void check_reset_8x8_2nd_coeffs(MACROBLOCKD *xd,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 693
620 ta = (ENTROPY_CONTEXT *)&t_above; 694 ta = (ENTROPY_CONTEXT *)&t_above;
621 tl = (ENTROPY_CONTEXT *)&t_left; 695 tl = (ENTROPY_CONTEXT *)&t_left;
622 696
623 has_2nd_order = get_2nd_order_usage(&x->e_mbd); 697 has_2nd_order = get_2nd_order_usage(&x->e_mbd);
624 698
625 type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC; 699 type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
626 700
627 for (b = 0; b < 16; b++) { 701 for (b = 0; b < 16; b++) {
628 optimize_b(x, b, type, 702 optimize_b(x, b, type,
629 ta + vp9_block2above[b], tl + vp9_block2left[b], TX_4X4); 703 ta + vp9_block2above[TX_4X4][b],
704 tl + vp9_block2left[TX_4X4][b], TX_4X4);
630 } 705 }
631 706
632 if (has_2nd_order) { 707 if (has_2nd_order) {
633 b = 24; 708 b = 24;
634 optimize_b(x, b, PLANE_TYPE_Y2, 709 optimize_b(x, b, PLANE_TYPE_Y2,
635 ta + vp9_block2above[b], tl + vp9_block2left[b], TX_4X4); 710 ta + vp9_block2above[TX_4X4][b],
711 tl + vp9_block2left[TX_4X4][b], TX_4X4);
636 check_reset_2nd_coeffs(&x->e_mbd, 712 check_reset_2nd_coeffs(&x->e_mbd,
637 ta + vp9_block2above[b], tl + vp9_block2left[b]); 713 ta + vp9_block2above[TX_4X4][b],
714 tl + vp9_block2left[TX_4X4][b]);
638 } 715 }
639 } 716 }
640 717
641 void vp9_optimize_mbuv_4x4(MACROBLOCK *x) { 718 void vp9_optimize_mbuv_4x4(MACROBLOCK *x) {
642 int b; 719 int b;
643 ENTROPY_CONTEXT_PLANES t_above, t_left; 720 ENTROPY_CONTEXT_PLANES t_above, t_left;
644 ENTROPY_CONTEXT *ta; 721 ENTROPY_CONTEXT *ta;
645 ENTROPY_CONTEXT *tl; 722 ENTROPY_CONTEXT *tl;
646 723
647 if (!x->e_mbd.above_context || !x->e_mbd.left_context) 724 if (!x->e_mbd.above_context || !x->e_mbd.left_context)
648 return; 725 return;
649 726
650 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 727 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
651 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 728 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
652 729
653 ta = (ENTROPY_CONTEXT *)&t_above; 730 ta = (ENTROPY_CONTEXT *)&t_above;
654 tl = (ENTROPY_CONTEXT *)&t_left; 731 tl = (ENTROPY_CONTEXT *)&t_left;
655 732
656 for (b = 16; b < 24; b++) { 733 for (b = 16; b < 24; b++) {
657 optimize_b(x, b, PLANE_TYPE_UV, 734 optimize_b(x, b, PLANE_TYPE_UV,
658 ta + vp9_block2above[b], tl + vp9_block2left[b], TX_4X4); 735 ta + vp9_block2above[TX_4X4][b],
736 tl + vp9_block2left[TX_4X4][b], TX_4X4);
659 } 737 }
660 } 738 }
661 739
662 static void optimize_mb_4x4(MACROBLOCK *x) { 740 static void optimize_mb_4x4(MACROBLOCK *x) {
663 vp9_optimize_mby_4x4(x); 741 vp9_optimize_mby_4x4(x);
664 vp9_optimize_mbuv_4x4(x); 742 vp9_optimize_mbuv_4x4(x);
665 } 743 }
666 744
667 void vp9_optimize_mby_8x8(MACROBLOCK *x) { 745 void vp9_optimize_mby_8x8(MACROBLOCK *x) {
668 int b; 746 int b;
669 PLANE_TYPE type; 747 PLANE_TYPE type;
670 ENTROPY_CONTEXT_PLANES t_above, t_left; 748 ENTROPY_CONTEXT_PLANES t_above, t_left;
671 ENTROPY_CONTEXT *ta; 749 ENTROPY_CONTEXT *ta;
672 ENTROPY_CONTEXT *tl; 750 ENTROPY_CONTEXT *tl;
673 int has_2nd_order = get_2nd_order_usage(&x->e_mbd); 751 int has_2nd_order = get_2nd_order_usage(&x->e_mbd);
674 752
675 if (!x->e_mbd.above_context || !x->e_mbd.left_context) 753 if (!x->e_mbd.above_context || !x->e_mbd.left_context)
676 return; 754 return;
677 755
678 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 756 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
679 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 757 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
680 758
681 ta = (ENTROPY_CONTEXT *)&t_above; 759 ta = (ENTROPY_CONTEXT *)&t_above;
682 tl = (ENTROPY_CONTEXT *)&t_left; 760 tl = (ENTROPY_CONTEXT *)&t_left;
683 type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC; 761 type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
684 for (b = 0; b < 16; b += 4) { 762 for (b = 0; b < 16; b += 4) {
685 optimize_b(x, b, type, 763 ENTROPY_CONTEXT *const a = ta + vp9_block2above[TX_8X8][b];
686 ta + vp9_block2above_8x8[b], tl + vp9_block2left_8x8[b], 764 ENTROPY_CONTEXT *const l = tl + vp9_block2left[TX_8X8][b];
687 TX_8X8); 765 #if CONFIG_CNVCONTEXT
688 ta[vp9_block2above_8x8[b] + 1] = ta[vp9_block2above_8x8[b]]; 766 ENTROPY_CONTEXT above_ec = (a[0] + a[1]) != 0;
689 tl[vp9_block2left_8x8[b] + 1] = tl[vp9_block2left_8x8[b]]; 767 ENTROPY_CONTEXT left_ec = (l[0] + l[1]) != 0;
768 #else
769 ENTROPY_CONTEXT above_ec = a[0];
770 ENTROPY_CONTEXT left_ec = l[0];
771 #endif
772 optimize_b(x, b, type, &above_ec, &left_ec, TX_8X8);
773 a[1] = a[0] = above_ec;
774 l[1] = l[0] = left_ec;
690 } 775 }
691 776
692 // 8x8 always have 2nd roder haar block 777 // 8x8 always have 2nd order block
693 if (has_2nd_order) { 778 if (has_2nd_order) {
694 check_reset_8x8_2nd_coeffs(&x->e_mbd, 779 check_reset_8x8_2nd_coeffs(&x->e_mbd,
695 ta + vp9_block2above_8x8[24], 780 ta + vp9_block2above[TX_8X8][24],
696 tl + vp9_block2left_8x8[24]); 781 tl + vp9_block2left[TX_8X8][24]);
697 } 782 }
698 } 783 }
699 784
700 void vp9_optimize_mbuv_8x8(MACROBLOCK *x) { 785 void vp9_optimize_mbuv_8x8(MACROBLOCK *x) {
701 int b; 786 int b;
702 ENTROPY_CONTEXT_PLANES t_above, t_left; 787 ENTROPY_CONTEXT *const ta = (ENTROPY_CONTEXT *)x->e_mbd.above_context;
703 ENTROPY_CONTEXT *ta; 788 ENTROPY_CONTEXT *const tl = (ENTROPY_CONTEXT *)x->e_mbd.left_context;
704 ENTROPY_CONTEXT *tl;
705 789
706 if (!x->e_mbd.above_context || !x->e_mbd.left_context) 790 if (!ta || !tl)
707 return; 791 return;
708 792
709 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
710 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
711
712 ta = (ENTROPY_CONTEXT *)&t_above;
713 tl = (ENTROPY_CONTEXT *)&t_left;
714
715 for (b = 16; b < 24; b += 4) { 793 for (b = 16; b < 24; b += 4) {
716 optimize_b(x, b, PLANE_TYPE_UV, 794 ENTROPY_CONTEXT *const a = ta + vp9_block2above[TX_8X8][b];
717 ta + vp9_block2above_8x8[b], tl + vp9_block2left_8x8[b], 795 ENTROPY_CONTEXT *const l = tl + vp9_block2left[TX_8X8][b];
718 TX_8X8); 796 #if CONFIG_CNVCONTEXT
719 ta[vp9_block2above_8x8[b] + 1] = ta[vp9_block2above_8x8[b]]; 797 ENTROPY_CONTEXT above_ec = (a[0] + a[1]) != 0;
720 tl[vp9_block2left_8x8[b] + 1] = tl[vp9_block2left_8x8[b]]; 798 ENTROPY_CONTEXT left_ec = (l[0] + l[1]) != 0;
799 #else
800 ENTROPY_CONTEXT above_ec = a[0];
801 ENTROPY_CONTEXT left_ec = l[0];
802 #endif
803 optimize_b(x, b, PLANE_TYPE_UV, &above_ec, &left_ec, TX_8X8);
721 } 804 }
722 } 805 }
723 806
724 static void optimize_mb_8x8(MACROBLOCK *x) { 807 static void optimize_mb_8x8(MACROBLOCK *x) {
725 vp9_optimize_mby_8x8(x); 808 vp9_optimize_mby_8x8(x);
726 vp9_optimize_mbuv_8x8(x); 809 vp9_optimize_mbuv_8x8(x);
727 } 810 }
728 811
729 static void optimize_b_16x16(MACROBLOCK *mb, int i, PLANE_TYPE type, 812 void vp9_optimize_mby_16x16(MACROBLOCK *x) {
730 ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) { 813 ENTROPY_CONTEXT_PLANES *const t_above = x->e_mbd.above_context;
731 BLOCK *b = &mb->block[i]; 814 ENTROPY_CONTEXT_PLANES *const t_left = x->e_mbd.left_context;
732 BLOCKD *d = &mb->e_mbd.block[i]; 815 ENTROPY_CONTEXT ta, tl;
733 vp9_token_state tokens[257][2];
734 unsigned best_index[257][2];
735 const short *dequant_ptr = d->dequant, *coeff_ptr = b->coeff;
736 short *qcoeff_ptr = qcoeff_ptr = d->qcoeff;
737 short *dqcoeff_ptr = dqcoeff_ptr = d->dqcoeff;
738 int eob = d->eob, final_eob, sz = 0;
739 int rc, x, next;
740 int64_t rdmult, rddiv, rd_cost0, rd_cost1;
741 int rate0, rate1, error0, error1, t0, t1;
742 int best, band, pt;
743 int err_mult = plane_rd_mult[type];
744 816
745 /* Now set up a Viterbi trellis to evaluate alternative roundings. */ 817 if (!t_above || !t_left)
746 rdmult = mb->rdmult * err_mult;
747 if (mb->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME)
748 rdmult = (rdmult * 9)>>4;
749 rddiv = mb->rddiv;
750 memset(best_index, 0, sizeof(best_index));
751 /* Initialize the sentinel node of the trellis. */
752 tokens[eob][0].rate = 0;
753 tokens[eob][0].error = 0;
754 tokens[eob][0].next = 256;
755 tokens[eob][0].token = DCT_EOB_TOKEN;
756 tokens[eob][0].qc = 0;
757 *(tokens[eob] + 1) = *(tokens[eob] + 0);
758 next = eob;
759 for (i = eob; i-- > 0;) {
760 int base_bits, d2, dx;
761
762 rc = vp9_default_zig_zag1d_16x16[i];
763 x = qcoeff_ptr[rc];
764 /* Only add a trellis state for non-zero coefficients. */
765 if (x) {
766 int shortcut = 0;
767 error0 = tokens[next][0].error;
768 error1 = tokens[next][1].error;
769 /* Evaluate the first possibility for this state. */
770 rate0 = tokens[next][0].rate;
771 rate1 = tokens[next][1].rate;
772 t0 = (vp9_dct_value_tokens_ptr + x)->Token;
773 /* Consider both possible successor states. */
774 if (next < 256) {
775 band = vp9_coef_bands_16x16[i + 1];
776 pt = vp9_prev_token_class[t0];
777 rate0 += mb->token_costs[TX_16X16][type][band][pt][tokens[next][0].token ];
778 rate1 += mb->token_costs[TX_16X16][type][band][pt][tokens[next][1].token ];
779 }
780 UPDATE_RD_COST();
781 /* And pick the best. */
782 best = rd_cost1 < rd_cost0;
783 base_bits = *(vp9_dct_value_cost_ptr + x);
784 dx = dqcoeff_ptr[rc] - coeff_ptr[rc];
785 d2 = dx*dx;
786 tokens[i][0].rate = base_bits + (best ? rate1 : rate0);
787 tokens[i][0].error = d2 + (best ? error1 : error0);
788 tokens[i][0].next = next;
789 tokens[i][0].token = t0;
790 tokens[i][0].qc = x;
791 best_index[i][0] = best;
792 /* Evaluate the second possibility for this state. */
793 rate0 = tokens[next][0].rate;
794 rate1 = tokens[next][1].rate;
795
796 if((abs(x)*dequant_ptr[rc!=0]>abs(coeff_ptr[rc])) &&
797 (abs(x)*dequant_ptr[rc!=0]<abs(coeff_ptr[rc])+dequant_ptr[rc!=0]))
798 shortcut = 1;
799 else
800 shortcut = 0;
801
802 if (shortcut) {
803 sz = -(x < 0);
804 x -= 2*sz + 1;
805 }
806
807 /* Consider both possible successor states. */
808 if (!x) {
809 /* If we reduced this coefficient to zero, check to see if
810 * we need to move the EOB back here.
811 */
812 t0 = tokens[next][0].token == DCT_EOB_TOKEN ?
813 DCT_EOB_TOKEN : ZERO_TOKEN;
814 t1 = tokens[next][1].token == DCT_EOB_TOKEN ?
815 DCT_EOB_TOKEN : ZERO_TOKEN;
816 }
817 else
818 t0=t1 = (vp9_dct_value_tokens_ptr + x)->Token;
819 if (next < 256) {
820 band = vp9_coef_bands_16x16[i + 1];
821 if (t0 != DCT_EOB_TOKEN) {
822 pt = vp9_prev_token_class[t0];
823 rate0 += mb->token_costs[TX_16X16][type][band][pt]
824 [tokens[next][0].token];
825 }
826 if (t1!=DCT_EOB_TOKEN) {
827 pt = vp9_prev_token_class[t1];
828 rate1 += mb->token_costs[TX_16X16][type][band][pt]
829 [tokens[next][1].token];
830 }
831 }
832 UPDATE_RD_COST();
833 /* And pick the best. */
834 best = rd_cost1 < rd_cost0;
835 base_bits = *(vp9_dct_value_cost_ptr + x);
836
837 if(shortcut) {
838 dx -= (dequant_ptr[rc!=0] + sz) ^ sz;
839 d2 = dx*dx;
840 }
841 tokens[i][1].rate = base_bits + (best ? rate1 : rate0);
842 tokens[i][1].error = d2 + (best ? error1 : error0);
843 tokens[i][1].next = next;
844 tokens[i][1].token = best ? t1 : t0;
845 tokens[i][1].qc = x;
846 best_index[i][1] = best;
847 /* Finally, make this the new head of the trellis. */
848 next = i;
849 }
850 /* There's no choice to make for a zero coefficient, so we don't
851 * add a new trellis node, but we do need to update the costs.
852 */
853 else {
854 band = vp9_coef_bands_16x16[i + 1];
855 t0 = tokens[next][0].token;
856 t1 = tokens[next][1].token;
857 /* Update the cost of each path if we're past the EOB token. */
858 if (t0 != DCT_EOB_TOKEN) {
859 tokens[next][0].rate += mb->token_costs[TX_16X16][type][band][0][t0];
860 tokens[next][0].token = ZERO_TOKEN;
861 }
862 if (t1 != DCT_EOB_TOKEN) {
863 tokens[next][1].rate += mb->token_costs[TX_16X16][type][band][0][t1];
864 tokens[next][1].token = ZERO_TOKEN;
865 }
866 /* Don't update next, because we didn't add a new node. */
867 }
868 }
869
870 /* Now pick the best path through the whole trellis. */
871 band = vp9_coef_bands_16x16[i + 1];
872 VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
873 rate0 = tokens[next][0].rate;
874 rate1 = tokens[next][1].rate;
875 error0 = tokens[next][0].error;
876 error1 = tokens[next][1].error;
877 t0 = tokens[next][0].token;
878 t1 = tokens[next][1].token;
879 rate0 += mb->token_costs[TX_16X16][type][band][pt][t0];
880 rate1 += mb->token_costs[TX_16X16][type][band][pt][t1];
881 UPDATE_RD_COST();
882 best = rd_cost1 < rd_cost0;
883 final_eob = -1;
884
885 for (i = next; i < eob; i = next) {
886 x = tokens[i][best].qc;
887 if (x)
888 final_eob = i;
889 rc = vp9_default_zig_zag1d_16x16[i];
890 qcoeff_ptr[rc] = x;
891 dqcoeff_ptr[rc] = (x * dequant_ptr[rc!=0]);
892
893 next = tokens[i][best].next;
894 best = best_index[i][best];
895 }
896 final_eob++;
897
898 d->eob = final_eob;
899 *a = *l = (d->eob > !type);
900 }
901
902 void vp9_optimize_mby_16x16(MACROBLOCK *x) {
903 ENTROPY_CONTEXT_PLANES t_above, t_left;
904 ENTROPY_CONTEXT *ta, *tl;
905
906 if (!x->e_mbd.above_context || !x->e_mbd.left_context)
907 return; 818 return;
908 819
909 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 820 #if CONFIG_CNVCONTEXT
910 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 821 ta = (t_above->y1[0] + t_above->y1[1] + t_above->y1[2] + t_above->y1[3]) != 0;
911 822 tl = (t_left->y1[0] + t_left->y1[1] + t_left->y1[2] + t_left->y1[3]) != 0;
912 ta = (ENTROPY_CONTEXT *)&t_above; 823 #else
913 tl = (ENTROPY_CONTEXT *)&t_left; 824 ta = t_above->y1[0];
914 optimize_b_16x16(x, 0, PLANE_TYPE_Y_WITH_DC, ta, tl); 825 tl = t_left->y1[0];
826 #endif
827 optimize_b(x, 0, PLANE_TYPE_Y_WITH_DC, &ta, &tl, TX_16X16);
915 } 828 }
916 829
917 static void optimize_mb_16x16(MACROBLOCK *x) { 830 static void optimize_mb_16x16(MACROBLOCK *x) {
918 vp9_optimize_mby_16x16(x); 831 vp9_optimize_mby_16x16(x);
919 vp9_optimize_mbuv_8x8(x); 832 vp9_optimize_mbuv_8x8(x);
920 } 833 }
921 834
922 void vp9_fidct_mb(MACROBLOCK *x) { 835 void vp9_fidct_mb(MACROBLOCK *x) {
923 MACROBLOCKD *const xd = &x->e_mbd; 836 MACROBLOCKD *const xd = &x->e_mbd;
924 TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size; 837 TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 subtract_mb(x); 878 subtract_mb(x);
966 vp9_fidct_mb(x); 879 vp9_fidct_mb(x);
967 vp9_recon_mb(xd); 880 vp9_recon_mb(xd);
968 } 881 }
969 882
970 /* this function is used by first pass only */ 883 /* this function is used by first pass only */
971 void vp9_encode_inter16x16y(MACROBLOCK *x) { 884 void vp9_encode_inter16x16y(MACROBLOCK *x) {
972 MACROBLOCKD *xd = &x->e_mbd; 885 MACROBLOCKD *xd = &x->e_mbd;
973 BLOCK *b = &x->block[0]; 886 BLOCK *b = &x->block[0];
974 887
975 #if CONFIG_PRED_FILTER
976 // Disable the prediction filter for firstpass
977 xd->mode_info_context->mbmi.pred_filter_enabled = 0;
978 #endif
979
980 vp9_build_1st_inter16x16_predictors_mby(xd, xd->predictor, 16, 0); 888 vp9_build_1st_inter16x16_predictors_mby(xd, xd->predictor, 16, 0);
981 889
982 vp9_subtract_mby(x->src_diff, *(b->base_src), xd->predictor, b->src_stride); 890 vp9_subtract_mby(x->src_diff, *(b->base_src), xd->predictor, b->src_stride);
983 891
984 vp9_transform_mby_4x4(x); 892 vp9_transform_mby_4x4(x);
985 vp9_quantize_mby_4x4(x); 893 vp9_quantize_mby_4x4(x);
986 vp9_inverse_transform_mby_4x4(xd); 894 vp9_inverse_transform_mby_4x4(xd);
987 895
988 vp9_recon_mby(xd); 896 vp9_recon_mby(xd);
989 } 897 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encodemb.h ('k') | source/libvpx/vp9/encoder/vp9_encodemv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698