summaryrefslogtreecommitdiff
path: root/vp8
diff options
context:
space:
mode:
authorPaul Wilkins <paulwilkins@google.com>2011-12-12 18:27:25 +0000
committerPaul Wilkins <paulwilkins@google.com>2011-12-19 09:27:19 +0000
commitfb807776a2bb56630311d72affb9fcb34c42dad0 (patch)
treec53767d36bb2a0d78df46fe6285e7a5e8b4e9113 /vp8
parentb3ade15a268ffdd4eea7fcbb2c0ecaca51e64294 (diff)
downloadlibvpx-fb807776a2bb56630311d72affb9fcb34c42dad0.tar
libvpx-fb807776a2bb56630311d72affb9fcb34c42dad0.tar.gz
libvpx-fb807776a2bb56630311d72affb9fcb34c42dad0.tar.bz2
libvpx-fb807776a2bb56630311d72affb9fcb34c42dad0.zip
Further QIndex realted Fixes:
Added code to support 256 index steps instead of 128 but disabled for now. Replace hard wired table vp8cx_base_skip_false_prob[128] Observed Qindex problem with setting minimum loop filter value. (Experiment code using real Q in place but for now just returning 0. This has a big beneficial effect on some clips, particularly waterfall which shows 5% ssim gain) Change-Id: I2f7117de8adc1797164c106aa13effc900a1467e
Diffstat (limited to 'vp8')
-rw-r--r--vp8/common/onyxc_int.h9
-rw-r--r--vp8/common/quant_common.c29
-rw-r--r--vp8/common/seg_common.c3
-rw-r--r--vp8/common/seg_common.h1
-rw-r--r--vp8/decoder/decodframe.c2
-rw-r--r--vp8/encoder/bitstream.c24
-rw-r--r--vp8/encoder/onyx_if.c81
-rw-r--r--vp8/encoder/onyx_int.h2
-rw-r--r--vp8/encoder/picklpf.c9
-rw-r--r--vp8/encoder/rdopt.c2
10 files changed, 111 insertions, 51 deletions
diff --git a/vp8/common/onyxc_int.h b/vp8/common/onyxc_int.h
index 01759b033..64c305a8d 100644
--- a/vp8/common/onyxc_int.h
+++ b/vp8/common/onyxc_int.h
@@ -32,7 +32,16 @@
void vp8_initialize_common(void);
#define MINQ 0
+
+/*#if CONFIG_EXTEND_QRANGE
+#define MAXQ 255
+#define QINDEX_BITS 8
+#else*/
#define MAXQ 127
+#define QINDEX_BITS 7
+//#endif
+
+
#define QINDEX_RANGE (MAXQ + 1)
#define NUM_YV12_BUFFERS 4
diff --git a/vp8/common/quant_common.c b/vp8/common/quant_common.c
index 79c40d630..2b5488a49 100644
--- a/vp8/common/quant_common.c
+++ b/vp8/common/quant_common.c
@@ -84,6 +84,10 @@ static int ac_qlookup[QINDEX_RANGE] =
155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209,
213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,
};
+
+//static int dc_qlookup[QINDEX_RANGE];
+//static int ac_qlookup[QINDEX_RANGE];
+
#endif
#if CONFIG_EXTEND_QRANGE
@@ -109,6 +113,7 @@ void vp8_init_quant_tables()
{
ac_qlookup[i] = current_val;
current_val = (int)((double)current_val * 1.042);
+ //current_val = (int)((double)current_val * 1.01765);
if ( current_val == last_val )
current_val++;
last_val = current_val;
@@ -132,8 +137,8 @@ int vp8_dc_quant(int QIndex, int Delta)
QIndex = QIndex + Delta;
- if (QIndex > 127)
- QIndex = 127;
+ if (QIndex > MAXQ)
+ QIndex = MAXQ;
else if (QIndex < 0)
QIndex = 0;
@@ -147,8 +152,8 @@ int vp8_dc2quant(int QIndex, int Delta)
QIndex = QIndex + Delta;
- if (QIndex > 127)
- QIndex = 127;
+ if (QIndex > MAXQ)
+ QIndex = MAXQ;
else if (QIndex < 0)
QIndex = 0;
@@ -166,8 +171,8 @@ int vp8_dc_uv_quant(int QIndex, int Delta)
QIndex = QIndex + Delta;
- if (QIndex > 127)
- QIndex = 127;
+ if (QIndex > MAXQ)
+ QIndex = MAXQ;
else if (QIndex < 0)
QIndex = 0;
@@ -180,8 +185,8 @@ int vp8_ac_yquant(int QIndex)
{
int retval;
- if (QIndex > 127)
- QIndex = 127;
+ if (QIndex > MAXQ)
+ QIndex = MAXQ;
else if (QIndex < 0)
QIndex = 0;
@@ -195,8 +200,8 @@ int vp8_ac2quant(int QIndex, int Delta)
QIndex = QIndex + Delta;
- if (QIndex > 127)
- QIndex = 127;
+ if (QIndex > MAXQ)
+ QIndex = MAXQ;
else if (QIndex < 0)
QIndex = 0;
#if !CONFIG_EXTEND_QRANGE
@@ -216,8 +221,8 @@ int vp8_ac_uv_quant(int QIndex, int Delta)
QIndex = QIndex + Delta;
- if (QIndex > 127)
- QIndex = 127;
+ if (QIndex > MAXQ)
+ QIndex = MAXQ;
else if (QIndex < 0)
QIndex = 0;
diff --git a/vp8/common/seg_common.c b/vp8/common/seg_common.c
index ee9ead4a5..cab642abc 100644
--- a/vp8/common/seg_common.c
+++ b/vp8/common/seg_common.c
@@ -12,7 +12,8 @@
//#if CONFIG_SEGFEATURES
const int segfeaturedata_signed[SEG_LVL_MAX] = {1, 1, 0, 0, 0, 0};
-const int vp8_seg_feature_data_bits[SEG_LVL_MAX] = {7, 6, 4, 4, 6, 2};
+const int vp8_seg_feature_data_bits[SEG_LVL_MAX] =
+ {QINDEX_BITS, 6, 4, 4, 6, 2};
// These functions provide access to new segment level features.
// Eventually these function may be "optimized out" but for the moment,
diff --git a/vp8/common/seg_common.h b/vp8/common/seg_common.h
index 876b806ad..6bd03eed8 100644
--- a/vp8/common/seg_common.h
+++ b/vp8/common/seg_common.h
@@ -9,6 +9,7 @@
*/
#include "type_aliases.h"
+#include "onyxc_int.h"
#include "vp8/common/blockd.h"
#ifndef __INC_SEG_COMMON_H__
diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c
index 0659f9308..6e8284f46 100644
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -1204,7 +1204,7 @@ int vp8_decode_frame(VP8D_COMP *pbi)
{
int Q, q_update;
- Q = vp8_read_literal(bc, 7); /* AC 1st order Q = default */
+ Q = vp8_read_literal(bc, QINDEX_BITS); /* AC 1st order Q = default */
pc->base_qindex = Q;
q_update = 0;
pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update);
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c
index 6f92ff0a7..cad4ef2d6 100644
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -28,26 +28,6 @@
//#if CONFIG_SEGFEATURES
#include "vp8/common/seg_common.h"
-const int vp8cx_base_skip_false_prob[128] =
-{
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 251, 248, 244, 240, 236, 232, 229, 225,
- 221, 217, 213, 208, 204, 199, 194, 190,
- 187, 183, 179, 175, 172, 168, 164, 160,
- 157, 153, 149, 145, 142, 138, 134, 130,
- 127, 124, 120, 117, 114, 110, 107, 104,
- 101, 98, 95, 92, 89, 86, 83, 80,
- 77, 74, 71, 68, 65, 62, 59, 56,
- 53, 50, 47, 44, 41, 38, 35, 32,
- 30, 28, 26, 24, 22, 20, 18, 16,
-};
-
#if defined(SECTIONBITS_OUTPUT)
unsigned __int64 Sectionbits[500];
#endif
@@ -2252,8 +2232,8 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
//signal here is multi token partition is enabled
vp8_write_literal(bc, pc->multi_token_partition, 2);
- // Frame Qbaseline quantizer index
- vp8_write_literal(bc, pc->base_qindex, 7);
+ // Frame Q baseline quantizer index
+ vp8_write_literal(bc, pc->base_qindex, QINDEX_BITS);
// Transmit Dc, Second order and Uv quantizer delta information
put_delta_q(bc, pc->y1dc_delta_q);
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 0b3e83bb3..4b97ed4fe 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -157,10 +157,33 @@ extern unsigned int inter_b_modes[B_MODE_COUNT];
extern void (*vp8_short_fdct4x4)(short *input, short *output, int pitch);
extern void (*vp8_short_fdct8x4)(short *input, short *output, int pitch);
-extern const int qrounding_factors[129];
-extern const int qzbin_factors[129];
extern void vp8cx_init_quantizer(VP8_COMP *cpi);
-extern const int vp8cx_base_skip_false_prob[128];
+
+/*#if CONFIG_EXTEND_QRANGE
+int vp8cx_base_skip_false_prob[QINDEX_RANGE];
+#else
+int vp8cx_base_skip_false_prob[QINDEX_RANGE] =
+{
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 251, 248, 244, 240, 236, 232, 229, 225,
+ 221, 217, 213, 208, 204, 199, 194, 190,
+ 187, 183, 179, 175, 172, 168, 164, 160,
+ 157, 153, 149, 145, 142, 138, 134, 130,
+ 127, 124, 120, 117, 114, 110, 107, 104,
+ 101, 98, 95, 92, 89, 86, 83, 80,
+ 77, 74, 71, 68, 65, 62, 59, 56,
+ 53, 50, 47, 44, 41, 38, 35, 32,
+ 30, 28, 26, 24, 22, 20, 18, 16,
+
+};
+#endif*/
+int vp8cx_base_skip_false_prob[QINDEX_RANGE];
// Tables relating active max Q to active min Q
static int kf_low_motion_minq[QINDEX_RANGE];
@@ -243,6 +266,28 @@ void init_minq_luts()
}
}
+void init_base_skip_probs()
+{
+ int i;
+ double q;
+ int skip_prob;
+
+ for ( i = 0; i < QINDEX_RANGE; i++ )
+ {
+ q = vp8_convert_qindex_to_q(i);
+
+ // Exponential decay caluclation of baseline skip prob with clamping
+ // Based on crude best fit of old table.
+ skip_prob = (int)( 564.25 * pow( 2.71828, (-0.012*q) ) );
+ if ( skip_prob < 1 )
+ skip_prob = 1;
+ else if ( skip_prob > 255 )
+ skip_prob = 255;
+
+ vp8cx_base_skip_false_prob[i] = skip_prob;
+ }
+}
+
void vp8_initialize()
{
static int init_done = 0;
@@ -258,6 +303,7 @@ void vp8_initialize()
#endif
vp8_init_me_luts();
init_minq_luts();
+ init_base_skip_probs();
init_done = 1;
}
}
@@ -1829,7 +1875,25 @@ void vp8_alloc_compressor_data(VP8_COMP *cpi)
}
-// Quant MOD
+// TODO perhaps change number of steps expose to outside world when setting
+// max and min limits. Also this will likely want refining for the extended Q
+// range.
+//
+// Table that converts 0-63 Q range values passed in outside to the Qindex
+// range used internally.
+/*#if CONFIG_EXTEND_QRANGE
+static const int q_trans[] =
+{
+ 0, 4, 8, 12, 16, 20, 24, 28,
+ 32, 36, 40, 44, 48, 52, 56, 60,
+ 64, 68, 72, 76, 80, 84, 88, 92,
+ 96, 100, 104, 108, 112, 116, 120, 124,
+ 128, 132, 136, 140, 144, 148, 152, 156,
+ 160, 164, 168, 172, 176, 180, 184, 188,
+ 192, 196, 200, 204, 208, 212, 216, 220,
+ 224, 228, 232, 236, 240, 244, 249, 255,
+};
+#else*/
static const int q_trans[] =
{
0, 1, 2, 3, 4, 5, 7, 8,
@@ -1841,6 +1905,7 @@ static const int q_trans[] =
82, 85, 88, 91, 94, 97, 100, 103,
106, 109, 112, 115, 118, 121, 124, 127,
};
+//#endif
int vp8_reverse_trans(int x)
{
@@ -4292,11 +4357,6 @@ static void encode_frame_to_data_rate
{
vp8_clear_system_state(); //__asm emms;
- /*
- if(cpi->is_src_frame_alt_ref)
- Q = 127;
- */
-
vp8_set_quantizer(cpi, Q);
this_q = Q;
@@ -4344,7 +4404,8 @@ static void encode_frame_to_data_rate
*/
}
- //as this is for cost estimate, let's make sure it does not go extreme eitehr way
+ // as this is for cost estimate, let's make sure it does not
+ // get extreme either way
if (cpi->prob_skip_false < 5)
cpi->prob_skip_false = 5;
diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h
index e2c4db6b9..f47a46408 100644
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -599,7 +599,7 @@ typedef struct VP8_COMP
unsigned int time_pick_lpf;
unsigned int time_encode_mb_row;
- int base_skip_false_prob[128];
+ int base_skip_false_prob[QINDEX_RANGE];
struct twopass_rc
{
diff --git a/vp8/encoder/picklpf.c b/vp8/encoder/picklpf.c
index 008461964..e42da0c96 100644
--- a/vp8/encoder/picklpf.c
+++ b/vp8/encoder/picklpf.c
@@ -107,18 +107,21 @@ static int vp8_calc_partial_ssl_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONF
static int get_min_filter_level(VP8_COMP *cpi, int base_qindex)
{
int min_filter_level;
+ /*int q = (int) vp8_convert_qindex_to_q(base_qindex);
if (cpi->source_alt_ref_active && cpi->common.refresh_golden_frame && !cpi->common.refresh_alt_ref_frame)
min_filter_level = 0;
else
{
- if (base_qindex <= 6)
+ if (q <= 10)
min_filter_level = 0;
- else if (base_qindex <= 16)
+ else if (q <= 64)
min_filter_level = 1;
else
- min_filter_level = (base_qindex / 8);
+ min_filter_level = (q >> 6);
}
+ */
+ min_filter_level = 0;
return min_filter_level;
}
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index c3d4145df..10d6e3cdb 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -278,7 +278,7 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int QIndex)
// for key frames, golden frames and arf frames.
// if (cpi->common.refresh_golden_frame ||
// cpi->common.refresh_alt_ref_frame)
- QIndex=(QIndex<0)? 0 : ((QIndex>127)?127 : QIndex);
+ QIndex=(QIndex<0)? 0 : ((QIndex>MAXQ)?MAXQ : QIndex);
cpi->RDMULT = compute_rd_mult(QIndex);