Commit 5b42ae09 authored by Yaowu Xu's avatar Yaowu Xu

experiment extending the quantizer range

Prior to this change, VP8 min quantizer is 4, which caps the
highest quality around 51DB. This experimental change extends
the min quantizer to 1, removes the cap and allows the highest
quality to be around ~73DB, consistent with the fdct/idct round trip
error. To test this change, at configure time use options:

--enable-experimental --enable-extend_qrange

The following is a brief log of changes in each of the patch sets

patch set 1:
In this commit, the quantization/dequantization constants are kept
unchanged, instead scaling factor 4 is rolled into fdct/idct.
Fixed Q0 encoding tests on mobile:
  Before:    9560.567kbps Overall PSNR:50.255DB VPXSSIM:98.288
  Now:   18035.774kbps Overall PSNR:73.022DB VPXSSIM:99.991

patch set 2:
regenerated dc/ac quantizer lookup tables based on the scaling
factor rolled in the fdct/idct. Also slightly extended the range
towards the high quantizer end.

patch set 3:
slightly tweaked the quantizer tables and generated bits_per_mb
table based on Paul's suggestions.

patch set 4:
fix a typo in idct, re-calculated tables relating active max Q
to active min Q

patch set 5:
added rdmult lookup table based on Q

patch set 6:
fix rdmult scale: dct coefficient has scaled up by 4

patch set 7:
make transform coefficients to be within 16bits

patch set 8:
normalize 2nd order quantizers

patch set 9:
fix mis-spellings

patch set 10:
change the configure script and macros to allow experimental code
to be enabled at configure time with --enable-extend_qrange

patch set 11:
rebase for merge

