149 lines
6.6 KiB
C++
149 lines
6.6 KiB
C++
|
|
/*
|
||
|
|
* Copyright (c) 2014 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 <cstdint>
|
||
|
|
#include <cstdlib>
|
||
|
|
#include <cstring>
|
||
|
|
|
||
|
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||
|
|
|
||
|
|
#include "test/codec_factory.h"
|
||
|
|
#include "test/encode_test_driver.h"
|
||
|
|
#include "test/i420_video_source.h"
|
||
|
|
#include "test/util.h"
|
||
|
|
#include "test/video_source.h"
|
||
|
|
#include "test/y4m_video_source.h"
|
||
|
|
#include "test/yuv_video_source.h"
|
||
|
|
#include "vpx/vp8cx.h"
|
||
|
|
#include "vpx/vpx_encoder.h"
|
||
|
|
|
||
|
|
#define MASK_WIDTH 40
|
||
|
|
#define MASK_HEIGHT 30
|
||
|
|
#define MASK_SIZE MASK_WIDTH *MASK_HEIGHT
|
||
|
|
|
||
|
|
namespace {
|
||
|
|
|
||
|
|
const int mask[MASK_SIZE] = {
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
|
||
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
|
||
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
||
|
|
0, 0, 0, 0
|
||
|
|
};
|
||
|
|
|
||
|
|
class RoiMaskBackgroundSkip : public ::libvpx_test::EncoderTest,
|
||
|
|
public ::testing::Test {
|
||
|
|
protected:
|
||
|
|
RoiMaskBackgroundSkip() : EncoderTest(&::libvpx_test::kVP9) {}
|
||
|
|
virtual ~RoiMaskBackgroundSkip() { free(roi_.roi_map); }
|
||
|
|
|
||
|
|
virtual void SetUp() {
|
||
|
|
InitializeConfig();
|
||
|
|
SetMode(::libvpx_test::kRealTime);
|
||
|
|
SetRoi();
|
||
|
|
}
|
||
|
|
|
||
|
|
void SetRoi() {
|
||
|
|
const int block_size = 8;
|
||
|
|
unsigned int i, j;
|
||
|
|
roi_.rows = (cfg_.g_h + block_size - 1) / block_size;
|
||
|
|
roi_.cols = (cfg_.g_w + block_size - 1) / block_size;
|
||
|
|
memset(&roi_.skip, 0, sizeof(roi_.skip));
|
||
|
|
memset(&roi_.delta_q, 0, sizeof(roi_.delta_q));
|
||
|
|
memset(&roi_.delta_lf, 0, sizeof(roi_.delta_lf));
|
||
|
|
memset(roi_.ref_frame, -1, sizeof(roi_.ref_frame));
|
||
|
|
roi_.ref_frame[1] = 1;
|
||
|
|
// Use segment 3 for skip.
|
||
|
|
roi_.skip[3] = 1;
|
||
|
|
roi_.roi_map =
|
||
|
|
(uint8_t *)calloc(roi_.rows * roi_.cols, sizeof(*roi_.roi_map));
|
||
|
|
for (i = 0; i < roi_.rows; ++i) {
|
||
|
|
for (j = 0; j < roi_.cols; ++j) {
|
||
|
|
const int idx = i * roi_.cols + j;
|
||
|
|
if (mask[idx] == 1) roi_.roi_map[idx] = 3;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
|
||
|
|
::libvpx_test::Encoder *encoder) {
|
||
|
|
if (video->frame() == 0) {
|
||
|
|
encoder->Control(VP8E_SET_CPUUSED, 7);
|
||
|
|
encoder->Control(VP9E_SET_AQ_MODE, 3);
|
||
|
|
}
|
||
|
|
encoder->Control(VP9E_SET_ROI_MAP, &roi_);
|
||
|
|
}
|
||
|
|
|
||
|
|
private:
|
||
|
|
vpx_roi_map_t roi_;
|
||
|
|
};
|
||
|
|
|
||
|
|
TEST_F(RoiMaskBackgroundSkip, RoiMaskNoMismatch) {
|
||
|
|
cfg_.rc_buf_initial_sz = 500;
|
||
|
|
cfg_.rc_buf_optimal_sz = 500;
|
||
|
|
cfg_.rc_buf_sz = 1000;
|
||
|
|
cfg_.rc_undershoot_pct = 20;
|
||
|
|
cfg_.rc_undershoot_pct = 20;
|
||
|
|
cfg_.rc_dropframe_thresh = 10;
|
||
|
|
cfg_.rc_min_quantizer = 0;
|
||
|
|
cfg_.rc_max_quantizer = 50;
|
||
|
|
cfg_.rc_end_usage = VPX_CBR;
|
||
|
|
cfg_.rc_target_bitrate = 200;
|
||
|
|
cfg_.g_lag_in_frames = 0;
|
||
|
|
cfg_.kf_max_dist = 9999;
|
||
|
|
|
||
|
|
::libvpx_test::I420VideoSource video("desktopqvga.320_240.yuv", 320, 240, 30,
|
||
|
|
1, 0, 150);
|
||
|
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||
|
|
}
|
||
|
|
} // namespace
|