summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
Diffstat (limited to 'vp9')
-rw-r--r--vp9/common/vp9_loopfilter.h1
-rw-r--r--vp9/encoder/vp9_encoder.c19
-rw-r--r--vp9/encoder/vp9_mcomp.c9
-rw-r--r--vp9/encoder/vp9_picklpf.c3
4 files changed, 24 insertions, 8 deletions
diff --git a/vp9/common/vp9_loopfilter.h b/vp9/common/vp9_loopfilter.h
index b2893a451..fca8830fa 100644
--- a/vp9/common/vp9_loopfilter.h
+++ b/vp9/common/vp9_loopfilter.h
@@ -69,6 +69,7 @@ typedef struct {
struct loopfilter {
int filter_level;
+ int last_filt_level;
int sharpness_level;
int last_sharpness_level;
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 5341c9444..1d081fdd4 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -2823,6 +2823,7 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
if (xd->lossless) {
lf->filter_level = 0;
+ lf->last_filt_level = 0;
} else {
struct vpx_usec_timer timer;
@@ -2830,7 +2831,16 @@ static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
vpx_usec_timer_start(&timer);
- vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
+ if (!cpi->rc.is_src_frame_alt_ref) {
+ if ((cpi->common.frame_type == KEY_FRAME) &&
+ (!cpi->rc.this_key_frame_forced)) {
+ lf->last_filt_level = 0;
+ }
+ vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
+ lf->last_filt_level = lf->filter_level;
+ } else {
+ lf->filter_level = 0;
+ }
vpx_usec_timer_mark(&timer);
cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
@@ -3023,7 +3033,7 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) {
"%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf"
"%6d %6d %5d %5d %5d "
"%10"PRId64" %10.3lf"
- "%10lf %8u %10"PRId64" %10d %10d %10d\n",
+ "%10lf %8u %10"PRId64" %10d %10d %10d %10d\n",
cpi->common.current_video_frame,
cm->width, cm->height,
cpi->td.rd_counts.m_search_count,
@@ -3055,7 +3065,8 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) {
(1 + cpi->twopass.total_left_stats.coded_error),
cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
cpi->twopass.kf_zeromotion_pct,
- cpi->twopass.fr_content_type);
+ cpi->twopass.fr_content_type,
+ cm->lf.filter_level);
fclose(f);
@@ -4326,7 +4337,7 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1;
#endif
- if (oxcf->arnr_max_frames > 0) {
+ if ((oxcf->arnr_max_frames > 0) && (oxcf->arnr_strength > 0)) {
// Produce the filtered ARF frame.
vp9_temporal_filter(cpi, arf_src_index);
vpx_extend_frame_borders(&cpi->alt_ref_buffer);
diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c
index 84ef1b43e..4004dd3db 100644
--- a/vp9/encoder/vp9_mcomp.c
+++ b/vp9/encoder/vp9_mcomp.c
@@ -86,7 +86,9 @@ static int mv_err_cost(const MV *mv, const MV *ref,
if (mvcost) {
const MV diff = { mv->row - ref->row,
mv->col - ref->col };
- return ROUND_POWER_OF_TWO(mv_cost(&diff, mvjcost, mvcost) *
+ // TODO(aconverse): See if this shift needs to be tied to
+ // VP9_PROB_COST_SHIFT.
+ return ROUND_POWER_OF_TWO((unsigned)mv_cost(&diff, mvjcost, mvcost) *
error_per_bit, 13);
}
return 0;
@@ -96,8 +98,9 @@ static int mvsad_err_cost(const MACROBLOCK *x, const MV *mv, const MV *ref,
int error_per_bit) {
const MV diff = { mv->row - ref->row,
mv->col - ref->col };
- return ROUND_POWER_OF_TWO(mv_cost(&diff, x->nmvjointsadcost,
- x->nmvsadcost) * error_per_bit, 8);
+ // TODO(aconverse): See if this shift needs to be tied to VP9_PROB_COST_SHIFT.
+ return ROUND_POWER_OF_TWO((unsigned)mv_cost(&diff, x->nmvjointsadcost,
+ x->nmvsadcost) * error_per_bit, 8);
}
void vp9_init_dsmotion_compensation(search_site_config *cfg, int stride) {
diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c
index 5444bc89f..f6b1dfcd5 100644
--- a/vp9/encoder/vp9_picklpf.c
+++ b/vp9/encoder/vp9_picklpf.c
@@ -78,7 +78,8 @@ static int search_filter_level(const YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi,
// Start the search at the previous frame filter level unless it is now out of
// range.
- int filt_mid = clamp(lf->filter_level, min_filter_level, max_filter_level);
+ int filt_mid =
+ clamp(lf->last_filt_level, min_filter_level, max_filter_level);
int filter_step = filt_mid < 16 ? 4 : filt_mid / 4;
// Sum squared error at each filter level
int64_t ss_err[MAX_LOOP_FILTER + 1];