Adjust q range
Skip Q values between the q.0 mode and a real q of 2.0 as these are not valuable from an RD perspective. Change-Id: I110c4858c57f97315953f4d88a2596d4764360df
This commit is contained in:
Родитель
67266cb213
Коммит
9afb6700c2
|
@ -15,7 +15,7 @@
|
||||||
static int16_t dc_qlookup[QINDEX_RANGE];
|
static int16_t dc_qlookup[QINDEX_RANGE];
|
||||||
static int16_t ac_qlookup[QINDEX_RANGE];
|
static int16_t ac_qlookup[QINDEX_RANGE];
|
||||||
|
|
||||||
#define ACDC_MIN 4
|
#define ACDC_MIN 8
|
||||||
|
|
||||||
// TODO(dkovalev) move to common and reuse
|
// TODO(dkovalev) move to common and reuse
|
||||||
static double poly3(double a, double b, double c, double d, double x) {
|
static double poly3(double a, double b, double c, double d, double x) {
|
||||||
|
@ -25,10 +25,19 @@ static double poly3(double a, double b, double c, double d, double x) {
|
||||||
void vp9_init_quant_tables() {
|
void vp9_init_quant_tables() {
|
||||||
int i, val = 4;
|
int i, val = 4;
|
||||||
|
|
||||||
for (i = 0; i < QINDEX_RANGE; i++) {
|
// A "real" q of 1.0 forces lossless mode.
|
||||||
|
// In practice non lossless Q's between 1.0 and 2.0 (represented here by
|
||||||
|
// integer values from 5-7 give poor rd results (lower psnr and often
|
||||||
|
// larger size than the lossless encode. To block out those "not very useful"
|
||||||
|
// values we increment the ac and dc q lookup values by 4 after position 0.
|
||||||
|
ac_qlookup[0] = val;
|
||||||
|
dc_qlookup[0] = val;
|
||||||
|
val += 4;
|
||||||
|
|
||||||
|
for (i = 1; i < QINDEX_RANGE; i++) {
|
||||||
const int ac_val = val;
|
const int ac_val = val;
|
||||||
|
|
||||||
val = (int)(val * 1.02);
|
val = (int)(val * 1.01975);
|
||||||
if (val == ac_val)
|
if (val == ac_val)
|
||||||
++val;
|
++val;
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,11 @@ static int calculate_minq_index(double maxq,
|
||||||
const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
|
const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
|
||||||
maxq);
|
maxq);
|
||||||
|
|
||||||
|
// Special case handling to deal with the step from q2.0
|
||||||
|
// down to lossless mode represented by q 1.0.
|
||||||
|
if (minqtarget <= 2.0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < QINDEX_RANGE; i++) {
|
for (i = 0; i < QINDEX_RANGE; i++) {
|
||||||
if (minqtarget <= vp9_convert_qindex_to_q(i))
|
if (minqtarget <= vp9_convert_qindex_to_q(i))
|
||||||
return i;
|
return i;
|
||||||
|
|
|
@ -263,10 +263,6 @@ void vp9_set_quantizer(struct VP9_COMP *cpi, int Q) {
|
||||||
|
|
||||||
cm->base_qindex = Q;
|
cm->base_qindex = Q;
|
||||||
|
|
||||||
// Set lossless mode
|
|
||||||
if (cm->base_qindex <= 4)
|
|
||||||
cm->base_qindex = 0;
|
|
||||||
|
|
||||||
// if any of the delta_q values are changing update flag will
|
// if any of the delta_q values are changing update flag will
|
||||||
// have to be set.
|
// have to be set.
|
||||||
cm->y_dc_delta_q = 0;
|
cm->y_dc_delta_q = 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче