ref: d8e86af263e59b8adf97ed99e552b2ff17d04e5b
parent: 5d1c62c6393cada449ddbeaed3a2e986b6c9ee8c
parent: 93762ca9b2e33c91fb6bfbde08a115148dee8c73
author: Paul Wilkins <paulwilkins@google.com>
date: Tue Jan 29 04:29:45 EST 2013
Merge "Remove eob_max_offset markers." into experimental
--- a/vp9/encoder/vp9_block.h
+++ b/vp9/encoder/vp9_block.h
@@ -50,10 +50,7 @@
int src;
int src_stride;
- int eob_max_offset;
- int eob_max_offset_8x8;
- int eob_max_offset_16x16;
- int eob_max_offset_32x32;
+ int skip_block;
} BLOCK;
typedef struct {
--- a/vp9/encoder/vp9_quantize.c
+++ b/vp9/encoder/vp9_quantize.c
@@ -57,27 +57,29 @@
eob = -1;
- for (i = 0; i < b->eob_max_offset; i++) {
- rc = pt_scan[i];
- z = coeff_ptr[rc];
+ if (!b->skip_block) {
+ for (i = 0; i < 16; i++) {
+ rc = pt_scan[i];
+ z = coeff_ptr[rc];
- zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
- zbin_boost_ptr ++;
+ zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
+ zbin_boost_ptr++;
- sz = (z >> 31); // sign of z
- x = (z ^ sz) - sz; // x = abs(z)
+ sz = (z >> 31); // sign of z
+ x = (z ^ sz) - sz; // x = abs(z)
- if (x >= zbin) {
- x += round_ptr[rc];
- y = (((x * quant_ptr[rc]) >> 16) + x)
- >> quant_shift_ptr[rc]; // quantize (x)
- x = (y ^ sz) - sz; // get the sign back
- qcoeff_ptr[rc] = x; // write to destination
- dqcoeff_ptr[rc] = x * dequant_ptr[rc]; // dequantized value
+ if (x >= zbin) {
+ x += round_ptr[rc];
+ y = (((x * quant_ptr[rc]) >> 16) + x)
+ >> quant_shift_ptr[rc]; // quantize (x)
+ x = (y ^ sz) - sz; // get the sign back
+ qcoeff_ptr[rc] = x; // write to destination
+ dqcoeff_ptr[rc] = x * dequant_ptr[rc]; // dequantized value
- if (y) {
- eob = i; // last nonzero coeffs
- zbin_boost_ptr = b->zrun_zbin_boost; // reset zero runlength
+ if (y) {
+ eob = i; // last nonzero coeffs
+ zbin_boost_ptr = b->zrun_zbin_boost; // reset zero runlength
+ }
}
}
}
@@ -105,28 +107,30 @@
eob = -1;
- for (i = 0; i < b->eob_max_offset; i++) {
- rc = vp9_default_zig_zag1d_4x4[i];
- z = coeff_ptr[rc];
+ if (!b->skip_block) {
+ for (i = 0; i < 16; i++) {
+ rc = vp9_default_zig_zag1d_4x4[i];
+ z = coeff_ptr[rc];
- zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
- zbin_boost_ptr ++;
+ zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value;
+ zbin_boost_ptr++;
- sz = (z >> 31); // sign of z
- x = (z ^ sz) - sz; // x = abs(z)
+ sz = (z >> 31); // sign of z
+ x = (z ^ sz) - sz; // x = abs(z)
- if (x >= zbin) {
- x += round_ptr[rc];
+ if (x >= zbin) {
+ x += round_ptr[rc];
- y = (((x * quant_ptr[rc]) >> 16) + x)
- >> quant_shift_ptr[rc]; // quantize (x)
- x = (y ^ sz) - sz; // get the sign back
- qcoeff_ptr[rc] = x; // write to destination
- dqcoeff_ptr[rc] = x * dequant_ptr[rc]; // dequantized value
+ y = (((x * quant_ptr[rc]) >> 16) + x)
+ >> quant_shift_ptr[rc]; // quantize (x)
+ x = (y ^ sz) - sz; // get the sign back
+ qcoeff_ptr[rc] = x; // write to destination
+ dqcoeff_ptr[rc] = x * dequant_ptr[rc]; // dequantized value
- if (y) {
- eob = i; // last nonzero coeffs
- zbin_boost_ptr = b->zrun_zbin_boost; // reset zero runlength
+ if (y) {
+ eob = i; // last nonzero coeffs
+ zbin_boost_ptr = b->zrun_zbin_boost; // reset zero runlength
+ }
}
}
}
@@ -185,6 +189,7 @@
int16_t *dqcoeff_ptr = d->dqcoeff;
int16_t *dequant_ptr = d->dequant;
int zbin_oq_value = b->zbin_extra;
+
// double q2nd = 4;
vpx_memset(qcoeff_ptr, 0, 32);
vpx_memset(dqcoeff_ptr, 0, 32);
@@ -191,28 +196,30 @@
eob = -1;
- for (i = 0; i < b->eob_max_offset_8x8; i++) {
- rc = vp9_default_zig_zag1d_4x4[i];
- z = coeff_ptr[rc];
+ if (!b->skip_block) {
+ for (i = 0; i < 4; i++) {
+ rc = vp9_default_zig_zag1d_4x4[i];
+ z = coeff_ptr[rc];
- zbin_boost_ptr = &b->zrun_zbin_boost[zbin_zrun_index];
- zbin_zrun_index += 4;
- zbin = (zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value);
+ zbin_boost_ptr = &b->zrun_zbin_boost[zbin_zrun_index];
+ zbin_zrun_index += 4;
+ zbin = (zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value);
- sz = (z >> 31); // sign of z
- x = (z ^ sz) - sz; // x = abs(z)
+ sz = (z >> 31); // sign of z
+ x = (z ^ sz) - sz; // x = abs(z)
- if (x >= zbin) {
- x += (round_ptr[rc]);
- y = ((int)((int)(x * quant_ptr[rc]) >> 16) + x)
- >> quant_shift_ptr[rc]; // quantize (x)
- x = (y ^ sz) - sz; // get the sign back
- qcoeff_ptr[rc] = x; // write to destination
- dqcoeff_ptr[rc] = x * dequant_ptr[rc]; // dequantized value
+ if (x >= zbin) {
+ x += (round_ptr[rc]);
+ y = ((int)((int)(x * quant_ptr[rc]) >> 16) + x)
+ >> quant_shift_ptr[rc]; // quantize (x)
+ x = (y ^ sz) - sz; // get the sign back
+ qcoeff_ptr[rc] = x; // write to destination
+ dqcoeff_ptr[rc] = x * dequant_ptr[rc]; // dequantized value
- if (y) {
- eob = i; // last nonzero coeffs
- zbin_zrun_index = 0;
+ if (y) {
+ eob = i; // last nonzero coeffs
+ zbin_zrun_index = 0;
+ }
}
}
}
@@ -241,30 +248,31 @@
eob = -1;
- for (i = 0; i < b->eob_max_offset_8x8; i++) {
- rc = vp9_default_zig_zag1d_8x8[i];
- z = coeff_ptr[rc];
- zbin = (zbin_ptr[rc != 0] + zbin_boost_ptr[zero_run] + zbin_oq_value);
- zero_run += (zero_run < 15);
+ if (!b->skip_block) {
+ for (i = 0; i < 64; i++) {
+ rc = vp9_default_zig_zag1d_8x8[i];
+ z = coeff_ptr[rc];
+ zbin = (zbin_ptr[rc != 0] + zbin_boost_ptr[zero_run] + zbin_oq_value);
+ zero_run += (zero_run < 15);
- sz = (z >> 31); // sign of z
- x = (z ^ sz) - sz; // x = abs(z)
+ sz = (z >> 31); // sign of z
+ x = (z ^ sz) - sz; // x = abs(z)
- if (x >= zbin) {
- x += (round_ptr[rc != 0]);
- y = ((int)(((int)(x * quant_ptr[rc != 0]) >> 16) + x))
- >> quant_shift_ptr[rc != 0]; // quantize (x)
- x = (y ^ sz) - sz; // get the sign back
- qcoeff_ptr[rc] = x; // write to destination
- dqcoeff_ptr[rc] = x * dequant_ptr[rc != 0]; // dequantized value
+ if (x >= zbin) {
+ x += (round_ptr[rc != 0]);
+ y = ((int)(((int)(x * quant_ptr[rc != 0]) >> 16) + x))
+ >> quant_shift_ptr[rc != 0]; // quantize (x)
+ x = (y ^ sz) - sz; // get the sign back
+ qcoeff_ptr[rc] = x; // write to destination
+ dqcoeff_ptr[rc] = x * dequant_ptr[rc != 0]; // dequantized value
- if (y) {
- eob = i; // last nonzero coeffs
- zero_run = 0;
+ if (y) {
+ eob = i; // last nonzero coeffs
+ zero_run = 0;
+ }
}
}
}
-
d->eob = eob + 1;
}
@@ -324,7 +332,7 @@
}
static void quantize(int16_t *zbin_boost_orig_ptr,
- int16_t *coeff_ptr, int n_coeffs, int max_coeffs,
+ int16_t *coeff_ptr, int n_coeffs, int skip_block,
int16_t *zbin_ptr, int16_t *round_ptr, int16_t *quant_ptr,
uint8_t *quant_shift_ptr,
int16_t *qcoeff_ptr, int16_t *dqcoeff_ptr,
@@ -340,27 +348,30 @@
vpx_memset(dqcoeff_ptr, 0, n_coeffs*sizeof(int16_t));
eob = -1;
- for (i = 0; i < max_coeffs; i++) {
- rc = scan[i];
- z = coeff_ptr[rc] * mul;
- zbin = (zbin_ptr[rc != 0] + zbin_boost_ptr[zero_run] + zbin_oq_value);
- zero_run += (zero_run < 15);
+ if (!skip_block) {
+ for (i = 0; i < n_coeffs; i++) {
+ rc = scan[i];
+ z = coeff_ptr[rc] * mul;
- sz = (z >> 31); // sign of z
- x = (z ^ sz) - sz; // x = abs(z)
+ zbin = (zbin_ptr[rc != 0] + zbin_boost_ptr[zero_run] + zbin_oq_value);
+ zero_run += (zero_run < 15);
- if (x >= zbin) {
- x += (round_ptr[rc!=0]);
- y = ((int)(((int)(x * quant_ptr[rc != 0]) >> 16) + x))
- >> quant_shift_ptr[rc!=0]; // quantize (x)
- x = (y ^ sz) - sz; // get the sign back
- qcoeff_ptr[rc] = x; // write to destination
- dqcoeff_ptr[rc] = x * dequant_ptr[rc != 0] / mul; // dequantized value
+ sz = (z >> 31); // sign of z
+ x = (z ^ sz) - sz; // x = abs(z)
- if (y) {
- eob = i; // last nonzero coeffs
- zero_run = 0;
+ if (x >= zbin) {
+ x += (round_ptr[rc != 0]);
+ y = ((int)(((int)(x * quant_ptr[rc != 0]) >> 16) + x))
+ >> quant_shift_ptr[rc != 0]; // quantize (x)
+ x = (y ^ sz) - sz; // get the sign back
+ qcoeff_ptr[rc] = x; // write to destination
+ dqcoeff_ptr[rc] = x * dequant_ptr[rc != 0] / mul; // dequantized value
+
+ if (y) {
+ eob = i; // last nonzero coeffs
+ zero_run = 0;
+ }
}
}
}
@@ -371,7 +382,7 @@
void vp9_regular_quantize_b_16x16(BLOCK *b, BLOCKD *d) {
quantize(b->zrun_zbin_boost,
b->coeff,
- 256, b->eob_max_offset_16x16,
+ 256, b->skip_block,
b->zbin, b->round, b->quant, b->quant_shift,
d->qcoeff,
d->dqcoeff,
@@ -381,36 +392,41 @@
}
void vp9_quantize_sby_32x32(MACROBLOCK *x) {
- x->e_mbd.block[0].eob = 0;
- quantize(x->block[0].zrun_zbin_boost,
+ MACROBLOCKD *xd = &x->e_mbd;
+ BLOCK *b = &x->block[0];
+ BLOCKD *d = &xd->block[0];
+
+ d->eob = 0;
+ quantize(b->zrun_zbin_boost,
x->sb_coeff_data.coeff,
- 1024, x->block[0].eob_max_offset_32x32,
- x->block[0].zbin,
- x->block[0].round, x->block[0].quant, x->block[0].quant_shift,
- x->e_mbd.sb_coeff_data.qcoeff,
- x->e_mbd.sb_coeff_data.dqcoeff,
- x->e_mbd.block[0].dequant,
- x->block[0].zbin_extra,
- &x->e_mbd.block[0].eob,
+ 1024, b->skip_block,
+ b->zbin,
+ b->round, b->quant, b->quant_shift,
+ xd->sb_coeff_data.qcoeff,
+ xd->sb_coeff_data.dqcoeff,
+ d->dequant,
+ b->zbin_extra,
+ &d->eob,
vp9_default_zig_zag1d_32x32, 2);
}
void vp9_quantize_sbuv_16x16(MACROBLOCK *x) {
int i;
+ MACROBLOCKD *xd = &x->e_mbd;
- x->e_mbd.block[16].eob = 0;
- x->e_mbd.block[20].eob = 0;
+ xd->block[16].eob = 0;
+ xd->block[20].eob = 0;
for (i = 16; i < 24; i += 4)
quantize(x->block[i].zrun_zbin_boost,
x->sb_coeff_data.coeff + 1024 + (i - 16) * 64,
- 256, x->block[i].eob_max_offset_16x16,
+ 256, x->block[i].skip_block,
x->block[i].zbin,
x->block[i].round, x->block[0].quant, x->block[i].quant_shift,
- x->e_mbd.sb_coeff_data.qcoeff + 1024 + (i - 16) * 64,
- x->e_mbd.sb_coeff_data.dqcoeff + 1024 + (i - 16) * 64,
- x->e_mbd.block[i].dequant,
+ xd->sb_coeff_data.qcoeff + 1024 + (i - 16) * 64,
+ xd->sb_coeff_data.dqcoeff + 1024 + (i - 16) * 64,
+ xd->block[i].dequant,
x->block[i].zbin_extra,
- &x->e_mbd.block[i].eob,
+ &xd->block[i].eob,
vp9_default_zig_zag1d_16x16, 1);
}
@@ -557,17 +573,8 @@
x->block[i].zbin_extra = (int16_t)zbin_extra;
// Segment skip feature.
- if (vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)) {
- x->block[i].eob_max_offset = 0;
- x->block[i].eob_max_offset_8x8 = 0;
- x->block[i].eob_max_offset_16x16 = 0;
- x->block[i].eob_max_offset_32x32 = 0;
- } else {
- x->block[i].eob_max_offset = 16;
- x->block[i].eob_max_offset_8x8 = 64;
- x->block[i].eob_max_offset_16x16 = 256;
- x->block[i].eob_max_offset_32x32 = 1024;
- }
+ x->block[i].skip_block =
+ vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP);
}
// UV
@@ -583,19 +590,11 @@
x->block[i].round = cpi->UVround[QIndex];
x->e_mbd.block[i].dequant = cpi->common.UVdequant[QIndex];
x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex];
-
x->block[i].zbin_extra = (int16_t)zbin_extra;
// Segment skip feature.
- if (vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)) {
- x->block[i].eob_max_offset = 0;
- x->block[i].eob_max_offset_8x8 = 0;
- x->block[i].eob_max_offset_16x16 = 0;
- } else {
- x->block[i].eob_max_offset = 16;
- x->block[i].eob_max_offset_8x8 = 64;
- x->block[i].eob_max_offset_16x16 = 256;
- }
+ x->block[i].skip_block =
+ vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP);
}
// Y2
@@ -614,13 +613,8 @@
// TBD perhaps not use for Y2
// Segment skip feature.
- if (vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)) {
- x->block[24].eob_max_offset = 0;
- x->block[24].eob_max_offset_8x8 = 0;
- } else {
- x->block[24].eob_max_offset = 16;
- x->block[24].eob_max_offset_8x8 = 4;
- }
+ x->block[24].skip_block =
+ vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP);
/* save this macroblock QIndex for vp9_update_zbin_extra() */
x->e_mbd.q_index = QIndex;
--
⑨