summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/svc_datarate_test.cc2
-rw-r--r--vp8/encoder/onyx_if.c12
-rw-r--r--vp8/encoder/onyx_int.h2
-rw-r--r--vp9/encoder/vp9_encoder.h4
-rw-r--r--vp9/encoder/vp9_firstpass.c26
-rw-r--r--vp9/encoder/vp9_pickmode.c63
-rw-r--r--vp9/encoder/vp9_ratectrl.c40
-rw-r--r--vp9/encoder/vp9_ratectrl.h2
-rw-r--r--vp9/encoder/vp9_speed_features.c4
-rw-r--r--vpx_dsp/vpx_dsp.mk7
-rw-r--r--vpx_dsp/vpx_dsp_rtcd_defs.pl4
11 files changed, 131 insertions, 35 deletions
diff --git a/test/svc_datarate_test.cc b/test/svc_datarate_test.cc
index bb9b0755f..6936b5649 100644
--- a/test/svc_datarate_test.cc
+++ b/test/svc_datarate_test.cc
@@ -937,7 +937,7 @@ TEST_P(DatarateOnePassCbrSvcFrameDropMultiBR, OnePassCbrSvc2SL3TL4Threads) {
layer_framedrop_ = GET_PARAM(2);
AssignLayerBitrates();
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
- CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.65,
+ CheckLayerRateTargeting(number_spatial_layers_, number_temporal_layers_, 0.64,
1.45);
#if CONFIG_VP9_DECODER
// The non-reference frames are expected to be mismatched frames as the
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 71bd7ed94..4fd157492 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -1532,6 +1532,8 @@ void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
}
}
+ cpi->ext_refresh_frame_flags_pending = 0;
+
cpi->baseline_gf_interval =
cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
@@ -2414,6 +2416,7 @@ int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags) {
if (ref_frame_flags & VP8_ALTR_FRAME) cpi->common.refresh_alt_ref_frame = 1;
+ cpi->ext_refresh_frame_flags_pending = 1;
return 0;
}
@@ -3512,6 +3515,7 @@ static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
cm->current_video_frame++;
cpi->frames_since_key++;
+ cpi->ext_refresh_frame_flags_pending = 0;
// We advance the temporal pattern for dropped frames.
cpi->temporal_pattern_counter++;
@@ -3553,6 +3557,7 @@ static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
#endif
cm->current_video_frame++;
cpi->frames_since_key++;
+ cpi->ext_refresh_frame_flags_pending = 0;
// We advance the temporal pattern for dropped frames.
cpi->temporal_pattern_counter++;
return;
@@ -4239,6 +4244,7 @@ static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
cpi->common.current_video_frame++;
cpi->frames_since_key++;
cpi->drop_frame_count++;
+ cpi->ext_refresh_frame_flags_pending = 0;
// We advance the temporal pattern for dropped frames.
cpi->temporal_pattern_counter++;
return;
@@ -4347,8 +4353,10 @@ static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
/* For inter frames the current default behavior is that when
* cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
* This is purely an encoder decision at present.
+ * Avoid this behavior when refresh flags are set by the user.
*/
- if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame) {
+ if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame &&
+ !cpi->ext_refresh_frame_flags_pending) {
cm->copy_buffer_to_arf = 2;
} else {
cm->copy_buffer_to_arf = 0;
@@ -4655,6 +4663,8 @@ static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
#endif
+ cpi->ext_refresh_frame_flags_pending = 0;
+
if (cm->refresh_golden_frame == 1) {
cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
} else {
diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h
index a48c4d5f7..af812b054 100644
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -697,6 +697,8 @@ typedef struct VP8_COMP {
// Use the static threshold from ROI settings.
int use_roi_static_threshold;
+
+ int ext_refresh_frame_flags_pending;
} VP8_COMP;
void vp8_initialize_enc(void);
diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h
index f448f961c..ddba3275e 100644
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -119,8 +119,8 @@ typedef enum {
COMPLEXITY_AQ = 2,
CYCLIC_REFRESH_AQ = 3,
EQUATOR360_AQ = 4,
- PSNR_AQ = 5,
- PERCEPTUAL_AQ = 6,
+ PERCEPTUAL_AQ = 5,
+ PSNR_AQ = 6,
// AQ based on lookahead temporal
// variance (only valid for altref frames)
LOOKAHEAD_AQ = 7,
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c
index 665b4c36e..392d1088e 100644
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2642,6 +2642,17 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
rc->source_alt_ref_pending = 0;
}
+#define LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR 0.2
+ rc->arf_active_best_quality_adjustment_factor = 1.0;
+ if (rc->source_alt_ref_pending && !is_lossless_requested(&cpi->oxcf) &&
+ rc->frames_to_key <= rc->arf_active_best_quality_adjustment_window) {
+ rc->arf_active_best_quality_adjustment_factor =
+ LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR +
+ (1.0 - LAST_ALR_ACTIVE_BEST_QUALITY_ADJUSTMENT_FACTOR) *
+ (rc->frames_to_key - i) /
+ VPXMAX(1, (rc->arf_active_best_quality_adjustment_window - i));
+ }
+
#ifdef AGGRESSIVE_VBR
// Limit maximum boost based on interval length.
rc->gfu_boost = VPXMIN((int)rc->gfu_boost, i * 140);
@@ -3190,6 +3201,11 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Default to normal-sized frame on keyframes.
cpi->rc.next_frame_size_selector = UNSCALED;
}
+#define ARF_ACTIVE_BEST_QUALITY_ADJUSTMENT_WINDOW_SIZE 64
+ // TODO(ravi.chaudhary@ittiam.com): Experiment without the below min
+ // condition. This might be helpful for small key frame intervals.
+ rc->arf_active_best_quality_adjustment_window =
+ VPXMIN(ARF_ACTIVE_BEST_QUALITY_ADJUSTMENT_WINDOW_SIZE, rc->frames_to_key);
}
static int is_skippable_frame(const VP9_COMP *cpi) {
@@ -3225,6 +3241,11 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
if (gf_group->update_type[gf_group->index] == ARF_UPDATE) {
int target_rate;
+ vp9_zero(this_frame);
+ this_frame =
+ cpi->twopass.stats_in_start[cm->current_video_frame +
+ gf_group->arf_src_offset[gf_group->index]];
+
vp9_configure_buffer_updates(cpi, gf_group->index);
target_rate = gf_group->bit_allocation[gf_group->index];
@@ -3240,6 +3261,11 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
cpi->partition_search_skippable_frame = is_skippable_frame(cpi);
}
+ // The multiplication by 256 reverses a scaling factor of (>> 8)
+ // applied when combining MB error values for the frame.
+ twopass->mb_av_energy = log((this_frame.intra_error * 256.0) + 1.0);
+ twopass->mb_smooth_pct = this_frame.intra_smooth_pct;
+
return;
}
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c
index a431e4ca6..d6052fade 100644
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -376,10 +376,52 @@ static TX_SIZE calculate_tx_size(VP9_COMP *const cpi, BLOCK_SIZE bsize,
tx_size = VPXMIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
}
-
return tx_size;
}
+static void compute_intra_yprediction(PREDICTION_MODE mode, BLOCK_SIZE bsize,
+ MACROBLOCK *x, MACROBLOCKD *xd) {
+ struct macroblockd_plane *const pd = &xd->plane[0];
+ struct macroblock_plane *const p = &x->plane[0];
+ uint8_t *const src_buf_base = p->src.buf;
+ uint8_t *const dst_buf_base = pd->dst.buf;
+ const int src_stride = p->src.stride;
+ const int dst_stride = pd->dst.stride;
+ // block and transform sizes, in number of 4x4 blocks log 2 ("*_b")
+ // 4x4=0, 8x8=2, 16x16=4, 32x32=6, 64x64=8
+ const TX_SIZE tx_size = max_txsize_lookup[bsize];
+ const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
+ const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];
+ int row, col;
+ // If mb_to_right_edge is < 0 we are in a situation in which
+ // the current block size extends into the UMV and we won't
+ // visit the sub blocks that are wholly within the UMV.
+ const int max_blocks_wide =
+ num_4x4_w + (xd->mb_to_right_edge >= 0
+ ? 0
+ : xd->mb_to_right_edge >> (5 + pd->subsampling_x));
+ const int max_blocks_high =
+ num_4x4_h + (xd->mb_to_bottom_edge >= 0
+ ? 0
+ : xd->mb_to_bottom_edge >> (5 + pd->subsampling_y));
+
+ // Keep track of the row and column of the blocks we use so that we know
+ // if we are in the unrestricted motion border.
+ for (row = 0; row < max_blocks_high; row += (1 << tx_size)) {
+ // Skip visiting the sub blocks that are wholly within the UMV.
+ for (col = 0; col < max_blocks_wide; col += (1 << tx_size)) {
+ p->src.buf = &src_buf_base[4 * (row * (int64_t)src_stride + col)];
+ pd->dst.buf = &dst_buf_base[4 * (row * (int64_t)dst_stride + col)];
+ vp9_predict_intra_block(xd, b_width_log2_lookup[bsize], tx_size, mode,
+ x->skip_encode ? p->src.buf : pd->dst.buf,
+ x->skip_encode ? src_stride : dst_stride,
+ pd->dst.buf, dst_stride, col, row, 0);
+ }
+ }
+ p->src.buf = src_buf_base;
+ pd->dst.buf = dst_buf_base;
+}
+
static void model_rd_for_sb_y_large(VP9_COMP *cpi, BLOCK_SIZE bsize,
MACROBLOCK *x, MACROBLOCKD *xd,
int *out_rate_sum, int64_t *out_dist_sum,
@@ -1013,8 +1055,8 @@ static void estimate_block_intra(int plane, int block, int row, int col,
(void)block;
- p->src.buf = &src_buf_base[4 * (row * src_stride + col)];
- pd->dst.buf = &dst_buf_base[4 * (row * dst_stride + col)];
+ p->src.buf = &src_buf_base[4 * (row * (int64_t)src_stride + col)];
+ pd->dst.buf = &dst_buf_base[4 * (row * (int64_t)dst_stride + col)];
// Use source buffer as an approximation for the fully reconstructed buffer.
vp9_predict_intra_block(xd, b_width_log2_lookup[plane_bsize], tx_size,
args->mode, x->skip_encode ? p->src.buf : pd->dst.buf,
@@ -1023,13 +1065,12 @@ static void estimate_block_intra(int plane, int block, int row, int col,
if (plane == 0) {
int64_t this_sse = INT64_MAX;
- // TODO(jingning): This needs further refactoring.
block_yrd(cpi, x, &this_rdc, &args->skippable, &this_sse, bsize_tx,
VPXMIN(tx_size, TX_16X16), 0, 1);
} else {
unsigned int var = 0;
unsigned int sse = 0;
- model_rd_for_sb_uv(cpi, plane_bsize, x, xd, &this_rdc, &var, &sse, plane,
+ model_rd_for_sb_uv(cpi, bsize_tx, x, xd, &this_rdc, &var, &sse, plane,
plane);
}
@@ -2472,13 +2513,12 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
bsize <= cpi->sf.max_intra_bsize && !x->skip_low_source_sad &&
!x->lowvar_highsumdiff)) {
struct estimate_block_intra_args args = { cpi, x, DC_PRED, 1, 0 };
+ int64_t this_sse = INT64_MAX;
int i;
PRED_BUFFER *const best_pred = best_pickmode.best_pred;
TX_SIZE intra_tx_size =
VPXMIN(max_txsize_lookup[bsize],
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
- if (cpi->oxcf.content != VP9E_CONTENT_SCREEN && intra_tx_size > TX_16X16)
- intra_tx_size = TX_16X16;
if (reuse_inter_pred && best_pred != NULL) {
if (best_pred->data == orig_dst.buf) {
@@ -2539,8 +2579,13 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data,
args.skippable = 1;
args.rdc = &this_rdc;
mi->tx_size = intra_tx_size;
- vp9_foreach_transformed_block_in_plane(xd, bsize, 0, estimate_block_intra,
- &args);
+
+ compute_intra_yprediction(this_mode, bsize, x, xd);
+ model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc.rate, &this_rdc.dist,
+ &var_y, &sse_y, 1);
+ block_yrd(cpi, x, &this_rdc, &args.skippable, &this_sse, bsize,
+ VPXMIN(mi->tx_size, TX_16X16), 1, 1);
+
// Check skip cost here since skippable is not set for for uv, this
// mirrors the behavior used by inter
if (args.skippable) {
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index b51f6797b..e45030ab8 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -211,17 +211,15 @@ int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
const RATE_CONTROL *rc = &cpi->rc;
const VP9EncoderConfig *oxcf = &cpi->oxcf;
- if (cpi->oxcf.pass != 2) {
- const int min_frame_target =
- VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5);
- if (target < min_frame_target) target = min_frame_target;
- if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
- // If there is an active ARF at this location use the minimum
- // bits on this frame even if it is a constructed arf.
- // The active maximum quantizer insures that an appropriate
- // number of bits will be spent if needed for constructed ARFs.
- target = min_frame_target;
- }
+ const int min_frame_target =
+ VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5);
+ if (target < min_frame_target) target = min_frame_target;
+ if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
+ // If there is an active ARF at this location use the minimum
+ // bits on this frame even if it is a constructed arf.
+ // The active maximum quantizer insures that an appropriate
+ // number of bits will be spent if needed for constructed ARFs.
+ target = min_frame_target;
}
// Clip the frame target to the maximum allowed value.
@@ -437,6 +435,7 @@ void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) {
rc->last_post_encode_dropped_scene_change = 0;
rc->use_post_encode_drop = 0;
rc->ext_use_post_encode_drop = 0;
+ rc->arf_active_best_quality_adjustment_factor = 1.0;
}
static int check_buffer_above_thresh(VP9_COMP *cpi, int drop_mark) {
@@ -1417,6 +1416,8 @@ static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, int *bottom_index,
int active_worst_quality = cpi->twopass.active_worst_quality;
int q;
int *inter_minq;
+ int arf_active_best_quality_adjustment, arf_active_best_quality_max;
+ int *arfgf_high_motion_minq;
const int boost_frame =
!rc->is_src_frame_alt_ref &&
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
@@ -1441,14 +1442,17 @@ static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, int *bottom_index,
// For constrained quality dont allow Q less than the cq level
if (oxcf->rc_mode == VPX_CQ) {
if (q < cq_level) q = cq_level;
+ }
+ active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
- active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
+ ASSIGN_MINQ_TABLE(cm->bit_depth, arfgf_high_motion_minq);
+ arf_active_best_quality_max = arfgf_high_motion_minq[q];
+ arf_active_best_quality_adjustment =
+ arf_active_best_quality_max - active_best_quality;
+ active_best_quality = arf_active_best_quality_max -
+ (int)(arf_active_best_quality_adjustment *
+ rc->arf_active_best_quality_adjustment_factor);
- // Constrained quality use slightly lower active best.
- active_best_quality = active_best_quality * 15 / 16;
- } else {
- active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
- }
// Modify best quality for second level arfs. For mode VPX_Q this
// becomes the baseline frame q.
if (gf_group->rf_level[gf_group_index] == GF_ARF_LOW) {
@@ -3049,7 +3053,7 @@ int vp9_encodedframe_overshoot(VP9_COMP *cpi, int frame_size, int *q) {
// Lower thresh_qp for video (more overshoot at lower Q) to be
// more conservative for video.
if (cpi->oxcf.content != VP9E_CONTENT_SCREEN)
- thresh_qp = rc->worst_quality >> 1;
+ thresh_qp = 3 * (rc->worst_quality >> 2);
// If this decision is not based on an encoded frame size but just on
// scene/slide change detection (i.e., re_encode_overshoot_cbr_rt ==
// FAST_DETECTION_MAXQ), for now skip the (frame_size > thresh_rate)
diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h
index a5c1f4cf0..2c2048edc 100644
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -197,6 +197,8 @@ typedef struct {
int ext_use_post_encode_drop;
int damped_adjustment[RATE_FACTOR_LEVELS];
+ double arf_active_best_quality_adjustment_factor;
+ int arf_active_best_quality_adjustment_window;
} RATE_CONTROL;
struct VP9_COMP;
diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c
index 18130dded..df2afceda 100644
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -725,6 +725,10 @@ static void set_rt_speed_feature_framesize_independent(
if (!frame_is_intra_only(cm) && cm->width * cm->height <= 352 * 288) {
sf->nonrd_use_ml_partition = 1;
}
+#if CONFIG_VP9_HIGHBITDEPTH
+ if (cpi->Source->flags & YV12_FLAG_HIGHBITDEPTH)
+ sf->nonrd_use_ml_partition = 0;
+#endif
if (content == VP9E_CONTENT_SCREEN) sf->mv.subpel_force_stop = HALF_PEL;
// Only keep INTRA_DC mode for speed 8.
if (!is_keyframe) {
diff --git a/vpx_dsp/vpx_dsp.mk b/vpx_dsp/vpx_dsp.mk
index 343250702..916a99017 100644
--- a/vpx_dsp/vpx_dsp.mk
+++ b/vpx_dsp/vpx_dsp.mk
@@ -83,10 +83,11 @@ DSP_SRCS-$(HAVE_DSPR2) += mips/intrapred16_dspr2.c
DSP_SRCS-$(HAVE_DSPR2) += mips/common_dspr2.h
DSP_SRCS-$(HAVE_DSPR2) += mips/common_dspr2.c
+DSP_SRCS-yes += vpx_filter.h
+ifeq ($(CONFIG_VP9),yes)
# interpolation filters
DSP_SRCS-yes += vpx_convolve.c
DSP_SRCS-yes += vpx_convolve.h
-DSP_SRCS-yes += vpx_filter.h
DSP_SRCS-$(ARCH_X86)$(ARCH_X86_64) += x86/convolve.h
@@ -113,10 +114,8 @@ endif
DSP_SRCS-$(HAVE_SSE2) += x86/vpx_convolve_copy_sse2.asm
DSP_SRCS-$(HAVE_NEON) += arm/vpx_scaled_convolve8_neon.c
-
ifeq ($(HAVE_NEON_ASM),yes)
DSP_SRCS-yes += arm/vpx_convolve_copy_neon_asm$(ASM)
-ifeq ($(CONFIG_VP9),yes)
DSP_SRCS-yes += arm/vpx_convolve8_horiz_filter_type2_neon$(ASM)
DSP_SRCS-yes += arm/vpx_convolve8_vert_filter_type2_neon$(ASM)
DSP_SRCS-yes += arm/vpx_convolve8_horiz_filter_type1_neon$(ASM)
@@ -129,7 +128,6 @@ DSP_SRCS-yes += arm/vpx_convolve_avg_neon_asm$(ASM)
DSP_SRCS-yes += arm/vpx_convolve8_neon_asm.c
DSP_SRCS-yes += arm/vpx_convolve8_neon_asm.h
DSP_SRCS-yes += arm/vpx_convolve_neon.c
-endif # CONFIG_VP9
else
ifeq ($(HAVE_NEON),yes)
DSP_SRCS-yes += arm/vpx_convolve_copy_neon.c
@@ -196,6 +194,7 @@ ifeq ($(CONFIG_VP9_HIGHBITDEPTH),yes)
DSP_SRCS-$(HAVE_NEON) += arm/highbd_loopfilter_neon.c
DSP_SRCS-$(HAVE_SSE2) += x86/highbd_loopfilter_sse2.c
endif # CONFIG_VP9_HIGHBITDEPTH
+endif # CONFIG_VP9
DSP_SRCS-yes += txfm_common.h
DSP_SRCS-$(HAVE_SSE2) += x86/txfm_common_sse2.h
diff --git a/vpx_dsp/vpx_dsp_rtcd_defs.pl b/vpx_dsp/vpx_dsp_rtcd_defs.pl
index 4b5e3d501..363154a77 100644
--- a/vpx_dsp/vpx_dsp_rtcd_defs.pl
+++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl
@@ -356,6 +356,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
specialize qw/vpx_highbd_dc_128_predictor_32x32 neon sse2/;
} # CONFIG_VP9_HIGHBITDEPTH
+if (vpx_config("CONFIG_VP9") eq "yes") {
#
# Sub Pixel Filters
#
@@ -395,6 +396,7 @@ add_proto qw/void vpx_scaled_avg_2d/, "const uint8_t *src, ptrdiff_t src_stride,
add_proto qw/void vpx_scaled_avg_horiz/, "const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, ptrdiff_t dst_stride, const InterpKernel *filter, int x0_q4, int x_step_q4, int y0_q4, int y_step_q4, int w, int h";
add_proto qw/void vpx_scaled_avg_vert/, "const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, ptrdiff_t dst_stride, const InterpKernel *filter, int x0_q4, int x_step_q4, int y0_q4, int y_step_q4, int w, int h";
+} #CONFIG_VP9
if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
#
@@ -425,6 +427,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
specialize qw/vpx_highbd_convolve8_avg_vert avx2 neon/, "$sse2_x86_64";
} # CONFIG_VP9_HIGHBITDEPTH
+if (vpx_config("CONFIG_VP9") eq "yes") {
#
# Loopfilter
#
@@ -463,6 +466,7 @@ specialize qw/vpx_lpf_horizontal_4 sse2 neon dspr2 msa/;
add_proto qw/void vpx_lpf_horizontal_4_dual/, "uint8_t *s, int pitch, const uint8_t *blimit0, const uint8_t *limit0, const uint8_t *thresh0, const uint8_t *blimit1, const uint8_t *limit1, const uint8_t *thresh1";
specialize qw/vpx_lpf_horizontal_4_dual sse2 neon dspr2 msa/;
+} #CONFIG_VP9
if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
add_proto qw/void vpx_highbd_lpf_vertical_16/, "uint16_t *s, int pitch, const uint8_t *blimit, const uint8_t *limit, const uint8_t *thresh, int bd";