| Index: source/libvpx/vp9/encoder/vp9_picklpf.c
 | 
| ===================================================================
 | 
| --- source/libvpx/vp9/encoder/vp9_picklpf.c	(revision 263011)
 | 
| +++ source/libvpx/vp9/encoder/vp9_picklpf.c	(working copy)
 | 
| @@ -10,40 +10,33 @@
 | 
|  
 | 
|  #include <assert.h>
 | 
|  #include <limits.h>
 | 
| +
 | 
| +#include "./vpx_scale_rtcd.h"
 | 
| +
 | 
| +#include "vpx_mem/vpx_mem.h"
 | 
| +
 | 
| +#include "vp9/common/vp9_loopfilter.h"
 | 
|  #include "vp9/common/vp9_onyxc_int.h"
 | 
| +#include "vp9/common/vp9_quant_common.h"
 | 
| +
 | 
|  #include "vp9/encoder/vp9_onyx_int.h"
 | 
|  #include "vp9/encoder/vp9_picklpf.h"
 | 
|  #include "vp9/encoder/vp9_quantize.h"
 | 
| -#include "vp9/common/vp9_quant_common.h"
 | 
| -#include "vpx_mem/vpx_mem.h"
 | 
| -#include "vpx_scale/vpx_scale.h"
 | 
| -#include "vp9/common/vp9_alloccommon.h"
 | 
| -#include "vp9/common/vp9_loopfilter.h"
 | 
| -#include "./vpx_scale_rtcd.h"
 | 
|  
 | 
