Merge "VP9 motion vector unit test"
This commit is contained in:
commit
f496032686
@ -23,6 +23,7 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_1280_720_30.y4m
|
|||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += noisy_clip_640_360.y4m
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += noisy_clip_640_360.y4m
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rush_hour_444.y4m
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rush_hour_444.y4m
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += screendata.y4m
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += screendata.y4m
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_640_480_30.yuv
|
||||||
|
|
||||||
# Test vectors
|
# Test vectors
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-001.ivf
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-001.ivf
|
||||||
@ -814,7 +815,6 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += kirland_640_480_30.yuv
|
|||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += macmarcomoving_640_480_30.yuv
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += macmarcomoving_640_480_30.yuv
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += macmarcostationary_640_480_30.yuv
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += macmarcostationary_640_480_30.yuv
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_1280_720_30.yuv
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_1280_720_30.yuv
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_640_480_30.yuv
|
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += tacomanarrows_640_480_30.yuv
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += tacomanarrows_640_480_30.yuv
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += tacomasmallcameramovement_640_480_30.yuv
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += tacomasmallcameramovement_640_480_30.yuv
|
||||||
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += thaloundeskmtg_640_480_30.yuv
|
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += thaloundeskmtg_640_480_30.yuv
|
||||||
|
@ -48,6 +48,7 @@ LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += frame_size_tests.cc
|
|||||||
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_lossless_test.cc
|
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_lossless_test.cc
|
||||||
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_end_to_end_test.cc
|
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_end_to_end_test.cc
|
||||||
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_ethread_test.cc
|
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_ethread_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_motion_vector_test.cc
|
||||||
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += level_test.cc
|
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += level_test.cc
|
||||||
|
|
||||||
LIBVPX_TEST_SRCS-yes += decode_test_driver.cc
|
LIBVPX_TEST_SRCS-yes += decode_test_driver.cc
|
||||||
|
97
test/vp9_motion_vector_test.cc
Normal file
97
test/vp9_motion_vector_test.cc
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
#include "test/codec_factory.h"
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/util.h"
|
||||||
|
#include "test/yuv_video_source.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
#define MAX_EXTREME_MV 1
|
||||||
|
#define MIN_EXTREME_MV 2
|
||||||
|
|
||||||
|
// Encoding modes
|
||||||
|
const libvpx_test::TestMode kEncodingModeVectors[] = {
|
||||||
|
::libvpx_test::kTwoPassGood, ::libvpx_test::kOnePassGood,
|
||||||
|
::libvpx_test::kRealTime,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Encoding speeds
|
||||||
|
const int kCpuUsedVectors[] = { 0, 1, 2, 3, 4, 5, 6 };
|
||||||
|
|
||||||
|
// MV test modes: 1 - always use maximum MV; 2 - always use minimum MV.
|
||||||
|
const int kMVTestModes[] = { MAX_EXTREME_MV, MIN_EXTREME_MV };
|
||||||
|
|
||||||
|
class MotionVectorTestLarge
|
||||||
|
: public ::libvpx_test::EncoderTest,
|
||||||
|
public ::libvpx_test::CodecTestWith3Params<libvpx_test::TestMode, int,
|
||||||
|
int> {
|
||||||
|
protected:
|
||||||
|
MotionVectorTestLarge()
|
||||||
|
: EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)),
|
||||||
|
cpu_used_(GET_PARAM(2)), mv_test_mode_(GET_PARAM(3)) {}
|
||||||
|
|
||||||
|
virtual ~MotionVectorTestLarge() {}
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(encoding_mode_);
|
||||||
|
if (encoding_mode_ != ::libvpx_test::kRealTime) {
|
||||||
|
cfg_.g_lag_in_frames = 3;
|
||||||
|
cfg_.rc_end_usage = VPX_VBR;
|
||||||
|
} else {
|
||||||
|
cfg_.g_lag_in_frames = 0;
|
||||||
|
cfg_.rc_end_usage = VPX_CBR;
|
||||||
|
cfg_.rc_buf_sz = 1000;
|
||||||
|
cfg_.rc_buf_initial_sz = 500;
|
||||||
|
cfg_.rc_buf_optimal_sz = 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
|
||||||
|
::libvpx_test::Encoder *encoder) {
|
||||||
|
if (video->frame() == 1) {
|
||||||
|
encoder->Control(VP8E_SET_CPUUSED, cpu_used_);
|
||||||
|
encoder->Control(VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST, mv_test_mode_);
|
||||||
|
if (encoding_mode_ != ::libvpx_test::kRealTime) {
|
||||||
|
encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
|
||||||
|
encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7);
|
||||||
|
encoder->Control(VP8E_SET_ARNR_STRENGTH, 5);
|
||||||
|
encoder->Control(VP8E_SET_ARNR_TYPE, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
libvpx_test::TestMode encoding_mode_;
|
||||||
|
int cpu_used_;
|
||||||
|
int mv_test_mode_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(MotionVectorTestLarge, OverallTest) {
|
||||||
|
cfg_.rc_target_bitrate = 24000;
|
||||||
|
cfg_.g_profile = 0;
|
||||||
|
init_flags_ = VPX_CODEC_USE_PSNR;
|
||||||
|
|
||||||
|
testing::internal::scoped_ptr<libvpx_test::VideoSource> video;
|
||||||
|
video.reset(new libvpx_test::YUVVideoSource(
|
||||||
|
"niklas_640_480_30.yuv", VPX_IMG_FMT_I420, 3840, 2160, // 2048, 1080,
|
||||||
|
30, 1, 0, 5));
|
||||||
|
|
||||||
|
ASSERT_TRUE(video.get() != NULL);
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
VP9_INSTANTIATE_TEST_CASE(MotionVectorTestLarge,
|
||||||
|
::testing::ValuesIn(kEncodingModeVectors),
|
||||||
|
::testing::ValuesIn(kCpuUsedVectors),
|
||||||
|
::testing::ValuesIn(kMVTestModes));
|
||||||
|
} // namespace
|
@ -34,7 +34,7 @@ static void print_mi_data(VP9_COMMON *cm, FILE *file, const char *descriptor,
|
|||||||
for (mi_row = 0; mi_row < rows; mi_row++) {
|
for (mi_row = 0; mi_row < rows; mi_row++) {
|
||||||
fprintf(file, "%c ", prefix);
|
fprintf(file, "%c ", prefix);
|
||||||
for (mi_col = 0; mi_col < cols; mi_col++) {
|
for (mi_col = 0; mi_col < cols; mi_col++) {
|
||||||
fprintf(file, "%2d ", *((int *)((char *)(mi[0]) + member_offset)));
|
fprintf(file, "%2d ", *((char *)((char *)(mi[0]) + member_offset)));
|
||||||
mi++;
|
mi++;
|
||||||
}
|
}
|
||||||
fprintf(file, "\n");
|
fprintf(file, "\n");
|
||||||
|
@ -269,6 +269,7 @@ typedef struct VP9EncoderConfig {
|
|||||||
|
|
||||||
int row_mt;
|
int row_mt;
|
||||||
unsigned int row_mt_bit_exact;
|
unsigned int row_mt_bit_exact;
|
||||||
|
unsigned int motion_vector_unit_test;
|
||||||
} VP9EncoderConfig;
|
} VP9EncoderConfig;
|
||||||
|
|
||||||
static INLINE int is_lossless_requested(const VP9EncoderConfig *cfg) {
|
static INLINE int is_lossless_requested(const VP9EncoderConfig *cfg) {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
|
|
||||||
#include "vp9/common/vp9_common.h"
|
#include "vp9/common/vp9_common.h"
|
||||||
|
#include "vp9/common/vp9_mvref_common.h"
|
||||||
#include "vp9/common/vp9_reconinter.h"
|
#include "vp9/common/vp9_reconinter.h"
|
||||||
|
|
||||||
#include "vp9/encoder/vp9_encoder.h"
|
#include "vp9/encoder/vp9_encoder.h"
|
||||||
@ -2477,3 +2478,85 @@ int vp9_full_pixel_search(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
|
|||||||
|
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note(yunqingwang): The following 2 functions are only used in the motion
|
||||||
|
// vector unit test, which return extreme motion vectors allowed by the MV
|
||||||
|
// limits.
|
||||||
|
#define COMMON_MV_TEST \
|
||||||
|
SETUP_SUBPEL_SEARCH; \
|
||||||
|
\
|
||||||
|
(void)error_per_bit; \
|
||||||
|
(void)vfp; \
|
||||||
|
(void)z; \
|
||||||
|
(void)src_stride; \
|
||||||
|
(void)y; \
|
||||||
|
(void)y_stride; \
|
||||||
|
(void)second_pred; \
|
||||||
|
(void)w; \
|
||||||
|
(void)h; \
|
||||||
|
(void)offset; \
|
||||||
|
(void)mvjcost; \
|
||||||
|
(void)mvcost; \
|
||||||
|
(void)sse1; \
|
||||||
|
(void)distortion; \
|
||||||
|
\
|
||||||
|
(void)halfiters; \
|
||||||
|
(void)quarteriters; \
|
||||||
|
(void)eighthiters; \
|
||||||
|
(void)whichdir; \
|
||||||
|
(void)allow_hp; \
|
||||||
|
(void)forced_stop; \
|
||||||
|
(void)hstep; \
|
||||||
|
(void)rr; \
|
||||||
|
(void)rc; \
|
||||||
|
\
|
||||||
|
(void)tr; \
|
||||||
|
(void)tc; \
|
||||||
|
(void)sse; \
|
||||||
|
(void)thismse; \
|
||||||
|
(void)cost_list;
|
||||||
|
|
||||||
|
// Return the maximum MV.
|
||||||
|
uint32_t vp9_return_max_sub_pixel_mv(
|
||||||
|
const MACROBLOCK *x, MV *bestmv, const MV *ref_mv, int allow_hp,
|
||||||
|
int error_per_bit, const vp9_variance_fn_ptr_t *vfp, int forced_stop,
|
||||||
|
int iters_per_step, int *cost_list, int *mvjcost, int *mvcost[2],
|
||||||
|
uint32_t *distortion, uint32_t *sse1, const uint8_t *second_pred, int w,
|
||||||
|
int h) {
|
||||||
|
COMMON_MV_TEST;
|
||||||
|
|
||||||
|
(void)minr;
|
||||||
|
(void)minc;
|
||||||
|
|
||||||
|
bestmv->row = maxr;
|
||||||
|
bestmv->col = maxc;
|
||||||
|
besterr = 0;
|
||||||
|
|
||||||
|
// In the sub-pel motion search, if hp is not used, then the last bit of mv
|
||||||
|
// has to be 0.
|
||||||
|
lower_mv_precision(bestmv, allow_hp && use_mv_hp(ref_mv));
|
||||||
|
|
||||||
|
return besterr;
|
||||||
|
}
|
||||||
|
// Return the minimum MV.
|
||||||
|
uint32_t vp9_return_min_sub_pixel_mv(
|
||||||
|
const MACROBLOCK *x, MV *bestmv, const MV *ref_mv, int allow_hp,
|
||||||
|
int error_per_bit, const vp9_variance_fn_ptr_t *vfp, int forced_stop,
|
||||||
|
int iters_per_step, int *cost_list, int *mvjcost, int *mvcost[2],
|
||||||
|
uint32_t *distortion, uint32_t *sse1, const uint8_t *second_pred, int w,
|
||||||
|
int h) {
|
||||||
|
COMMON_MV_TEST;
|
||||||
|
|
||||||
|
(void)maxr;
|
||||||
|
(void)maxc;
|
||||||
|
|
||||||
|
bestmv->row = minr;
|
||||||
|
bestmv->col = minc;
|
||||||
|
besterr = 0;
|
||||||
|
|
||||||
|
// In the sub-pel motion search, if hp is not used, then the last bit of mv
|
||||||
|
// has to be 0.
|
||||||
|
lower_mv_precision(bestmv, allow_hp && use_mv_hp(ref_mv));
|
||||||
|
|
||||||
|
return besterr;
|
||||||
|
}
|
||||||
|
@ -81,6 +81,8 @@ extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned;
|
|||||||
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_more;
|
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_more;
|
||||||
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_evenmore;
|
extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_evenmore;
|
||||||
extern fractional_mv_step_fp vp9_skip_sub_pixel_tree;
|
extern fractional_mv_step_fp vp9_skip_sub_pixel_tree;
|
||||||
|
extern fractional_mv_step_fp vp9_return_max_sub_pixel_mv;
|
||||||
|
extern fractional_mv_step_fp vp9_return_min_sub_pixel_mv;
|
||||||
|
|
||||||
typedef int (*vp9_full_search_fn_t)(const MACROBLOCK *x, const MV *ref_mv,
|
typedef int (*vp9_full_search_fn_t)(const MACROBLOCK *x, const MV *ref_mv,
|
||||||
int sad_per_bit, int distance,
|
int sad_per_bit, int distance,
|
||||||
|
@ -3241,6 +3241,9 @@ void vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, TileDataEnc *tile_data,
|
|||||||
|
|
||||||
if (best_rd < mode_threshold[mode_index]) continue;
|
if (best_rd < mode_threshold[mode_index]) continue;
|
||||||
|
|
||||||
|
// This is only used in motion vector unit test.
|
||||||
|
if (cpi->oxcf.motion_vector_unit_test && ref_frame == INTRA_FRAME) continue;
|
||||||
|
|
||||||
if (sf->motion_field_mode_search) {
|
if (sf->motion_field_mode_search) {
|
||||||
const int mi_width = VPXMIN(num_8x8_blocks_wide_lookup[bsize],
|
const int mi_width = VPXMIN(num_8x8_blocks_wide_lookup[bsize],
|
||||||
tile_info->mi_col_end - mi_col);
|
tile_info->mi_col_end - mi_col);
|
||||||
@ -3924,6 +3927,9 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, TileDataEnc *tile_data,
|
|||||||
&rd_thresh_freq_fact[ref_index]))
|
&rd_thresh_freq_fact[ref_index]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// This is only used in motion vector unit test.
|
||||||
|
if (cpi->oxcf.motion_vector_unit_test && ref_frame == INTRA_FRAME) continue;
|
||||||
|
|
||||||
comp_pred = second_ref_frame > INTRA_FRAME;
|
comp_pred = second_ref_frame > INTRA_FRAME;
|
||||||
if (comp_pred) {
|
if (comp_pred) {
|
||||||
if (!cpi->allow_comp_inter_inter) continue;
|
if (!cpi->allow_comp_inter_inter) continue;
|
||||||
|
@ -609,6 +609,12 @@ void vp9_set_speed_features_framesize_dependent(VP9_COMP *cpi) {
|
|||||||
sf->allow_exhaustive_searches = 0;
|
sf->allow_exhaustive_searches = 0;
|
||||||
sf->adaptive_pred_interp_filter = 0;
|
sf->adaptive_pred_interp_filter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is only used in motion vector unit test.
|
||||||
|
if (cpi->oxcf.motion_vector_unit_test == 1)
|
||||||
|
cpi->find_fractional_mv_step = vp9_return_max_sub_pixel_mv;
|
||||||
|
else if (cpi->oxcf.motion_vector_unit_test == 2)
|
||||||
|
cpi->find_fractional_mv_step = vp9_return_min_sub_pixel_mv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) {
|
void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) {
|
||||||
@ -779,4 +785,10 @@ void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) {
|
|||||||
sf->allow_exhaustive_searches = 0;
|
sf->allow_exhaustive_searches = 0;
|
||||||
sf->adaptive_pred_interp_filter = 0;
|
sf->adaptive_pred_interp_filter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is only used in motion vector unit test.
|
||||||
|
if (cpi->oxcf.motion_vector_unit_test == 1)
|
||||||
|
cpi->find_fractional_mv_step = vp9_return_max_sub_pixel_mv;
|
||||||
|
else if (cpi->oxcf.motion_vector_unit_test == 2)
|
||||||
|
cpi->find_fractional_mv_step = vp9_return_min_sub_pixel_mv;
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,7 @@ struct vp9_extracfg {
|
|||||||
int render_height;
|
int render_height;
|
||||||
unsigned int row_mt;
|
unsigned int row_mt;
|
||||||
unsigned int row_mt_bit_exact;
|
unsigned int row_mt_bit_exact;
|
||||||
|
unsigned int motion_vector_unit_test;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct vp9_extracfg default_extra_cfg = {
|
static struct vp9_extracfg default_extra_cfg = {
|
||||||
@ -86,6 +87,7 @@ static struct vp9_extracfg default_extra_cfg = {
|
|||||||
0, // render height
|
0, // render height
|
||||||
0, // row_mt
|
0, // row_mt
|
||||||
0, // row_mt_bit_exact
|
0, // row_mt_bit_exact
|
||||||
|
0, // motion_vector_unit_test
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vpx_codec_alg_priv {
|
struct vpx_codec_alg_priv {
|
||||||
@ -251,6 +253,7 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
|
|||||||
|
|
||||||
RANGE_CHECK(extra_cfg, row_mt, 0, 1);
|
RANGE_CHECK(extra_cfg, row_mt, 0, 1);
|
||||||
RANGE_CHECK(extra_cfg, row_mt_bit_exact, 0, 1);
|
RANGE_CHECK(extra_cfg, row_mt_bit_exact, 0, 1);
|
||||||
|
RANGE_CHECK(extra_cfg, motion_vector_unit_test, 0, 2);
|
||||||
RANGE_CHECK(extra_cfg, enable_auto_alt_ref, 0, 2);
|
RANGE_CHECK(extra_cfg, enable_auto_alt_ref, 0, 2);
|
||||||
RANGE_CHECK(extra_cfg, cpu_used, -8, 8);
|
RANGE_CHECK(extra_cfg, cpu_used, -8, 8);
|
||||||
RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6);
|
RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6);
|
||||||
@ -562,6 +565,7 @@ static vpx_codec_err_t set_encoder_config(
|
|||||||
|
|
||||||
oxcf->row_mt = extra_cfg->row_mt;
|
oxcf->row_mt = extra_cfg->row_mt;
|
||||||
oxcf->row_mt_bit_exact = extra_cfg->row_mt_bit_exact;
|
oxcf->row_mt_bit_exact = extra_cfg->row_mt_bit_exact;
|
||||||
|
oxcf->motion_vector_unit_test = extra_cfg->motion_vector_unit_test;
|
||||||
|
|
||||||
for (sl = 0; sl < oxcf->ss_number_layers; ++sl) {
|
for (sl = 0; sl < oxcf->ss_number_layers; ++sl) {
|
||||||
#if CONFIG_SPATIAL_SVC
|
#if CONFIG_SPATIAL_SVC
|
||||||
@ -865,6 +869,14 @@ static vpx_codec_err_t ctrl_enable_row_mt_bit_exact(vpx_codec_alg_priv_t *ctx,
|
|||||||
return update_extra_cfg(ctx, &extra_cfg);
|
return update_extra_cfg(ctx, &extra_cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static vpx_codec_err_t ctrl_enable_motion_vector_unit_test(
|
||||||
|
vpx_codec_alg_priv_t *ctx, va_list args) {
|
||||||
|
struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
||||||
|
extra_cfg.motion_vector_unit_test =
|
||||||
|
CAST(VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST, args);
|
||||||
|
return update_extra_cfg(ctx, &extra_cfg);
|
||||||
|
}
|
||||||
|
|
||||||
static vpx_codec_err_t ctrl_get_level(vpx_codec_alg_priv_t *ctx, va_list args) {
|
static vpx_codec_err_t ctrl_get_level(vpx_codec_alg_priv_t *ctx, va_list args) {
|
||||||
int *const arg = va_arg(args, int *);
|
int *const arg = va_arg(args, int *);
|
||||||
if (arg == NULL) return VPX_CODEC_INVALID_PARAM;
|
if (arg == NULL) return VPX_CODEC_INVALID_PARAM;
|
||||||
@ -1622,6 +1634,7 @@ static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = {
|
|||||||
{ VP9E_SET_TARGET_LEVEL, ctrl_set_target_level },
|
{ VP9E_SET_TARGET_LEVEL, ctrl_set_target_level },
|
||||||
{ VP9E_SET_ROW_MT, ctrl_set_row_mt },
|
{ VP9E_SET_ROW_MT, ctrl_set_row_mt },
|
||||||
{ VP9E_ENABLE_ROW_MT_BIT_EXACT, ctrl_enable_row_mt_bit_exact },
|
{ VP9E_ENABLE_ROW_MT_BIT_EXACT, ctrl_enable_row_mt_bit_exact },
|
||||||
|
{ VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST, ctrl_enable_motion_vector_unit_test },
|
||||||
|
|
||||||
// Getters
|
// Getters
|
||||||
{ VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer },
|
{ VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer },
|
||||||
|
12
vpx/vp8cx.h
12
vpx/vp8cx.h
@ -594,6 +594,15 @@ enum vp8e_enc_control_id {
|
|||||||
* Supported in codecs: VP8
|
* Supported in codecs: VP8
|
||||||
*/
|
*/
|
||||||
VP8E_SET_GF_CBR_BOOST_PCT,
|
VP8E_SET_GF_CBR_BOOST_PCT,
|
||||||
|
|
||||||
|
/*!\brief Codec control function to enable the extreme motion vector unit test
|
||||||
|
* in VP9. Please note that this is only used in motion vector unit test.
|
||||||
|
*
|
||||||
|
* 0 : off, 1 : MAX_EXTREME_MV, 2 : MIN_EXTREME_MV
|
||||||
|
*
|
||||||
|
* Supported in codecs: VP9
|
||||||
|
*/
|
||||||
|
VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!\brief vpx 1-D scaling mode
|
/*!\brief vpx 1-D scaling mode
|
||||||
@ -864,6 +873,9 @@ VPX_CTRL_USE_TYPE(VP9E_ENABLE_ROW_MT_BIT_EXACT, unsigned int)
|
|||||||
VPX_CTRL_USE_TYPE(VP9E_GET_LEVEL, int *)
|
VPX_CTRL_USE_TYPE(VP9E_GET_LEVEL, int *)
|
||||||
#define VPX_CTRL_VP9E_GET_LEVEL
|
#define VPX_CTRL_VP9E_GET_LEVEL
|
||||||
|
|
||||||
|
VPX_CTRL_USE_TYPE(VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST, unsigned int)
|
||||||
|
#define VPX_CTRL_VP9E_ENABLE_MOTION_VECTOR_UNIT_TEST
|
||||||
|
|
||||||
/*!\endcond */
|
/*!\endcond */
|
||||||
/*! @} - end defgroup vp8_encoder */
|
/*! @} - end defgroup vp8_encoder */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
Loading…
x
Reference in New Issue
Block a user