ref: 6127af60c1eb4f20b03a4a34eb53704592194bed
parent: bdd60a7be779400e597cae001448a44d21c98f2b
parent: e55974bf86714e6403f68c010b89fbd62a4f35e5
author: John Koleszar <jkoleszar@google.com>
date: Mon Dec 5 09:36:54 EST 2011
Merge "Speed selection support for disabled reference frames"
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -617,6 +617,7 @@
int i;
VP8_COMMON *cm = &cpi->common;
int last_improved_quant = sf->improved_quant;
+ int ref_frames;
// Initialise default mode frequency sampling variables
for (i = 0; i < MAX_MODES; i ++)
@@ -650,19 +651,28 @@
for (i = 0; i < MAX_MODES; i++)
sf->thresh_mult[i] = 0;
+ /* Count enabled references */
+ ref_frames = 1;
+ if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ ref_frames++;
+ if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ ref_frames++;
+ if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ ref_frames++;
+
switch (Mode)
{
#if !(CONFIG_REALTIME_ONLY)
case 0: // best quality mode
- sf->thresh_mult[THR_ZEROMV ] = 0;
- sf->thresh_mult[THR_ZEROG ] = 0;
- sf->thresh_mult[THR_ZEROA ] = 0;
- sf->thresh_mult[THR_NEARESTMV] = 0;
- sf->thresh_mult[THR_NEARESTG ] = 0;
- sf->thresh_mult[THR_NEARESTA ] = 0;
- sf->thresh_mult[THR_NEARMV ] = 0;
- sf->thresh_mult[THR_NEARG ] = 0;
- sf->thresh_mult[THR_NEARA ] = 0;
+ sf->thresh_mult[THR_ZERO1 ] = 0;
+ sf->thresh_mult[THR_ZERO2 ] = 0;
+ sf->thresh_mult[THR_ZERO3 ] = 0;
+ sf->thresh_mult[THR_NEAREST1 ] = 0;
+ sf->thresh_mult[THR_NEAREST2 ] = 0;
+ sf->thresh_mult[THR_NEAREST3 ] = 0;
+ sf->thresh_mult[THR_NEAR1 ] = 0;
+ sf->thresh_mult[THR_NEAR2 ] = 0;
+ sf->thresh_mult[THR_NEAR3 ] = 0;
sf->thresh_mult[THR_DC ] = 0;
@@ -671,13 +681,13 @@
sf->thresh_mult[THR_B_PRED ] = 2000;
sf->thresh_mult[THR_TM ] = 1000;
- sf->thresh_mult[THR_NEWMV ] = 1000;
- sf->thresh_mult[THR_NEWG ] = 1000;
- sf->thresh_mult[THR_NEWA ] = 1000;
+ sf->thresh_mult[THR_NEW1 ] = 1000;
+ sf->thresh_mult[THR_NEW2 ] = 1000;
+ sf->thresh_mult[THR_NEW3 ] = 1000;
- sf->thresh_mult[THR_SPLITMV ] = 2500;
- sf->thresh_mult[THR_SPLITG ] = 5000;
- sf->thresh_mult[THR_SPLITA ] = 5000;
+ sf->thresh_mult[THR_SPLIT1 ] = 2500;
+ sf->thresh_mult[THR_SPLIT2 ] = 5000;
+ sf->thresh_mult[THR_SPLIT3 ] = 5000;
sf->first_step = 0;
@@ -685,33 +695,33 @@
break;
case 1:
case 3:
- sf->thresh_mult[THR_NEARESTMV] = 0;
- sf->thresh_mult[THR_ZEROMV ] = 0;
+ sf->thresh_mult[THR_NEAREST1 ] = 0;
+ sf->thresh_mult[THR_ZERO1 ] = 0;
sf->thresh_mult[THR_DC ] = 0;
- sf->thresh_mult[THR_NEARMV ] = 0;
+ sf->thresh_mult[THR_NEAR1 ] = 0;
sf->thresh_mult[THR_V_PRED ] = 1000;
sf->thresh_mult[THR_H_PRED ] = 1000;
sf->thresh_mult[THR_B_PRED ] = 2500;
sf->thresh_mult[THR_TM ] = 1000;
- sf->thresh_mult[THR_NEARESTG ] = 1000;
- sf->thresh_mult[THR_NEARESTA ] = 1000;
+ sf->thresh_mult[THR_NEAREST2 ] = 1000;
+ sf->thresh_mult[THR_NEAREST3 ] = 1000;
- sf->thresh_mult[THR_ZEROG ] = 1000;
- sf->thresh_mult[THR_ZEROA ] = 1000;
- sf->thresh_mult[THR_NEARG ] = 1000;
- sf->thresh_mult[THR_NEARA ] = 1000;
+ sf->thresh_mult[THR_ZERO2 ] = 1000;
+ sf->thresh_mult[THR_ZERO3 ] = 1000;
+ sf->thresh_mult[THR_NEAR2 ] = 1000;
+ sf->thresh_mult[THR_NEAR3 ] = 1000;
#if 1
- sf->thresh_mult[THR_ZEROMV ] = 0;
- sf->thresh_mult[THR_ZEROG ] = 0;
- sf->thresh_mult[THR_ZEROA ] = 0;
- sf->thresh_mult[THR_NEARESTMV] = 0;
- sf->thresh_mult[THR_NEARESTG ] = 0;
- sf->thresh_mult[THR_NEARESTA ] = 0;
- sf->thresh_mult[THR_NEARMV ] = 0;
- sf->thresh_mult[THR_NEARG ] = 0;
- sf->thresh_mult[THR_NEARA ] = 0;
+ sf->thresh_mult[THR_ZERO1 ] = 0;
+ sf->thresh_mult[THR_ZERO2 ] = 0;
+ sf->thresh_mult[THR_ZERO3 ] = 0;
+ sf->thresh_mult[THR_NEAREST1 ] = 0;
+ sf->thresh_mult[THR_NEAREST2 ] = 0;
+ sf->thresh_mult[THR_NEAREST3 ] = 0;
+ sf->thresh_mult[THR_NEAR1 ] = 0;
+ sf->thresh_mult[THR_NEAR2 ] = 0;
+ sf->thresh_mult[THR_NEAR3 ] = 0;
// sf->thresh_mult[THR_DC ] = 0;
@@ -720,21 +730,21 @@
// sf->thresh_mult[THR_B_PRED ] = 2000;
// sf->thresh_mult[THR_TM ] = 1000;
- sf->thresh_mult[THR_NEWMV ] = 1000;
- sf->thresh_mult[THR_NEWG ] = 1000;
- sf->thresh_mult[THR_NEWA ] = 1000;
+ sf->thresh_mult[THR_NEW1 ] = 1000;
+ sf->thresh_mult[THR_NEW2 ] = 1000;
+ sf->thresh_mult[THR_NEW3 ] = 1000;
- sf->thresh_mult[THR_SPLITMV ] = 1700;
- sf->thresh_mult[THR_SPLITG ] = 4500;
- sf->thresh_mult[THR_SPLITA ] = 4500;
+ sf->thresh_mult[THR_SPLIT1 ] = 1700;
+ sf->thresh_mult[THR_SPLIT2 ] = 4500;
+ sf->thresh_mult[THR_SPLIT3 ] = 4500;
#else
- sf->thresh_mult[THR_NEWMV ] = 1500;
- sf->thresh_mult[THR_NEWG ] = 1500;
- sf->thresh_mult[THR_NEWA ] = 1500;
+ sf->thresh_mult[THR_NEW1 ] = 1500;
+ sf->thresh_mult[THR_NEW2 ] = 1500;
+ sf->thresh_mult[THR_NEW3 ] = 1500;
- sf->thresh_mult[THR_SPLITMV ] = 5000;
- sf->thresh_mult[THR_SPLITG ] = 10000;
- sf->thresh_mult[THR_SPLITA ] = 10000;
+ sf->thresh_mult[THR_SPLIT1 ] = 5000;
+ sf->thresh_mult[THR_SPLIT2 ] = 10000;
+ sf->thresh_mult[THR_SPLIT3 ] = 10000;
#endif
if (Speed > 0)
@@ -746,16 +756,16 @@
sf->first_step = 1;
- cpi->mode_check_freq[THR_SPLITG] = 2;
- cpi->mode_check_freq[THR_SPLITA] = 2;
- cpi->mode_check_freq[THR_SPLITMV] = 0;
+ cpi->mode_check_freq[THR_SPLIT2] = 2;
+ cpi->mode_check_freq[THR_SPLIT3] = 2;
+ cpi->mode_check_freq[THR_SPLIT1 ] = 0;
}
if (Speed > 1)
{
- cpi->mode_check_freq[THR_SPLITG] = 4;
- cpi->mode_check_freq[THR_SPLITA] = 4;
- cpi->mode_check_freq[THR_SPLITMV] = 2;
+ cpi->mode_check_freq[THR_SPLIT2] = 4;
+ cpi->mode_check_freq[THR_SPLIT3] = 4;
+ cpi->mode_check_freq[THR_SPLIT1 ] = 2;
sf->thresh_mult[THR_TM ] = 1500;
sf->thresh_mult[THR_V_PRED ] = 1500;
@@ -762,36 +772,36 @@
sf->thresh_mult[THR_H_PRED ] = 1500;
sf->thresh_mult[THR_B_PRED ] = 5000;
- if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ if (ref_frames > 1)
{
- sf->thresh_mult[THR_NEWMV ] = 2000;
- sf->thresh_mult[THR_SPLITMV ] = 10000;
+ sf->thresh_mult[THR_NEW1 ] = 2000;
+ sf->thresh_mult[THR_SPLIT1 ] = 10000;
}
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- sf->thresh_mult[THR_NEARESTG ] = 1500;
- sf->thresh_mult[THR_ZEROG ] = 1500;
- sf->thresh_mult[THR_NEARG ] = 1500;
- sf->thresh_mult[THR_NEWG ] = 2000;
- sf->thresh_mult[THR_SPLITG ] = 20000;
+ sf->thresh_mult[THR_NEAREST2 ] = 1500;
+ sf->thresh_mult[THR_ZERO2 ] = 1500;
+ sf->thresh_mult[THR_NEAR2 ] = 1500;
+ sf->thresh_mult[THR_NEW2 ] = 2000;
+ sf->thresh_mult[THR_SPLIT2 ] = 20000;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- sf->thresh_mult[THR_NEARESTA ] = 1500;
- sf->thresh_mult[THR_ZEROA ] = 1500;
- sf->thresh_mult[THR_NEARA ] = 1500;
- sf->thresh_mult[THR_NEWA ] = 2000;
- sf->thresh_mult[THR_SPLITA ] = 20000;
+ sf->thresh_mult[THR_NEAREST3 ] = 1500;
+ sf->thresh_mult[THR_ZERO3 ] = 1500;
+ sf->thresh_mult[THR_NEAR3 ] = 1500;
+ sf->thresh_mult[THR_NEW3 ] = 2000;
+ sf->thresh_mult[THR_SPLIT3 ] = 20000;
}
}
if (Speed > 2)
{
- cpi->mode_check_freq[THR_SPLITG] = 15;
- cpi->mode_check_freq[THR_SPLITA] = 15;
- cpi->mode_check_freq[THR_SPLITMV] = 7;
+ cpi->mode_check_freq[THR_SPLIT2] = 15;
+ cpi->mode_check_freq[THR_SPLIT3] = 15;
+ cpi->mode_check_freq[THR_SPLIT1 ] = 7;
sf->thresh_mult[THR_TM ] = 2000;
sf->thresh_mult[THR_V_PRED ] = 2000;
@@ -798,28 +808,28 @@
sf->thresh_mult[THR_H_PRED ] = 2000;
sf->thresh_mult[THR_B_PRED ] = 7500;
- if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ if (ref_frames > 1)
{
- sf->thresh_mult[THR_NEWMV ] = 2000;
- sf->thresh_mult[THR_SPLITMV ] = 25000;
+ sf->thresh_mult[THR_NEW1 ] = 2000;
+ sf->thresh_mult[THR_SPLIT1 ] = 25000;
}
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- sf->thresh_mult[THR_NEARESTG ] = 2000;
- sf->thresh_mult[THR_ZEROG ] = 2000;
- sf->thresh_mult[THR_NEARG ] = 2000;
- sf->thresh_mult[THR_NEWG ] = 2500;
- sf->thresh_mult[THR_SPLITG ] = 50000;
+ sf->thresh_mult[THR_NEAREST2 ] = 2000;
+ sf->thresh_mult[THR_ZERO2 ] = 2000;
+ sf->thresh_mult[THR_NEAR2 ] = 2000;
+ sf->thresh_mult[THR_NEW2 ] = 2500;
+ sf->thresh_mult[THR_SPLIT2 ] = 50000;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- sf->thresh_mult[THR_NEARESTA ] = 2000;
- sf->thresh_mult[THR_ZEROA ] = 2000;
- sf->thresh_mult[THR_NEARA ] = 2000;
- sf->thresh_mult[THR_NEWA ] = 2500;
- sf->thresh_mult[THR_SPLITA ] = 50000;
+ sf->thresh_mult[THR_NEAREST3 ] = 2000;
+ sf->thresh_mult[THR_ZERO3 ] = 2000;
+ sf->thresh_mult[THR_NEAR3 ] = 2000;
+ sf->thresh_mult[THR_NEW3 ] = 2500;
+ sf->thresh_mult[THR_SPLIT3 ] = 50000;
}
sf->improved_quant = 0;
@@ -833,17 +843,17 @@
if (Speed > 3)
{
- sf->thresh_mult[THR_SPLITA ] = INT_MAX;
- sf->thresh_mult[THR_SPLITG ] = INT_MAX;
- sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
+ sf->thresh_mult[THR_SPLIT3 ] = INT_MAX;
+ sf->thresh_mult[THR_SPLIT2 ] = INT_MAX;
+ sf->thresh_mult[THR_SPLIT1 ] = INT_MAX;
cpi->mode_check_freq[THR_V_PRED] = 0;
cpi->mode_check_freq[THR_H_PRED] = 0;
cpi->mode_check_freq[THR_B_PRED] = 0;
- cpi->mode_check_freq[THR_NEARG] = 0;
- cpi->mode_check_freq[THR_NEWG] = 0;
- cpi->mode_check_freq[THR_NEARA] = 0;
- cpi->mode_check_freq[THR_NEWA] = 0;
+ cpi->mode_check_freq[THR_NEAR2] = 0;
+ cpi->mode_check_freq[THR_NEW2] = 0;
+ cpi->mode_check_freq[THR_NEAR3] = 0;
+ cpi->mode_check_freq[THR_NEW3] = 0;
sf->auto_filter = 1;
sf->recode_loop = 0; // recode loop off
@@ -859,32 +869,32 @@
cpi->mode_check_freq[THR_H_PRED] = 2;
cpi->mode_check_freq[THR_B_PRED] = 2;
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- cpi->mode_check_freq[THR_NEARG] = 2;
- cpi->mode_check_freq[THR_NEWG] = 4;
+ cpi->mode_check_freq[THR_NEAR2] = 2;
+ cpi->mode_check_freq[THR_NEW2] = 4;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- cpi->mode_check_freq[THR_NEARA] = 2;
- cpi->mode_check_freq[THR_NEWA] = 4;
+ cpi->mode_check_freq[THR_NEAR3] = 2;
+ cpi->mode_check_freq[THR_NEW3] = 4;
}
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- sf->thresh_mult[THR_NEARESTG ] = 2000;
- sf->thresh_mult[THR_ZEROG ] = 2000;
- sf->thresh_mult[THR_NEARG ] = 2000;
- sf->thresh_mult[THR_NEWG ] = 4000;
+ sf->thresh_mult[THR_NEAREST2 ] = 2000;
+ sf->thresh_mult[THR_ZERO2 ] = 2000;
+ sf->thresh_mult[THR_NEAR2 ] = 2000;
+ sf->thresh_mult[THR_NEW2 ] = 4000;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- sf->thresh_mult[THR_NEARESTA ] = 2000;
- sf->thresh_mult[THR_ZEROA ] = 2000;
- sf->thresh_mult[THR_NEARA ] = 2000;
- sf->thresh_mult[THR_NEWA ] = 4000;
+ sf->thresh_mult[THR_NEAREST3 ] = 2000;
+ sf->thresh_mult[THR_ZERO3 ] = 2000;
+ sf->thresh_mult[THR_NEAR3 ] = 2000;
+ sf->thresh_mult[THR_NEW3 ] = 4000;
}
}
@@ -895,33 +905,33 @@
sf->recode_loop = 0;
sf->auto_filter = 1;
sf->iterative_sub_pixel = 1;
- sf->thresh_mult[THR_NEARESTMV] = 0;
- sf->thresh_mult[THR_ZEROMV ] = 0;
+ sf->thresh_mult[THR_NEAREST1 ] = 0;
+ sf->thresh_mult[THR_ZERO1 ] = 0;
sf->thresh_mult[THR_DC ] = 0;
sf->thresh_mult[THR_TM ] = 0;
- sf->thresh_mult[THR_NEARMV ] = 0;
+ sf->thresh_mult[THR_NEAR1 ] = 0;
sf->thresh_mult[THR_V_PRED ] = 1000;
sf->thresh_mult[THR_H_PRED ] = 1000;
sf->thresh_mult[THR_B_PRED ] = 2500;
- sf->thresh_mult[THR_NEARESTG ] = 1000;
- sf->thresh_mult[THR_ZEROG ] = 1000;
- sf->thresh_mult[THR_NEARG ] = 1000;
- sf->thresh_mult[THR_NEARESTA ] = 1000;
- sf->thresh_mult[THR_ZEROA ] = 1000;
- sf->thresh_mult[THR_NEARA ] = 1000;
- sf->thresh_mult[THR_NEWMV ] = 2000;
- sf->thresh_mult[THR_NEWG ] = 2000;
- sf->thresh_mult[THR_NEWA ] = 2000;
- sf->thresh_mult[THR_SPLITMV ] = 5000;
- sf->thresh_mult[THR_SPLITG ] = 10000;
- sf->thresh_mult[THR_SPLITA ] = 10000;
+ sf->thresh_mult[THR_NEAREST2 ] = 1000;
+ sf->thresh_mult[THR_ZERO2 ] = 1000;
+ sf->thresh_mult[THR_NEAR2 ] = 1000;
+ sf->thresh_mult[THR_NEAREST3 ] = 1000;
+ sf->thresh_mult[THR_ZERO3 ] = 1000;
+ sf->thresh_mult[THR_NEAR3 ] = 1000;
+ sf->thresh_mult[THR_NEW1 ] = 2000;
+ sf->thresh_mult[THR_NEW2 ] = 2000;
+ sf->thresh_mult[THR_NEW3 ] = 2000;
+ sf->thresh_mult[THR_SPLIT1 ] = 5000;
+ sf->thresh_mult[THR_SPLIT2 ] = 10000;
+ sf->thresh_mult[THR_SPLIT3 ] = 10000;
sf->search_method = NSTEP;
if (Speed > 0)
{
- cpi->mode_check_freq[THR_SPLITG] = 4;
- cpi->mode_check_freq[THR_SPLITA] = 4;
- cpi->mode_check_freq[THR_SPLITMV] = 2;
+ cpi->mode_check_freq[THR_SPLIT2] = 4;
+ cpi->mode_check_freq[THR_SPLIT3] = 4;
+ cpi->mode_check_freq[THR_SPLIT1 ] = 2;
sf->thresh_mult[THR_DC ] = 0;
sf->thresh_mult[THR_TM ] = 1000;
@@ -929,31 +939,31 @@
sf->thresh_mult[THR_H_PRED ] = 2000;
sf->thresh_mult[THR_B_PRED ] = 5000;
- if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ if (ref_frames > 1)
{
- sf->thresh_mult[THR_NEARESTMV] = 0;
- sf->thresh_mult[THR_ZEROMV ] = 0;
- sf->thresh_mult[THR_NEARMV ] = 0;
- sf->thresh_mult[THR_NEWMV ] = 2000;
- sf->thresh_mult[THR_SPLITMV ] = 10000;
+ sf->thresh_mult[THR_NEAREST1 ] = 0;
+ sf->thresh_mult[THR_ZERO1 ] = 0;
+ sf->thresh_mult[THR_NEAR1 ] = 0;
+ sf->thresh_mult[THR_NEW1 ] = 2000;
+ sf->thresh_mult[THR_SPLIT1 ] = 10000;
}
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- sf->thresh_mult[THR_NEARESTG ] = 1000;
- sf->thresh_mult[THR_ZEROG ] = 1000;
- sf->thresh_mult[THR_NEARG ] = 1000;
- sf->thresh_mult[THR_NEWG ] = 2000;
- sf->thresh_mult[THR_SPLITG ] = 20000;
+ sf->thresh_mult[THR_NEAREST2 ] = 1000;
+ sf->thresh_mult[THR_ZERO2 ] = 1000;
+ sf->thresh_mult[THR_NEAR2 ] = 1000;
+ sf->thresh_mult[THR_NEW2 ] = 2000;
+ sf->thresh_mult[THR_SPLIT2 ] = 20000;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- sf->thresh_mult[THR_NEARESTA ] = 1000;
- sf->thresh_mult[THR_ZEROA ] = 1000;
- sf->thresh_mult[THR_NEARA ] = 1000;
- sf->thresh_mult[THR_NEWA ] = 2000;
- sf->thresh_mult[THR_SPLITA ] = 20000;
+ sf->thresh_mult[THR_NEAREST3 ] = 1000;
+ sf->thresh_mult[THR_ZERO3 ] = 1000;
+ sf->thresh_mult[THR_NEAR3 ] = 1000;
+ sf->thresh_mult[THR_NEW3 ] = 2000;
+ sf->thresh_mult[THR_SPLIT3 ] = 20000;
}
sf->improved_quant = 0;
@@ -966,9 +976,9 @@
if (Speed > 1)
{
- cpi->mode_check_freq[THR_SPLITMV] = 7;
- cpi->mode_check_freq[THR_SPLITG] = 15;
- cpi->mode_check_freq[THR_SPLITA] = 15;
+ cpi->mode_check_freq[THR_SPLIT1 ] = 7;
+ cpi->mode_check_freq[THR_SPLIT2] = 15;
+ cpi->mode_check_freq[THR_SPLIT3] = 15;
sf->thresh_mult[THR_TM ] = 2000;
sf->thresh_mult[THR_V_PRED ] = 2000;
@@ -975,28 +985,28 @@
sf->thresh_mult[THR_H_PRED ] = 2000;
sf->thresh_mult[THR_B_PRED ] = 5000;
- if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ if (ref_frames > 1)
{
- sf->thresh_mult[THR_NEWMV ] = 2000;
- sf->thresh_mult[THR_SPLITMV ] = 25000;
+ sf->thresh_mult[THR_NEW1 ] = 2000;
+ sf->thresh_mult[THR_SPLIT1 ] = 25000;
}
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- sf->thresh_mult[THR_NEARESTG ] = 2000;
- sf->thresh_mult[THR_ZEROG ] = 2000;
- sf->thresh_mult[THR_NEARG ] = 2000;
- sf->thresh_mult[THR_NEWG ] = 2500;
- sf->thresh_mult[THR_SPLITG ] = 50000;
+ sf->thresh_mult[THR_NEAREST2 ] = 2000;
+ sf->thresh_mult[THR_ZERO2 ] = 2000;
+ sf->thresh_mult[THR_NEAR2 ] = 2000;
+ sf->thresh_mult[THR_NEW2 ] = 2500;
+ sf->thresh_mult[THR_SPLIT2 ] = 50000;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- sf->thresh_mult[THR_NEARESTA ] = 2000;
- sf->thresh_mult[THR_ZEROA ] = 2000;
- sf->thresh_mult[THR_NEARA ] = 2000;
- sf->thresh_mult[THR_NEWA ] = 2500;
- sf->thresh_mult[THR_SPLITA ] = 50000;
+ sf->thresh_mult[THR_NEAREST3 ] = 2000;
+ sf->thresh_mult[THR_ZERO3 ] = 2000;
+ sf->thresh_mult[THR_NEAR3 ] = 2000;
+ sf->thresh_mult[THR_NEW3 ] = 2500;
+ sf->thresh_mult[THR_SPLIT3 ] = 50000;
}
}
@@ -1009,21 +1019,21 @@
cpi->mode_check_freq[THR_H_PRED] = 2;
cpi->mode_check_freq[THR_B_PRED] = 2;
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- cpi->mode_check_freq[THR_NEARG] = 2;
- cpi->mode_check_freq[THR_NEWG] = 4;
+ cpi->mode_check_freq[THR_NEAR2] = 2;
+ cpi->mode_check_freq[THR_NEW2] = 4;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- cpi->mode_check_freq[THR_NEARA] = 2;
- cpi->mode_check_freq[THR_NEWA] = 4;
+ cpi->mode_check_freq[THR_NEAR3] = 2;
+ cpi->mode_check_freq[THR_NEW3] = 4;
}
- sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
- sf->thresh_mult[THR_SPLITG ] = INT_MAX;
- sf->thresh_mult[THR_SPLITA ] = INT_MAX;
+ sf->thresh_mult[THR_SPLIT1 ] = INT_MAX;
+ sf->thresh_mult[THR_SPLIT2 ] = INT_MAX;
+ sf->thresh_mult[THR_SPLIT3 ] = INT_MAX;
}
@@ -1049,14 +1059,14 @@
if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
{
- cpi->mode_check_freq[THR_NEARG] = 2;
- cpi->mode_check_freq[THR_NEWG] = 4;
+ cpi->mode_check_freq[THR_NEAR2] = 2;
+ cpi->mode_check_freq[THR_NEW2] = 4;
}
if (cpi->ref_frame_flags & VP8_ALT_FLAG)
{
- cpi->mode_check_freq[THR_NEARA] = 2;
- cpi->mode_check_freq[THR_NEWA] = 4;
+ cpi->mode_check_freq[THR_NEAR3] = 2;
+ cpi->mode_check_freq[THR_NEW3] = 4;
}
sf->thresh_mult[THR_TM ] = 2000;
@@ -1064,18 +1074,18 @@
if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
{
- sf->thresh_mult[THR_NEARESTG ] = 2000;
- sf->thresh_mult[THR_ZEROG ] = 2000;
- sf->thresh_mult[THR_NEARG ] = 2000;
- sf->thresh_mult[THR_NEWG ] = 4000;
+ sf->thresh_mult[THR_NEAREST2 ] = 2000;
+ sf->thresh_mult[THR_ZERO2 ] = 2000;
+ sf->thresh_mult[THR_NEAR2 ] = 2000;
+ sf->thresh_mult[THR_NEW2 ] = 4000;
}
if (cpi->ref_frame_flags & VP8_ALT_FLAG)
{
- sf->thresh_mult[THR_NEARESTA ] = 2000;
- sf->thresh_mult[THR_ZEROA ] = 2000;
- sf->thresh_mult[THR_NEARA ] = 2000;
- sf->thresh_mult[THR_NEWA ] = 4000;
+ sf->thresh_mult[THR_NEAREST3 ] = 2000;
+ sf->thresh_mult[THR_ZERO3 ] = 2000;
+ sf->thresh_mult[THR_NEAR3 ] = 2000;
+ sf->thresh_mult[THR_NEW3 ] = 4000;
}
}
@@ -1122,25 +1132,25 @@
if (thresh < 2000)
thresh = 2000;
- if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ if (ref_frames > 1)
{
- sf->thresh_mult[THR_NEWMV] = thresh;
- sf->thresh_mult[THR_NEARESTMV ] = thresh >> 1;
- sf->thresh_mult[THR_NEARMV ] = thresh >> 1;
+ sf->thresh_mult[THR_NEW1 ] = thresh;
+ sf->thresh_mult[THR_NEAREST1 ] = thresh >> 1;
+ sf->thresh_mult[THR_NEAR1 ] = thresh >> 1;
}
- if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ if (ref_frames > 2)
{
- sf->thresh_mult[THR_NEWG] = thresh << 1;
- sf->thresh_mult[THR_NEARESTG ] = thresh;
- sf->thresh_mult[THR_NEARG ] = thresh;
+ sf->thresh_mult[THR_NEW2] = thresh << 1;
+ sf->thresh_mult[THR_NEAREST2 ] = thresh;
+ sf->thresh_mult[THR_NEAR2 ] = thresh;
}
- if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ if (ref_frames > 3)
{
- sf->thresh_mult[THR_NEWA] = thresh << 1;
- sf->thresh_mult[THR_NEARESTA ] = thresh;
- sf->thresh_mult[THR_NEARA ] = thresh;
+ sf->thresh_mult[THR_NEW3] = thresh << 1;
+ sf->thresh_mult[THR_NEAREST3 ] = thresh;
+ sf->thresh_mult[THR_NEAR3 ] = thresh;
}
// Disable other intra prediction modes
@@ -1165,21 +1175,21 @@
if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
{
- cpi->mode_check_freq[THR_ZEROG] = 1 << (Tmp - 1);
- cpi->mode_check_freq[THR_NEARESTG] = 1 << (Tmp - 1);
- cpi->mode_check_freq[THR_NEARG] = 1 << Tmp;
- cpi->mode_check_freq[THR_NEWG] = 1 << (Tmp + 1);
+ cpi->mode_check_freq[THR_ZERO2] = 1 << (Tmp - 1);
+ cpi->mode_check_freq[THR_NEAREST2] = 1 << (Tmp - 1);
+ cpi->mode_check_freq[THR_NEAR2] = 1 << Tmp;
+ cpi->mode_check_freq[THR_NEW2] = 1 << (Tmp + 1);
}
if (cpi->ref_frame_flags & VP8_ALT_FLAG)
{
- cpi->mode_check_freq[THR_ZEROA] = 1 << (Tmp - 1);
- cpi->mode_check_freq[THR_NEARESTA] = 1 << (Tmp - 1);
- cpi->mode_check_freq[THR_NEARA] = 1 << Tmp;
- cpi->mode_check_freq[THR_NEWA] = 1 << (Tmp + 1);
+ cpi->mode_check_freq[THR_ZERO3] = 1 << (Tmp - 1);
+ cpi->mode_check_freq[THR_NEAREST3] = 1 << (Tmp - 1);
+ cpi->mode_check_freq[THR_NEAR3] = 1 << Tmp;
+ cpi->mode_check_freq[THR_NEW3] = 1 << (Tmp + 1);
}
- cpi->mode_check_freq[THR_NEWMV] = 1 << (Tmp - 1);
+ cpi->mode_check_freq[THR_NEW1 ] = 1 << (Tmp - 1);
}
cm->filter_type = NORMAL_LOOPFILTER;
@@ -1195,35 +1205,6 @@
vpx_memset(cpi->error_bins, 0, sizeof(cpi->error_bins));
}; /* switch */
-
- /* disable frame modes if flags not set */
- if (!(cpi->ref_frame_flags & VP8_LAST_FLAG))
- {
- sf->thresh_mult[THR_NEWMV ] = INT_MAX;
- sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
- sf->thresh_mult[THR_ZEROMV ] = INT_MAX;
- sf->thresh_mult[THR_NEARMV ] = INT_MAX;
- sf->thresh_mult[THR_SPLITMV ] = INT_MAX;
- }
-
- if (!(cpi->ref_frame_flags & VP8_GOLD_FLAG))
- {
- sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
- sf->thresh_mult[THR_ZEROG ] = INT_MAX;
- sf->thresh_mult[THR_NEARG ] = INT_MAX;
- sf->thresh_mult[THR_NEWG ] = INT_MAX;
- sf->thresh_mult[THR_SPLITG ] = INT_MAX;
- }
-
- if (!(cpi->ref_frame_flags & VP8_ALT_FLAG))
- {
- sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
- sf->thresh_mult[THR_ZEROA ] = INT_MAX;
- sf->thresh_mult[THR_NEARA ] = INT_MAX;
- sf->thresh_mult[THR_NEWA ] = INT_MAX;
- sf->thresh_mult[THR_SPLITA ] = INT_MAX;
- }
-
// Slow quant, dct and trellis not worthwhile for first pass
// so make sure they are always turned off.
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -133,32 +133,32 @@
typedef enum
{
- THR_ZEROMV = 0,
+ THR_ZERO1 = 0,
THR_DC = 1,
- THR_NEARESTMV = 2,
- THR_NEARMV = 3,
+ THR_NEAREST1 = 2,
+ THR_NEAR1 = 3,
- THR_ZEROG = 4,
- THR_NEARESTG = 5,
+ THR_ZERO2 = 4,
+ THR_NEAREST2 = 5,
- THR_ZEROA = 6,
- THR_NEARESTA = 7,
+ THR_ZERO3 = 6,
+ THR_NEAREST3 = 7,
- THR_NEARG = 8,
- THR_NEARA = 9,
+ THR_NEAR2 = 8,
+ THR_NEAR3 = 9,
THR_V_PRED = 10,
THR_H_PRED = 11,
THR_TM = 12,
- THR_NEWMV = 13,
- THR_NEWG = 14,
- THR_NEWA = 15,
+ THR_NEW1 = 13,
+ THR_NEW2 = 14,
+ THR_NEW3 = 15,
- THR_SPLITMV = 16,
- THR_SPLITG = 17,
- THR_SPLITA = 18,
+ THR_SPLIT1 = 16,
+ THR_SPLIT2 = 17,
+ THR_SPLIT3 = 18,
THR_B_PRED = 19,
}
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -39,7 +39,7 @@
extern unsigned int cnt_pm;
#endif
-extern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES];
+extern const int vp8_ref_frame_order[MAX_MODES];
extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
extern unsigned int (*vp8_get4x4sse_cs)(unsigned char *src_ptr, int source_stride, unsigned char *ref_ptr, int recon_stride);
@@ -439,8 +439,9 @@
unsigned char *y_buffer[4];
unsigned char *u_buffer[4];
unsigned char *v_buffer[4];
+ int i;
+ int ref_frame_map[4];
- int skip_mode[4] = {0, 0, 0, 0};
int found_near_mvs[4] = {0, 0, 0, 0};
int have_subp_search = cpi->sf.half_pixel_search; /* In real-time mode, when Speed >= 15, no sub-pixel search. */
@@ -450,6 +451,17 @@
vpx_memset(near_mv, 0, sizeof(near_mv));
vpx_memset(&best_mbmode, 0, sizeof(best_mbmode));
+ /* Setup search priorities */
+ i=0;
+ ref_frame_map[i++] = INTRA_FRAME;
+ if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ ref_frame_map[i++] = LAST_FRAME;
+ if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ ref_frame_map[i++] = GOLDEN_FRAME;
+ if (cpi->ref_frame_flags & VP8_ALT_FLAG) // &&(cpi->source_alt_ref_active || cpi->oxcf.number_of_layers > 1)
+ ref_frame_map[i++] = ALTREF_FRAME;
+ for(; i<4; i++)
+ ref_frame_map[i] = -1;
// set up all the refframe dependent pointers.
if (cpi->ref_frame_flags & VP8_LAST_FLAG)
@@ -459,8 +471,6 @@
u_buffer[LAST_FRAME] = lst_yv12->u_buffer + recon_uvoffset;
v_buffer[LAST_FRAME] = lst_yv12->v_buffer + recon_uvoffset;
}
- else
- skip_mode[LAST_FRAME] = 1;
if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
{
@@ -469,11 +479,8 @@
u_buffer[GOLDEN_FRAME] = gld_yv12->u_buffer + recon_uvoffset;
v_buffer[GOLDEN_FRAME] = gld_yv12->v_buffer + recon_uvoffset;
}
- else
- skip_mode[GOLDEN_FRAME] = 1;
- if ((cpi->ref_frame_flags & VP8_ALT_FLAG) &&
- (cpi->source_alt_ref_active || cpi->oxcf.number_of_layers > 1))
+ if (cpi->ref_frame_flags & VP8_ALT_FLAG)
{
YV12_BUFFER_CONFIG *alt_yv12 = &cpi->common.yv12_fb[cpi->common.alt_fb_idx];
y_buffer[ALTREF_FRAME] = alt_yv12->y_buffer + recon_yoffset;
@@ -480,8 +487,6 @@
u_buffer[ALTREF_FRAME] = alt_yv12->u_buffer + recon_uvoffset;
v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset;
}
- else
- skip_mode[ALTREF_FRAME] = 1;
cpi->mbs_tested_so_far++; // Count of the number of MBs tested so far this frame
@@ -496,14 +501,16 @@
{
int frame_cost;
int this_rd = INT_MAX;
+ int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]];
if (best_rd <= cpi->rd_threshes[mode_index])
continue;
- x->e_mbd.mode_info_context->mbmi.ref_frame = vp8_ref_frame_order[mode_index];
-
- if (skip_mode[x->e_mbd.mode_info_context->mbmi.ref_frame])
+ if (this_ref_frame < 0)
continue;
+
+ x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
+
// Check to see if the testing frequency for this mode is at its max
// If so then prevent it from being tested and increase the threshold for its testing
--- a/vp8/encoder/ratectrl.c
+++ b/vp8/encoder/ratectrl.c
@@ -28,7 +28,6 @@
#define MAX_BPB_FACTOR 50
extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
-extern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES];
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -100,36 +100,39 @@
B_PRED,
};
-const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES] =
+/* This table determines the search order in reference frame priority order,
+ * which may not necessarily match INTRA,LAST,GOLDEN,ARF
+ */
+const int vp8_ref_frame_order[MAX_MODES] =
{
- LAST_FRAME,
- INTRA_FRAME,
+ 1,
+ 0,
- LAST_FRAME,
- LAST_FRAME,
+ 1,
+ 1,
- GOLDEN_FRAME,
- GOLDEN_FRAME,
+ 2,
+ 2,
- ALTREF_FRAME,
- ALTREF_FRAME,
+ 3,
+ 3,
- GOLDEN_FRAME,
- ALTREF_FRAME,
+ 2,
+ 3,
- INTRA_FRAME,
- INTRA_FRAME,
- INTRA_FRAME,
+ 0,
+ 0,
+ 0,
- LAST_FRAME,
- GOLDEN_FRAME,
- ALTREF_FRAME,
+ 1,
+ 2,
+ 3,
- LAST_FRAME,
- GOLDEN_FRAME,
- ALTREF_FRAME,
+ 1,
+ 2,
+ 3,
- INTRA_FRAME,
+ 0,
};
static void fill_token_costs(
@@ -1789,11 +1792,24 @@
unsigned char *y_buffer[4];
unsigned char *u_buffer[4];
unsigned char *v_buffer[4];
+ int ref_frame_map[4];
vpx_memset(&best_mbmode, 0, sizeof(best_mbmode));
vpx_memset(&best_bmodes, 0, sizeof(best_bmodes));
+ /* Setup search priorities */
+ i=0;
+ ref_frame_map[i++] = INTRA_FRAME;
if (cpi->ref_frame_flags & VP8_LAST_FLAG)
+ ref_frame_map[i++] = LAST_FRAME;
+ if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
+ ref_frame_map[i++] = GOLDEN_FRAME;
+ if (cpi->ref_frame_flags & VP8_ALT_FLAG)
+ ref_frame_map[i++] = ALTREF_FRAME;
+ for(; i<4; i++)
+ ref_frame_map[i] = -1;
+
+ if (cpi->ref_frame_flags & VP8_LAST_FLAG)
{
YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
@@ -1852,6 +1868,7 @@
int lf_or_gf = 0; // Lat Frame (01) or gf/arf (1)
int disable_skip = 0;
int other_cost = 0;
+ int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]];
// Experimental debug code.
// Record of rd values recorded for this MB. -1 indicates not measured
@@ -1864,6 +1881,9 @@
if (best_rd <= cpi->rd_threshes[mode_index])
continue;
+ if (this_ref_frame < 0)
+ continue;
+
// These variables hold are rolling total cost and distortion for this mode
rate2 = 0;
distortion2 = 0;
@@ -1872,7 +1892,7 @@
x->e_mbd.mode_info_context->mbmi.mode = this_mode;
x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
- x->e_mbd.mode_info_context->mbmi.ref_frame = vp8_ref_frame_order[mode_index];
+ x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
// Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
// unless ARNR filtering is enabled in which case we want
@@ -1920,13 +1940,13 @@
// Experimental code. Special case for gf and arf zeromv modes. Increase zbin size to supress noise
if (cpi->zbin_mode_boost_enabled)
{
- if ( vp8_ref_frame_order[mode_index] == INTRA_FRAME )
+ if ( this_ref_frame == INTRA_FRAME )
cpi->zbin_mode_boost = 0;
else
{
if (vp8_mode_order[mode_index] == ZEROMV)
{
- if (vp8_ref_frame_order[mode_index] != LAST_FRAME)
+ if (this_ref_frame != LAST_FRAME)
cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
else
cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
@@ -1971,8 +1991,8 @@
int tmp_rd;
int this_rd_thresh;
- this_rd_thresh = (x->e_mbd.mode_info_context->mbmi.ref_frame == LAST_FRAME) ? cpi->rd_threshes[THR_NEWMV] : cpi->rd_threshes[THR_NEWA];
- this_rd_thresh = (x->e_mbd.mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) ? cpi->rd_threshes[THR_NEWG]: this_rd_thresh;
+ this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1) ? cpi->rd_threshes[THR_NEW1] : cpi->rd_threshes[THR_NEW3];
+ this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2) ? cpi->rd_threshes[THR_NEW2] : this_rd_thresh;
tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv,
best_yrd, mdcounts,
--
⑨