| -static int get_min_filter_level(VP9_COMP *cpi, int base_qindex) {
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -static int get_max_filter_level(VP9_COMP *cpi, int base_qindex) {
 | 
| +static int get_max_filter_level(VP9_COMP *cpi) {
 | 
|    return cpi->twopass.section_intra_rating > 8 ? MAX_LOOP_FILTER * 3 / 4
 | 
|                                                 : MAX_LOOP_FILTER;
 | 
|  }
 | 
|  
 | 
| -// Stub function for now Alt LF not used
 | 
| -void vp9_set_alt_lf_level(VP9_COMP *cpi, int filt_val) {
 | 
| -}
 | 
|  
 | 
|  static int try_filter_frame(const YV12_BUFFER_CONFIG *sd, VP9_COMP *const cpi,
 | 
| -                            MACROBLOCKD *const xd, VP9_COMMON *const cm,
 | 
|                              int filt_level, int partial_frame) {
 | 
| +  VP9_COMMON *const cm = &cpi->common;
 | 
|    int filt_err;
 | 
|  
 | 
| -  vp9_set_alt_lf_level(cpi, filt_level);
 | 
| -  vp9_loop_filter_frame(cm, xd, filt_level, 1, partial_frame);
 | 
| +  vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_level, 1, partial_frame);
 | 
| +  filt_err = vp9_get_y_sse(sd, cm->frame_to_show);
 | 
|  
 | 
| -  filt_err = vp9_calc_ss_err(sd, cm->frame_to_show);
 | 
| -
 | 
|    // Re-instate the unfiltered frame
 | 
|    vpx_yv12_copy_y(&cpi->last_frame_uf, cm->frame_to_show);
 | 
|  
 | 
| @@ -52,11 +45,10 @@
 | 
|  
 | 
|  static void search_filter_level(const YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi,
 | 
|                                  int partial_frame) {
 | 
| -  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
 | 
|    VP9_COMMON *const cm = &cpi->common;
 | 
|    struct loopfilter *const lf = &cm->lf;
 | 
| -  const int min_filter_level = get_min_filter_level(cpi, cm->base_qindex);
 | 
| -  const int max_filter_level = get_max_filter_level(cpi, cm->base_qindex);
 | 
| +  const int min_filter_level = 0;
 | 
| +  const int max_filter_level = get_max_filter_level(cpi);
 | 
|    int best_err;
 | 
|    int filt_best;
 | 
|    int filt_direction = 0;
 | 
| @@ -73,7 +65,7 @@
 | 
|    //  Make a copy of the unfiltered / processed recon buffer
 | 
|    vpx_yv12_copy_y(cm->frame_to_show, &cpi->last_frame_uf);
 | 
|  
 | 
| -  best_err = try_filter_frame(sd, cpi, xd, cm, filt_mid, partial_frame);
 | 
| +  best_err = try_filter_frame(sd, cpi, filt_mid, partial_frame);
 | 
|    filt_best = filt_mid;
 | 
|    ss_err[filt_mid] = best_err;
 | 
|  
 | 
| @@ -95,7 +87,7 @@
 | 
|      if (filt_direction <= 0 && filt_low != filt_mid) {
 | 
|        // Get Low filter error score
 | 
|        if (ss_err[filt_low] < 0) {
 | 
| -        filt_err = try_filter_frame(sd, cpi, xd, cm, filt_low, partial_frame);
 | 
| +        filt_err = try_filter_frame(sd, cpi, filt_low, partial_frame);
 | 
|          ss_err[filt_low] = filt_err;
 | 
|        } else {
 | 
|          filt_err = ss_err[filt_low];
 | 
| @@ -114,7 +106,7 @@
 | 
|      // Now look at filt_high
 | 
|      if (filt_direction >= 0 && filt_high != filt_mid) {
 | 
|        if (ss_err[filt_high] < 0) {
 | 
| -        filt_err = try_filter_frame(sd, cpi, xd, cm, filt_high, partial_frame);
 | 
| +        filt_err = try_filter_frame(sd, cpi, filt_high, partial_frame);
 | 
|          ss_err[filt_high] = filt_err;
 | 
|        } else {
 | 
|          filt_err = ss_err[filt_high];
 | 
| @@ -128,7 +120,7 @@
 | 
|  
 | 
|      // Half the step distance if the best filter value was the same as last time
 | 
|      if (filt_best == filt_mid) {
 | 
| -      filter_step = filter_step / 2;
 | 
| +      filter_step /= 2;
 | 
|        filt_direction = 0;
 | 
|      } else {
 | 
|        filt_direction = (filt_best < filt_mid) ? -1 : 1;
 | 
| @@ -140,25 +132,24 @@
 | 
|  }
 | 
|  
 | 
|  void vp9_pick_filter_level(const YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi,
 | 
| -                           int method) {
 | 
| +                           LPF_PICK_METHOD method) {
 | 
|    VP9_COMMON *const cm = &cpi->common;
 | 
|    struct loopfilter *const lf = &cm->lf;
 | 
|  
 | 
|    lf->sharpness_level = cm->frame_type == KEY_FRAME ? 0
 | 
|                                                      : cpi->oxcf.sharpness;
 | 
|  
 | 
| -  if (method == 2) {
 | 
| -    const int min_filter_level = get_min_filter_level(cpi, cm->base_qindex);
 | 
| -    const int max_filter_level = get_max_filter_level(cpi, cm->base_qindex);
 | 
| +  if (method == LPF_PICK_FROM_Q) {
 | 
| +    const int min_filter_level = 0;
 | 
| +    const int max_filter_level = get_max_filter_level(cpi);
 | 
|      const int q = vp9_ac_quant(cm->base_qindex, 0);
 | 
|      // These values were determined by linear fitting the result of the
 | 
| -    // searched level
 | 
| -    // filt_guess = q * 0.316206 + 3.87252
 | 
| -    int filt_guess = (q * 20723 + 1015158 + (1 << 17)) >> 18;
 | 
| +    // searched level, filt_guess = q * 0.316206 + 3.87252
 | 
| +    int filt_guess = ROUND_POWER_OF_TWO(q * 20723 + 1015158, 18);
 | 
|      if (cm->frame_type == KEY_FRAME)
 | 
|        filt_guess -= 4;
 | 
|      lf->filter_level = clamp(filt_guess, min_filter_level, max_filter_level);
 | 
|    } else {
 | 
| -    search_filter_level(sd, cpi, method == 1);
 | 
| +    search_filter_level(sd, cpi, method == LPF_PICK_FROM_SUBIMAGE);
 | 
|    }
 | 
|  }
 | 
| 
 |