diff options
Diffstat (limited to 'vp9')
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 6 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.h | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 6 | ||||
-rw-r--r-- | vp9/encoder/vp9_lookahead.c | 3 | ||||
-rw-r--r-- | vp9/encoder/vp9_lookahead.h | 3 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.h | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_rdopt.c | 29 | ||||
-rw-r--r-- | vp9/encoder/vp9_svc_layercontext.c | 16 | ||||
-rw-r--r-- | vp9/encoder/vp9_temporal_filter.c | 145 | ||||
-rw-r--r-- | vp9/encoder/vp9_temporal_filter.h | 1 | ||||
-rw-r--r-- | vp9/encoder/vp9_variance.c | 69 | ||||
-rw-r--r-- | vp9/vp9_cx_iface.c | 6 |
13 files changed, 168 insertions, 122 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 395d26aef..f3ab4ede3 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -162,6 +162,7 @@ void vp9_initialize_enc() { vp9_rc_init_minq_luts(); vp9_entropy_mv_init(); vp9_entropy_mode_init(); + vp9_temporal_filter_init(); init_done = 1; } } @@ -536,7 +537,6 @@ static void set_tile_limits(VP9_COMP *cpi) { static void init_config(struct VP9_COMP *cpi, VP9EncoderConfig *oxcf) { VP9_COMMON *const cm = &cpi->common; - int i; cpi->oxcf = *oxcf; @@ -571,10 +571,6 @@ static void init_config(struct VP9_COMP *cpi, VP9EncoderConfig *oxcf) { cpi->alt_fb_idx = 2; set_tile_limits(cpi); - - cpi->fixed_divide[0] = 0; - for (i = 1; i < 512; i++) - cpi->fixed_divide[i] = 0x80000 / i; } static int get_pass(MODE mode) { diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index 3cd0fc1ac..87320952d 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -276,6 +276,7 @@ typedef struct VP9EncoderConfig { int arnr_max_frames; int arnr_strength; + int arnr_type; int tile_columns; int tile_rows; @@ -443,7 +444,6 @@ typedef struct VP9_COMP { YV12_BUFFER_CONFIG alt_ref_buffer; YV12_BUFFER_CONFIG *frames[MAX_LAG_BUFFERS]; - int fixed_divide[512]; #if CONFIG_INTERNAL_STATS unsigned int mode_chosen_counts[MAX_MODES]; diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 1f995c9e7..5867fb3fc 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -61,7 +61,7 @@ #define MIN_GF_INTERVAL 4 #endif -#define LONG_TERM_VBR_CORRECTION +// #define LONG_TERM_VBR_CORRECTION static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { YV12_BUFFER_CONFIG temp = *a; @@ -2402,8 +2402,8 @@ void vp9_twopass_postencode_update(VP9_COMP *cpi) { const double progress = (double)(cpi->twopass.stats_in - cpi->twopass.stats_in_start) / (cpi->twopass.stats_in_end - cpi->twopass.stats_in_start); - const int bits_used = progress * cpi->rc.this_frame_target + - (1.0 - progress) * cpi->rc.projected_frame_size; + const int bits_used = progress * rc->this_frame_target + + (1.0 - progress) * rc->projected_frame_size; #endif cpi->twopass.bits_left -= bits_used; diff --git a/vp9/encoder/vp9_lookahead.c b/vp9/encoder/vp9_lookahead.c index a298f1c20..abe71e681 100644 --- a/vp9/encoder/vp9_lookahead.c +++ b/vp9/encoder/vp9_lookahead.c @@ -18,6 +18,9 @@ #include "vp9/encoder/vp9_extend.h" #include "vp9/encoder/vp9_lookahead.h" +// The max of past frames we want to keep in the queue. +#define MAX_PRE_FRAMES 1 + struct lookahead_ctx { unsigned int max_sz; /* Absolute size of the queue */ unsigned int sz; /* Number of buffers currently in the queue */ diff --git a/vp9/encoder/vp9_lookahead.h b/vp9/encoder/vp9_lookahead.h index 046c533cc..ff63c0d0d 100644 --- a/vp9/encoder/vp9_lookahead.h +++ b/vp9/encoder/vp9_lookahead.h @@ -20,9 +20,6 @@ extern "C" { #define MAX_LAG_BUFFERS 25 -// The max of past frames we want to keep in the queue. -#define MAX_PRE_FRAMES 1 - struct lookahead_entry { YV12_BUFFER_CONFIG img; int64_t ts_start; diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index b123bfdcb..24e75aedb 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -40,6 +40,8 @@ #define MIN_BPB_FACTOR 0.005 #define MAX_BPB_FACTOR 50 +#define FRAME_OVERHEAD_BITS 200 + // Tables relating active max Q to active min Q static int kf_low_motion_minq[QINDEX_RANGE]; static int kf_high_motion_minq[QINDEX_RANGE]; diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h index 820366119..b1cc67609 100644 --- a/vp9/encoder/vp9_ratectrl.h +++ b/vp9/encoder/vp9_ratectrl.h @@ -20,8 +20,6 @@ extern "C" { #endif -#define FRAME_OVERHEAD_BITS 200 - // Bits Per MB at different Q (Multiplied by 512) #define BPER_MB_NORMBITS 9 diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 6c6c1d7ee..857015e51 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -1805,7 +1805,7 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x, // motion search for newmv (single predictor case only) if (!has_second_rf && this_mode == NEWMV && seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) { - int_mv *const new_mv = &mode_mv[NEWMV][0]; + MV *const new_mv = &mode_mv[NEWMV][0].as_mv; int step_param = 0; int further_steps; int thissme, bestsme = INT_MAX; @@ -1861,9 +1861,9 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x, step_param, sadpb, 1, v_fn_ptr, 1, &bsi->ref_mv[0]->as_mv, - &new_mv->as_mv); + new_mv); if (bestsme < INT_MAX) - bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv, + bestsme = vp9_get_mvpred_var(x, new_mv, &bsi->ref_mv[0]->as_mv, v_fn_ptr, 1); } else if (cpi->sf.search_method == SQUARE) { @@ -1871,9 +1871,9 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x, step_param, sadpb, 1, v_fn_ptr, 1, &bsi->ref_mv[0]->as_mv, - &new_mv->as_mv); + new_mv); if (bestsme < INT_MAX) - bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv, + bestsme = vp9_get_mvpred_var(x, new_mv, &bsi->ref_mv[0]->as_mv, v_fn_ptr, 1); } else if (cpi->sf.search_method == BIGDIA) { @@ -1881,16 +1881,16 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x, step_param, sadpb, 1, v_fn_ptr, 1, &bsi->ref_mv[0]->as_mv, - &new_mv->as_mv); + new_mv); if (bestsme < INT_MAX) - bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv, + bestsme = vp9_get_mvpred_var(x, new_mv, &bsi->ref_mv[0]->as_mv, v_fn_ptr, 1); } else { bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, sadpb, further_steps, 0, v_fn_ptr, &bsi->ref_mv[0]->as_mv, - &new_mv->as_mv); + new_mv); } // Should we do a full search (best quality only) @@ -1905,18 +1905,18 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x, &best_mv->as_mv); if (thissme < bestsme) { bestsme = thissme; - new_mv->as_int = best_mv->as_int; + *new_mv = best_mv->as_mv; } else { // The full search result is actually worse so re-instate the // previous best vector - best_mv->as_int = new_mv->as_int; + best_mv->as_mv = *new_mv; } } if (bestsme < INT_MAX) { int distortion; cpi->find_fractional_mv_step(x, - &new_mv->as_mv, + new_mv, &bsi->ref_mv[0]->as_mv, cm->allow_high_precision_mv, x->errorperbit, v_fn_ptr, @@ -1927,11 +1927,11 @@ static int64_t rd_pick_best_sub8x8_mode(VP9_COMP *cpi, MACROBLOCK *x, &x->pred_sse[mbmi->ref_frame[0]]); // save motion search result for use in compound prediction - seg_mvs[i][mbmi->ref_frame[0]].as_int = new_mv->as_int; + seg_mvs[i][mbmi->ref_frame[0]].as_mv = *new_mv; } if (cpi->sf.adaptive_motion_search) - x->pred_mv[mbmi->ref_frame[0]].as_int = new_mv->as_int; + x->pred_mv[mbmi->ref_frame[0]].as_mv = *new_mv; // restore src pointers mi_buf_restore(x, orig_src, orig_pre); @@ -3249,9 +3249,8 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, // an unfiltered alternative. We allow near/nearest as well // because they may result in zero-zero MVs but be cheaper. if (cpi->rc.is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) { - const int altref_zero_mask = + mode_skip_mask = ~((1 << THR_NEARESTA) | (1 << THR_NEARA) | (1 << THR_ZEROA)); - mode_skip_mask |= altref_zero_mask; if (frame_mv[NEARMV][ALTREF_FRAME].as_int != 0) mode_skip_mask |= (1 << THR_NEARA); if (frame_mv[NEARESTMV][ALTREF_FRAME].as_int != 0) diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c index 5342447d6..792e8d21b 100644 --- a/vp9/encoder/vp9_svc_layercontext.c +++ b/vp9/encoder/vp9_svc_layercontext.c @@ -221,15 +221,9 @@ void vp9_inc_frame_in_layer(SVC *svc) { ++lc->current_video_frame_in_layer; } -int vp9_is_upper_layer_key_frame(const struct VP9_COMP *const cpi) { - int is_upper_layer_key_frame = 0; - - if (cpi->use_svc && cpi->svc.number_temporal_layers == 1 && - cpi->svc.spatial_layer_id > 0) { - if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame) { - is_upper_layer_key_frame = 1; - } - } - - return is_upper_layer_key_frame; +int vp9_is_upper_layer_key_frame(const VP9_COMP *cpi) { + return cpi->use_svc && + cpi->svc.number_temporal_layers == 1 && + cpi->svc.spatial_layer_id > 0 && + cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame; } diff --git a/vp9/encoder/vp9_temporal_filter.c b/vp9/encoder/vp9_temporal_filter.c index ca9339155..6eff20080 100644 --- a/vp9/encoder/vp9_temporal_filter.c +++ b/vp9/encoder/vp9_temporal_filter.c @@ -27,6 +27,8 @@ #include "vpx_ports/vpx_timer.h" #include "vpx_scale/vpx_scale.h" +static int fixed_divide[512]; + static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd, uint8_t *y_mb_ptr, uint8_t *u_mb_ptr, @@ -78,6 +80,14 @@ static void temporal_filter_predictors_mb_c(MACROBLOCKD *xd, kernel, mv_precision_uv, x, y); } +void vp9_temporal_filter_init() { + int i; + + fixed_divide[0] = 0; + for (i = 1; i < 512; ++i) + fixed_divide[i] = 0x80000 / i; +} + void vp9_temporal_filter_apply_c(uint8_t *frame1, unsigned int stride, uint8_t *frame2, @@ -89,6 +99,7 @@ void vp9_temporal_filter_apply_c(uint8_t *frame1, unsigned int i, j, k; int modifier; int byte = 0; + const int rounding = strength > 0 ? 1 << (strength - 1) : 0; for (i = 0, k = 0; i < block_size; i++) { for (j = 0; j < block_size; j++, k++) { @@ -101,7 +112,7 @@ void vp9_temporal_filter_apply_c(uint8_t *frame1, // modifier = (int)roundf(coeff > 16 ? 0 : 16-coeff); modifier *= modifier; modifier *= 3; - modifier += 1 << (strength - 1); + modifier += rounding; modifier >>= strength; if (modifier > 16) @@ -294,7 +305,7 @@ static void temporal_filter_iterate_c(VP9_COMP *cpi, for (i = 0, k = 0; i < 16; i++) { for (j = 0; j < 16; j++, k++) { unsigned int pval = accumulator[k] + (count[k] >> 1); - pval *= cpi->fixed_divide[count[k]]; + pval *= fixed_divide[count[k]]; pval >>= 19; dst1[byte] = (uint8_t)pval; @@ -315,13 +326,13 @@ static void temporal_filter_iterate_c(VP9_COMP *cpi, // U unsigned int pval = accumulator[k] + (count[k] >> 1); - pval *= cpi->fixed_divide[count[k]]; + pval *= fixed_divide[count[k]]; pval >>= 19; dst1[byte] = (uint8_t)pval; // V pval = accumulator[m] + (count[m] >> 1); - pval *= cpi->fixed_divide[count[m]]; + pval *= fixed_divide[count[m]]; pval >>= 19; dst2[byte] = (uint8_t)pval; @@ -345,33 +356,74 @@ static void temporal_filter_iterate_c(VP9_COMP *cpi, void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) { VP9_COMMON *const cm = &cpi->common; int frame = 0; + int frames_to_blur_backward = 0; + int frames_to_blur_forward = 0; int frames_to_blur = 0; int start_frame = 0; int strength = cpi->active_arnr_strength; + int blur_type = cpi->oxcf.arnr_type; int max_frames = cpi->active_arnr_frames; - int frames_to_blur_backward = distance; - int frames_to_blur_forward = vp9_lookahead_depth(cpi->lookahead) - - (distance + 1); + const int num_frames_backward = distance; + const int num_frames_forward = vp9_lookahead_depth(cpi->lookahead) + - (num_frames_backward + 1); struct scale_factors sf; - // Determine which input frames to filter. - if (frames_to_blur_forward > frames_to_blur_backward) - frames_to_blur_forward = frames_to_blur_backward; + switch (blur_type) { + case 1: + // Backward Blur + frames_to_blur_backward = num_frames_backward; + + if (frames_to_blur_backward >= max_frames) + frames_to_blur_backward = max_frames - 1; + + frames_to_blur = frames_to_blur_backward + 1; + break; + + case 2: + // Forward Blur + frames_to_blur_forward = num_frames_forward; + + if (frames_to_blur_forward >= max_frames) + frames_to_blur_forward = max_frames - 1; + + frames_to_blur = frames_to_blur_forward + 1; + break; - if (frames_to_blur_backward > frames_to_blur_forward) - frames_to_blur_backward = frames_to_blur_forward; + case 3: + default: + // Center Blur + frames_to_blur_forward = num_frames_forward; + frames_to_blur_backward = num_frames_backward; - // When max_frames is even we have 1 more frame backward than forward - if (frames_to_blur_forward > (max_frames - 1) / 2) - frames_to_blur_forward = (max_frames - 1) / 2; + if (frames_to_blur_forward > frames_to_blur_backward) + frames_to_blur_forward = frames_to_blur_backward; - if (frames_to_blur_backward > (max_frames / 2)) - frames_to_blur_backward = max_frames / 2; + if (frames_to_blur_backward > frames_to_blur_forward) + frames_to_blur_backward = frames_to_blur_forward; - frames_to_blur = frames_to_blur_backward + frames_to_blur_forward + 1; + // When max_frames is even we have 1 more frame backward than forward + if (frames_to_blur_forward > (max_frames - 1) / 2) + frames_to_blur_forward = ((max_frames - 1) / 2); + + if (frames_to_blur_backward > (max_frames / 2)) + frames_to_blur_backward = (max_frames / 2); + + frames_to_blur = frames_to_blur_backward + frames_to_blur_forward + 1; + break; + } start_frame = distance + frames_to_blur_forward; +#ifdef DEBUGFWG + // DEBUG FWG + printf( + "max:%d FBCK:%d FFWD:%d ftb:%d ftbbck:%d ftbfwd:%d sei:%d lasei:%d " + "start:%d", + max_frames, num_frames_backward, num_frames_forward, frames_to_blur, + frames_to_blur_backward, frames_to_blur_forward, cpi->source_encode_index, + cpi->last_alt_ref_sei, start_frame); +#endif + // Setup scaling factors. Scaling on each of the arnr frames is not supported vp9_setup_scale_factors_for_frame(&sf, get_frame_new_buffer(cm)->y_crop_width, @@ -380,7 +432,7 @@ void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) { // Setup frame pointers, NULL indicates frame not included in filter vp9_zero(cpi->frames); - for (frame = 0; frame < frames_to_blur; ++frame) { + for (frame = 0; frame < frames_to_blur; frame++) { int which_buffer = start_frame - frame; struct lookahead_entry *buf = vp9_lookahead_peek(cpi->lookahead, which_buffer); @@ -394,11 +446,11 @@ void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance) { void vp9_configure_arnr_filter(VP9_COMP *cpi, const unsigned int frames_to_arnr, const int group_boost) { - int q; int half_gf_int; int frames_after_arf; - int frames_bwd; - int frames_fwd = (cpi->oxcf.arnr_max_frames - 1) >> 1; + int frames_bwd = cpi->oxcf.arnr_max_frames - 1; + int frames_fwd = cpi->oxcf.arnr_max_frames - 1; + int q; // Define the arnr filter width for this group of frames. We only // filter frames that lie within a distance of half the GF interval @@ -410,26 +462,47 @@ void vp9_configure_arnr_filter(VP9_COMP *cpi, frames_after_arf = vp9_lookahead_depth(cpi->lookahead) - frames_to_arnr - 1; - if (frames_fwd > frames_after_arf) - frames_fwd = frames_after_arf; - if (frames_fwd > half_gf_int) - frames_fwd = half_gf_int; - - frames_bwd = frames_fwd; - - // For even length filter there is one more frame backward - // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. - if (frames_bwd < half_gf_int) - frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1; + switch (cpi->oxcf.arnr_type) { + case 1: // Backward filter + frames_fwd = 0; + if (frames_bwd > half_gf_int) + frames_bwd = half_gf_int; + break; + + case 2: // Forward filter + if (frames_fwd > half_gf_int) + frames_fwd = half_gf_int; + if (frames_fwd > frames_after_arf) + frames_fwd = frames_after_arf; + frames_bwd = 0; + break; + + case 3: // Centered filter + default: + frames_fwd >>= 1; + if (frames_fwd > frames_after_arf) + frames_fwd = frames_after_arf; + if (frames_fwd > half_gf_int) + frames_fwd = half_gf_int; + + frames_bwd = frames_fwd; + + // For even length filter there is one more frame backward + // than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff. + if (frames_bwd < half_gf_int) + frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1; + break; + } cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd; // Adjust the strength based on active max q if (cpi->common.current_video_frame > 1) - q = ((int)vp9_convert_qindex_to_q(cpi->rc.avg_frame_qindex[INTER_FRAME])); + q = ((int)vp9_convert_qindex_to_q( + cpi->rc.avg_frame_qindex[INTER_FRAME])); else - q = ((int)vp9_convert_qindex_to_q(cpi->rc.avg_frame_qindex[KEY_FRAME])); - + q = ((int)vp9_convert_qindex_to_q( + cpi->rc.avg_frame_qindex[KEY_FRAME])); if (q > 16) { cpi->active_arnr_strength = cpi->oxcf.arnr_strength; } else { diff --git a/vp9/encoder/vp9_temporal_filter.h b/vp9/encoder/vp9_temporal_filter.h index 3028d7884..9453dc16a 100644 --- a/vp9/encoder/vp9_temporal_filter.h +++ b/vp9/encoder/vp9_temporal_filter.h @@ -15,6 +15,7 @@ extern "C" { #endif +void vp9_temporal_filter_init(); void vp9_temporal_filter_prepare(VP9_COMP *cpi, int distance); void vp9_configure_arnr_filter(VP9_COMP *cpi, const unsigned int frames_to_arnr, diff --git a/vp9/encoder/vp9_variance.c b/vp9/encoder/vp9_variance.c index ae3c86aee..324a1de84 100644 --- a/vp9/encoder/vp9_variance.c +++ b/vp9/encoder/vp9_variance.c @@ -113,12 +113,9 @@ unsigned int vp9_get_mb_ss_c(const int16_t *src_ptr) { unsigned int vp9_variance##W##x##H##_c(const uint8_t *a, int a_stride, \ const uint8_t *b, int b_stride, \ unsigned int *sse) { \ - unsigned int var; \ - int avg; \ -\ - variance(a, a_stride, b, b_stride, W, H, &var, &avg); \ - *sse = var; \ - return var - (((int64_t)avg * avg) / (W * H)); \ + int sum; \ + variance(a, a_stride, b, b_stride, W, H, sse, &sum); \ + return *sse - (((int64_t)sum * sum) / (W * H)); \ } #define SUBPIX_VAR(W, H) \ @@ -172,56 +169,36 @@ void vp9_get_sse_sum_8x8_c(const uint8_t *src_ptr, int source_stride, variance(src_ptr, source_stride, ref_ptr, ref_stride, 8, 8, sse, sum); } -unsigned int vp9_mse16x16_c(const uint8_t *src_ptr, - int source_stride, - const uint8_t *ref_ptr, - int recon_stride, +unsigned int vp9_mse16x16_c(const uint8_t *src, int src_stride, + const uint8_t *ref, int ref_stride, unsigned int *sse) { - unsigned int var; - int avg; - - variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); - *sse = var; - return var; + int sum; + variance(src, src_stride, ref, ref_stride, 16, 16, sse, &sum); + return *sse; } -unsigned int vp9_mse16x8_c(const uint8_t *src_ptr, - int source_stride, - const uint8_t *ref_ptr, - int recon_stride, +unsigned int vp9_mse16x8_c(const uint8_t *src, int src_stride, + const uint8_t *ref, int ref_stride, unsigned int *sse) { - unsigned int var; - int avg; - - variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 8, &var, &avg); - *sse = var; - return var; + int sum; + variance(src, src_stride, ref, ref_stride, 16, 8, sse, &sum); + return *sse; } -unsigned int vp9_mse8x16_c(const uint8_t *src_ptr, - int source_stride, - const uint8_t *ref_ptr, - int recon_stride, +unsigned int vp9_mse8x16_c(const uint8_t *src, int src_stride, + const uint8_t *ref, int ref_stride, unsigned int *sse) { - unsigned int var; - int avg; - - variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 16, &var, &avg); - *sse = var; - return var; + int sum; + variance(src, src_stride, ref, ref_stride, 8, 16, sse, &sum); + return *sse; } -unsigned int vp9_mse8x8_c(const uint8_t *src_ptr, - int source_stride, - const uint8_t *ref_ptr, - int recon_stride, +unsigned int vp9_mse8x8_c(const uint8_t *src, int src_stride, + const uint8_t *ref, int ref_stride, unsigned int *sse) { - unsigned int var; - int avg; - - variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 8, &var, &avg); - *sse = var; - return var; + int sum; + variance(src, src_stride, ref, ref_stride, 8, 8, sse, &sum); + return *sse; } VAR(4, 4) diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index 1ca9fb93a..449e7d897 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -30,6 +30,7 @@ struct vp9_extracfg { unsigned int tile_rows; unsigned int arnr_max_frames; unsigned int arnr_strength; + unsigned int arnr_type; vp8e_tuning tuning; unsigned int cq_level; // constrained quality level unsigned int rc_max_intra_bitrate_pct; @@ -59,6 +60,7 @@ static const struct extraconfig_map extracfg_map[] = { 0, // tile_rows 7, // arnr_max_frames 5, // arnr_strength + 3, // arnr_type VP8_TUNE_PSNR, // tuning 10, // cq_level 0, // rc_max_intra_bitrate_pct @@ -201,6 +203,7 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx, RANGE_CHECK_HI(extra_cfg, sharpness, 7); RANGE_CHECK(extra_cfg, arnr_max_frames, 0, 15); RANGE_CHECK_HI(extra_cfg, arnr_strength, 6); + RANGE_CHECK(extra_cfg, arnr_type, 1, 3); RANGE_CHECK(extra_cfg, cq_level, 0, 63); // TODO(yaowu): remove this when ssim tuning is implemented for vp9 @@ -364,6 +367,7 @@ static vpx_codec_err_t set_encoder_config( oxcf->arnr_max_frames = extra_cfg->arnr_max_frames; oxcf->arnr_strength = extra_cfg->arnr_strength; + oxcf->arnr_type = extra_cfg->arnr_type; oxcf->tuning = extra_cfg->tuning; @@ -494,6 +498,7 @@ static vpx_codec_err_t ctrl_set_param(vpx_codec_alg_priv_t *ctx, int ctrl_id, MAP(VP9E_SET_TILE_ROWS, extra_cfg.tile_rows); MAP(VP8E_SET_ARNR_MAXFRAMES, extra_cfg.arnr_max_frames); MAP(VP8E_SET_ARNR_STRENGTH, extra_cfg.arnr_strength); + MAP(VP8E_SET_ARNR_TYPE, extra_cfg.arnr_type); MAP(VP8E_SET_TUNING, extra_cfg.tuning); MAP(VP8E_SET_CQ_LEVEL, extra_cfg.cq_level); MAP(VP8E_SET_MAX_INTRA_BITRATE_PCT, extra_cfg.rc_max_intra_bitrate_pct); @@ -1107,6 +1112,7 @@ static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { {VP9E_SET_TILE_ROWS, ctrl_set_param}, {VP8E_SET_ARNR_MAXFRAMES, ctrl_set_param}, {VP8E_SET_ARNR_STRENGTH, ctrl_set_param}, + {VP8E_SET_ARNR_TYPE, ctrl_set_param}, {VP8E_SET_TUNING, ctrl_set_param}, {VP8E_SET_CQ_LEVEL, ctrl_set_param}, {VP8E_SET_MAX_INTRA_BITRATE_PCT, ctrl_set_param}, |