Change-Id: Ib50641ddd44aba2a52ed890222c309faa31cc59c
parent ae4db164
......@@ -214,6 +214,7 @@ HAVE_LIST="
sys_mman_h
"
EXPERIMENT_LIST="
extend_qrange
"
CONFIG_LIST="
external_build
......
......@@ -83,8 +83,18 @@ void vp8_machine_specific_config(VP8_COMMON *ctx)
vp8_arch_x86_common_init(ctx);
#endif
#if ARCH_ARM
vp8_arch_arm_common_init(ctx);
#endif
#if CONFIG_EXTEND_QRANGE
rtcd->idct.idct1 = vp8_short_idct4x4llm_1_c;
rtcd->idct.idct16 = vp8_short_idct4x4llm_c;
rtcd->idct.idct1_scalar_add = vp8_dc_only_idct_add_c;
rtcd->idct.iwalsh1 = vp8_short_inv_walsh4x4_1_c;
rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_c;
#endif
}
......@@ -22,6 +22,8 @@
* so
* x * sqrt(2) * cos (pi/8) = x + x * (sqrt(2) *cos(pi/8)-1).
**************************************************************************/
#include "vpx_ports/config.h"
static const int cospi8sqrt2minus1 = 20091;
static const int sinpi8sqrt2 = 35468;
static const int rounding = 0;
......@@ -75,11 +77,19 @@ void vp8_short_idct4x4llm_c(short *input, short *output, int pitch)
d1 = temp1 + temp2;
#if !CONFIG_EXTEND_QRANGE
op[0] = (a1 + d1 + 4) >> 3;
op[3] = (a1 - d1 + 4) >> 3;
op[1] = (b1 + c1 + 4) >> 3;
op[2] = (b1 - c1 + 4) >> 3;
#else
op[0] = (a1 + d1 + 16) >> 5;
op[3] = (a1 - d1 + 16) >> 5;
op[1] = (b1 + c1 + 16) >> 5;
op[2] = (b1 - c1 + 16) >> 5;
#endif
ip += shortpitch;
op += shortpitch;
......@@ -92,8 +102,11 @@ void vp8_short_idct4x4llm_1_c(short *input, short *output, int pitch)
int a1;
short *op = output;
int shortpitch = pitch >> 1;
#if !CONFIG_EXTEND_QRANGE
a1 = ((input[0] + 4) >> 3);
#else
a1 = ((input[0] + 16) >> 5);
#endif
for (i = 0; i < 4; i++)
{
op[0] = a1;
......@@ -106,7 +119,11 @@ void vp8_short_idct4x4llm_1_c(short *input, short *output, int pitch)
void vp8_dc_only_idct_add_c(short input_dc, unsigned char *pred_ptr, unsigned char *dst_ptr, int pitch, int stride)
{
#if !CONFIG_EXTEND_QRANGE
int a1 = ((input_dc + 4) >> 3);
#else
int a1 = ((input_dc + 16) >> 5);
#endif
int r, c;
for (r = 0; r < 4; r++)
......@@ -168,11 +185,17 @@ void vp8_short_inv_walsh4x4_c(short *input, short *output)
c2 = a1 - b1;
d2 = d1 - c1;
#if !CONFIG_EXTEND_QRANGE
op[0] = (a2 + 3) >> 3;
op[1] = (b2 + 3) >> 3;
op[2] = (c2 + 3) >> 3;
op[3] = (d2 + 3) >> 3;
#else
op[0] = (a2 + 1) >> 2;
op[1] = (b2 + 1) >> 2;
op[2] = (c2 + 1) >> 2;
op[3] = (d2 + 1) >> 2;
#endif
ip += 4;
op += 4;
}
......@@ -184,7 +207,11 @@ void vp8_short_inv_walsh4x4_1_c(short *input, short *output)
int a1;
short *op = output;
a1 = ((input[0] + 3) >> 3);
#if !CONFIG_EXTEND_QRANGE
a1 = (input[0] + 3 )>> 3;
#else
a1 = (input[0] + 1 )>> 2;
#endif
for (i = 0; i < 4; i++)
{
......
......@@ -11,6 +11,8 @@
#include "quant_common.h"
#if !CONFIG_EXTEND_QRANGE
static const int dc_qlookup[QINDEX_RANGE] =
{
4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17,
......@@ -34,7 +36,32 @@ static const 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,
};
#else
static const int dc_qlookup[QINDEX_RANGE] =
{
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 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, 205, 210, 215, 220,
225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300,
310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460,
472, 484, 496, 508, 520, 532, 544, 556, 572, 588, 608, 628, 648, 668, 692, 720,
};
static const int ac_qlookup[QINDEX_RANGE] =
{
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 51,
54, 57, 60, 63, 66, 69, 72, 76, 80, 84, 88, 92, 96, 100, 105, 110,
115, 120, 125, 130, 135, 140, 146, 152, 158, 164, 170, 176, 182, 188, 194, 200,
206, 212, 218, 224, 232, 240, 248, 256, 264, 272, 280, 288, 296, 304, 312, 320,
330, 340, 350, 360, 370, 380, 392, 404, 416, 428, 440, 454, 468, 482, 496, 510,
524, 540, 556, 572, 588, 604, 622, 640, 658, 676, 696, 716, 736, 756, 776, 796,
820, 844, 868, 892, 916, 944, 972, 1000, 1032, 1064, 1096, 1128, 1168, 1208, 1252, 1300
};
#endif
int vp8_dc_quant(int QIndex, int Delta)
{
......@@ -62,7 +89,11 @@ int vp8_dc2quant(int QIndex, int Delta)
else if (QIndex < 0)
QIndex = 0;
#if !CONFIG_EXTEND_QRANGE
retval = dc_qlookup[ QIndex ] * 2;
#else
retval = dc_qlookup[ QIndex ];
#endif
return retval;
}
......@@ -72,16 +103,13 @@ int vp8_dc_uv_quant(int QIndex, int Delta)
QIndex = QIndex + Delta;
if (QIndex > 127)
QIndex = 127;
if (QIndex > 117)
QIndex = 117;
else if (QIndex < 0)
QIndex = 0;
retval = dc_qlookup[ QIndex ];
if (retval > 132)
retval = 132;
return retval;
}
......@@ -108,12 +136,13 @@ int vp8_ac2quant(int QIndex, int Delta)
QIndex = 127;
else if (QIndex < 0)
QIndex = 0;
#if !CONFIG_EXTEND_QRANGE
retval = (ac_qlookup[ QIndex ] * 155) / 100;
if (retval < 8)
retval = 8;
#else
retval = ac_qlookup[ QIndex ];
#endif
return retval;
}
int vp8_ac_uv_quant(int QIndex, int Delta)
......
......@@ -39,7 +39,16 @@ void vp8_dmachine_specific_config(VP8D_COMP *pbi)
vp8_arch_x86_decode_init(pbi);
#endif
#if ARCH_ARM
vp8_arch_arm_decode_init(pbi);
#endif
#if CONFIG_EXTEND_QRANGE
pbi->dequant.idct_add = vp8_dequant_idct_add_c;
pbi->dequant.dc_idct_add = vp8_dequant_dc_idct_add_c;
pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_c;
pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_c;
pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_c;
#endif
}
......@@ -10,7 +10,7 @@
#include <math.h>
#include "vpx_ports/config.h"
void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
{
int i;
......@@ -20,11 +20,17 @@ void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
for (i = 0; i < 4; i++)
{
#if CONFIG_EXTEND_QRANGE
a1 = ((ip[0] + ip[3])<<5);
b1 = ((ip[1] + ip[2])<<5);
c1 = ((ip[1] - ip[2])<<5);
d1 = ((ip[0] - ip[3])<<5);
#else
a1 = ((ip[0] + ip[3])<<3);
b1 = ((ip[1] + ip[2])<<3);
c1 = ((ip[1] - ip[2])<<3);
d1 = ((ip[0] - ip[3])<<3);
#endif
op[0] = a1 + b1;
op[2] = a1 - b1;
......@@ -72,12 +78,22 @@ void vp8_short_walsh4x4_c(short *input, short *output, int pitch)
for (i = 0; i < 4; i++)
{
#if !CONFIG_EXTEND_QRANGE
a1 = ((ip[0] + ip[2])<<2);
d1 = ((ip[1] + ip[3])<<2);
c1 = ((ip[1] - ip[3])<<2);
b1 = ((ip[0] - ip[2])<<2);
op[0] = a1 + d1 + (a1!=0);
#else
a1 = ((ip[0] + ip[2]));
d1 = ((ip[1] + ip[3]));
c1 = ((ip[1] - ip[3]));
b1 = ((ip[0] - ip[2]));
op[0] = a1 + d1;
#endif
op[1] = b1 + c1;
op[2] = b1 - c1;
op[3] = a1 - d1;
......@@ -105,11 +121,17 @@ void vp8_short_walsh4x4_c(short *input, short *output, int pitch)
c2 += c2<0;
d2 += d2<0;
#if !CONFIG_EXTEND_QRANGE
op[0] = (a2+3) >> 3;
op[4] = (b2+3) >> 3;
op[8] = (c2+3) >> 3;
op[12]= (d2+3) >> 3;
#else
op[0] = (a2+1) >> 2;
op[4] = (b2+1) >> 2;
op[8] = (c2+1) >> 2;
op[12]= (d2+1) >> 2;
#endif
ip++;
op++;
}
......
......@@ -709,7 +709,7 @@ void vp8_encode_frame(VP8_COMP *cpi)
vp8_auto_select_speed(cpi);
}
vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
vp8_initialize_rd_consts(cpi, cm->base_qindex + cm->y1dc_delta_q);
vp8cx_initialize_me_consts(cpi, cm->base_qindex);
// Copy data over into macro block data sturctures.
......
......@@ -245,7 +245,11 @@ struct vp8_token_state{
// TODO: experiments to find optimal multiple numbers
#define Y1_RD_MULT 4
#define UV_RD_MULT 2
#if !CONFIG_EXTEND_QRANGE
#define Y2_RD_MULT 16
#else
#define Y2_RD_MULT 4
#endif
static const int plane_rd_mult[4]=
{
......
......@@ -578,7 +578,7 @@ void vp8_first_pass(VP8_COMP *cpi)
//if ( 0 )
{
int flag[2] = {1, 1};
vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
vp8_initialize_rd_consts(cpi, cm->base_qindex+cm->y1dc_delta_q);
vpx_memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
}
......
......@@ -111,4 +111,12 @@ void vp8_cmachine_specific_config(VP8_COMP *cpi)
vp8_arch_arm_encoder_init(cpi);
#endif
#if CONFIG_EXTEND_QRANGE
cpi->rtcd.fdct.short4x4 = vp8_short_fdct4x4_c;
cpi->rtcd.fdct.short8x4 = vp8_short_fdct8x4_c;
cpi->rtcd.fdct.fast4x4 = vp8_short_fdct4x4_c;
cpi->rtcd.fdct.fast8x4 = vp8_short_fdct8x4_c;
cpi->rtcd.fdct.walsh_short4x4 = vp8_short_walsh4x4_c;
#endif
}
......@@ -151,7 +151,7 @@ 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
// Tables relating active max Q to active min Q
static const int kf_low_motion_minq[QINDEX_RANGE] =
{
......@@ -219,7 +219,76 @@ static const int inter_minq[QINDEX_RANGE] =
71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
};
#else
static const int kf_low_motion_minq[QINDEX_RANGE] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8,
9, 9, 9, 10,10,11,11,12,12,13,13,14,14,15,15,16,
16,17,17,18,18,19,19,20,20,21,21,22,23,23,24,24,
25,25,26,27,28,29,30,30,31,32,33,34,35,35,36,36,
38,38,39,40,40,41,42,42,43,44,44,45,46,46,47,48,
49,49,50,50,51,52,52,53,54,55,56,57,58,59,60,61,
};
static const int kf_high_motion_minq[QINDEX_RANGE] =
{
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6,
6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,10,
11,11,12,13,14,15,16,17,18,19,20,21,22,23,24,24,
25,26,27,28,28,29,29,30,30,31,31,32,33,33,34,34,
35,36,37,38,39,39,40,41,41,42,43,44,45,45,46,46,
47,47,48,48,49,49,50,50,51,51,52,52,53,53,54,54,
55,55,56,56,57,58,59,60,61,62,63,64,65,67,69,70,
};
static const int gf_low_motion_minq[QINDEX_RANGE] =
{
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4,
4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9,
10,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,
17,18,18,19,19,20,21,22,23,24,25,26,27,29,29,30,
31,32,33,34,35,36,37,38,39,40,41,41,42,42,43,43,
44,44,45,45,46,46,47,47,48,48,49,49,50,50,51,51,
52,52,53,53,54,54,55,55,56,56,57,57,58,59,60,61,
62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,
};
static const int gf_mid_motion_minq[QINDEX_RANGE] =
{
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4,
4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9,10,
10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,
18,19,19,20,20,21,22,23,24,25,26,27,28,29,30,31,
32,33,34,35,35,36,36,37,37,38,38,39,39,40,40,41,
41,42,42,43,43,44,44,45,45,46,46,47,48,49,50,51,
52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,
};
static const int gf_high_motion_minq[QINDEX_RANGE] =
{
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4,
4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9,10,10,
11,11,12,12,13,14,15,16,17,18,18,19,19,20,20,21,
22,23,24,25,26,26,27,28,29,30,31,32,33,34,35,36,
37,38,39,39,40,40,40,41,41,41,42,42,43,43,44,44,
44,45,45,45,46,46,47,47,47,48,48,48,49,49,49,50,
50,50,51,51,52,53,54,54,55,56,57,57,58,59,60,61,
62,63,64,66,68,69,72,74,77,80,82,85,87,89,91,93,
};
static const int inter_minq[QINDEX_RANGE] =
{
0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
8, 9,10,11,12,13,14,15,16,17,18,18,19,19,20,21,
21,22,23,23,24,25,26,26,27,28,29,30,31,32,32,33,
34,35,36,36,37,38,39,40,40,41,41,42,43,44,44,45,
46,46,47,47,48,49,49,50,50,51,52,52,53,54,54,55,
55,56,57,57,58,59,60,60,61,62,63,63,64,65,66,67,
68,68,69,70,71,72,72,73,74,75,76,77,78,79,80,81,
81,82,83,84,85,86,87,88,89,90,90,91,92,93,94,95,
};
#endif
void vp8_initialize()
{
static int init_done = 0;
......@@ -3466,6 +3535,12 @@ static int decide_key_frame(VP8_COMP *cpi)
return code_key_frame;
}
#if !CONFIG_EXTEND_QRANGE
#define FIRSTPASS_QINDEX 26
#else
#define FIRSTPASS_QINDEX 49
#endif
#if !(CONFIG_REALTIME_ONLY)
static void Pass1Encode(VP8_COMP *cpi, unsigned long *size, unsigned char *dest, unsigned int *frame_flags)
......@@ -4107,6 +4182,17 @@ static void encode_frame_to_data_rate
vp8_clear_system_state(); //__asm emms;
#if 0
if (cpi->pass != 1)
{
FILE *f = fopen("q_used.stt", "a");
fprintf(f, "%4d, %4d, %8d\n", cpi->common.current_video_frame,
cpi->common.base_qindex, cpi->projected_frame_size);
fclose(f);
}
#endif
// Test to see if the stats generated for this frame indicate that we should have coded a key frame
// (assuming that we didn't)!
if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
......@@ -4843,10 +4929,15 @@ static void encode_frame_to_data_rate
fclose(recon_file);
}
#endif
#if 0
// DEBUG
//vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show);
if(cm->current_video_frame>173 && cm->current_video_frame<178)
{
char filename[512];
sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
vp8_write_yuv_frame(filename, cm->frame_to_show);
}
#endif
}
......@@ -5416,7 +5507,15 @@ int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned lon
cpi->totalp_v += v2;
cpi->totalp += frame_psnr2;
cpi->total_sq_error2 += sq_error;
#if 0
{
FILE *f = fopen("q_used.stt", "a");
fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
cpi->common.current_video_frame,y2, u2, v2,
frame_psnr2, frame_ssim2);
fclose(f);
}
#endif
}
}
......
......@@ -48,6 +48,7 @@ extern int inter_b_modes[10];
// Work in progress recalibration of baseline rate tables based on
// the assumption that bits per mb is inversely proportional to the
// quantizer value.
#if !CONFIG_EXTEND_QRANGE
const int vp8_bits_per_mb[2][QINDEX_RANGE] =
{
// Intra case 450000/Qintra
......@@ -89,10 +90,54 @@ const int vp8_bits_per_mb[2][QINDEX_RANGE] =
11445, 11220, 11003, 10795, 10594, 10401, 10215, 10035,
}
};
#else
const int vp8_bits_per_mb[2][QINDEX_RANGE] =
{
// (Updated DEC 2010) Baseline estimate of Bits Per MB at each Q:
// 4500000/Qintra
{
4500000,3600000,3000000,2571428,2250000,2000000,1800000,1636363,
1500000,1384615,1285714,1200000,1125000,1058823,1000000, 947368,
900000, 818181, 750000, 692307, 642857, 600000, 562500, 529411,
500000, 473684, 450000, 428571, 409090, 391304, 375000, 352941,
333333, 315789, 300000, 285714, 272727, 260869, 250000, 236842,
225000, 214285, 204545, 195652, 187500, 180000, 171428, 163636,
156521, 150000, 144000, 138461, 133333, 128571, 123287, 118421,
113924, 109756, 105882, 102272, 98901, 95744, 92783, 90000,
87378, 84905, 82568, 80357, 77586, 75000, 72580, 70312,
68181, 66176, 64285, 62500, 60810, 59210, 57692, 56250,
54545, 52941, 51428, 50000, 48648, 47368, 45918, 44554,
43269, 42056, 40909, 39647, 38461, 37344, 36290, 35294,
34351, 33333, 32374, 31468, 30612, 29801, 28938, 28125,
27355, 26627, 25862, 25139, 24456, 23809, 23195, 22613,
21951, 21327, 20737, 20179, 19650, 19067, 18518, 18000,
17441, 16917, 16423, 15957, 15410, 14900, 14376, 13846,
},
//2850000/Qinter
{
2850000,2280000,1900000,1628571,1425000,1266666,1140000,1036363,
950000, 876923, 814285, 760000, 712500, 670588, 633333, 600000,
570000, 518181, 475000, 438461, 407142, 380000, 356250, 335294,
316666, 300000, 285000, 271428, 259090, 247826, 237500, 223529,
211111, 200000, 190000, 180952, 172727, 165217, 158333, 150000,
142500, 135714, 129545, 123913, 118750, 114000, 108571, 103636,
99130, 95000, 91200, 87692, 84444, 81428, 78082, 75000,
72151, 69512, 67058, 64772, 62637, 60638, 58762, 57000,
55339, 53773, 52293, 50892, 49137, 47500, 45967, 44531,
43181, 41911, 40714, 39583, 38513, 37500, 36538, 35625,
34545, 33529, 32571, 31666, 30810, 30000, 29081, 28217,
27403, 26635, 25909, 25110, 24358, 23651, 22983, 22352,
21755, 21111, 20503, 19930, 19387, 18874, 18327, 17812,
17325, 16863, 16379, 15921, 15489, 15079, 14690, 14321,
13902, 13507, 13133, 12780, 12445, 12076, 11728, 11400,
11046, 10714, 10401, 10106, 9760, 9437, 9105, 8769,
}
};
#endif
const int vp8_kf_boost_qadjustment[QINDEX_RANGE] =
{
128, 129, 130, 131, 132, 133, 134, 135,
{
128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159,
......
......@@ -158,6 +158,48 @@ static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
// 3* dc_qlookup[Q]*dc_qlookup[Q];
#if !CONFIG_EXTEND_QRANGE
static int rdmult_lut[QINDEX_RANGE]=
{
48,75,108,147,192,243,300,300,
363,432,507,588,675,768,867,867,
972,1083,1200,1200,1323,1323,1452,1452,
1587,1587,1728,1875,1875,2028,2187,2352,
2523,2700,2883,3072,3267,3468,3675,3888,
4107,4107,4332,4563,4800,5043,5292,5547,
5808,6075,6348,6348,6627,6912,7203,7500,
7803,8112,8427,8748,9075,9408,9747,10092,
10443,10800,11163,11532,11907,12288,12675,13068,
13467,13872,14283,14700,15123,15552,15987,16428,
16875,17328,17328,17787,18252,18723,19200,19683,
20172,20667,21168,21675,22188,22707,23232,23763,
24843,25947,27075,27648,28812,30000,30603,31212,
32448,33708,34992,36300,37632,38988,40368,41772,
44652,46128,47628,49152,50700,52272,53868,55488,
57132,58800,61347,63075,65712,68403,71148,73947,
};
#else
static int rdmult_lut[QINDEX_RANGE]=
{
3,5,7,9,12,15,19,23,
27,32,37,42,48,54,61,68,
75,83,91,99,108,117,127,137,
147,169,192,217,243,271,300,331,
363,397,450,507,567,631,698,768,
842,919,999,1083,1170,1261,1355,1452,
1587,1728,1875,2028,2187,2352,2523,2700,
2883,3072,3267,3468,3675,3888,4107,4332,
4563,4800,5043,5292,5547,5808,6075,6348,
6627,6912,7203,7500,7880,8269,8667,9075,
9492,9919,10355,10800,11255,11719,12192,12675,
13167,13669,14180,14700,15230,15769,16317,16875,
18019,19200,20419,21675,22969,24300,25669,27075,
28519,30000,31519,33075,34669,36300,37969,39675,
41772,43923,46128,48387,50700,53067,55488,57963,
61347,64827,69312,73947,78732,83667,89787,97200,
};
#endif
/* values are now correlated to quantizer */
static int sad_per_bit16lut[QINDEX_RANGE] =
......@@ -205,12 +247,16 @@ void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex)
cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex];
}
void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
void vp8_initialize_rd_consts(VP8_COMP *cpi, int QIndex)
{
int q;
int i;
double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0;
double rdconst = 3.00;
int *thresh;
int threshmult;
vp8_clear_system_state(); //__asm emms;
......@@ -218,7 +264,8 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
// for key frames, golden frames and arf frames.
// if (cpi->common.refresh_golden_frame ||
// cpi->common.refresh_alt_ref_frame)
cpi->RDMULT = (int)(rdconst * (capped_q * capped_q));
QIndex=(QIndex<0)? 0 : ((QIndex>127)?127 : QIndex);
cpi->RDMULT = rdmult_lut[QIndex];
// Extend rate multiplier along side quantizer zbin increases
if (cpi->zbin_over_quant > 0)
......@@ -229,8 +276,7 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
// Experimental code using the same basic equation as used for Q above
// The units of cpi->zbin_over_quant are 1/128 of Q bin size
oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant);
modq = (int)((double)capped_q * oq_factor);
cpi->RDMULT = (int)(rdconst * (modq * modq));
cpi->RDMULT = (int)((double)cpi->RDMULT * oq_factor * oq_factor);
}
if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME))
......@@ -241,20 +287,35 @@ void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) >> 4;
}
#if !CONFIG_EXTEND_QRANGE
if (cpi->RDMULT < 125)
cpi->RDMULT = 125;
#else
if (cpi->RDMULT < 7)
cpi->RDMULT = 7;
#endif
cpi->mb.errorperbit = (cpi->RDMULT / 100);
#if CONFIG_EXTEND_QRANGE
if(cpi->mb.errorperbit<1)
cpi->mb.errorperbit=1;
#endif
vp8_set_speed_features(cpi);
if (cpi->common.simpler_lpf)
cpi->common.filter_type = SIMPLE_LOOPFILTER;
q = (int)pow(Qvalue, 1.25);
q = (int)pow(vp8_dc_quant(QIndex,0), 1.25);
if (q < 8)
q = 8;
#if CONFIG_EXTEND_QRANGE
cpi->RDMULT *= 16;
#endif
if (cpi->RDMULT > 1000)
{
cpi->RDDIV = 1;
......@@ -972,7 +1033,11 @@ static void macro_block_yrd(MACROBLOCK *mb, int *Rate, int *Distortion, const vp
// Distortion
d = ENCODEMB_INVOKE(rtcd, mberr)(mb, 1) << 2;
#if CONFIG_EXTEND_QRANGE
d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff)<<2;
#else
d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff);
#endif
*Distortion = (d >> 4);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please