Merge "Accelerated transform in high bit depth"
diff --git a/build/make/iosbuild.sh b/build/make/iosbuild.sh
index 927f3e5..6f7180d 100755
--- a/build/make/iosbuild.sh
+++ b/build/make/iosbuild.sh
@@ -25,7 +25,6 @@
DIST_DIR="_dist"
FRAMEWORK_DIR="VPX.framework"
HEADER_DIR="${FRAMEWORK_DIR}/Headers/vpx"
-MAKE_JOBS=1
SCRIPT_DIR=$(dirname "$0")
LIBVPX_SOURCE_DIR=$(cd ${SCRIPT_DIR}/../..; pwd)
LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
@@ -58,7 +57,7 @@
${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS} ${target_specific_flags} \
${devnull}
export DIST_DIR
- eval make -j ${MAKE_JOBS} dist ${devnull}
+ eval make dist ${devnull}
cd "${old_pwd}"
vlog "***Done building target: ${target}***"
@@ -203,7 +202,6 @@
Usage: ${0##*/} [arguments]
--help: Display this message and exit.
--extra-configure-args <args>: Extra args to pass when configuring libvpx.
- --jobs: Number of make jobs.
--preserve-build-output: Do not delete the build directory.
--show-build-output: Show output from each library build.
--targets <targets>: Override default target list. Defaults:
@@ -238,10 +236,6 @@
iosbuild_usage
exit
;;
- --jobs)
- MAKE_JOBS="$2"
- shift
- ;;
--preserve-build-output)
PRESERVE_BUILD_OUTPUT=yes
;;
@@ -274,11 +268,11 @@
EXTRA_CONFIGURE_ARGS=${EXTRA_CONFIGURE_ARGS}
FRAMEWORK_DIR=${FRAMEWORK_DIR}
HEADER_DIR=${HEADER_DIR}
- MAKE_JOBS=${MAKE_JOBS}
- PRESERVE_BUILD_OUTPUT=${PRESERVE_BUILD_OUTPUT}
LIBVPX_SOURCE_DIR=${LIBVPX_SOURCE_DIR}
LIPO=${LIPO}
+ MAKEFLAGS=${MAKEFLAGS}
ORIG_PWD=${ORIG_PWD}
+ PRESERVE_BUILD_OUTPUT=${PRESERVE_BUILD_OUTPUT}
TARGETS="${TARGETS}"
EOF
fi
diff --git a/test/active_map_refresh_test.cc b/test/active_map_refresh_test.cc
new file mode 100644
index 0000000..c945661
--- /dev/null
+++ b/test/active_map_refresh_test.cc
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2015 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 <algorithm>
+#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/y4m_video_source.h"
+
+namespace {
+
+// Check if any pixel in a 16x16 macroblock varies between frames.
+int CheckMb(const vpx_image_t ¤t, const vpx_image_t &previous,
+ int mb_r, int mb_c) {
+ for (int plane = 0; plane < 3; plane++) {
+ int r = 16 * mb_r;
+ int c0 = 16 * mb_c;
+ int r_top = std::min(r + 16, static_cast<int>(current.d_h));
+ int c_top = std::min(c0 + 16, static_cast<int>(current.d_w));
+ r = std::max(r, 0);
+ c0 = std::max(c0, 0);
+ if (plane > 0 && current.x_chroma_shift) {
+ c_top = (c_top + 1) >> 1;
+ c0 >>= 1;
+ }
+ if (plane > 0 && current.y_chroma_shift) {
+ r_top = (r_top + 1) >> 1;
+ r >>= 1;
+ }
+ for (; r < r_top; ++r) {
+ for (int c = c0; c < c_top; ++c) {
+ if (current.planes[plane][current.stride[plane] * r + c] !=
+ previous.planes[plane][previous.stride[plane] * r + c])
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+void GenerateMap(int mb_rows, int mb_cols, const vpx_image_t ¤t,
+ const vpx_image_t &previous, uint8_t *map) {
+ for (int mb_r = 0; mb_r < mb_rows; ++mb_r) {
+ for (int mb_c = 0; mb_c < mb_cols; ++mb_c) {
+ map[mb_r * mb_cols + mb_c] = CheckMb(current, previous, mb_r, mb_c);
+ }
+ }
+}
+
+const int kAqModeCyclicRefresh = 3;
+
+class ActiveMapRefreshTest
+ : public ::libvpx_test::EncoderTest,
+ public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
+ protected:
+ ActiveMapRefreshTest() : EncoderTest(GET_PARAM(0)) {}
+ virtual ~ActiveMapRefreshTest() {}
+
+ virtual void SetUp() {
+ InitializeConfig();
+ SetMode(GET_PARAM(1));
+ cpu_used_ = GET_PARAM(2);
+ }
+
+ virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
+ ::libvpx_test::Encoder *encoder) {
+ ::libvpx_test::Y4mVideoSource *y4m_video =
+ static_cast<libvpx_test::Y4mVideoSource *>(video);
+ if (video->frame() == 1) {
+ encoder->Control(VP8E_SET_CPUUSED, cpu_used_);
+ encoder->Control(VP9E_SET_AQ_MODE, kAqModeCyclicRefresh);
+ } else if (video->frame() >= 2 && video->img()) {
+ vpx_image_t *current = video->img();
+ vpx_image_t *previous = y4m_holder_->img();
+ ASSERT_TRUE(previous != NULL);
+ vpx_active_map_t map = vpx_active_map_t();
+ const int width = static_cast<int>(current->d_w);
+ const int height = static_cast<int>(current->d_h);
+ const int mb_width = (width + 15) / 16;
+ const int mb_height = (height + 15) / 16;
+ uint8_t *active_map = new uint8_t[mb_width * mb_height];
+ GenerateMap(mb_height, mb_width, *current, *previous, active_map);
+ map.cols = mb_width;
+ map.rows = mb_height;
+ map.active_map = active_map;
+ encoder->Control(VP8E_SET_ACTIVEMAP, &map);
+ delete[] active_map;
+ }
+ if (video->img()) {
+ y4m_video->SwapBuffers(y4m_holder_);
+ }
+ }
+
+ int cpu_used_;
+ ::libvpx_test::Y4mVideoSource *y4m_holder_;
+};
+
+TEST_P(ActiveMapRefreshTest, Test) {
+ cfg_.g_lag_in_frames = 0;
+ cfg_.g_profile = 1;
+ cfg_.rc_target_bitrate = 600;
+ cfg_.rc_resize_allowed = 0;
+ cfg_.rc_min_quantizer = 8;
+ cfg_.rc_max_quantizer = 30;
+ cfg_.g_pass = VPX_RC_ONE_PASS;
+ cfg_.rc_end_usage = VPX_CBR;
+ cfg_.kf_max_dist = 90000;
+
+ ::libvpx_test::Y4mVideoSource video("desktop_credits.y4m", 0, 30);
+ ::libvpx_test::Y4mVideoSource video_holder("desktop_credits.y4m", 0, 30);
+ video_holder.Begin();
+ y4m_holder_ = &video_holder;
+
+ ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
+}
+
+VP9_INSTANTIATE_TEST_CASE(ActiveMapRefreshTest,
+ ::testing::Values(::libvpx_test::kRealTime),
+ ::testing::Range(5, 6));
+} // namespace
diff --git a/test/intrapred_test.cc b/test/intrapred_test.cc
deleted file mode 100644
index 65a0697..0000000
--- a/test/intrapred_test.cc
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Copyright (c) 2012 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 <string.h>
-
-#include "third_party/googletest/src/include/gtest/gtest.h"
-
-#include "./vpx_config.h"
-#include "./vp8_rtcd.h"
-#include "test/acm_random.h"
-#include "test/clear_system_state.h"
-#include "test/register_state_check.h"
-#include "vp8/common/blockd.h"
-#include "vpx_mem/vpx_mem.h"
-
-namespace {
-
-using libvpx_test::ACMRandom;
-
-class IntraPredBase {
- public:
- virtual ~IntraPredBase() { libvpx_test::ClearSystemState(); }
-
- protected:
- void SetupMacroblock(MACROBLOCKD *mbptr,
- MODE_INFO *miptr,
- uint8_t *data,
- int block_size,
- int stride,
- int num_planes) {
- mbptr_ = mbptr;
- miptr_ = miptr;
- mbptr_->up_available = 1;
- mbptr_->left_available = 1;
- mbptr_->mode_info_context = miptr_;
- stride_ = stride;
- block_size_ = block_size;
- num_planes_ = num_planes;
- for (int p = 0; p < num_planes; p++)
- data_ptr_[p] = data + stride * (block_size + 1) * p +
- stride + block_size;
- }
-
- void FillRandom() {
- // Fill edges with random data
- ACMRandom rnd(ACMRandom::DeterministicSeed());
- for (int p = 0; p < num_planes_; p++) {
- for (int x = -1 ; x <= block_size_; x++)
- data_ptr_[p][x - stride_] = rnd.Rand8();
- for (int y = 0; y < block_size_; y++)
- data_ptr_[p][y * stride_ - 1] = rnd.Rand8();
- }
- }
-
- virtual void Predict(MB_PREDICTION_MODE mode) = 0;
-
- void SetLeftUnavailable() {
- mbptr_->left_available = 0;
- for (int p = 0; p < num_planes_; p++)
- for (int i = -1; i < block_size_; ++i)
- data_ptr_[p][stride_ * i - 1] = 129;
- }
-
- void SetTopUnavailable() {
- mbptr_->up_available = 0;
- for (int p = 0; p < num_planes_; p++)
- memset(&data_ptr_[p][-1 - stride_], 127, block_size_ + 2);
- }
-
- void SetTopLeftUnavailable() {
- SetLeftUnavailable();
- SetTopUnavailable();
- }
-
- int BlockSizeLog2Min1() const {
- switch (block_size_) {
- case 16:
- return 3;
- case 8:
- return 2;
- default:
- return 0;
- }
- }
-
- // check DC prediction output against a reference
- void CheckDCPrediction() const {
- for (int p = 0; p < num_planes_; p++) {
- // calculate expected DC
- int expected;
- if (mbptr_->up_available || mbptr_->left_available) {
- int sum = 0, shift = BlockSizeLog2Min1() + mbptr_->up_available +
- mbptr_->left_available;
- if (mbptr_->up_available)
- for (int x = 0; x < block_size_; x++)
- sum += data_ptr_[p][x - stride_];
- if (mbptr_->left_available)
- for (int y = 0; y < block_size_; y++)
- sum += data_ptr_[p][y * stride_ - 1];
- expected = (sum + (1 << (shift - 1))) >> shift;
- } else {
- expected = 0x80;
- }
- // check that all subsequent lines are equal to the first
- for (int y = 1; y < block_size_; ++y)
- ASSERT_EQ(0, memcmp(data_ptr_[p], &data_ptr_[p][y * stride_],
- block_size_));
- // within the first line, ensure that each pixel has the same value
- for (int x = 1; x < block_size_; ++x)
- ASSERT_EQ(data_ptr_[p][0], data_ptr_[p][x]);
- // now ensure that that pixel has the expected (DC) value
- ASSERT_EQ(expected, data_ptr_[p][0]);
- }
- }
-
- // check V prediction output against a reference
- void CheckVPrediction() const {
- // check that all lines equal the top border
- for (int p = 0; p < num_planes_; p++)
- for (int y = 0; y < block_size_; y++)
- ASSERT_EQ(0, memcmp(&data_ptr_[p][-stride_],
- &data_ptr_[p][y * stride_], block_size_));
- }
-
- // check H prediction output against a reference
- void CheckHPrediction() const {
- // for each line, ensure that each pixel is equal to the left border
- for (int p = 0; p < num_planes_; p++)
- for (int y = 0; y < block_size_; y++)
- for (int x = 0; x < block_size_; x++)
- ASSERT_EQ(data_ptr_[p][-1 + y * stride_],
- data_ptr_[p][x + y * stride_]);
- }
-
- static int ClipByte(int value) {
- if (value > 255)
- return 255;
- else if (value < 0)
- return 0;
- return value;
- }
-
- // check TM prediction output against a reference
- void CheckTMPrediction() const {
- for (int p = 0; p < num_planes_; p++)
- for (int y = 0; y < block_size_; y++)
- for (int x = 0; x < block_size_; x++) {
- const int expected = ClipByte(data_ptr_[p][x - stride_]
- + data_ptr_[p][stride_ * y - 1]
- - data_ptr_[p][-1 - stride_]);
- ASSERT_EQ(expected, data_ptr_[p][y * stride_ + x]);
- }
- }
-
- // Actual test
- void RunTest() {
- {
- SCOPED_TRACE("DC_PRED");
- FillRandom();
- Predict(DC_PRED);
- CheckDCPrediction();
- }
- {
- SCOPED_TRACE("DC_PRED LEFT");
- FillRandom();
- SetLeftUnavailable();
- Predict(DC_PRED);
- CheckDCPrediction();
- }
- {
- SCOPED_TRACE("DC_PRED TOP");
- FillRandom();
- SetTopUnavailable();
- Predict(DC_PRED);
- CheckDCPrediction();
- }
- {
- SCOPED_TRACE("DC_PRED TOP_LEFT");
- FillRandom();
- SetTopLeftUnavailable();
- Predict(DC_PRED);
- CheckDCPrediction();
- }
- {
- SCOPED_TRACE("H_PRED");
- FillRandom();
- Predict(H_PRED);
- CheckHPrediction();
- }
- {
- SCOPED_TRACE("V_PRED");
- FillRandom();
- Predict(V_PRED);
- CheckVPrediction();
- }
- {
- SCOPED_TRACE("TM_PRED");
- FillRandom();
- Predict(TM_PRED);
- CheckTMPrediction();
- }
- }
-
- MACROBLOCKD *mbptr_;
- MODE_INFO *miptr_;
- uint8_t *data_ptr_[2]; // in the case of Y, only [0] is used
- int stride_;
- int block_size_;
- int num_planes_;
-};
-
-typedef void (*IntraPredYFunc)(MACROBLOCKD *x,
- uint8_t *yabove_row,
- uint8_t *yleft,
- int left_stride,
- uint8_t *ypred_ptr,
- int y_stride);
-
-class IntraPredYTest
- : public IntraPredBase,
- public ::testing::TestWithParam<IntraPredYFunc> {
- public:
- static void SetUpTestCase() {
- mb_ = reinterpret_cast<MACROBLOCKD*>(
- vpx_memalign(32, sizeof(MACROBLOCKD)));
- mi_ = reinterpret_cast<MODE_INFO*>(
- vpx_memalign(32, sizeof(MODE_INFO)));
- data_array_ = reinterpret_cast<uint8_t*>(
- vpx_memalign(kDataAlignment, kDataBufferSize));
- }
-
- static void TearDownTestCase() {
- vpx_free(data_array_);
- vpx_free(mi_);
- vpx_free(mb_);
- data_array_ = NULL;
- }
-
- protected:
- static const int kBlockSize = 16;
- static const int kDataAlignment = 16;
- static const int kStride = kBlockSize * 3;
- // We use 48 so that the data pointer of the first pixel in each row of
- // each macroblock is 16-byte aligned, and this gives us access to the
- // top-left and top-right corner pixels belonging to the top-left/right
- // macroblocks.
- // We use 17 lines so we have one line above us for top-prediction.
- static const int kDataBufferSize = kStride * (kBlockSize + 1);
-
- virtual void SetUp() {
- pred_fn_ = GetParam();
- SetupMacroblock(mb_, mi_, data_array_, kBlockSize, kStride, 1);
- }
-
- virtual void Predict(MB_PREDICTION_MODE mode) {
- mbptr_->mode_info_context->mbmi.mode = mode;
- ASM_REGISTER_STATE_CHECK(pred_fn_(mbptr_,
- data_ptr_[0] - kStride,
- data_ptr_[0] - 1, kStride,
- data_ptr_[0], kStride));
- }
-
- IntraPredYFunc pred_fn_;
- static uint8_t* data_array_;
- static MACROBLOCKD * mb_;
- static MODE_INFO *mi_;
-};
-
-MACROBLOCKD* IntraPredYTest::mb_ = NULL;
-MODE_INFO* IntraPredYTest::mi_ = NULL;
-uint8_t* IntraPredYTest::data_array_ = NULL;
-
-TEST_P(IntraPredYTest, IntraPredTests) {
- RunTest();
-}
-
-INSTANTIATE_TEST_CASE_P(C, IntraPredYTest,
- ::testing::Values(
- vp8_build_intra_predictors_mby_s_c));
-#if HAVE_SSE2
-INSTANTIATE_TEST_CASE_P(SSE2, IntraPredYTest,
- ::testing::Values(
- vp8_build_intra_predictors_mby_s_sse2));
-#endif
-#if HAVE_SSSE3
-INSTANTIATE_TEST_CASE_P(SSSE3, IntraPredYTest,
- ::testing::Values(
- vp8_build_intra_predictors_mby_s_ssse3));
-#endif
-#if HAVE_NEON
-INSTANTIATE_TEST_CASE_P(NEON, IntraPredYTest,
- ::testing::Values(
- vp8_build_intra_predictors_mby_s_neon));
-#endif
-#if HAVE_MSA
-INSTANTIATE_TEST_CASE_P(MSA, IntraPredYTest,
- ::testing::Values(
- vp8_build_intra_predictors_mby_s_msa));
-#endif
-
-typedef void (*IntraPredUvFunc)(MACROBLOCKD *x,
- uint8_t *uabove_row,
- uint8_t *vabove_row,
- uint8_t *uleft,
- uint8_t *vleft,
- int left_stride,
- uint8_t *upred_ptr,
- uint8_t *vpred_ptr,
- int pred_stride);
-
-class IntraPredUVTest
- : public IntraPredBase,
- public ::testing::TestWithParam<IntraPredUvFunc> {
- public:
- static void SetUpTestCase() {
- mb_ = reinterpret_cast<MACROBLOCKD*>(
- vpx_memalign(32, sizeof(MACROBLOCKD)));
- mi_ = reinterpret_cast<MODE_INFO*>(
- vpx_memalign(32, sizeof(MODE_INFO)));
- data_array_ = reinterpret_cast<uint8_t*>(
- vpx_memalign(kDataAlignment, kDataBufferSize));
- }
-
- static void TearDownTestCase() {
- vpx_free(data_array_);
- vpx_free(mi_);
- vpx_free(mb_);
- data_array_ = NULL;
- }
-
- protected:
- static const int kBlockSize = 8;
- static const int kDataAlignment = 8;
- static const int kStride = kBlockSize * 3;
- // We use 24 so that the data pointer of the first pixel in each row of
- // each macroblock is 8-byte aligned, and this gives us access to the
- // top-left and top-right corner pixels belonging to the top-left/right
- // macroblocks.
- // We use 9 lines so we have one line above us for top-prediction.
- // [0] = U, [1] = V
- static const int kDataBufferSize = 2 * kStride * (kBlockSize + 1);
-
- virtual void SetUp() {
- pred_fn_ = GetParam();
- SetupMacroblock(mb_, mi_, data_array_, kBlockSize, kStride, 2);
- }
-
- virtual void Predict(MB_PREDICTION_MODE mode) {
- mbptr_->mode_info_context->mbmi.uv_mode = mode;
- pred_fn_(mbptr_, data_ptr_[0] - kStride, data_ptr_[1] - kStride,
- data_ptr_[0] - 1, data_ptr_[1] - 1, kStride,
- data_ptr_[0], data_ptr_[1], kStride);
- }
-
- IntraPredUvFunc pred_fn_;
- // We use 24 so that the data pointer of the first pixel in each row of
- // each macroblock is 8-byte aligned, and this gives us access to the
- // top-left and top-right corner pixels belonging to the top-left/right
- // macroblocks.
- // We use 9 lines so we have one line above us for top-prediction.
- // [0] = U, [1] = V
- static uint8_t* data_array_;
- static MACROBLOCKD* mb_;
- static MODE_INFO* mi_;
-};
-
-MACROBLOCKD* IntraPredUVTest::mb_ = NULL;
-MODE_INFO* IntraPredUVTest::mi_ = NULL;
-uint8_t* IntraPredUVTest::data_array_ = NULL;
-
-TEST_P(IntraPredUVTest, IntraPredTests) {
- RunTest();
-}
-
-INSTANTIATE_TEST_CASE_P(C, IntraPredUVTest,
- ::testing::Values(
- vp8_build_intra_predictors_mbuv_s_c));
-#if HAVE_SSE2
-INSTANTIATE_TEST_CASE_P(SSE2, IntraPredUVTest,
- ::testing::Values(
- vp8_build_intra_predictors_mbuv_s_sse2));
-#endif
-#if HAVE_SSSE3
-INSTANTIATE_TEST_CASE_P(SSSE3, IntraPredUVTest,
- ::testing::Values(
- vp8_build_intra_predictors_mbuv_s_ssse3));
-#endif
-#if HAVE_NEON
-INSTANTIATE_TEST_CASE_P(NEON, IntraPredUVTest,
- ::testing::Values(
- vp8_build_intra_predictors_mbuv_s_neon));
-#endif
-#if HAVE_MSA
-INSTANTIATE_TEST_CASE_P(MSA, IntraPredUVTest,
- ::testing::Values(
- vp8_build_intra_predictors_mbuv_s_msa));
-#endif
-
-} // namespace
diff --git a/test/register_state_check.h b/test/register_state_check.h
index 8e72f91..399df87 100644
--- a/test/register_state_check.h
+++ b/test/register_state_check.h
@@ -30,7 +30,8 @@
#if defined(_WIN64)
-#define _WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winnt.h>
diff --git a/test/sixtap_predict_test.cc b/test/sixtap_predict_test.cc
index 8c7c98d..1e682e7 100644
--- a/test/sixtap_predict_test.cc
+++ b/test/sixtap_predict_test.cc
@@ -201,7 +201,7 @@
const SixtapPredictFunc sixtap_8x8_neon = vp8_sixtap_predict8x8_neon;
const SixtapPredictFunc sixtap_8x4_neon = vp8_sixtap_predict8x4_neon;
INSTANTIATE_TEST_CASE_P(
- DISABLED_NEON, SixtapPredictTest, ::testing::Values(
+ NEON, SixtapPredictTest, ::testing::Values(
make_tuple(16, 16, sixtap_16x16_neon),
make_tuple(8, 8, sixtap_8x8_neon),
make_tuple(8, 4, sixtap_8x4_neon)));
diff --git a/test/test-data.mk b/test/test-data.mk
index e3217fb..4280b35 100644
--- a/test/test-data.mk
+++ b/test/test-data.mk
@@ -18,6 +18,7 @@
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_444.y4m
LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_440.yuv
+LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += desktop_credits.y4m
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += niklas_1280_720_30.y4m
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rush_hour_444.y4m
LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += screendata.y4m
diff --git a/test/test-data.sha1 b/test/test-data.sha1
index fb7ea7d..4e4ac62 100644
--- a/test/test-data.sha1
+++ b/test/test-data.sha1
@@ -743,3 +743,4 @@
e60d859b0ef2b331b21740cf6cb83fabe469b079 *invalid-vp90-2-03-size-202x210.webm.ivf.s113306_r01-05_b6-.ivf
0ae808dca4d3c1152a9576e14830b6faa39f1b4a *invalid-vp90-2-03-size-202x210.webm.ivf.s113306_r01-05_b6-.ivf.res
9cfc855459e7549fd015c79e8eca512b2f2cb7e3 *niklas_1280_720_30.y4m
+5b5763b388b1b52a81bb82b39f7ec25c4bd3d0e1 *desktop_credits.y4m
diff --git a/test/test.mk b/test/test.mk
index bb5186b..8d66244 100644
--- a/test/test.mk
+++ b/test/test.mk
@@ -36,6 +36,7 @@
LIBVPX_TEST_SRCS-$(CONFIG_VP9_DECODER) += invalid_file_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP9_DECODER) += user_priv_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP9_DECODER) += vp9_frame_parallel_test.cc
+LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += active_map_refresh_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += active_map_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += borders_test.cc
LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += cpu_speed_test.cc
@@ -110,7 +111,6 @@
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += quantize_test.cc
LIBVPX_TEST_SRCS-yes += idct_test.cc
-LIBVPX_TEST_SRCS-yes += intrapred_test.cc
LIBVPX_TEST_SRCS-yes += sixtap_predict_test.cc
LIBVPX_TEST_SRCS-yes += vpx_scale_test.cc
diff --git a/test/video_source.h b/test/video_source.h
index db01575..8739dda 100644
--- a/test/video_source.h
+++ b/test/video_source.h
@@ -11,6 +11,8 @@
#define TEST_VIDEO_SOURCE_H_
#if defined(_WIN32)
+#define NOMINMAX
+#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include <cstdio>
diff --git a/test/vp9_thread_test.cc b/test/vp9_thread_test.cc
index 233e1b1..92e4b96 100644
--- a/test/vp9_thread_test.cc
+++ b/test/vp9_thread_test.cc
@@ -190,7 +190,7 @@
void DecodeFiles(const FileList files[]) {
for (const FileList *iter = files; iter->name != NULL; ++iter) {
SCOPED_TRACE(iter->name);
- for (int t = 2; t <= 8; ++t) {
+ for (int t = 1; t <= 8; ++t) {
EXPECT_EQ(iter->expected_md5, DecodeFile(iter->name, t))
<< "threads = " << t;
}
@@ -235,13 +235,13 @@
EXPECT_EQ(expected_md5, DecodeFile(filename, 2));
}
-TEST(VP9DecodeMultiThreadedTest, Decode) {
+TEST(VP9DecodeMultiThreadedTest, NoTilesNonFrameParallel) {
// no tiles or frame parallel; this exercises loop filter threading.
EXPECT_EQ("b35a1b707b28e82be025d960aba039bc",
DecodeFile("vp90-2-03-size-226x226.webm", 2));
}
-TEST(VP9DecodeMultiThreadedTest, Decode2) {
+TEST(VP9DecodeMultiThreadedTest, FrameParallel) {
static const FileList files[] = {
{ "vp90-2-08-tile_1x2_frame_parallel.webm",
"68ede6abd66bae0a2edf2eb9232241b6" },
@@ -255,8 +255,7 @@
DecodeFiles(files);
}
-// Test tile quantity changes within one file.
-TEST(VP9DecodeMultiThreadedTest, Decode3) {
+TEST(VP9DecodeMultiThreadedTest, FrameParallelResize) {
static const FileList files[] = {
{ "vp90-2-14-resize-fp-tiles-1-16.webm",
"0cd5e632c326297e975f38949c31ea94" },
@@ -307,6 +306,19 @@
DecodeFiles(files);
}
+
+TEST(VP9DecodeMultiThreadedTest, NonFrameParallel) {
+ static const FileList files[] = {
+ { "vp90-2-08-tile_1x2.webm", "570b4a5d5a70d58b5359671668328a16" },
+ { "vp90-2-08-tile_1x4.webm", "988d86049e884c66909d2d163a09841a" },
+ { "vp90-2-08-tile_1x8.webm", "0941902a52e9092cb010905eab16364c" },
+ { "vp90-2-08-tile-4x1.webm", "06505aade6647c583c8e00a2f582266f" },
+ { "vp90-2-08-tile-4x4.webm", "85c2299892460d76e2c600502d52bfe2" },
+ { NULL, NULL }
+ };
+
+ DecodeFiles(files);
+}
#endif // CONFIG_WEBM_IO
INSTANTIATE_TEST_CASE_P(Synchronous, VPxWorkerThreadTest, ::testing::Bool());
diff --git a/test/y4m_video_source.h b/test/y4m_video_source.h
index 378e75b..03d9388 100644
--- a/test/y4m_video_source.h
+++ b/test/y4m_video_source.h
@@ -9,6 +9,7 @@
*/
#ifndef TEST_Y4M_VIDEO_SOURCE_H_
#define TEST_Y4M_VIDEO_SOURCE_H_
+#include <algorithm>
#include <string>
#include "test/video_source.h"
@@ -91,6 +92,18 @@
y4m_input_fetch_frame(&y4m_, input_file_, img_.get());
}
+ // Swap buffers with another y4m source. This allows reading a new frame
+ // while keeping the old frame around. A whole Y4mSource is required and
+ // not just a vpx_image_t because of how the y4m reader manipulates
+ // vpx_image_t internals,
+ void SwapBuffers(Y4mVideoSource *other) {
+ std::swap(other->y4m_.dst_buf, y4m_.dst_buf);
+ vpx_image_t *tmp;
+ tmp = other->img_.release();
+ other->img_.reset(img_.release());
+ img_.reset(tmp);
+ }
+
protected:
void CloseSource() {
y4m_input_close(&y4m_);
diff --git a/vp10/common/reconintra.c b/vp10/common/reconintra.c
index 9350d67..da35530 100644
--- a/vp10/common/reconintra.c
+++ b/vp10/common/reconintra.c
@@ -120,7 +120,6 @@
int frame_width, frame_height;
int x0, y0;
const struct macroblockd_plane *const pd = &xd->plane[plane];
- // int base=128;
int base = 128 << (bd - 8);
// 127 127 127 .. 127 127 127 127 127 127
// 129 A B .. Y Z
diff --git a/vp8/common/arm/armv6/intra4x4_predict_v6.asm b/vp8/common/arm/armv6/intra4x4_predict_v6.asm
deleted file mode 100644
index c5ec824..0000000
--- a/vp8/common/arm/armv6/intra4x4_predict_v6.asm
+++ /dev/null
@@ -1,611 +0,0 @@
-;
-; Copyright (c) 2011 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.
-;
-
-
- EXPORT |vp8_intra4x4_predict_armv6|
-
- ARM
- REQUIRE8
- PRESERVE8
-
- AREA ||.text||, CODE, READONLY, ALIGN=2
-
-
-;void vp8_intra4x4_predict_armv6(unsigned char *Above, unsigned char *yleft,
-; B_PREDICTION_MODE left_stride, int b_mode,
-; unsigned char *dst, int dst_stride,
-; unsigned char top_left)
-
-; r0: *Above
-; r1: *yleft
-; r2: left_stride
-; r3: b_mode
-; sp + #40: dst
-; sp + #44: dst_stride
-; sp + #48: top_left
-|vp8_intra4x4_predict_armv6| PROC
- push {r4-r12, lr}
-
- cmp r3, #10
- addlt pc, pc, r3, lsl #2 ; position independent switch
- pop {r4-r12, pc} ; default
- b b_dc_pred
- b b_tm_pred
- b b_ve_pred
- b b_he_pred
- b b_ld_pred
- b b_rd_pred
- b b_vr_pred
- b b_vl_pred
- b b_hd_pred
- b b_hu_pred
-
-b_dc_pred
- ; load values
- ldr r8, [r0] ; Above
- ldrb r4, [r1], r2 ; Left[0]
- mov r9, #0
- ldrb r5, [r1], r2 ; Left[1]
- ldrb r6, [r1], r2 ; Left[2]
- usad8 r12, r8, r9
- ldrb r7, [r1] ; Left[3]
-
- ; calculate dc
- add r4, r4, r5
- add r4, r4, r6
- add r4, r4, r7
- add r4, r4, r12
- add r4, r4, #4
- ldr r0, [sp, #44] ; dst_stride
- mov r12, r4, asr #3 ; (expected_dc + 4) >> 3
-
- add r12, r12, r12, lsl #8
- ldr r3, [sp, #40] ; dst
- add r12, r12, r12, lsl #16
-
- ; store values
- str r12, [r3], r0
- str r12, [r3], r0
- str r12, [r3], r0
- str r12, [r3]
-
- pop {r4-r12, pc}
-
-b_tm_pred
- ldr r8, [r0] ; Above
- ldrb r9, [sp, #48] ; top_left
- ldrb r4, [r1], r2 ; Left[0]
- ldrb r5, [r1], r2 ; Left[1]
- ldrb r6, [r1], r2 ; Left[2]
- ldrb r7, [r1] ; Left[3]
- ldr r0, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- add r9, r9, r9, lsl #16 ; [tl|tl]
- uxtb16 r10, r8 ; a[2|0]
- uxtb16 r11, r8, ror #8 ; a[3|1]
- ssub16 r10, r10, r9 ; a[2|0] - [tl|tl]
- ssub16 r11, r11, r9 ; a[3|1] - [tl|tl]
-
- add r4, r4, r4, lsl #16 ; l[0|0]
- add r5, r5, r5, lsl #16 ; l[1|1]
- add r6, r6, r6, lsl #16 ; l[2|2]
- add r7, r7, r7, lsl #16 ; l[3|3]
-
- sadd16 r1, r4, r10 ; l[0|0] + a[2|0] - [tl|tl]
- sadd16 r2, r4, r11 ; l[0|0] + a[3|1] - [tl|tl]
- usat16 r1, #8, r1
- usat16 r2, #8, r2
-
- sadd16 r4, r5, r10 ; l[1|1] + a[2|0] - [tl|tl]
- sadd16 r5, r5, r11 ; l[1|1] + a[3|1] - [tl|tl]
-
- add r12, r1, r2, lsl #8 ; [3|2|1|0]
- str r12, [r3], r0
-
- usat16 r4, #8, r4
- usat16 r5, #8, r5
-
- sadd16 r1, r6, r10 ; l[2|2] + a[2|0] - [tl|tl]
- sadd16 r2, r6, r11 ; l[2|2] + a[3|1] - [tl|tl]
-
- add r12, r4, r5, lsl #8 ; [3|2|1|0]
- str r12, [r3], r0
-
- usat16 r1, #8, r1
- usat16 r2, #8, r2
-
- sadd16 r4, r7, r10 ; l[3|3] + a[2|0] - [tl|tl]
- sadd16 r5, r7, r11 ; l[3|3] + a[3|1] - [tl|tl]
-
- add r12, r1, r2, lsl #8 ; [3|2|1|0]
-
- usat16 r4, #8, r4
- usat16 r5, #8, r5
-
- str r12, [r3], r0
-
- add r12, r4, r5, lsl #8 ; [3|2|1|0]
- str r12, [r3]
-
- pop {r4-r12, pc}
-
-b_ve_pred
- ldr r8, [r0] ; a[3|2|1|0]
- ldr r11, c00FF00FF
- ldrb r9, [sp, #48] ; top_left
- ldrb r10, [r0, #4] ; a[4]
-
- ldr r0, c00020002
-
- uxtb16 r4, r8 ; a[2|0]
- uxtb16 r5, r8, ror #8 ; a[3|1]
- ldr r2, [sp, #44] ; dst_stride
- pkhbt r9, r9, r5, lsl #16 ; a[1|-1]
-
- add r9, r9, r4, lsl #1 ;[a[1]+2*a[2] | tl+2*a[0] ]
- uxtab16 r9, r9, r5 ;[a[1]+2*a[2]+a[3] | tl+2*a[0]+a[1] ]
- ldr r3, [sp, #40] ; dst
- uxtab16 r9, r9, r0 ;[a[1]+2*a[2]+a[3]+2| tl+2*a[0]+a[1]+2]
-
- add r0, r0, r10, lsl #16 ;[a[4]+2 | 2]
- add r0, r0, r4, asr #16 ;[a[4]+2 | a[2]+2]
- add r0, r0, r5, lsl #1 ;[a[4]+2*a[3]+2 | a[2]+2*a[1]+2]
- uadd16 r4, r4, r0 ;[a[4]+2*a[3]+a[2]+2|a[2]+2*a[1]+a[0]+2]
-
- and r9, r11, r9, asr #2
- and r4, r11, r4, asr #2
- add r9, r9, r4, lsl #8
-
- ; store values
- str r9, [r3], r2
- str r9, [r3], r2
- str r9, [r3], r2
- str r9, [r3]
-
- pop {r4-r12, pc}
-
-
-b_he_pred
- ldrb r4, [r1], r2 ; Left[0]
- ldrb r8, [sp, #48] ; top_left
- ldrb r5, [r1], r2 ; Left[1]
- ldrb r6, [r1], r2 ; Left[2]
- ldrb r7, [r1] ; Left[3]
-
- add r8, r8, r4 ; tl + l[0]
- add r9, r4, r5 ; l[0] + l[1]
- add r10, r5, r6 ; l[1] + l[2]
- add r11, r6, r7 ; l[2] + l[3]
-
- mov r0, #2<<14
-
- add r8, r8, r9 ; tl + 2*l[0] + l[1]
- add r4, r9, r10 ; l[0] + 2*l[1] + l[2]
- add r5, r10, r11 ; l[1] + 2*l[2] + l[3]
- add r6, r11, r7, lsl #1 ; l[2] + 2*l[3] + l[3]
-
-
- add r8, r0, r8, lsl #14 ; (tl + 2*l[0] + l[1])>>2 in top half
- add r9, r0, r4, lsl #14 ; (l[0] + 2*l[1] + l[2])>>2 in top half
- add r10,r0, r5, lsl #14 ; (l[1] + 2*l[2] + l[3])>>2 in top half
- add r11,r0, r6, lsl #14 ; (l[2] + 2*l[3] + l[3])>>2 in top half
-
- pkhtb r8, r8, r8, asr #16 ; l[-|0|-|0]
- pkhtb r9, r9, r9, asr #16 ; l[-|1|-|1]
- pkhtb r10, r10, r10, asr #16 ; l[-|2|-|2]
- pkhtb r11, r11, r11, asr #16 ; l[-|3|-|3]
-
- ldr r0, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- add r8, r8, r8, lsl #8 ; l[0|0|0|0]
- add r9, r9, r9, lsl #8 ; l[1|1|1|1]
- add r10, r10, r10, lsl #8 ; l[2|2|2|2]
- add r11, r11, r11, lsl #8 ; l[3|3|3|3]
-
- ; store values
- str r8, [r3], r0
- str r9, [r3], r0
- str r10, [r3], r0
- str r11, [r3]
-
- pop {r4-r12, pc}
-
-b_ld_pred
- ldr r4, [r0] ; Above[0-3]
- ldr r12, c00020002
- ldr r5, [r0, #4] ; Above[4-7]
- ldr lr, c00FF00FF
-
- uxtb16 r6, r4 ; a[2|0]
- uxtb16 r7, r4, ror #8 ; a[3|1]
- uxtb16 r8, r5 ; a[6|4]
- uxtb16 r9, r5, ror #8 ; a[7|5]
- pkhtb r10, r6, r8 ; a[2|4]
- pkhtb r11, r7, r9 ; a[3|5]
-
- add r4, r6, r7, lsl #1 ; [a2+2*a3 | a0+2*a1]
- add r4, r4, r10, ror #16 ; [a2+2*a3+a4 | a0+2*a1+a2]
- uxtab16 r4, r4, r12 ; [a2+2*a3+a4+2 | a0+2*a1+a2+2]
-
- add r5, r7, r10, ror #15 ; [a3+2*a4 | a1+2*a2]
- add r5, r5, r11, ror #16 ; [a3+2*a4+a5 | a1+2*a2+a3]
- uxtab16 r5, r5, r12 ; [a3+2*a4+a5+2 | a1+2*a2+a3+2]
-
- pkhtb r7, r9, r8, asr #16
- add r6, r8, r9, lsl #1 ; [a6+2*a7 | a4+2*a5]
- uadd16 r6, r6, r7 ; [a6+2*a7+a7 | a4+2*a5+a6]
- uxtab16 r6, r6, r12 ; [a6+2*a7+a7+2 | a4+2*a5+a6+2]
-
- uxth r7, r9 ; [ a5]
- add r7, r7, r8, asr #15 ; [ a5+2*a6]
- add r7, r7, r9, asr #16 ; [ a5+2*a6+a7]
- uxtah r7, r7, r12 ; [ a5+2*a6+a7+2]
-
- ldr r0, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- ; scale down
- and r4, lr, r4, asr #2
- and r5, lr, r5, asr #2
- and r6, lr, r6, asr #2
- mov r7, r7, asr #2
-
- add r8, r4, r5, lsl #8 ; [3|2|1|0]
- str r8, [r3], r0
-
- mov r9, r8, lsr #8
- add r9, r9, r6, lsl #24 ; [4|3|2|1]
- str r9, [r3], r0
-
- mov r10, r9, lsr #8
- add r10, r10, r7, lsl #24 ; [5|4|3|2]
- str r10, [r3], r0
-
- mov r6, r6, lsr #16
- mov r11, r10, lsr #8
- add r11, r11, r6, lsl #24 ; [6|5|4|3]
- str r11, [r3]
-
- pop {r4-r12, pc}
-
-b_rd_pred
- ldrb r7, [r1], r2 ; l[0] = pp[3]
- ldr lr, [r0] ; Above = pp[8|7|6|5]
- ldrb r8, [sp, #48] ; tl = pp[4]
- ldrb r6, [r1], r2 ; l[1] = pp[2]
- ldrb r5, [r1], r2 ; l[2] = pp[1]
- ldrb r4, [r1], r2 ; l[3] = pp[0]
-
-
- uxtb16 r9, lr ; p[7|5]
- uxtb16 r10, lr, ror #8 ; p[8|6]
- add r4, r4, r6, lsl #16 ; p[2|0]
- add r5, r5, r7, lsl #16 ; p[3|1]
- add r6, r6, r8, lsl #16 ; p[4|2]
- pkhbt r7, r7, r9, lsl #16 ; p[5|3]
- pkhbt r8, r8, r10, lsl #16 ; p[6|4]
-
- ldr r12, c00020002
- ldr lr, c00FF00FF
-
- add r4, r4, r5, lsl #1 ; [p2+2*p3 | p0+2*p1]
- add r4, r4, r6 ; [p2+2*p3+p4 | p0+2*p1+p2]
- uxtab16 r4, r4, r12 ; [p2+2*p3+p4+2 | p0+2*p1+p2+2]
-
- add r5, r5, r6, lsl #1 ; [p3+2*p4 | p1+2*p2]
- add r5, r5, r7 ; [p3+2*p4+p5 | p1+2*p2+p3]
- uxtab16 r5, r5, r12 ; [p3+2*p4+p5+2 | p1+2*p2+p3+2]
-
- add r6, r7, r8, lsl #1 ; [p5+2*p6 | p3+2*p4]
- add r6, r6, r9 ; [p5+2*p6+p7 | p3+2*p4+p5]
- uxtab16 r6, r6, r12 ; [p5+2*p6+p7+2 | p3+2*p4+p5+2]
-
- add r7, r8, r9, lsl #1 ; [p6+2*p7 | p4+2*p5]
- add r7, r7, r10 ; [p6+2*p7+p8 | p4+2*p5+p6]
- uxtab16 r7, r7, r12 ; [p6+2*p7+p8+2 | p4+2*p5+p6+2]
-
- ldr r0, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- ; scale down
- and r7, lr, r7, asr #2
- and r6, lr, r6, asr #2
- and r5, lr, r5, asr #2
- and r4, lr, r4, asr #2
-
- add r8, r6, r7, lsl #8 ; [6|5|4|3]
- str r8, [r3], r0
-
- mov r9, r8, lsl #8 ; [5|4|3|-]
- uxtab r9, r9, r4, ror #16 ; [5|4|3|2]
- str r9, [r3], r0
-
- mov r10, r9, lsl #8 ; [4|3|2|-]
- uxtab r10, r10, r5 ; [4|3|2|1]
- str r10, [r3], r0
-
- mov r11, r10, lsl #8 ; [3|2|1|-]
- uxtab r11, r11, r4 ; [3|2|1|0]
- str r11, [r3]
-
- pop {r4-r12, pc}
-
-b_vr_pred
- ldrb r7, [r1], r2 ; l[0] = pp[3]
- ldr lr, [r0] ; Above = pp[8|7|6|5]
- ldrb r8, [sp, #48] ; tl = pp[4]
- ldrb r6, [r1], r2 ; l[1] = pp[2]
- ldrb r5, [r1], r2 ; l[2] = pp[1]
- ldrb r4, [r1] ; l[3] = pp[0]
-
- add r5, r5, r7, lsl #16 ; p[3|1]
- add r6, r6, r8, lsl #16 ; p[4|2]
- uxtb16 r9, lr ; p[7|5]
- uxtb16 r10, lr, ror #8 ; p[8|6]
- pkhbt r7, r7, r9, lsl #16 ; p[5|3]
- pkhbt r8, r8, r10, lsl #16 ; p[6|4]
-
- ldr r4, c00010001
- ldr r12, c00020002
- ldr lr, c00FF00FF
-
- add r5, r5, r6, lsl #1 ; [p3+2*p4 | p1+2*p2]
- add r5, r5, r7 ; [p3+2*p4+p5 | p1+2*p2+p3]
- uxtab16 r5, r5, r12 ; [p3+2*p4+p5+2 | p1+2*p2+p3+2]
-
- add r6, r6, r7, lsl #1 ; [p4+2*p5 | p2+2*p3]
- add r6, r6, r8 ; [p4+2*p5+p6 | p2+2*p3+p4]
- uxtab16 r6, r6, r12 ; [p4+2*p5+p6+2 | p2+2*p3+p4+2]
-
- uadd16 r11, r8, r9 ; [p6+p7 | p4+p5]
- uhadd16 r11, r11, r4 ; [(p6+p7+1)>>1 | (p4+p5+1)>>1]
- ; [F|E]
-
- add r7, r7, r8, lsl #1 ; [p5+2*p6 | p3+2*p4]
- add r7, r7, r9 ; [p5+2*p6+p7 | p3+2*p4+p5]
- uxtab16 r7, r7, r12 ; [p5+2*p6+p7+2 | p3+2*p4+p5+2]
-
- uadd16 r2, r9, r10 ; [p7+p8 | p5+p6]
- uhadd16 r2, r2, r4 ; [(p7+p8+1)>>1 | (p5+p6+1)>>1]
- ; [J|I]
-
- add r8, r8, r9, lsl #1 ; [p6+2*p7 | p4+2*p5]
- add r8, r8, r10 ; [p6+2*p7+p8 | p4+2*p5+p6]
- uxtab16 r8, r8, r12 ; [p6+2*p7+p8+2 | p4+2*p5+p6+2]
-
- ldr r0, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- ; scale down
- and r5, lr, r5, asr #2 ; [B|A]
- and r6, lr, r6, asr #2 ; [D|C]
- and r7, lr, r7, asr #2 ; [H|G]
- and r8, lr, r8, asr #2 ; [L|K]
-
- add r12, r11, r2, lsl #8 ; [J|F|I|E]
- str r12, [r3], r0
-
- add r12, r7, r8, lsl #8 ; [L|H|K|G]
- str r12, [r3], r0
-
- pkhbt r2, r6, r2, lsl #16 ; [-|I|-|C]
- add r2, r2, r11, lsl #8 ; [F|I|E|C]
-
- pkhtb r12, r6, r5 ; [-|D|-|A]
- pkhtb r10, r7, r5, asr #16 ; [-|H|-|B]
- str r2, [r3], r0
- add r12, r12, r10, lsl #8 ; [H|D|B|A]
- str r12, [r3]
-
- pop {r4-r12, pc}
-
-b_vl_pred
- ldr r4, [r0] ; [3|2|1|0] = Above[0-3]
- ldr r12, c00020002
- ldr r5, [r0, #4] ; [7|6|5|4] = Above[4-7]
- ldr lr, c00FF00FF
- ldr r2, c00010001
-
- mov r0, r4, lsr #16 ; [-|-|3|2]
- add r0, r0, r5, lsl #16 ; [5|4|3|2]
- uxtb16 r6, r4 ; [2|0]
- uxtb16 r7, r4, ror #8 ; [3|1]
- uxtb16 r8, r0 ; [4|2]
- uxtb16 r9, r0, ror #8 ; [5|3]
- uxtb16 r10, r5 ; [6|4]
- uxtb16 r11, r5, ror #8 ; [7|5]
-
- uadd16 r4, r6, r7 ; [p2+p3 | p0+p1]
- uhadd16 r4, r4, r2 ; [(p2+p3+1)>>1 | (p0+p1+1)>>1]
- ; [B|A]
-
- add r5, r6, r7, lsl #1 ; [p2+2*p3 | p0+2*p1]
- add r5, r5, r8 ; [p2+2*p3+p4 | p0+2*p1+p2]
- uxtab16 r5, r5, r12 ; [p2+2*p3+p4+2 | p0+2*p1+p2+2]
-
- uadd16 r6, r7, r8 ; [p3+p4 | p1+p2]
- uhadd16 r6, r6, r2 ; [(p3+p4+1)>>1 | (p1+p2+1)>>1]
- ; [F|E]
-
- add r7, r7, r8, lsl #1 ; [p3+2*p4 | p1+2*p2]
- add r7, r7, r9 ; [p3+2*p4+p5 | p1+2*p2+p3]
- uxtab16 r7, r7, r12 ; [p3+2*p4+p5+2 | p1+2*p2+p3+2]
-
- add r8, r8, r9, lsl #1 ; [p4+2*p5 | p2+2*p3]
- add r8, r8, r10 ; [p4+2*p5+p6 | p2+2*p3+p4]
- uxtab16 r8, r8, r12 ; [p4+2*p5+p6+2 | p2+2*p3+p4+2]
-
- add r9, r9, r10, lsl #1 ; [p5+2*p6 | p3+2*p4]
- add r9, r9, r11 ; [p5+2*p6+p7 | p3+2*p4+p5]
- uxtab16 r9, r9, r12 ; [p5+2*p6+p7+2 | p3+2*p4+p5+2]
-
- ldr r0, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- ; scale down
- and r5, lr, r5, asr #2 ; [D|C]
- and r7, lr, r7, asr #2 ; [H|G]
- and r8, lr, r8, asr #2 ; [I|D]
- and r9, lr, r9, asr #2 ; [J|H]
-
- add r10, r4, r6, lsl #8 ; [F|B|E|A]
- str r10, [r3], r0
-
- add r5, r5, r7, lsl #8 ; [H|C|G|D]
- str r5, [r3], r0
-
- pkhtb r12, r8, r4, asr #16 ; [-|I|-|B]
- pkhtb r10, r9, r8 ; [-|J|-|D]
-
- add r12, r6, r12, lsl #8 ; [I|F|B|E]
- str r12, [r3], r0
-
- add r10, r7, r10, lsl #8 ; [J|H|D|G]
- str r10, [r3]
-
- pop {r4-r12, pc}
-
-b_hd_pred
- ldrb r7, [r1], r2 ; l[0] = pp[3]
- ldr lr, [r0] ; Above = pp[8|7|6|5]
- ldrb r8, [sp, #48] ; tl = pp[4]
- ldrb r6, [r1], r2 ; l[1] = pp[2]
- ldrb r5, [r1], r2 ; l[2] = pp[1]
- ldrb r4, [r1] ; l[3] = pp[0]
-
- uxtb16 r9, lr ; p[7|5]
- uxtb16 r10, lr, ror #8 ; p[8|6]
-
- add r4, r4, r5, lsl #16 ; p[1|0]
- add r5, r5, r6, lsl #16 ; p[2|1]
- add r6, r6, r7, lsl #16 ; p[3|2]
- add r7, r7, r8, lsl #16 ; p[4|3]
-
- ldr r12, c00020002
- ldr lr, c00FF00FF
- ldr r2, c00010001
-
- pkhtb r8, r7, r9 ; p[4|5]
- pkhtb r1, r9, r10 ; p[7|6]
- pkhbt r10, r8, r10, lsl #16 ; p[6|5]
-
- uadd16 r11, r4, r5 ; [p1+p2 | p0+p1]
- uhadd16 r11, r11, r2 ; [(p1+p2+1)>>1 | (p0+p1+1)>>1]
- ; [B|A]
-
- add r4, r4, r5, lsl #1 ; [p1+2*p2 | p0+2*p1]
- add r4, r4, r6 ; [p1+2*p2+p3 | p0+2*p1+p2]
- uxtab16 r4, r4, r12 ; [p1+2*p2+p3+2 | p0+2*p1+p2+2]
-
- uadd16 r0, r6, r7 ; [p3+p4 | p2+p3]
- uhadd16 r0, r0, r2 ; [(p3+p4+1)>>1 | (p2+p3+1)>>1]
- ; [F|E]
-
- add r5, r6, r7, lsl #1 ; [p3+2*p4 | p2+2*p3]
- add r5, r5, r8, ror #16 ; [p3+2*p4+p5 | p2+2*p3+p4]
- uxtab16 r5, r5, r12 ; [p3+2*p4+p5+2 | p2+2*p3+p4+2]
-
- add r6, r12, r8, ror #16 ; [p5+2 | p4+2]
- add r6, r6, r10, lsl #1 ; [p5+2+2*p6 | p4+2+2*p5]
- uxtab16 r6, r6, r1 ; [p5+2+2*p6+p7 | p4+2+2*p5+p6]
-
- ; scale down
- and r4, lr, r4, asr #2 ; [D|C]
- and r5, lr, r5, asr #2 ; [H|G]
- and r6, lr, r6, asr #2 ; [J|I]
-
- ldr lr, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
-
- pkhtb r2, r0, r6 ; [-|F|-|I]
- pkhtb r12, r6, r5, asr #16 ; [-|J|-|H]
- add r12, r12, r2, lsl #8 ; [F|J|I|H]
- add r2, r0, r5, lsl #8 ; [H|F|G|E]
- mov r12, r12, ror #24 ; [J|I|H|F]
- str r12, [r3], lr
-
- mov r7, r11, asr #16 ; [-|-|-|B]
- str r2, [r3], lr
- add r7, r7, r0, lsl #16 ; [-|E|-|B]
- add r7, r7, r4, asr #8 ; [-|E|D|B]
- add r7, r7, r5, lsl #24 ; [G|E|D|B]
- str r7, [r3], lr
-
- add r5, r11, r4, lsl #8 ; [D|B|C|A]
- str r5, [r3]
-
- pop {r4-r12, pc}
-
-
-
-b_hu_pred
- ldrb r4, [r1], r2 ; Left[0]
- ldr r12, c00020002
- ldrb r5, [r1], r2 ; Left[1]
- ldr lr, c00FF00FF
- ldrb r6, [r1], r2 ; Left[2]
- ldr r2, c00010001
- ldrb r7, [r1] ; Left[3]
-
- add r4, r4, r5, lsl #16 ; [1|0]
- add r5, r5, r6, lsl #16 ; [2|1]
- add r9, r6, r7, lsl #16 ; [3|2]
-
- uadd16 r8, r4, r5 ; [p1+p2 | p0+p1]
- uhadd16 r8, r8, r2 ; [(p1+p2+1)>>1 | (p0+p1+1)>>1]
- ; [B|A]
-
- add r4, r4, r5, lsl #1 ; [p1+2*p2 | p0+2*p1]
- add r4, r4, r9 ; [p1+2*p2+p3 | p0+2*p1+p2]
- uxtab16 r4, r4, r12 ; [p1+2*p2+p3+2 | p0+2*p1+p2+2]
- ldr r2, [sp, #44] ; dst_stride
- ldr r3, [sp, #40] ; dst
- and r4, lr, r4, asr #2 ; [D|C]
-
- add r10, r6, r7 ; [p2+p3]
- add r11, r10, r7, lsl #1 ; [p2+3*p3]
- add r10, r10, #1
- add r11, r11, #2
- mov r10, r10, asr #1 ; [E]
- mov r11, r11, asr #2 ; [F]
-
- add r9, r7, r9, asr #8 ; [-|-|G|G]
- add r0, r8, r4, lsl #8 ; [D|B|C|A]
- add r7, r9, r9, lsl #16 ; [G|G|G|G]
-
- str r0, [r3], r2
-
- mov r1, r8, asr #16 ; [-|-|-|B]
- add r1, r1, r4, asr #8 ; [-|-|D|B]
- add r1, r1, r10, lsl #16 ; [-|E|D|B]
- add r1, r1, r11, lsl #24 ; [F|E|D|B]
- str r1, [r3], r2
-
- add r10, r11, lsl #8 ; [-|-|F|E]
- add r10, r10, r9, lsl #16 ; [G|G|F|E]
- str r10, [r3], r2
-
- str r7, [r3]
-
- pop {r4-r12, pc}
-
- ENDP
-
-; constants
-c00010001
- DCD 0x00010001
-c00020002
- DCD 0x00020002
-c00FF00FF
- DCD 0x00FF00FF
-
- END
diff --git a/vp8/common/arm/neon/reconintra_neon.c b/vp8/common/arm/neon/reconintra_neon.c
deleted file mode 100644
index af52cd5..0000000
--- a/vp8/common/arm/neon/reconintra_neon.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * 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 <arm_neon.h>
-
-#include "vp8/common/blockd.h"
-
-void vp8_build_intra_predictors_mby_s_neon(MACROBLOCKD *x,
- unsigned char * yabove_row,
- unsigned char * yleft,
- int left_stride,
- unsigned char * ypred_ptr,
- int y_stride) {
- const int mode = x->mode_info_context->mbmi.mode;
- int i;
-
- switch (mode) {
- case DC_PRED:
- {
- int shift = x->up_available + x->left_available;
- uint8x16_t v_expected_dc = vdupq_n_u8(128);
-
- if (shift) {
- unsigned int average = 0;
- int expected_dc;
- if (x->up_available) {
- const uint8x16_t v_above = vld1q_u8(yabove_row);
- const uint16x8_t a = vpaddlq_u8(v_above);
- const uint32x4_t b = vpaddlq_u16(a);
- const uint64x2_t c = vpaddlq_u32(b);
- const uint32x2_t d = vadd_u32(vreinterpret_u32_u64(vget_low_u64(c)),
- vreinterpret_u32_u64(vget_high_u64(c)));
- average = vget_lane_u32(d, 0);
- }
- if (x->left_available) {
- for (i = 0; i < 16; ++i) {
- average += yleft[0];
- yleft += left_stride;
- }
- }
- shift += 3;
- expected_dc = (average + (1 << (shift - 1))) >> shift;
- v_expected_dc = vmovq_n_u8((uint8_t)expected_dc);
- }
- for (i = 0; i < 16; ++i) {
- vst1q_u8(ypred_ptr, v_expected_dc);
- ypred_ptr += y_stride;
- }
- }
- break;
- case V_PRED:
- {
- const uint8x16_t v_above = vld1q_u8(yabove_row);
- for (i = 0; i < 16; ++i) {
- vst1q_u8(ypred_ptr, v_above);
- ypred_ptr += y_stride;
- }
- }
- break;
- case H_PRED:
- {
- for (i = 0; i < 16; ++i) {
- const uint8x16_t v_yleft = vmovq_n_u8((uint8_t)yleft[0]);
- yleft += left_stride;
- vst1q_u8(ypred_ptr, v_yleft);
- ypred_ptr += y_stride;
- }
- }
- break;
- case TM_PRED:
- {
- const uint16x8_t v_ytop_left = vmovq_n_u16((int16_t)yabove_row[-1]);
- const uint8x16_t v_above = vld1q_u8(yabove_row);
- for (i = 0; i < 16; ++i) {
- const uint8x8_t v_yleft = vmov_n_u8((int8_t)yleft[0]);
- const uint16x8_t a_lo = vaddl_u8(vget_low_u8(v_above), v_yleft);
- const uint16x8_t a_hi = vaddl_u8(vget_high_u8(v_above), v_yleft);
- const int16x8_t b_lo = vsubq_s16(vreinterpretq_s16_u16(a_lo),
- vreinterpretq_s16_u16(v_ytop_left));
- const int16x8_t b_hi = vsubq_s16(vreinterpretq_s16_u16(a_hi),
- vreinterpretq_s16_u16(v_ytop_left));
- const uint8x8_t pred_lo = vqmovun_s16(b_lo);
- const uint8x8_t pred_hi = vqmovun_s16(b_hi);
-
- vst1q_u8(ypred_ptr, vcombine_u8(pred_lo, pred_hi));
- ypred_ptr += y_stride;
- yleft += left_stride;
- }
- }
- break;
- }
-}
-
-void vp8_build_intra_predictors_mbuv_s_neon(MACROBLOCKD *x,
- unsigned char * uabove_row,
- unsigned char * vabove_row,
- unsigned char * uleft,
- unsigned char * vleft,
- int left_stride,
- unsigned char * upred_ptr,
- unsigned char * vpred_ptr,
- int pred_stride) {
- const int mode = x->mode_info_context->mbmi.uv_mode;
- int i;
-
- switch (mode) {
- case DC_PRED:
- {
- int shift = x->up_available + x->left_available;
- uint8x8_t v_expected_udc = vdup_n_u8(128);
- uint8x8_t v_expected_vdc = vdup_n_u8(128);
-
- if (shift) {
- unsigned int average_u = 0;
- unsigned int average_v = 0;
- int expected_udc;
- int expected_vdc;
- if (x->up_available) {
- const uint8x8_t v_uabove = vld1_u8(uabove_row);
- const uint8x8_t v_vabove = vld1_u8(vabove_row);
- const uint16x8_t a = vpaddlq_u8(vcombine_u8(v_uabove, v_vabove));
- const uint32x4_t b = vpaddlq_u16(a);
- const uint64x2_t c = vpaddlq_u32(b);
- average_u = vgetq_lane_u32(vreinterpretq_u32_u64((c)), 0);
- average_v = vgetq_lane_u32(vreinterpretq_u32_u64((c)), 2);
- }
- if (x->left_available) {
- for (i = 0; i < 8; ++i) {
- average_u += uleft[0];
- uleft += left_stride;
- average_v += vleft[0];
- vleft += left_stride;
- }
- }
- shift += 2;
- expected_udc = (average_u + (1 << (shift - 1))) >> shift;
- expected_vdc = (average_v + (1 << (shift - 1))) >> shift;
- v_expected_udc = vmov_n_u8((uint8_t)expected_udc);
- v_expected_vdc = vmov_n_u8((uint8_t)expected_vdc);
- }
- for (i = 0; i < 8; ++i) {
- vst1_u8(upred_ptr, v_expected_udc);
- upred_ptr += pred_stride;
- vst1_u8(vpred_ptr, v_expected_vdc);
- vpred_ptr += pred_stride;
- }
- }
- break;
- case V_PRED:
- {
- const uint8x8_t v_uabove = vld1_u8(uabove_row);
- const uint8x8_t v_vabove = vld1_u8(vabove_row);
- for (i = 0; i < 8; ++i) {
- vst1_u8(upred_ptr, v_uabove);
- upred_ptr += pred_stride;
- vst1_u8(vpred_ptr, v_vabove);
- vpred_ptr += pred_stride;
- }
- }
- break;
- case H_PRED:
- {
- for (i = 0; i < 8; ++i) {
- const uint8x8_t v_uleft = vmov_n_u8((uint8_t)uleft[0]);
- const uint8x8_t v_vleft = vmov_n_u8((uint8_t)vleft[0]);
- uleft += left_stride;
- vleft += left_stride;
- vst1_u8(upred_ptr, v_uleft);
- upred_ptr += pred_stride;
- vst1_u8(vpred_ptr, v_vleft);
- vpred_ptr += pred_stride;
- }
- }
- break;
- case TM_PRED:
- {
- const uint16x8_t v_utop_left = vmovq_n_u16((int16_t)uabove_row[-1]);
- const uint16x8_t v_vtop_left = vmovq_n_u16((int16_t)vabove_row[-1]);
- const uint8x8_t v_uabove = vld1_u8(uabove_row);
- const uint8x8_t v_vabove = vld1_u8(vabove_row);
- for (i = 0; i < 8; ++i) {
- const uint8x8_t v_uleft = vmov_n_u8((int8_t)uleft[0]);
- const uint8x8_t v_vleft = vmov_n_u8((int8_t)vleft[0]);
- const uint16x8_t a_u = vaddl_u8(v_uabove, v_uleft);
- const uint16x8_t a_v = vaddl_u8(v_vabove, v_vleft);
- const int16x8_t b_u = vsubq_s16(vreinterpretq_s16_u16(a_u),
- vreinterpretq_s16_u16(v_utop_left));
- const int16x8_t b_v = vsubq_s16(vreinterpretq_s16_u16(a_v),
- vreinterpretq_s16_u16(v_vtop_left));
- const uint8x8_t pred_u = vqmovun_s16(b_u);
- const uint8x8_t pred_v = vqmovun_s16(b_v);
-
- vst1_u8(upred_ptr, pred_u);
- vst1_u8(vpred_ptr, pred_v);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- uleft += left_stride;
- vleft += left_stride;
- }
- }
- break;
- }
-}
diff --git a/vp8/common/mips/msa/reconintra_msa.c b/vp8/common/mips/msa/reconintra_msa.c
deleted file mode 100644
index 57f705d..0000000
--- a/vp8/common/mips/msa/reconintra_msa.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (c) 2015 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 "./vp8_rtcd.h"
-#include "vp8/common/blockd.h"
-#include "vp8/common/mips/msa/vp8_macros_msa.h"
-
-static void intra_predict_vert_8x8_msa(uint8_t *src, uint8_t *dst,
- int32_t dst_stride)
-{
- uint64_t out = LD(src);
-
- SD4(out, out, out, out, dst, dst_stride);
- dst += (4 * dst_stride);
- SD4(out, out, out, out, dst, dst_stride);
-}
-
-static void intra_predict_vert_16x16_msa(uint8_t *src, uint8_t *dst,
- int32_t dst_stride)
-{
- v16u8 out = LD_UB(src);
-
- ST_UB8(out, out, out, out, out, out, out, out, dst, dst_stride);
- dst += (8 * dst_stride);
- ST_UB8(out, out, out, out, out, out, out, out, dst, dst_stride);
-}
-
-static void intra_predict_horiz_8x8_msa(uint8_t *src, int32_t src_stride,
- uint8_t *dst, int32_t dst_stride)
-{
- uint64_t out0, out1, out2, out3, out4, out5, out6, out7;
-
- out0 = src[0 * src_stride] * 0x0101010101010101ull;
- out1 = src[1 * src_stride] * 0x0101010101010101ull;
- out2 = src[2 * src_stride] * 0x0101010101010101ull;
- out3 = src[3 * src_stride] * 0x0101010101010101ull;
- out4 = src[4 * src_stride] * 0x0101010101010101ull;
- out5 = src[5 * src_stride] * 0x0101010101010101ull;
- out6 = src[6 * src_stride] * 0x0101010101010101ull;
- out7 = src[7 * src_stride] * 0x0101010101010101ull;
-
- SD4(out0, out1, out2, out3, dst, dst_stride);
- dst += (4 * dst_stride);
- SD4(out4, out5, out6, out7, dst, dst_stride);
-}
-
-static void intra_predict_horiz_16x16_msa(uint8_t *src, int32_t src_stride,
- uint8_t *dst, int32_t dst_stride)
-{
- uint32_t row;
- uint8_t inp0, inp1, inp2, inp3;
- v16u8 src0, src1, src2, src3;
-
- for (row = 4; row--;)
- {
- inp0 = src[0];
- src += src_stride;
- inp1 = src[0];
- src += src_stride;
- inp2 = src[0];
- src += src_stride;
- inp3 = src[0];
- src += src_stride;
-
- src0 = (v16u8)__msa_fill_b(inp0);
- src1 = (v16u8)__msa_fill_b(inp1);
- src2 = (v16u8)__msa_fill_b(inp2);
- src3 = (v16u8)__msa_fill_b(inp3);
-
- ST_UB4(src0, src1, src2, src3, dst, dst_stride);
- dst += (4 * dst_stride);
- }
-}
-
-static void intra_predict_dc_8x8_msa(uint8_t *src_top, uint8_t *src_left,
- int32_t src_stride_left,
- uint8_t *dst, int32_t dst_stride,
- uint8_t is_above, uint8_t is_left)
-{
- uint32_t row, addition = 0;
- uint64_t out;
- v16u8 src_above, store;
- v8u16 sum_above;
- v4u32 sum_top;
- v2u64 sum;
-
- if (is_left && is_above)
- {
- src_above = LD_UB(src_top);
-
- sum_above = __msa_hadd_u_h(src_above, src_above);
- sum_top = __msa_hadd_u_w(sum_above, sum_above);
- sum = __msa_hadd_u_d(sum_top, sum_top);
- addition = __msa_copy_u_w((v4i32)sum, 0);
-
- for (row = 0; row < 8; ++row)
- {
- addition += src_left[row * src_stride_left];
- }
-
- addition = (addition + 8) >> 4;
- store = (v16u8)__msa_fill_b(addition);
- }
- else if (is_left)
- {
- for (row = 0; row < 8; ++row)
- {
- addition += src_left[row * src_stride_left];
- }
-
- addition = (addition + 4) >> 3;
- store = (v16u8)__msa_fill_b(addition);
- }
- else if (is_above)
- {
- src_above = LD_UB(src_top);
-
- sum_above = __msa_hadd_u_h(src_above, src_above);
- sum_top = __msa_hadd_u_w(sum_above, sum_above);
- sum = __msa_hadd_u_d(sum_top, sum_top);
- sum = (v2u64)__msa_srari_d((v2i64)sum, 3);
- store = (v16u8)__msa_splati_b((v16i8)sum, 0);
- }
- else
- {
- store = (v16u8)__msa_ldi_b(128);
- }
-
- out = __msa_copy_u_d((v2i64)store, 0);
-
- SD4(out, out, out, out, dst, dst_stride);
- dst += (4 * dst_stride);
- SD4(out, out, out, out, dst, dst_stride);
-}
-
-static void intra_predict_dc_16x16_msa(uint8_t *src_top, uint8_t *src_left,
- int32_t src_stride_left,
- uint8_t *dst, int32_t dst_stride,
- uint8_t is_above, uint8_t is_left)
-{
- uint32_t row;
- uint32_t addition = 0;
- v16u8 src_above, out;
- v8u16 sum_above;
- v4u32 sum_top;
- v2u64 sum;
-
- if (is_left && is_above)
- {
- src_above = LD_UB(src_top);
-
- sum_above = __msa_hadd_u_h(src_above, src_above);
- sum_top = __msa_hadd_u_w(sum_above, sum_above);
- sum = __msa_hadd_u_d(sum_top, sum_top);
- sum_top = (v4u32)__msa_pckev_w((v4i32)sum, (v4i32)sum);
- sum = __msa_hadd_u_d(sum_top, sum_top);
- addition = __msa_copy_u_w((v4i32)sum, 0);
-
- for (row = 0; row < 16; ++row)
- {
- addition += src_left[row * src_stride_left];
- }
-
- addition = (addition + 16) >> 5;
- out = (v16u8)__msa_fill_b(addition);
- }
- else if (is_left)
- {
- for (row = 0; row < 16; ++row)
- {
- addition += src_left[row * src_stride_left];
- }
-
- addition = (addition + 8) >> 4;
- out = (v16u8)__msa_fill_b(addition);
- }
- else if (is_above)
- {
- src_above = LD_UB(src_top);
-
- sum_above = __msa_hadd_u_h(src_above, src_above);
- sum_top = __msa_hadd_u_w(sum_above, sum_above);
- sum = __msa_hadd_u_d(sum_top, sum_top);
- sum_top = (v4u32)__msa_pckev_w((v4i32)sum, (v4i32)sum);
- sum = __msa_hadd_u_d(sum_top, sum_top);
- sum = (v2u64)__msa_srari_d((v2i64)sum, 4);
- out = (v16u8)__msa_splati_b((v16i8)sum, 0);
- }
- else
- {
- out = (v16u8)__msa_ldi_b(128);
- }
-
- ST_UB8(out, out, out, out, out, out, out, out, dst, dst_stride);
- dst += (8 * dst_stride);
- ST_UB8(out, out, out, out, out, out, out, out, dst, dst_stride);
-}
-
-void vp8_build_intra_predictors_mby_s_msa(struct macroblockd *x,
- unsigned char *yabove_row,
- unsigned char *yleft,
- int left_stride,
- unsigned char *ypred_ptr,
- int y_stride)
-{
- uint32_t row, col;
- uint8_t ytop_left = yabove_row[-1];
-
- switch (x->mode_info_context->mbmi.mode)
- {
- case DC_PRED:
- intra_predict_dc_16x16_msa(yabove_row, yleft, left_stride,
- ypred_ptr, y_stride,
- x->up_available, x->left_available);
- break;
-
- case V_PRED:
- intra_predict_vert_16x16_msa(yabove_row, ypred_ptr, y_stride);
- break;
-
- case H_PRED:
- intra_predict_horiz_16x16_msa(yleft, left_stride, ypred_ptr,
- y_stride);
- break;
-
- case TM_PRED:
- for (row = 0; row < 16; ++row)
- {
- for (col = 0; col < 16; ++col)
- {
- int pred = yleft[row * left_stride] + yabove_row[col] -
- ytop_left;
-
- if (pred < 0)
- pred = 0;
-
- if (pred > 255)
- pred = 255;
-
- ypred_ptr[col] = pred;
- }
-
- ypred_ptr += y_stride;
- }
- break;
-
- case B_PRED:
- case NEARESTMV:
- case NEARMV:
- case ZEROMV:
- case NEWMV:
- case SPLITMV:
- case MB_MODE_COUNT:
- break;
- }
-}
-
-void vp8_build_intra_predictors_mbuv_s_msa(struct macroblockd *x,
- unsigned char *uabove_row,
- unsigned char *vabove_row,
- unsigned char *uleft,
- unsigned char *vleft,
- int left_stride,
- unsigned char *upred_ptr,
- unsigned char *vpred_ptr,
- int pred_stride)
-{
- uint32_t row, col;
- uint8_t utop_left = uabove_row[-1];
- uint8_t vtop_left = vabove_row[-1];
-
- switch (x->mode_info_context->mbmi.uv_mode)
- {
- case DC_PRED:
- intra_predict_dc_8x8_msa(uabove_row, uleft, left_stride,
- upred_ptr, pred_stride,
- x->up_available, x->left_available);
- intra_predict_dc_8x8_msa(vabove_row, vleft, left_stride,
- vpred_ptr, pred_stride,
- x->up_available, x->left_available);
- break;
-
- case V_PRED:
- intra_predict_vert_8x8_msa(uabove_row, upred_ptr, pred_stride);
- intra_predict_vert_8x8_msa(vabove_row, vpred_ptr, pred_stride);
- break;
-
- case H_PRED:
- intra_predict_horiz_8x8_msa(uleft, left_stride, upred_ptr,
- pred_stride);
- intra_predict_horiz_8x8_msa(vleft, left_stride, vpred_ptr,
- pred_stride);
- break;
-
- case TM_PRED:
- for (row = 0; row < 8; ++row)
- {
- for (col = 0; col < 8; ++col)
- {
- int predu = uleft[row * left_stride] + uabove_row[col] -
- utop_left;
- int predv = vleft[row * left_stride] + vabove_row[col] -
- vtop_left;
-
- if (predu < 0)
- predu = 0;
-
- if (predu > 255)
- predu = 255;
-
- if (predv < 0)
- predv = 0;
-
- if (predv > 255)
- predv = 255;
-
- upred_ptr[col] = predu;
- vpred_ptr[col] = predv;
- }
-
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
- break;
-
- case B_PRED:
- case NEARESTMV:
- case NEARMV:
- case ZEROMV:
- case NEWMV:
- case SPLITMV:
- case MB_MODE_COUNT:
- break;
- }
-}
diff --git a/vp8/common/reconintra.c b/vp8/common/reconintra.c
index 0a6c51b..356655d 100644
--- a/vp8/common/reconintra.c
+++ b/vp8/common/reconintra.c
@@ -9,272 +9,109 @@
*/
-#include "vpx_config.h"
-#include "vp8_rtcd.h"
+#include "./vpx_config.h"
+#include "./vpx_dsp_rtcd.h"
+#include "./vp8_rtcd.h"
#include "vpx_mem/vpx_mem.h"
+#include "vpx_ports/vpx_once.h"
#include "blockd.h"
+#include "vp8/common/reconintra.h"
+#include "vp8/common/reconintra4x4.h"
-void vp8_build_intra_predictors_mby_s_c(MACROBLOCKD *x,
- unsigned char * yabove_row,
- unsigned char * yleft,
- int left_stride,
- unsigned char * ypred_ptr,
- int y_stride)
+enum {
+ SIZE_16,
+ SIZE_8,
+ NUM_SIZES,
+};
+
+typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride,
+ const uint8_t *above, const uint8_t *left);
+
+static intra_pred_fn pred[4][NUM_SIZES];
+static intra_pred_fn dc_pred[2][2][NUM_SIZES];
+
+static void vp8_init_intra_predictors_internal(void)
{
- unsigned char yleft_col[16];
- unsigned char ytop_left = yabove_row[-1];
- int r, c, i;
+#define INIT_SIZE(sz) \
+ pred[V_PRED][SIZE_##sz] = vpx_v_predictor_##sz##x##sz; \
+ pred[H_PRED][SIZE_##sz] = vpx_h_predictor_##sz##x##sz; \
+ pred[TM_PRED][SIZE_##sz] = vpx_tm_predictor_##sz##x##sz; \
+ \
+ dc_pred[0][0][SIZE_##sz] = vpx_dc_128_predictor_##sz##x##sz; \
+ dc_pred[0][1][SIZE_##sz] = vpx_dc_top_predictor_##sz##x##sz; \
+ dc_pred[1][0][SIZE_##sz] = vpx_dc_left_predictor_##sz##x##sz; \
+ dc_pred[1][1][SIZE_##sz] = vpx_dc_predictor_##sz##x##sz
+
+ INIT_SIZE(16);
+ INIT_SIZE(8);
+ vp8_init_intra4x4_predictors_internal();
+}
+
+void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x,
+ unsigned char * yabove_row,
+ unsigned char * yleft,
+ int left_stride,
+ unsigned char * ypred_ptr,
+ int y_stride)
+{
+ MB_PREDICTION_MODE mode = x->mode_info_context->mbmi.mode;
+ DECLARE_ALIGNED(16, uint8_t, yleft_col[16]);
+ int i;
+ intra_pred_fn fn;
for (i = 0; i < 16; i++)
{
yleft_col[i] = yleft[i* left_stride];
}
- /* for Y */
- switch (x->mode_info_context->mbmi.mode)
+ if (mode == DC_PRED)
{
- case DC_PRED:
+ fn = dc_pred[x->left_available][x->up_available][SIZE_16];
+ }
+ else
{
- int expected_dc;
- int shift;
- int average = 0;
-
-
- if (x->up_available || x->left_available)
- {
- if (x->up_available)
- {
- for (i = 0; i < 16; i++)
- {
- average += yabove_row[i];
- }
- }
-
- if (x->left_available)
- {
-
- for (i = 0; i < 16; i++)
- {
- average += yleft_col[i];
- }
-
- }
-
-
-
- shift = 3 + x->up_available + x->left_available;
- expected_dc = (average + (1 << (shift - 1))) >> shift;
- }
- else
- {
- expected_dc = 128;
- }
-
- /*memset(ypred_ptr, expected_dc, 256);*/
- for (r = 0; r < 16; r++)
- {
- memset(ypred_ptr, expected_dc, 16);
- ypred_ptr += y_stride;
- }
+ fn = pred[mode][SIZE_16];
}
- break;
- case V_PRED:
- {
- for (r = 0; r < 16; r++)
- {
-
- ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0];
- ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
- ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
- ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
- ypred_ptr += y_stride;
- }
- }
- break;
- case H_PRED:
- {
-
- for (r = 0; r < 16; r++)
- {
-
- memset(ypred_ptr, yleft_col[r], 16);
- ypred_ptr += y_stride;
- }
-
- }
- break;
- case TM_PRED:
- {
-
- for (r = 0; r < 16; r++)
- {
- for (c = 0; c < 16; c++)
- {
- int pred = yleft_col[r] + yabove_row[ c] - ytop_left;
-
- if (pred < 0)
- pred = 0;
-
- if (pred > 255)
- pred = 255;
-
- ypred_ptr[c] = pred;
- }
-
- ypred_ptr += y_stride;
- }
-
- }
- break;
- case B_PRED:
- case NEARESTMV:
- case NEARMV:
- case ZEROMV:
- case NEWMV:
- case SPLITMV:
- case MB_MODE_COUNT:
- break;
- }
+ fn(ypred_ptr, y_stride, yabove_row, yleft_col);
}
-void vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD *x,
- unsigned char * uabove_row,
- unsigned char * vabove_row,
- unsigned char * uleft,
- unsigned char * vleft,
- int left_stride,
- unsigned char * upred_ptr,
- unsigned char * vpred_ptr,
- int pred_stride)
+void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x,
+ unsigned char * uabove_row,
+ unsigned char * vabove_row,
+ unsigned char * uleft,
+ unsigned char * vleft,
+ int left_stride,
+ unsigned char * upred_ptr,
+ unsigned char * vpred_ptr,
+ int pred_stride)
{
+ MB_PREDICTION_MODE uvmode = x->mode_info_context->mbmi.uv_mode;
unsigned char uleft_col[8];
- unsigned char utop_left = uabove_row[-1];
unsigned char vleft_col[8];
- unsigned char vtop_left = vabove_row[-1];
-
- int i, j;
+ int i;
+ intra_pred_fn fn;
for (i = 0; i < 8; i++)
{
- uleft_col[i] = uleft [i* left_stride];
- vleft_col[i] = vleft [i* left_stride];
+ uleft_col[i] = uleft[i * left_stride];
+ vleft_col[i] = vleft[i * left_stride];
}
- switch (x->mode_info_context->mbmi.uv_mode)
+ if (uvmode == DC_PRED)
{
- case DC_PRED:
+ fn = dc_pred[x->left_available][x->up_available][SIZE_8];
+ }
+ else
{
- int expected_udc;
- int expected_vdc;
- int shift;
- int Uaverage = 0;
- int Vaverage = 0;
-
- if (x->up_available)
- {
- for (i = 0; i < 8; i++)
- {
- Uaverage += uabove_row[i];
- Vaverage += vabove_row[i];
- }
- }
-
- if (x->left_available)
- {
- for (i = 0; i < 8; i++)
- {
- Uaverage += uleft_col[i];
- Vaverage += vleft_col[i];
- }
- }
-
- if (!x->up_available && !x->left_available)
- {
- expected_udc = 128;
- expected_vdc = 128;
- }
- else
- {
- shift = 2 + x->up_available + x->left_available;
- expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
- expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
- }
-
-
- /*memset(upred_ptr,expected_udc,64);*/
- /*memset(vpred_ptr,expected_vdc,64);*/
- for (i = 0; i < 8; i++)
- {
- memset(upred_ptr, expected_udc, 8);
- memset(vpred_ptr, expected_vdc, 8);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
- }
- break;
- case V_PRED:
- {
- for (i = 0; i < 8; i++)
- {
- memcpy(upred_ptr, uabove_row, 8);
- memcpy(vpred_ptr, vabove_row, 8);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
-
- }
- break;
- case H_PRED:
- {
- for (i = 0; i < 8; i++)
- {
- memset(upred_ptr, uleft_col[i], 8);
- memset(vpred_ptr, vleft_col[i], 8);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
+ fn = pred[uvmode][SIZE_8];
}
- break;
- case TM_PRED:
- {
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 8; j++)
- {
- int predu = uleft_col[i] + uabove_row[j] - utop_left;
- int predv = vleft_col[i] + vabove_row[j] - vtop_left;
+ fn(upred_ptr, pred_stride, uabove_row, uleft_col);
+ fn(vpred_ptr, pred_stride, vabove_row, vleft_col);
+}
- if (predu < 0)
- predu = 0;
-
- if (predu > 255)
- predu = 255;
-
- if (predv < 0)
- predv = 0;
-
- if (predv > 255)
- predv = 255;
-
- upred_ptr[j] = predu;
- vpred_ptr[j] = predv;
- }
-
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
-
- }
- break;
- case B_PRED:
- case NEARESTMV:
- case NEARMV:
- case ZEROMV:
- case NEWMV:
- case SPLITMV:
- case MB_MODE_COUNT:
- break;
- }
+void vp8_init_intra_predictors(void)
+{
+ once(vp8_init_intra_predictors_internal);
}
diff --git a/vp8/common/reconintra.h b/vp8/common/reconintra.h
new file mode 100644
index 0000000..b6225a6
--- /dev/null
+++ b/vp8/common/reconintra.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2010 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.
+ */
+
+
+#ifndef VP8_COMMON_RECONINTRA_H_
+#define VP8_COMMON_RECONINTRA_H_
+
+#include "vp8/common/blockd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x,
+ unsigned char *yabove_row,
+ unsigned char *yleft,
+ int left_stride,
+ unsigned char *ypred_ptr,
+ int y_stride);
+
+void vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x,
+ unsigned char * uabove_row,
+ unsigned char * vabove_row,
+ unsigned char * uleft,
+ unsigned char * vleft,
+ int left_stride,
+ unsigned char * upred_ptr,
+ unsigned char * vpred_ptr,
+ int pred_stride);
+
+void vp8_init_intra_predictors(void);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // VP8_COMMON_RECONINTRA_H_
diff --git a/vp8/common/reconintra4x4.c b/vp8/common/reconintra4x4.c
index 3d4f2c4..2a50e59 100644
--- a/vp8/common/reconintra4x4.c
+++ b/vp8/common/reconintra4x4.c
@@ -8,290 +8,47 @@
* be found in the AUTHORS file in the root of the source tree.
*/
+#include <string.h>
#include "vpx_config.h"
+#include "./vpx_dsp_rtcd.h"
#include "vp8_rtcd.h"
#include "blockd.h"
-void vp8_intra4x4_predict_c(unsigned char *Above,
- unsigned char *yleft, int left_stride,
- int _b_mode,
- unsigned char *dst, int dst_stride,
- unsigned char top_left)
+typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride,
+ const uint8_t *above, const uint8_t *left);
+
+static intra_pred_fn pred[10];
+
+void vp8_init_intra4x4_predictors_internal(void)
{
- int i, r, c;
- B_PREDICTION_MODE b_mode = (B_PREDICTION_MODE)_b_mode;
+ pred[B_DC_PRED] = vpx_dc_predictor_4x4;
+ pred[B_TM_PRED] = vpx_tm_predictor_4x4;
+ pred[B_VE_PRED] = vpx_ve_predictor_4x4;
+ pred[B_HE_PRED] = vpx_he_predictor_4x4;
+ pred[B_LD_PRED] = vpx_d45e_predictor_4x4;
+ pred[B_RD_PRED] = vpx_d135_predictor_4x4;
+ pred[B_VR_PRED] = vpx_d117_predictor_4x4;
+ pred[B_VL_PRED] = vpx_d63e_predictor_4x4;
+ pred[B_HD_PRED] = vpx_d153_predictor_4x4;
+ pred[B_HU_PRED] = vpx_d207_predictor_4x4;
+}
+
+void vp8_intra4x4_predict(unsigned char *above,
+ unsigned char *yleft, int left_stride,
+ B_PREDICTION_MODE b_mode,
+ unsigned char *dst, int dst_stride,
+ unsigned char top_left)
+{
unsigned char Left[4];
+ unsigned char Aboveb[12], *Above = Aboveb + 4;
+
Left[0] = yleft[0];
Left[1] = yleft[left_stride];
Left[2] = yleft[2 * left_stride];
Left[3] = yleft[3 * left_stride];
+ memcpy(Above, above, 8);
+ Above[-1] = top_left;
- switch (b_mode)
- {
- case B_DC_PRED:
- {
- int expected_dc = 0;
-
- for (i = 0; i < 4; i++)
- {
- expected_dc += Above[i];
- expected_dc += Left[i];
- }
-
- expected_dc = (expected_dc + 4) >> 3;
-
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- dst[c] = expected_dc;
- }
-
- dst += dst_stride;
- }
- }
- break;
- case B_TM_PRED:
- {
- /* prediction similar to true_motion prediction */
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- int pred = Above[c] - top_left + Left[r];
-
- if (pred < 0)
- pred = 0;
-
- if (pred > 255)
- pred = 255;
-
- dst[c] = pred;
- }
-
- dst += dst_stride;
- }
- }
- break;
-
- case B_VE_PRED:
- {
-
- unsigned int ap[4];
- ap[0] = (top_left + 2 * Above[0] + Above[1] + 2) >> 2;
- ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2;
- ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2;
- ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2;
-
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
-
- dst[c] = ap[c];
- }
-
- dst += dst_stride;
- }
-
- }
- break;
-
-
- case B_HE_PRED:
- {
-
- unsigned int lp[4];
- lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2;
- lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2;
- lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2;
- lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2;
-
- for (r = 0; r < 4; r++)
- {
- for (c = 0; c < 4; c++)
- {
- dst[c] = lp[r];
- }
-
- dst += dst_stride;
- }
- }
- break;
- case B_LD_PRED:
- {
- unsigned char *ptr = Above;
- dst[0 * dst_stride + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2;
- dst[0 * dst_stride + 1] =
- dst[1 * dst_stride + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2;
- dst[0 * dst_stride + 2] =
- dst[1 * dst_stride + 1] =
- dst[2 * dst_stride + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2;
- dst[0 * dst_stride + 3] =
- dst[1 * dst_stride + 2] =
- dst[2 * dst_stride + 1] =
- dst[3 * dst_stride + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2;
- dst[1 * dst_stride + 3] =
- dst[2 * dst_stride + 2] =
- dst[3 * dst_stride + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2;
- dst[2 * dst_stride + 3] =
- dst[3 * dst_stride + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2;
- dst[3 * dst_stride + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2;
-
- }
- break;
- case B_RD_PRED:
- {
-
- unsigned char pp[9];
-
- pp[0] = Left[3];
- pp[1] = Left[2];
- pp[2] = Left[1];
- pp[3] = Left[0];
- pp[4] = top_left;
- pp[5] = Above[0];
- pp[6] = Above[1];
- pp[7] = Above[2];
- pp[8] = Above[3];
-
- dst[3 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
- dst[3 * dst_stride + 1] =
- dst[2 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
- dst[3 * dst_stride + 2] =
- dst[2 * dst_stride + 1] =
- dst[1 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
- dst[3 * dst_stride + 3] =
- dst[2 * dst_stride + 2] =
- dst[1 * dst_stride + 1] =
- dst[0 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
- dst[2 * dst_stride + 3] =
- dst[1 * dst_stride + 2] =
- dst[0 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
- dst[1 * dst_stride + 3] =
- dst[0 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
- dst[0 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
-
- }
- break;
- case B_VR_PRED:
- {
-
- unsigned char pp[9];
-
- pp[0] = Left[3];
- pp[1] = Left[2];
- pp[2] = Left[1];
- pp[3] = Left[0];
- pp[4] = top_left;
- pp[5] = Above[0];
- pp[6] = Above[1];
- pp[7] = Above[2];
- pp[8] = Above[3];
-
-
- dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
- dst[2 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
- dst[3 * dst_stride + 1] =
- dst[1 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
- dst[2 * dst_stride + 1] =
- dst[0 * dst_stride + 0] = (pp[4] + pp[5] + 1) >> 1;
- dst[3 * dst_stride + 2] =
- dst[1 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
- dst[2 * dst_stride + 2] =
- dst[0 * dst_stride + 1] = (pp[5] + pp[6] + 1) >> 1;
- dst[3 * dst_stride + 3] =
- dst[1 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
- dst[2 * dst_stride + 3] =
- dst[0 * dst_stride + 2] = (pp[6] + pp[7] + 1) >> 1;
- dst[1 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
- dst[0 * dst_stride + 3] = (pp[7] + pp[8] + 1) >> 1;
-
- }
- break;
- case B_VL_PRED:
- {
-
- unsigned char *pp = Above;
-
- dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
- dst[1 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
- dst[2 * dst_stride + 0] =
- dst[0 * dst_stride + 1] = (pp[1] + pp[2] + 1) >> 1;
- dst[1 * dst_stride + 1] =
- dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
- dst[2 * dst_stride + 1] =
- dst[0 * dst_stride + 2] = (pp[2] + pp[3] + 1) >> 1;
- dst[3 * dst_stride + 1] =
- dst[1 * dst_stride + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
- dst[0 * dst_stride + 3] =
- dst[2 * dst_stride + 2] = (pp[3] + pp[4] + 1) >> 1;
- dst[1 * dst_stride + 3] =
- dst[3 * dst_stride + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
- dst[2 * dst_stride + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
- dst[3 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
- }
- break;
-
- case B_HD_PRED:
- {
- unsigned char pp[9];
- pp[0] = Left[3];
- pp[1] = Left[2];
- pp[2] = Left[1];
- pp[3] = Left[0];
- pp[4] = top_left;
- pp[5] = Above[0];
- pp[6] = Above[1];
- pp[7] = Above[2];
- pp[8] = Above[3];
-
-
- dst[3 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
- dst[3 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
- dst[2 * dst_stride + 0] =
- dst[3 * dst_stride + 2] = (pp[1] + pp[2] + 1) >> 1;
- dst[2 * dst_stride + 1] =
- dst[3 * dst_stride + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
- dst[2 * dst_stride + 2] =
- dst[1 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
- dst[2 * dst_stride + 3] =
- dst[1 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
- dst[1 * dst_stride + 2] =
- dst[0 * dst_stride + 0] = (pp[3] + pp[4] + 1) >> 1;
- dst[1 * dst_stride + 3] =
- dst[0 * dst_stride + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
- dst[0 * dst_stride + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
- dst[0 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
- }
- break;
-
-
- case B_HU_PRED:
- {
- unsigned char *pp = Left;
- dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
- dst[0 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
- dst[0 * dst_stride + 2] =
- dst[1 * dst_stride + 0] = (pp[1] + pp[2] + 1) >> 1;
- dst[0 * dst_stride + 3] =
- dst[1 * dst_stride + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
- dst[1 * dst_stride + 2] =
- dst[2 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
- dst[1 * dst_stride + 3] =
- dst[2 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2;
- dst[2 * dst_stride + 2] =
- dst[2 * dst_stride + 3] =
- dst[3 * dst_stride + 0] =
- dst[3 * dst_stride + 1] =
- dst[3 * dst_stride + 2] =
- dst[3 * dst_stride + 3] = pp[3];
- }
- break;
-
- default:
- break;
-
- }
+ pred[b_mode](dst, dst_stride, Above, Left);
}
diff --git a/vp8/common/reconintra4x4.h b/vp8/common/reconintra4x4.h
index ed59c9e..869841e 100644
--- a/vp8/common/reconintra4x4.h
+++ b/vp8/common/reconintra4x4.h
@@ -18,7 +18,7 @@
#endif
static void intra_prediction_down_copy(MACROBLOCKD *xd,
- unsigned char *above_right_src)
+ unsigned char *above_right_src)
{
int dst_stride = xd->dst.y_stride;
unsigned char *above_right_dst = xd->dst.y_buffer - dst_stride + 16;
@@ -33,6 +33,14 @@
*dst_ptr2 = *src_ptr;
}
+void vp8_intra4x4_predict(unsigned char *Above,
+ unsigned char *yleft, int left_stride,
+ B_PREDICTION_MODE b_mode,
+ unsigned char *dst, int dst_stride,
+ unsigned char top_left);
+
+void vp8_init_intra4x4_predictors_internal(void);
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/vp8/common/rtcd_defs.pl b/vp8/common/rtcd_defs.pl
index 7924ae7..6799c27 100644
--- a/vp8/common/rtcd_defs.pl
+++ b/vp8/common/rtcd_defs.pl
@@ -152,16 +152,6 @@
$vp8_copy_mem8x4_media=vp8_copy_mem8x4_v6;
$vp8_copy_mem8x4_dspr2=vp8_copy_mem8x4_dspr2;
-add_proto qw/void vp8_build_intra_predictors_mby_s/, "struct macroblockd *x, unsigned char * yabove_row, unsigned char * yleft, int left_stride, unsigned char * ypred_ptr, int y_stride";
-specialize qw/vp8_build_intra_predictors_mby_s sse2 ssse3 neon msa/;
-
-add_proto qw/void vp8_build_intra_predictors_mbuv_s/, "struct macroblockd *x, unsigned char * uabove_row, unsigned char * vabove_row, unsigned char *uleft, unsigned char *vleft, int left_stride, unsigned char * upred_ptr, unsigned char * vpred_ptr, int pred_stride";
-specialize qw/vp8_build_intra_predictors_mbuv_s sse2 ssse3 neon msa/;
-
-add_proto qw/void vp8_intra4x4_predict/, "unsigned char *Above, unsigned char *yleft, int left_stride, int b_mode, unsigned char *dst, int dst_stride, unsigned char top_left";
-specialize qw/vp8_intra4x4_predict media/;
-$vp8_intra4x4_predict_media=vp8_intra4x4_predict_armv6;
-
#
# Postproc
#
diff --git a/vp8/common/x86/recon_sse2.asm b/vp8/common/x86/recon_sse2.asm
index 7141f83..cb89537 100644
--- a/vp8/common/x86/recon_sse2.asm
+++ b/vp8/common/x86/recon_sse2.asm
@@ -114,1002 +114,3 @@
UNSHADOW_ARGS
pop rbp
ret
-
-
-;void vp8_intra_pred_uv_dc_mmx2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-global sym(vp8_intra_pred_uv_dc_mmx2) PRIVATE
-sym(vp8_intra_pred_uv_dc_mmx2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- ; end prolog
-
- ; from top
- mov rdi, arg(2) ;above;
- mov rsi, arg(3) ;left;
- movsxd rax, dword ptr arg(4) ;left_stride;
- pxor mm0, mm0
- movq mm1, [rdi]
- lea rdi, [rax*3]
- psadbw mm1, mm0
- ; from left
- movzx ecx, byte [rsi]
- movzx edx, byte [rsi+rax*1]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
-
- movzx edx, byte [rsi+rdi]
- lea rsi, [rsi+rax*4]
- add ecx, edx
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
-
- ; add up
- pextrw edx, mm1, 0x0
- lea edx, [edx+ecx+8]
- sar edx, 4
- movd mm1, edx
- movsxd rcx, dword ptr arg(1) ;dst_stride
- pshufw mm1, mm1, 0x0
- mov rdi, arg(0) ;dst;
- packuswb mm1, mm1
-
- ; write out
- lea rax, [rcx*3]
- lea rdx, [rdi+rcx*4]
-
- movq [rdi ], mm1
- movq [rdi+rcx ], mm1
- movq [rdi+rcx*2], mm1
- movq [rdi+rax ], mm1
- movq [rdx ], mm1
- movq [rdx+rcx ], mm1
- movq [rdx+rcx*2], mm1
- movq [rdx+rax ], mm1
-
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_uv_dctop_mmx2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-global sym(vp8_intra_pred_uv_dctop_mmx2) PRIVATE
-sym(vp8_intra_pred_uv_dctop_mmx2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- GET_GOT rbx
- push rsi
- push rdi
- ; end prolog
-
- ;arg(3), arg(4) not used
-
- ; from top
- mov rsi, arg(2) ;above;
- pxor mm0, mm0
- movq mm1, [rsi]
- psadbw mm1, mm0
-
- ; add up
- paddw mm1, [GLOBAL(dc_4)]
- psraw mm1, 3
- pshufw mm1, mm1, 0x0
- packuswb mm1, mm1
-
- ; write out
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
- lea rax, [rcx*3]
-
- movq [rdi ], mm1
- movq [rdi+rcx ], mm1
- movq [rdi+rcx*2], mm1
- movq [rdi+rax ], mm1
- lea rdi, [rdi+rcx*4]
- movq [rdi ], mm1
- movq [rdi+rcx ], mm1
- movq [rdi+rcx*2], mm1
- movq [rdi+rax ], mm1
-
- ; begin epilog
- pop rdi
- pop rsi
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_uv_dcleft_mmx2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-global sym(vp8_intra_pred_uv_dcleft_mmx2) PRIVATE
-sym(vp8_intra_pred_uv_dcleft_mmx2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- ; end prolog
-
- ;arg(2) not used
-
- ; from left
- mov rsi, arg(3) ;left;
- movsxd rax, dword ptr arg(4) ;left_stride;
- lea rdi, [rax*3]
- movzx ecx, byte [rsi]
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- lea edx, [ecx+edx+4]
-
- ; add up
- shr edx, 3
- movd mm1, edx
- pshufw mm1, mm1, 0x0
- packuswb mm1, mm1
-
- ; write out
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
- lea rax, [rcx*3]
-
- movq [rdi ], mm1
- movq [rdi+rcx ], mm1
- movq [rdi+rcx*2], mm1
- movq [rdi+rax ], mm1
- lea rdi, [rdi+rcx*4]
- movq [rdi ], mm1
- movq [rdi+rcx ], mm1
- movq [rdi+rcx*2], mm1
- movq [rdi+rax ], mm1
-
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_uv_dc128_mmx(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-global sym(vp8_intra_pred_uv_dc128_mmx) PRIVATE
-sym(vp8_intra_pred_uv_dc128_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- GET_GOT rbx
- ; end prolog
-
- ;arg(2), arg(3), arg(4) not used
-
- ; write out
- movq mm1, [GLOBAL(dc_128)]
- mov rax, arg(0) ;dst;
- movsxd rdx, dword ptr arg(1) ;dst_stride
- lea rcx, [rdx*3]
-
- movq [rax ], mm1
- movq [rax+rdx ], mm1
- movq [rax+rdx*2], mm1
- movq [rax+rcx ], mm1
- lea rax, [rax+rdx*4]
- movq [rax ], mm1
- movq [rax+rdx ], mm1
- movq [rax+rdx*2], mm1
- movq [rax+rcx ], mm1
-
- ; begin epilog
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_uv_tm_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-%macro vp8_intra_pred_uv_tm 1
-global sym(vp8_intra_pred_uv_tm_%1) PRIVATE
-sym(vp8_intra_pred_uv_tm_%1):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- GET_GOT rbx
- push rsi
- push rdi
- push rbx
- ; end prolog
-
- ; read top row
- mov edx, 4
- mov rsi, arg(2) ;above
- movsxd rax, dword ptr arg(4) ;left_stride;
- pxor xmm0, xmm0
-%ifidn %1, ssse3
- movdqa xmm2, [GLOBAL(dc_1024)]
-%endif
- movq xmm1, [rsi]
- punpcklbw xmm1, xmm0
-
- ; set up left ptrs ans subtract topleft
- movd xmm3, [rsi-1]
- mov rsi, arg(3) ;left;
-%ifidn %1, sse2
- punpcklbw xmm3, xmm0
- pshuflw xmm3, xmm3, 0x0
- punpcklqdq xmm3, xmm3
-%else
- pshufb xmm3, xmm2
-%endif
- psubw xmm1, xmm3
-
- ; set up dest ptrs
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
-
-.vp8_intra_pred_uv_tm_%1_loop:
- mov bl, [rsi]
- movd xmm3, ebx
-
- mov bl, [rsi+rax]
- movd xmm5, ebx
-%ifidn %1, sse2
- punpcklbw xmm3, xmm0
- punpcklbw xmm5, xmm0
- pshuflw xmm3, xmm3, 0x0
- pshuflw xmm5, xmm5, 0x0
- punpcklqdq xmm3, xmm3
- punpcklqdq xmm5, xmm5
-%else
- pshufb xmm3, xmm2
- pshufb xmm5, xmm2
-%endif
- paddw xmm3, xmm1
- paddw xmm5, xmm1
- packuswb xmm3, xmm5
- movq [rdi ], xmm3
- movhps[rdi+rcx], xmm3
- lea rsi, [rsi+rax*2]
- lea rdi, [rdi+rcx*2]
- dec edx
- jnz .vp8_intra_pred_uv_tm_%1_loop
-
- ; begin epilog
- pop rbx
- pop rdi
- pop rsi
- RESTORE_GOT
- UNSHADOW_ARGS
- pop rbp
- ret
-%endmacro
-
-vp8_intra_pred_uv_tm sse2
-vp8_intra_pred_uv_tm ssse3
-
-;void vp8_intra_pred_uv_ve_mmx(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-global sym(vp8_intra_pred_uv_ve_mmx) PRIVATE
-sym(vp8_intra_pred_uv_ve_mmx):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- ; end prolog
-
- ; arg(3), arg(4) not used
-
- ; read from top
- mov rax, arg(2) ;src;
-
- movq mm1, [rax]
-
- ; write out
- mov rax, arg(0) ;dst;
- movsxd rdx, dword ptr arg(1) ;dst_stride
- lea rcx, [rdx*3]
-
- movq [rax ], mm1
- movq [rax+rdx ], mm1
- movq [rax+rdx*2], mm1
- movq [rax+rcx ], mm1
- lea rax, [rax+rdx*4]
- movq [rax ], mm1
- movq [rax+rdx ], mm1
- movq [rax+rdx*2], mm1
- movq [rax+rcx ], mm1
-
- ; begin epilog
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_uv_ho_mmx2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-%macro vp8_intra_pred_uv_ho 1
-global sym(vp8_intra_pred_uv_ho_%1) PRIVATE
-sym(vp8_intra_pred_uv_ho_%1):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- push rbx
-%ifidn %1, ssse3
- GET_GOT rbx
-%endif
- ; end prolog
-
- ;arg(2) not used
-
- ; read from left and write out
-%ifidn %1, mmx2
- mov edx, 4
-%endif
- mov rsi, arg(3) ;left
- movsxd rax, dword ptr arg(4) ;left_stride;
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
-%ifidn %1, ssse3
- lea rdx, [rcx*3]
- movdqa xmm2, [GLOBAL(dc_00001111)]
-%endif
-
-%ifidn %1, mmx2
-.vp8_intra_pred_uv_ho_%1_loop:
- mov bl, [rsi]
- movd mm0, ebx
-
- mov bl, [rsi+rax]
- movd mm1, ebx
-
- punpcklbw mm0, mm0
- punpcklbw mm1, mm1
- pshufw mm0, mm0, 0x0
- pshufw mm1, mm1, 0x0
- movq [rdi ], mm0
- movq [rdi+rcx], mm1
- lea rsi, [rsi+rax*2]
- lea rdi, [rdi+rcx*2]
- dec edx
- jnz .vp8_intra_pred_uv_ho_%1_loop
-%else
- mov bl, [rsi]
- movd xmm0, ebx
-
- mov bl, [rsi+rax]
- movd xmm3, ebx
-
- mov bl, [rsi+rax*2]
- movd xmm1, ebx
-
- lea rbx, [rax*3]
- mov bl, [rsi+rbx]
- movd xmm4, ebx
-
- punpcklbw xmm0, xmm3
- punpcklbw xmm1, xmm4
- pshufb xmm0, xmm2
- pshufb xmm1, xmm2
- movq [rdi ], xmm0
- movhps [rdi+rcx], xmm0
- movq [rdi+rcx*2], xmm1
- movhps [rdi+rdx], xmm1
- lea rsi, [rsi+rax*4]
- lea rdi, [rdi+rcx*4]
-
- mov bl, [rsi]
- movd xmm0, ebx
-
- mov bl, [rsi+rax]
- movd xmm3, ebx
-
- mov bl, [rsi+rax*2]
- movd xmm1, ebx
-
- lea rbx, [rax*3]
- mov bl, [rsi+rbx]
- movd xmm4, ebx
-
- punpcklbw xmm0, xmm3
- punpcklbw xmm1, xmm4
- pshufb xmm0, xmm2
- pshufb xmm1, xmm2
- movq [rdi ], xmm0
- movhps [rdi+rcx], xmm0
- movq [rdi+rcx*2], xmm1
- movhps [rdi+rdx], xmm1
-%endif
-
- ; begin epilog
-%ifidn %1, ssse3
- RESTORE_GOT
-%endif
- pop rbx
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-%endmacro
-
-vp8_intra_pred_uv_ho mmx2
-vp8_intra_pred_uv_ho ssse3
-
-;void vp8_intra_pred_y_dc_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-global sym(vp8_intra_pred_y_dc_sse2) PRIVATE
-sym(vp8_intra_pred_y_dc_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- ; end prolog
-
- ; from top
- mov rdi, arg(2) ;above
- mov rsi, arg(3) ;left
- movsxd rax, dword ptr arg(4) ;left_stride;
-
- pxor xmm0, xmm0
- movdqa xmm1, [rdi]
- psadbw xmm1, xmm0
- movq xmm2, xmm1
- punpckhqdq xmm1, xmm1
- paddw xmm1, xmm2
-
- ; from left
- lea rdi, [rax*3]
-
- movzx ecx, byte [rsi]
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
-
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
-
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
-
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
-
- ; add up
- pextrw edx, xmm1, 0x0
- lea edx, [edx+ecx+16]
- sar edx, 5
- movd xmm1, edx
- ; FIXME use pshufb for ssse3 version
- pshuflw xmm1, xmm1, 0x0
- punpcklqdq xmm1, xmm1
- packuswb xmm1, xmm1
-
- ; write out
- mov rsi, 2
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
- lea rax, [rcx*3]
-
-.label
- movdqa [rdi ], xmm1
- movdqa [rdi+rcx ], xmm1
- movdqa [rdi+rcx*2], xmm1
- movdqa [rdi+rax ], xmm1
- lea rdi, [rdi+rcx*4]
- movdqa [rdi ], xmm1
- movdqa [rdi+rcx ], xmm1
- movdqa [rdi+rcx*2], xmm1
- movdqa [rdi+rax ], xmm1
- lea rdi, [rdi+rcx*4]
- dec rsi
- jnz .label
-
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_y_dctop_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-global sym(vp8_intra_pred_y_dctop_sse2) PRIVATE
-sym(vp8_intra_pred_y_dctop_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- GET_GOT rbx
- ; end prolog
-
- ;arg(3), arg(4) not used
-
- ; from top
- mov rcx, arg(2) ;above;
- pxor xmm0, xmm0
- movdqa xmm1, [rcx]
- psadbw xmm1, xmm0
- movdqa xmm2, xmm1
- punpckhqdq xmm1, xmm1
- paddw xmm1, xmm2
-
- ; add up
- paddw xmm1, [GLOBAL(dc_8)]
- psraw xmm1, 4
- ; FIXME use pshufb for ssse3 version
- pshuflw xmm1, xmm1, 0x0
- punpcklqdq xmm1, xmm1
- packuswb xmm1, xmm1
-
- ; write out
- mov rsi, 2
- mov rdx, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
- lea rax, [rcx*3]
-
-.label
- movdqa [rdx ], xmm1
- movdqa [rdx+rcx ], xmm1
- movdqa [rdx+rcx*2], xmm1
- movdqa [rdx+rax ], xmm1
- lea rdx, [rdx+rcx*4]
- movdqa [rdx ], xmm1
- movdqa [rdx+rcx ], xmm1
- movdqa [rdx+rcx*2], xmm1
- movdqa [rdx+rax ], xmm1
- lea rdx, [rdx+rcx*4]
- dec rsi
- jnz .label
-
- ; begin epilog
- RESTORE_GOT
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_y_dcleft_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-global sym(vp8_intra_pred_y_dcleft_sse2) PRIVATE
-sym(vp8_intra_pred_y_dcleft_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- ; end prolog
-
- ;arg(2) not used
-
- ; from left
- mov rsi, arg(3) ;left;
- movsxd rax, dword ptr arg(4) ;left_stride;
-
- lea rdi, [rax*3]
- movzx ecx, byte [rsi]
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- add ecx, edx
- lea rsi, [rsi+rax*4]
- movzx edx, byte [rsi]
- add ecx, edx
- movzx edx, byte [rsi+rax]
- add ecx, edx
- movzx edx, byte [rsi+rax*2]
- add ecx, edx
- movzx edx, byte [rsi+rdi]
- lea edx, [ecx+edx+8]
-
- ; add up
- shr edx, 4
- movd xmm1, edx
- ; FIXME use pshufb for ssse3 version
- pshuflw xmm1, xmm1, 0x0
- punpcklqdq xmm1, xmm1
- packuswb xmm1, xmm1
-
- ; write out
- mov rsi, 2
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
- lea rax, [rcx*3]
-
-.label
- movdqa [rdi ], xmm1
- movdqa [rdi+rcx ], xmm1
- movdqa [rdi+rcx*2], xmm1
- movdqa [rdi+rax ], xmm1
- lea rdi, [rdi+rcx*4]
- movdqa [rdi ], xmm1
- movdqa [rdi+rcx ], xmm1
- movdqa [rdi+rcx*2], xmm1
- movdqa [rdi+rax ], xmm1
- lea rdi, [rdi+rcx*4]
- dec rsi
- jnz .label
-
- ; begin epilog
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_y_dc128_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-global sym(vp8_intra_pred_y_dc128_sse2) PRIVATE
-sym(vp8_intra_pred_y_dc128_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- GET_GOT rbx
- ; end prolog
-
- ;arg(2), arg(3), arg(4) not used
-
- ; write out
- mov rsi, 2
- movdqa xmm1, [GLOBAL(dc_128)]
- mov rax, arg(0) ;dst;
- movsxd rdx, dword ptr arg(1) ;dst_stride
- lea rcx, [rdx*3]
-
-.label
- movdqa [rax ], xmm1
- movdqa [rax+rdx ], xmm1
- movdqa [rax+rdx*2], xmm1
- movdqa [rax+rcx ], xmm1
- lea rax, [rax+rdx*4]
- movdqa [rax ], xmm1
- movdqa [rax+rdx ], xmm1
- movdqa [rax+rdx*2], xmm1
- movdqa [rax+rcx ], xmm1
- lea rax, [rax+rdx*4]
- dec rsi
- jnz .label
-
- ; begin epilog
- RESTORE_GOT
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_y_tm_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-%macro vp8_intra_pred_y_tm 1
-global sym(vp8_intra_pred_y_tm_%1) PRIVATE
-sym(vp8_intra_pred_y_tm_%1):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- SAVE_XMM 7
- push rsi
- push rdi
- push rbx
- GET_GOT rbx
- ; end prolog
-
- ; read top row
- mov edx, 8
- mov rsi, arg(2) ;above
- movsxd rax, dword ptr arg(4) ;left_stride;
- pxor xmm0, xmm0
-%ifidn %1, ssse3
- movdqa xmm3, [GLOBAL(dc_1024)]
-%endif
- movdqa xmm1, [rsi]
- movdqa xmm2, xmm1
- punpcklbw xmm1, xmm0
- punpckhbw xmm2, xmm0
-
- ; set up left ptrs ans subtract topleft
- movd xmm4, [rsi-1]
- mov rsi, arg(3) ;left
-%ifidn %1, sse2
- punpcklbw xmm4, xmm0
- pshuflw xmm4, xmm4, 0x0
- punpcklqdq xmm4, xmm4
-%else
- pshufb xmm4, xmm3
-%endif
- psubw xmm1, xmm4
- psubw xmm2, xmm4
-
- ; set up dest ptrs
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
-vp8_intra_pred_y_tm_%1_loop:
- mov bl, [rsi]
- movd xmm4, ebx
-
- mov bl, [rsi+rax]
- movd xmm5, ebx
-%ifidn %1, sse2
- punpcklbw xmm4, xmm0
- punpcklbw xmm5, xmm0
- pshuflw xmm4, xmm4, 0x0
- pshuflw xmm5, xmm5, 0x0
- punpcklqdq xmm4, xmm4
- punpcklqdq xmm5, xmm5
-%else
- pshufb xmm4, xmm3
- pshufb xmm5, xmm3
-%endif
- movdqa xmm6, xmm4
- movdqa xmm7, xmm5
- paddw xmm4, xmm1
- paddw xmm6, xmm2
- paddw xmm5, xmm1
- paddw xmm7, xmm2
- packuswb xmm4, xmm6
- packuswb xmm5, xmm7
- movdqa [rdi ], xmm4
- movdqa [rdi+rcx], xmm5
- lea rsi, [rsi+rax*2]
- lea rdi, [rdi+rcx*2]
- dec edx
- jnz vp8_intra_pred_y_tm_%1_loop
-
- ; begin epilog
- RESTORE_GOT
- pop rbx
- pop rdi
- pop rsi
- RESTORE_XMM
- UNSHADOW_ARGS
- pop rbp
- ret
-%endmacro
-
-vp8_intra_pred_y_tm sse2
-vp8_intra_pred_y_tm ssse3
-
-;void vp8_intra_pred_y_ve_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride
-; )
-global sym(vp8_intra_pred_y_ve_sse2) PRIVATE
-sym(vp8_intra_pred_y_ve_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- ; end prolog
-
- ;arg(3), arg(4) not used
-
- mov rax, arg(2) ;above;
- mov rsi, 2
- movsxd rdx, dword ptr arg(1) ;dst_stride
-
- ; read from top
- movdqa xmm1, [rax]
-
- ; write out
- mov rax, arg(0) ;dst;
- lea rcx, [rdx*3]
-
-.label
- movdqa [rax ], xmm1
- movdqa [rax+rdx ], xmm1
- movdqa [rax+rdx*2], xmm1
- movdqa [rax+rcx ], xmm1
- lea rax, [rax+rdx*4]
- movdqa [rax ], xmm1
- movdqa [rax+rdx ], xmm1
- movdqa [rax+rdx*2], xmm1
- movdqa [rax+rcx ], xmm1
- lea rax, [rax+rdx*4]
- dec rsi
- jnz .label
-
- ; begin epilog
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-;void vp8_intra_pred_y_ho_sse2(
-; unsigned char *dst,
-; int dst_stride
-; unsigned char *above,
-; unsigned char *left,
-; int left_stride,
-; )
-global sym(vp8_intra_pred_y_ho_sse2) PRIVATE
-sym(vp8_intra_pred_y_ho_sse2):
- push rbp
- mov rbp, rsp
- SHADOW_ARGS_TO_STACK 5
- push rsi
- push rdi
- push rbx
- ; end prolog
-
- ;arg(2) not used
-
- ; read from left and write out
- mov edx, 8
- mov rsi, arg(3) ;left;
- movsxd rax, dword ptr arg(4) ;left_stride;
- mov rdi, arg(0) ;dst;
- movsxd rcx, dword ptr arg(1) ;dst_stride
-
-vp8_intra_pred_y_ho_sse2_loop:
- mov bl, [rsi]
- movd xmm0, ebx
- mov bl, [rsi+rax]
- movd xmm1, ebx
-
- ; FIXME use pshufb for ssse3 version
- punpcklbw xmm0, xmm0
- punpcklbw xmm1, xmm1
- pshuflw xmm0, xmm0, 0x0
- pshuflw xmm1, xmm1, 0x0
- punpcklqdq xmm0, xmm0
- punpcklqdq xmm1, xmm1
- movdqa [rdi ], xmm0
- movdqa [rdi+rcx], xmm1
- lea rsi, [rsi+rax*2]
- lea rdi, [rdi+rcx*2]
- dec edx
- jnz vp8_intra_pred_y_ho_sse2_loop
-
- ; begin epilog
- pop rbx
- pop rdi
- pop rsi
- UNSHADOW_ARGS
- pop rbp
- ret
-
-SECTION_RODATA
-align 16
-dc_128:
- times 16 db 128
-dc_4:
- times 4 dw 4
-align 16
-dc_8:
- times 8 dw 8
-align 16
-dc_1024:
- times 8 dw 0x400
-align 16
-dc_00001111:
- times 8 db 0
- times 8 db 1
diff --git a/vp8/common/x86/recon_wrapper_sse2.c b/vp8/common/x86/recon_wrapper_sse2.c
deleted file mode 100644
index 65f4251..0000000
--- a/vp8/common/x86/recon_wrapper_sse2.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2010 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 "vpx_config.h"
-#include "vp8_rtcd.h"
-#include "vpx_mem/vpx_mem.h"
-#include "vp8/common/blockd.h"
-
-#define build_intra_predictors_mbuv_prototype(sym) \
- void sym(unsigned char *dst, int dst_stride, \
- const unsigned char *above, \
- const unsigned char *left, int left_stride)
-typedef build_intra_predictors_mbuv_prototype((*build_intra_predictors_mbuv_fn_t));
-
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dc_mmx2);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dctop_mmx2);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dcleft_mmx2);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_dc128_mmx);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ho_mmx2);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ho_ssse3);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_ve_mmx);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_tm_sse2);
-extern build_intra_predictors_mbuv_prototype(vp8_intra_pred_uv_tm_ssse3);
-
-static void vp8_build_intra_predictors_mbuv_x86(MACROBLOCKD *x,
- unsigned char * uabove_row,
- unsigned char * vabove_row,
- unsigned char *dst_u,
- unsigned char *dst_v,
- int dst_stride,
- unsigned char * uleft,
- unsigned char * vleft,
- int left_stride,
- build_intra_predictors_mbuv_fn_t tm_func,
- build_intra_predictors_mbuv_fn_t ho_func)
-{
- int mode = x->mode_info_context->mbmi.uv_mode;
- build_intra_predictors_mbuv_fn_t fn;
-
- switch (mode) {
- case V_PRED: fn = vp8_intra_pred_uv_ve_mmx; break;
- case H_PRED: fn = ho_func; break;
- case TM_PRED: fn = tm_func; break;
- case DC_PRED:
- if (x->up_available) {
- if (x->left_available) {
- fn = vp8_intra_pred_uv_dc_mmx2; break;
- } else {
- fn = vp8_intra_pred_uv_dctop_mmx2; break;
- }
- } else if (x->left_available) {
- fn = vp8_intra_pred_uv_dcleft_mmx2; break;
- } else {
- fn = vp8_intra_pred_uv_dc128_mmx; break;
- }
- break;
- default: return;
- }
-
- fn(dst_u, dst_stride, uabove_row, uleft, left_stride);
- fn(dst_v, dst_stride, vabove_row, vleft, left_stride);
-}
-
-void vp8_build_intra_predictors_mbuv_s_sse2(MACROBLOCKD *x,
- unsigned char * uabove_row,
- unsigned char * vabove_row,
- unsigned char * uleft,
- unsigned char * vleft,
- int left_stride,
- unsigned char * upred_ptr,
- unsigned char * vpred_ptr,
- int pred_stride)
-{
- vp8_build_intra_predictors_mbuv_x86(x,
- uabove_row, vabove_row,
- upred_ptr,
- vpred_ptr, pred_stride,
- uleft,
- vleft,
- left_stride,
- vp8_intra_pred_uv_tm_sse2,
- vp8_intra_pred_uv_ho_mmx2);
-}
-
-void vp8_build_intra_predictors_mbuv_s_ssse3(MACROBLOCKD *x,
- unsigned char * uabove_row,
- unsigned char * vabove_row,
- unsigned char * uleft,
- unsigned char * vleft,
- int left_stride,
- unsigned char * upred_ptr,
- unsigned char * vpred_ptr,
- int pred_stride)
-{
- vp8_build_intra_predictors_mbuv_x86(x,
- uabove_row, vabove_row,
- upred_ptr,
- vpred_ptr, pred_stride,
- uleft,
- vleft,
- left_stride,
- vp8_intra_pred_uv_tm_ssse3,
- vp8_intra_pred_uv_ho_ssse3);
-}
-
-#define build_intra_predictors_mby_prototype(sym) \
- void sym(unsigned char *dst, int dst_stride, \
- const unsigned char *above, \
- const unsigned char *left, int left_stride)
-typedef build_intra_predictors_mby_prototype((*build_intra_predictors_mby_fn_t));
-
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dc_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dctop_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dcleft_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_dc128_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_ho_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_ve_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_tm_sse2);
-extern build_intra_predictors_mby_prototype(vp8_intra_pred_y_tm_ssse3);
-
-static void vp8_build_intra_predictors_mby_x86(MACROBLOCKD *x,
- unsigned char * yabove_row,
- unsigned char *dst_y,
- int dst_stride,
- unsigned char * yleft,
- int left_stride,
- build_intra_predictors_mby_fn_t tm_func)
-{
- int mode = x->mode_info_context->mbmi.mode;
- build_intra_predictors_mbuv_fn_t fn;
-
- switch (mode) {
- case V_PRED: fn = vp8_intra_pred_y_ve_sse2; break;
- case H_PRED: fn = vp8_intra_pred_y_ho_sse2; break;
- case TM_PRED: fn = tm_func; break;
- case DC_PRED:
- if (x->up_available) {
- if (x->left_available) {
- fn = vp8_intra_pred_y_dc_sse2; break;
- } else {
- fn = vp8_intra_pred_y_dctop_sse2; break;
- }
- } else if (x->left_available) {
- fn = vp8_intra_pred_y_dcleft_sse2; break;
- } else {
- fn = vp8_intra_pred_y_dc128_sse2; break;
- }
- break;
- default: return;
- }
-
- fn(dst_y, dst_stride, yabove_row, yleft, left_stride);
- return;
-}
-
-void vp8_build_intra_predictors_mby_s_sse2(MACROBLOCKD *x,
- unsigned char * yabove_row,
- unsigned char * yleft,
- int left_stride,
- unsigned char * ypred_ptr,
- int y_stride)
-{
- vp8_build_intra_predictors_mby_x86(x, yabove_row, ypred_ptr,
- y_stride, yleft, left_stride,
- vp8_intra_pred_y_tm_sse2);
-}
-
-void vp8_build_intra_predictors_mby_s_ssse3(MACROBLOCKD *x,
- unsigned char * yabove_row,
- unsigned char * yleft,
- int left_stride,
- unsigned char * ypred_ptr,
- int y_stride)
-{
- vp8_build_intra_predictors_mby_x86(x, yabove_row, ypred_ptr,
- y_stride, yleft, left_stride,
- vp8_intra_pred_y_tm_ssse3);
-
-}
diff --git a/vp8/decoder/decodeframe.c b/vp8/decoder/decodeframe.c
index 8be8c16..f0d7603 100644
--- a/vp8/decoder/decodeframe.c
+++ b/vp8/decoder/decodeframe.c
@@ -23,6 +23,7 @@
#include "vp8/common/entropymode.h"
#include "vp8/common/quant_common.h"
#include "vpx_scale/vpx_scale.h"
+#include "vp8/common/reconintra.h"
#include "vp8/common/setupintrarecon.h"
#include "decodemv.h"
diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c
index 9015fcb..3468268 100644
--- a/vp8/decoder/onyxd_if.c
+++ b/vp8/decoder/onyxd_if.c
@@ -25,9 +25,12 @@
#include <assert.h>
#include "vp8/common/quant_common.h"
+#include "vp8/common/reconintra.h"
+#include "./vpx_dsp_rtcd.h"
#include "./vpx_scale_rtcd.h"
#include "vpx_scale/vpx_scale.h"
#include "vp8/common/systemdependent.h"
+#include "vpx_ports/vpx_once.h"
#include "vpx_ports/vpx_timer.h"
#include "detokenize.h"
#if CONFIG_ERROR_CONCEALMENT
@@ -42,6 +45,17 @@
static int get_free_fb (VP8_COMMON *cm);
static void ref_cnt_fb (int *buf, int *idx, int new_idx);
+static void initialize_dec(void) {
+ static volatile int init_done = 0;
+
+ if (!init_done)
+ {
+ vpx_dsp_rtcd();
+ vp8_init_intra_predictors();
+ init_done = 1;
+ }
+}
+
static void remove_decompressor(VP8D_COMP *pbi)
{
#if CONFIG_ERROR_CONCEALMENT
@@ -105,6 +119,8 @@
vp8_setup_block_dptrs(&pbi->mb);
+ once(initialize_dec);
+
return pbi;
}
diff --git a/vp8/decoder/threading.c b/vp8/decoder/threading.c
index 6801532..7c7184c 100644
--- a/vp8/decoder/threading.c
+++ b/vp8/decoder/threading.c
@@ -24,6 +24,7 @@
#include "detokenize.h"
#include "vp8/common/reconintra4x4.h"
#include "vp8/common/reconinter.h"
+#include "vp8/common/reconintra.h"
#include "vp8/common/setupintrarecon.h"
#if CONFIG_ERROR_CONCEALMENT
#include "error_concealment.h"
diff --git a/vp8/encoder/encodeintra.c b/vp8/encoder/encodeintra.c
index 938cc7e..44be959 100644
--- a/vp8/encoder/encodeintra.c
+++ b/vp8/encoder/encodeintra.c
@@ -13,6 +13,7 @@
#include "vp8_rtcd.h"
#include "./vpx_dsp_rtcd.h"
#include "vp8/encoder/quantize.h"
+#include "vp8/common/reconintra.h"
#include "vp8/common/reconintra4x4.h"
#include "encodemb.h"
#include "vp8/common/invtrans.h"
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index f1b9326..df5bcf6 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -31,6 +31,7 @@
#include "vp8/common/postproc.h"
#endif
#include "vpx_mem/vpx_mem.h"
+#include "vp8/common/reconintra.h"
#include "vp8/common/swapyv12buffer.h"
#include "vp8/common/threading.h"
#include "vpx_ports/vpx_timer.h"
@@ -422,6 +423,16 @@
static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
+void vp8_initialize_enc(void)
+{
+ static volatile int init_done = 0;
+
+ if (!init_done) {
+ vpx_dsp_rtcd();
+ vp8_init_intra_predictors();
+ init_done = 1;
+ }
+}
static void dealloc_compressor_data(VP8_COMP *cpi)
{
diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h
index 8beba27..317e4b9 100644
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -716,6 +716,8 @@
} rd_costs;
} VP8_COMP;
+void vp8_initialize_enc(void);
+
void vp8_alloc_compressor_data(VP8_COMP *cpi);
int vp8_reverse_trans(int x);
void vp8_new_framerate(VP8_COMP *cpi, double framerate);
diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c
index b508385..d0fff3f 100644
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -21,6 +21,7 @@
#include "vp8/common/findnearmv.h"
#include "encodemb.h"
#include "vp8/common/reconinter.h"
+#include "vp8/common/reconintra.h"
#include "vp8/common/reconintra4x4.h"
#include "vpx_dsp/variance.h"
#include "mcomp.h"
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index fdff378..ab0ad15 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -24,6 +24,7 @@
#include "pickinter.h"
#include "vp8/common/entropymode.h"
#include "vp8/common/reconinter.h"
+#include "vp8/common/reconintra.h"
#include "vp8/common/reconintra4x4.h"
#include "vp8/common/findnearmv.h"
#include "vp8/common/quant_common.h"
diff --git a/vp8/vp8_common.mk b/vp8/vp8_common.mk
index 3ad11c7..4c4e856 100644
--- a/vp8/vp8_common.mk
+++ b/vp8/vp8_common.mk
@@ -45,6 +45,7 @@
VP8_COMMON_SRCS-yes += common/onyxc_int.h
VP8_COMMON_SRCS-yes += common/quant_common.h
VP8_COMMON_SRCS-yes += common/reconinter.h
+VP8_COMMON_SRCS-yes += common/reconintra.h
VP8_COMMON_SRCS-yes += common/reconintra4x4.h
VP8_COMMON_SRCS-yes += common/rtcd.c
VP8_COMMON_SRCS-yes += common/rtcd_defs.pl
@@ -88,7 +89,6 @@
VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/idct_blk_sse2.c
VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/idctllm_sse2.asm
VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/recon_sse2.asm
-VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/recon_wrapper_sse2.c
VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/subpixel_sse2.asm
VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/loopfilter_sse2.asm
VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/iwalsh_sse2.asm
@@ -118,7 +118,6 @@
VP8_COMMON_SRCS-$(HAVE_MSA) += common/mips/msa/copymem_msa.c
VP8_COMMON_SRCS-$(HAVE_MSA) += common/mips/msa/idct_msa.c
VP8_COMMON_SRCS-$(HAVE_MSA) += common/mips/msa/loopfilter_filters_msa.c
-VP8_COMMON_SRCS-$(HAVE_MSA) += common/mips/msa/reconintra_msa.c
VP8_COMMON_SRCS-$(HAVE_MSA) += common/mips/msa/sixtap_filter_msa.c
VP8_COMMON_SRCS-$(HAVE_MSA) += common/mips/msa/vp8_macros_msa.h
@@ -146,7 +145,6 @@
VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/loopfilter_v6$(ASM)
VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/simpleloopfilter_v6$(ASM)
VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/sixtappredict8x4_v6$(ASM)
-VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/intra4x4_predict_v6$(ASM)
VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/dequant_idct_v6$(ASM)
VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/dequantize_v6$(ASM)
VP8_COMMON_SRCS-$(HAVE_MEDIA) += common/arm/armv6/idct_blk_v6.c
@@ -165,7 +163,6 @@
VP8_COMMON_SRCS-$(HAVE_NEON) += common/arm/neon/loopfiltersimplehorizontaledge_neon.c
VP8_COMMON_SRCS-$(HAVE_NEON) += common/arm/neon/loopfiltersimpleverticaledge_neon.c
VP8_COMMON_SRCS-$(HAVE_NEON) += common/arm/neon/mbloopfilter_neon.c
-VP8_COMMON_SRCS-$(HAVE_NEON) += common/arm/neon/reconintra_neon.c
VP8_COMMON_SRCS-$(HAVE_NEON) += common/arm/neon/shortidct4x4llm_neon.c
VP8_COMMON_SRCS-$(HAVE_NEON) += common/arm/neon/sixtappredict_neon.c
diff --git a/vp8/vp8_cx_iface.c b/vp8/vp8_cx_iface.c
index 74eccd7..80ea6b4 100644
--- a/vp8/vp8_cx_iface.c
+++ b/vp8/vp8_cx_iface.c
@@ -17,6 +17,7 @@
#include "vpx/internal/vpx_codec_internal.h"
#include "vpx_version.h"
#include "vpx_mem/vpx_mem.h"
+#include "vpx_ports/vpx_once.h"
#include "vp8/encoder/onyx_int.h"
#include "vpx/vp8cx.h"
#include "vp8/encoder/firstpass.h"
@@ -693,6 +694,8 @@
else
ctx->priv->enc.total_encoders = 1;
+ once(vp8_initialize_enc);
+
res = validate_config(priv, &priv->cfg, &priv->vp8_cfg, 0);
if (!res)
diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c
index ac417b6..24c6c54 100644
--- a/vp9/common/vp9_alloccommon.c
+++ b/vp9/common/vp9_alloccommon.c
@@ -115,6 +115,8 @@
cm->above_context = NULL;
vpx_free(cm->above_seg_context);
cm->above_seg_context = NULL;
+ vpx_free(cm->lf.lfm);
+ cm->lf.lfm = NULL;
}
int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) {
@@ -149,6 +151,16 @@
cm->above_context_alloc_cols = cm->mi_cols;
}
+ vpx_free(cm->lf.lfm);
+
+ // Each lfm holds bit masks for all the 8x8 blocks in a 64x64 region. The
+ // stride and rows are rounded up / truncated to a multiple of 8.
+ cm->lf.lfm_stride = (cm->mi_cols + (MI_BLOCK_SIZE - 1)) >> 3;
+ cm->lf.lfm = (LOOP_FILTER_MASK *)vpx_calloc(
+ ((cm->mi_rows + (MI_BLOCK_SIZE - 1)) >> 3) * cm->lf.lfm_stride,
+ sizeof(*cm->lf.lfm));
+ if (!cm->lf.lfm) goto fail;
+
return 0;
fail:
diff --git a/vp9/common/vp9_blockd.c b/vp9/common/vp9_blockd.c
index e8334fc..0e104ee 100644
--- a/vp9/common/vp9_blockd.c
+++ b/vp9/common/vp9_blockd.c
@@ -129,7 +129,6 @@
int i;
for (i = 0; i < MAX_MB_PLANE; i++) {
- xd->plane[i].plane_type = i ? PLANE_TYPE_UV : PLANE_TYPE_Y;
xd->plane[i].subsampling_x = i ? ss_x : 0;
xd->plane[i].subsampling_y = i ? ss_y : 0;
}
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h
index 5683736..61eb591 100644
--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -120,7 +120,6 @@
struct macroblockd_plane {
tran_low_t *dqcoeff;
- PLANE_TYPE plane_type;
int subsampling_x;
int subsampling_y;
struct buf_2d dst;
@@ -200,6 +199,10 @@
struct vpx_internal_error_info *error_info;
} MACROBLOCKD;
+static INLINE PLANE_TYPE get_plane_type(int plane) {
+ return (PLANE_TYPE)(plane > 0);
+}
+
static INLINE BLOCK_SIZE get_subsize(BLOCK_SIZE bsize,
PARTITION_TYPE partition) {
return subsize_lookup[partition][bsize];
diff --git a/vp9/common/vp9_loopfilter.c b/vp9/common/vp9_loopfilter.c
index 5e090f3..b8a1132 100644
--- a/vp9/common/vp9_loopfilter.c
+++ b/vp9/common/vp9_loopfilter.c
@@ -776,7 +776,7 @@
// an 8x8 in that the internal ones can be skipped and don't depend on
// the prediction block size.
if (tx_size_y == TX_4X4)
- *int_4x4_y |= (size_mask[block_size] & 0xffffffffffffffffULL) << shift_y;
+ *int_4x4_y |= size_mask[block_size] << shift_y;
if (tx_size_uv == TX_4X4)
*int_4x4_uv |= (size_mask_uv[block_size] & 0xffff) << shift_uv;
@@ -822,7 +822,121 @@
left_64x64_txform_mask[tx_size_y]) << shift_y;
if (tx_size_y == TX_4X4)
- *int_4x4_y |= (size_mask[block_size] & 0xffffffffffffffffULL) << shift_y;
+ *int_4x4_y |= size_mask[block_size] << shift_y;
+}
+
+void vp9_adjust_mask(VP9_COMMON *const cm, const int mi_row,
+ const int mi_col, LOOP_FILTER_MASK *lfm) {
+ int i;
+
+ // The largest loopfilter we have is 16x16 so we use the 16x16 mask
+ // for 32x32 transforms also.
+ lfm->left_y[TX_16X16] |= lfm->left_y[TX_32X32];
+ lfm->above_y[TX_16X16] |= lfm->above_y[TX_32X32];
+ lfm->left_uv[TX_16X16] |= lfm->left_uv[TX_32X32];
+ lfm->above_uv[TX_16X16] |= lfm->above_uv[TX_32X32];
+
+ // We do at least 8 tap filter on every 32x32 even if the transform size
+ // is 4x4. So if the 4x4 is set on a border pixel add it to the 8x8 and
+ // remove it from the 4x4.
+ lfm->left_y[TX_8X8] |= lfm->left_y[TX_4X4] & left_border;
+ lfm->left_y[TX_4X4] &= ~left_border;
+ lfm->above_y[TX_8X8] |= lfm->above_y[TX_4X4] & above_border;
+ lfm->above_y[TX_4X4] &= ~above_border;
+ lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_4X4] & left_border_uv;
+ lfm->left_uv[TX_4X4] &= ~left_border_uv;
+ lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_4X4] & above_border_uv;
+ lfm->above_uv[TX_4X4] &= ~above_border_uv;
+
+ // We do some special edge handling.
+ if (mi_row + MI_BLOCK_SIZE > cm->mi_rows) {
+ const uint64_t rows = cm->mi_rows - mi_row;
+
+ // Each pixel inside the border gets a 1,
+ const uint64_t mask_y = (((uint64_t) 1 << (rows << 3)) - 1);
+ const uint16_t mask_uv = (((uint16_t) 1 << (((rows + 1) >> 1) << 2)) - 1);
+
+ // Remove values completely outside our border.
+ for (i = 0; i < TX_32X32; i++) {
+ lfm->left_y[i] &= mask_y;
+ lfm->above_y[i] &= mask_y;
+ lfm->left_uv[i] &= mask_uv;
+ lfm->above_uv[i] &= mask_uv;
+ }
+ lfm->int_4x4_y &= mask_y;
+ lfm->int_4x4_uv &= mask_uv;
+
+ // We don't apply a wide loop filter on the last uv block row. If set
+ // apply the shorter one instead.
+ if (rows == 1) {
+ lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16];
+ lfm->above_uv[TX_16X16] = 0;
+ }
+ if (rows == 5) {
+ lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16] & 0xff00;
+ lfm->above_uv[TX_16X16] &= ~(lfm->above_uv[TX_16X16] & 0xff00);
+ }
+ }
+
+ if (mi_col + MI_BLOCK_SIZE > cm->mi_cols) {
+ const uint64_t columns = cm->mi_cols - mi_col;
+
+ // Each pixel inside the border gets a 1, the multiply copies the border
+ // to where we need it.
+ const uint64_t mask_y = (((1 << columns) - 1)) * 0x0101010101010101ULL;
+ const uint16_t mask_uv = ((1 << ((columns + 1) >> 1)) - 1) * 0x1111;
+
+ // Internal edges are not applied on the last column of the image so
+ // we mask 1 more for the internal edges
+ const uint16_t mask_uv_int = ((1 << (columns >> 1)) - 1) * 0x1111;
+
+ // Remove the bits outside the image edge.
+ for (i = 0; i < TX_32X32; i++) {
+ lfm->left_y[i] &= mask_y;
+ lfm->above_y[i] &= mask_y;
+ lfm->left_uv[i] &= mask_uv;
+ lfm->above_uv[i] &= mask_uv;
+ }
+ lfm->int_4x4_y &= mask_y;
+ lfm->int_4x4_uv &= mask_uv_int;
+
+ // We don't apply a wide loop filter on the last uv column. If set
+ // apply the shorter one instead.
+ if (columns == 1) {
+ lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_16X16];
+ lfm->left_uv[TX_16X16] = 0;
+ }
+ if (columns == 5) {
+ lfm->left_uv[TX_8X8] |= (lfm->left_uv[TX_16X16] & 0xcccc);
+ lfm->left_uv[TX_16X16] &= ~(lfm->left_uv[TX_16X16] & 0xcccc);
+ }
+ }
+ // We don't apply a loop filter on the first column in the image, mask that
+ // out.
+ if (mi_col == 0) {
+ for (i = 0; i < TX_32X32; i++) {
+ lfm->left_y[i] &= 0xfefefefefefefefeULL;
+ lfm->left_uv[i] &= 0xeeee;
+ }
+ }
+
+ // Assert if we try to apply 2 different loop filters at the same position.
+ assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_8X8]));
+ assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_4X4]));
+ assert(!(lfm->left_y[TX_8X8] & lfm->left_y[TX_4X4]));
+ assert(!(lfm->int_4x4_y & lfm->left_y[TX_16X16]));
+ assert(!(lfm->left_uv[TX_16X16]&lfm->left_uv[TX_8X8]));
+ assert(!(lfm->left_uv[TX_16X16] & lfm->left_uv[TX_4X4]));
+ assert(!(lfm->left_uv[TX_8X8] & lfm->left_uv[TX_4X4]));
+ assert(!(lfm->int_4x4_uv & lfm->left_uv[TX_16X16]));
+ assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_8X8]));
+ assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_4X4]));
+ assert(!(lfm->above_y[TX_8X8] & lfm->above_y[TX_4X4]));
+ assert(!(lfm->int_4x4_y & lfm->above_y[TX_16X16]));
+ assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_8X8]));
+ assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_4X4]));
+ assert(!(lfm->above_uv[TX_8X8] & lfm->above_uv[TX_4X4]));
+ assert(!(lfm->int_4x4_uv & lfm->above_uv[TX_16X16]));
}
// This function sets up the bit masks for the entire 64x64 region represented
@@ -855,7 +969,6 @@
const int shift_8_y[] = {0, 1, 8, 9};
const int shift_32_uv[] = {0, 2, 8, 10};
const int shift_16_uv[] = {0, 1, 4, 5};
- int i;
const int max_rows = (mi_row + MI_BLOCK_SIZE > cm->mi_rows ?
cm->mi_rows - mi_row : MI_BLOCK_SIZE);
const int max_cols = (mi_col + MI_BLOCK_SIZE > cm->mi_cols ?
@@ -970,114 +1083,8 @@
}
break;
}
- // The largest loopfilter we have is 16x16 so we use the 16x16 mask
- // for 32x32 transforms also.
- lfm->left_y[TX_16X16] |= lfm->left_y[TX_32X32];
- lfm->above_y[TX_16X16] |= lfm->above_y[TX_32X32];
- lfm->left_uv[TX_16X16] |= lfm->left_uv[TX_32X32];
- lfm->above_uv[TX_16X16] |= lfm->above_uv[TX_32X32];
- // We do at least 8 tap filter on every 32x32 even if the transform size
- // is 4x4. So if the 4x4 is set on a border pixel add it to the 8x8 and
- // remove it from the 4x4.
- lfm->left_y[TX_8X8] |= lfm->left_y[TX_4X4] & left_border;
- lfm->left_y[TX_4X4] &= ~left_border;
- lfm->above_y[TX_8X8] |= lfm->above_y[TX_4X4] & above_border;
- lfm->above_y[TX_4X4] &= ~above_border;
- lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_4X4] & left_border_uv;
- lfm->left_uv[TX_4X4] &= ~left_border_uv;
- lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_4X4] & above_border_uv;
- lfm->above_uv[TX_4X4] &= ~above_border_uv;
-
- // We do some special edge handling.
- if (mi_row + MI_BLOCK_SIZE > cm->mi_rows) {
- const uint64_t rows = cm->mi_rows - mi_row;
-
- // Each pixel inside the border gets a 1,
- const uint64_t mask_y = (((uint64_t) 1 << (rows << 3)) - 1);
- const uint16_t mask_uv = (((uint16_t) 1 << (((rows + 1) >> 1) << 2)) - 1);
-
- // Remove values completely outside our border.
- for (i = 0; i < TX_32X32; i++) {
- lfm->left_y[i] &= mask_y;
- lfm->above_y[i] &= mask_y;
- lfm->left_uv[i] &= mask_uv;
- lfm->above_uv[i] &= mask_uv;
- }
- lfm->int_4x4_y &= mask_y;
- lfm->int_4x4_uv &= mask_uv;
-
- // We don't apply a wide loop filter on the last uv block row. If set
- // apply the shorter one instead.
- if (rows == 1) {
- lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16];
- lfm->above_uv[TX_16X16] = 0;
- }
- if (rows == 5) {
- lfm->above_uv[TX_8X8] |= lfm->above_uv[TX_16X16] & 0xff00;
- lfm->above_uv[TX_16X16] &= ~(lfm->above_uv[TX_16X16] & 0xff00);
- }
- }
-
- if (mi_col + MI_BLOCK_SIZE > cm->mi_cols) {
- const uint64_t columns = cm->mi_cols - mi_col;
-
- // Each pixel inside the border gets a 1, the multiply copies the border
- // to where we need it.
- const uint64_t mask_y = (((1 << columns) - 1)) * 0x0101010101010101ULL;
- const uint16_t mask_uv = ((1 << ((columns + 1) >> 1)) - 1) * 0x1111;
-
- // Internal edges are not applied on the last column of the image so
- // we mask 1 more for the internal edges
- const uint16_t mask_uv_int = ((1 << (columns >> 1)) - 1) * 0x1111;
-
- // Remove the bits outside the image edge.
- for (i = 0; i < TX_32X32; i++) {
- lfm->left_y[i] &= mask_y;
- lfm->above_y[i] &= mask_y;
- lfm->left_uv[i] &= mask_uv;
- lfm->above_uv[i] &= mask_uv;
- }
- lfm->int_4x4_y &= mask_y;
- lfm->int_4x4_uv &= mask_uv_int;
-
- // We don't apply a wide loop filter on the last uv column. If set
- // apply the shorter one instead.
- if (columns == 1) {
- lfm->left_uv[TX_8X8] |= lfm->left_uv[TX_16X16];
- lfm->left_uv[TX_16X16] = 0;
- }
- if (columns == 5) {
- lfm->left_uv[TX_8X8] |= (lfm->left_uv[TX_16X16] & 0xcccc);
- lfm->left_uv[TX_16X16] &= ~(lfm->left_uv[TX_16X16] & 0xcccc);
- }
- }
- // We don't apply a loop filter on the first column in the image, mask that
- // out.
- if (mi_col == 0) {
- for (i = 0; i < TX_32X32; i++) {
- lfm->left_y[i] &= 0xfefefefefefefefeULL;
- lfm->left_uv[i] &= 0xeeee;
- }
- }
-
- // Assert if we try to apply 2 different loop filters at the same position.
- assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_8X8]));
- assert(!(lfm->left_y[TX_16X16] & lfm->left_y[TX_4X4]));
- assert(!(lfm->left_y[TX_8X8] & lfm->left_y[TX_4X4]));
- assert(!(lfm->int_4x4_y & lfm->left_y[TX_16X16]));
- assert(!(lfm->left_uv[TX_16X16]&lfm->left_uv[TX_8X8]));
- assert(!(lfm->left_uv[TX_16X16] & lfm->left_uv[TX_4X4]));
- assert(!(lfm->left_uv[TX_8X8] & lfm->left_uv[TX_4X4]));
- assert(!(lfm->int_4x4_uv & lfm->left_uv[TX_16X16]));
- assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_8X8]));
- assert(!(lfm->above_y[TX_16X16] & lfm->above_y[TX_4X4]));
- assert(!(lfm->above_y[TX_8X8] & lfm->above_y[TX_4X4]));
- assert(!(lfm->int_4x4_y & lfm->above_y[TX_16X16]));
- assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_8X8]));
- assert(!(lfm->above_uv[TX_16X16] & lfm->above_uv[TX_4X4]));
- assert(!(lfm->above_uv[TX_8X8] & lfm->above_uv[TX_4X4]));
- assert(!(lfm->int_4x4_uv & lfm->above_uv[TX_16X16]));
+ vp9_adjust_mask(cm, mi_row, mi_col, lfm);
}
static void filter_selectively_vert(uint8_t *s, int pitch,
@@ -1189,9 +1196,7 @@
const int block_edge_above = (num_4x4_blocks_high_lookup[sb_type] > 1) ?
!(r & (num_8x8_blocks_high_lookup[sb_type] - 1)) : 1;
const int skip_this_r = skip_this && !block_edge_above;
- const TX_SIZE tx_size = (plane->plane_type == PLANE_TYPE_UV)
- ? get_uv_tx_size(&mi[0].mbmi, plane)
- : mi[0].mbmi.tx_size;
+ const TX_SIZE tx_size = get_uv_tx_size(&mi[0].mbmi, plane);
const int skip_border_4x4_c = ss_x && mi_col + c == cm->mi_cols - 1;
const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1;
@@ -1428,6 +1433,7 @@
struct buf_2d *const dst = &plane->dst;
uint8_t *const dst0 = dst->buf;
int r, c;
+ uint8_t lfl_uv[16];
uint16_t mask_16x16 = lfm->left_uv[TX_16X16];
uint16_t mask_8x8 = lfm->left_uv[TX_8X8];
@@ -1438,11 +1444,9 @@
// Vertical pass: do 2 rows at one time
for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += 4) {
- if (plane->plane_type == 1) {
- for (c = 0; c < (MI_BLOCK_SIZE >> 1); c++) {
- lfm->lfl_uv[(r << 1) + c] = lfm->lfl_y[(r << 3) + (c << 1)];
- lfm->lfl_uv[((r + 2) << 1) + c] = lfm->lfl_y[((r + 2) << 3) + (c << 1)];
- }
+ for (c = 0; c < (MI_BLOCK_SIZE >> 1); c++) {
+ lfl_uv[(r << 1) + c] = lfm->lfl_y[(r << 3) + (c << 1)];
+ lfl_uv[((r + 2) << 1) + c] = lfm->lfl_y[((r + 2) << 3) + (c << 1)];
}
{
@@ -1457,18 +1461,18 @@
highbd_filter_selectively_vert_row2(
plane->subsampling_x, CONVERT_TO_SHORTPTR(dst->buf), dst->stride,
mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info,
- &lfm->lfl_uv[r << 1], (int)cm->bit_depth);
+ &lfl_uv[r << 1], (int)cm->bit_depth);
} else {
filter_selectively_vert_row2(
plane->subsampling_x, dst->buf, dst->stride,
mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info,
- &lfm->lfl_uv[r << 1]);
+ &lfl_uv[r << 1]);
}
#else
filter_selectively_vert_row2(
plane->subsampling_x, dst->buf, dst->stride,
mask_16x16_l, mask_8x8_l, mask_4x4_l, mask_4x4_int_l, &cm->lf_info,
- &lfm->lfl_uv[r << 1]);
+ &lfl_uv[r << 1]);
#endif // CONFIG_VP9_HIGHBITDEPTH
dst->buf += 16 * dst->stride;
@@ -1509,16 +1513,16 @@
highbd_filter_selectively_horiz(CONVERT_TO_SHORTPTR(dst->buf),
dst->stride, mask_16x16_r, mask_8x8_r,
mask_4x4_r, mask_4x4_int_r, &cm->lf_info,
- &lfm->lfl_uv[r << 1], (int)cm->bit_depth);
+ &lfl_uv[r << 1], (int)cm->bit_depth);
} else {
filter_selectively_horiz(dst->buf, dst->stride, mask_16x16_r, mask_8x8_r,
mask_4x4_r, mask_4x4_int_r, &cm->lf_info,
- &lfm->lfl_uv[r << 1]);
+ &lfl_uv[r << 1]);
}
#else
filter_selectively_horiz(dst->buf, dst->stride, mask_16x16_r, mask_8x8_r,
mask_4x4_r, mask_4x4_int_r, &cm->lf_info,
- &lfm->lfl_uv[r << 1]);
+ &lfl_uv[r << 1]);
#endif // CONFIG_VP9_HIGHBITDEPTH
dst->buf += 8 * dst->stride;
@@ -1529,13 +1533,11 @@
}
}
-void vp9_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer,
- VP9_COMMON *cm,
- struct macroblockd_plane planes[MAX_MB_PLANE],
- int start, int stop, int y_only) {
+static void loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer, VP9_COMMON *cm,
+ struct macroblockd_plane planes[MAX_MB_PLANE],
+ int start, int stop, int y_only) {
const int num_planes = y_only ? 1 : MAX_MB_PLANE;
enum lf_path path;
- LOOP_FILTER_MASK lfm;
int mi_row, mi_col;
if (y_only)
@@ -1549,24 +1551,24 @@
for (mi_row = start; mi_row < stop; mi_row += MI_BLOCK_SIZE) {
MODE_INFO **mi = cm->mi_grid_visible + mi_row * cm->mi_stride;
+ LOOP_FILTER_MASK *lfm = get_lfm(&cm->lf, mi_row, 0);
- for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) {
+ for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE, ++lfm) {
int plane;
vp9_setup_dst_planes(planes, frame_buffer, mi_row, mi_col);
// TODO(JBB): Make setup_mask work for non 420.
- vp9_setup_mask(cm, mi_row, mi_col, mi + mi_col, cm->mi_stride,
- &lfm);
+ vp9_adjust_mask(cm, mi_row, mi_col, lfm);
- vp9_filter_block_plane_ss00(cm, &planes[0], mi_row, &lfm);
+ vp9_filter_block_plane_ss00(cm, &planes[0], mi_row, lfm);
for (plane = 1; plane < num_planes; ++plane) {
switch (path) {
case LF_PATH_420:
- vp9_filter_block_plane_ss11(cm, &planes[plane], mi_row, &lfm);
+ vp9_filter_block_plane_ss11(cm, &planes[plane], mi_row, lfm);
break;
case LF_PATH_444:
- vp9_filter_block_plane_ss00(cm, &planes[plane], mi_row, &lfm);
+ vp9_filter_block_plane_ss00(cm, &planes[plane], mi_row, lfm);
break;
case LF_PATH_SLOW:
vp9_filter_block_plane_non420(cm, &planes[plane], mi + mi_col,
@@ -1592,10 +1594,132 @@
mi_rows_to_filter = VPXMAX(cm->mi_rows / 8, 8);
}
end_mi_row = start_mi_row + mi_rows_to_filter;
+ loop_filter_rows(frame, cm, xd->plane, start_mi_row, end_mi_row, y_only);
+}
+
+// Used by the encoder to build the loopfilter masks.
+void vp9_build_mask_frame(VP9_COMMON *cm, int frame_filter_level,
+ int partial_frame) {
+ int start_mi_row, end_mi_row, mi_rows_to_filter;
+ int mi_col, mi_row;
+ if (!frame_filter_level) return;
+ start_mi_row = 0;
+ mi_rows_to_filter = cm->mi_rows;
+ if (partial_frame && cm->mi_rows > 8) {
+ start_mi_row = cm->mi_rows >> 1;
+ start_mi_row &= 0xfffffff8;
+ mi_rows_to_filter = VPXMAX(cm->mi_rows / 8, 8);
+ }
+ end_mi_row = start_mi_row + mi_rows_to_filter;
+
vp9_loop_filter_frame_init(cm, frame_filter_level);
- vp9_loop_filter_rows(frame, cm, xd->plane,
- start_mi_row, end_mi_row,
- y_only);
+
+ for (mi_row = start_mi_row; mi_row < end_mi_row; mi_row += MI_BLOCK_SIZE) {
+ MODE_INFO **mi = cm->mi_grid_visible + mi_row * cm->mi_stride;
+ for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) {
+ // vp9_setup_mask() zeros lfm
+ vp9_setup_mask(cm, mi_row, mi_col, mi + mi_col, cm->mi_stride,
+ get_lfm(&cm->lf, mi_row, mi_col));
+ }
+ }
+}
+
+// 8x8 blocks in a superblock. A "1" represents the first block in a 16x16
+// or greater area.
+static const uint8_t first_block_in_16x16[8][8] = {
+ {1, 0, 1, 0, 1, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 1, 0, 1, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 1, 0, 1, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0},
+ {1, 0, 1, 0, 1, 0, 1, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0}
+};
+
+// This function sets up the bit masks for a block represented
+// by mi_row, mi_col in a 64x64 region.
+// TODO(SJL): This function only works for yv12.
+void vp9_build_mask(VP9_COMMON *cm, const MB_MODE_INFO *mbmi, int mi_row,
+ int mi_col, int bw, int bh) {
+ const BLOCK_SIZE block_size = mbmi->sb_type;
+ const TX_SIZE tx_size_y = mbmi->tx_size;
+ const loop_filter_info_n *const lfi_n = &cm->lf_info;
+ const int filter_level = get_filter_level(lfi_n, mbmi);
+ const TX_SIZE tx_size_uv = get_uv_tx_size_impl(tx_size_y, block_size, 1, 1);
+ LOOP_FILTER_MASK *const lfm = get_lfm(&cm->lf, mi_row, mi_col);
+ uint64_t *const left_y = &lfm->left_y[tx_size_y];
+ uint64_t *const above_y = &lfm->above_y[tx_size_y];
+ uint64_t *const int_4x4_y = &lfm->int_4x4_y;
+ uint16_t *const left_uv = &lfm->left_uv[tx_size_uv];
+ uint16_t *const above_uv = &lfm->above_uv[tx_size_uv];
+ uint16_t *const int_4x4_uv = &lfm->int_4x4_uv;
+ const int row_in_sb = (mi_row & 7);
+ const int col_in_sb = (mi_col & 7);
+ const int shift_y = col_in_sb + (row_in_sb << 3);
+ const int shift_uv = (col_in_sb >> 1) + ((row_in_sb >> 1) << 2);
+ const int build_uv = first_block_in_16x16[row_in_sb][col_in_sb];
+
+ if (!filter_level) {
+ return;
+ } else {
+ int index = shift_y;
+ int i;
+ for (i = 0; i < bh; i++) {
+ memset(&lfm->lfl_y[index], filter_level, bw);
+ index += 8;
+ }
+ }
+
+ // These set 1 in the current block size for the block size edges.
+ // For instance if the block size is 32x16, we'll set:
+ // above = 1111
+ // 0000
+ // and
+ // left = 1000
+ // = 1000
+ // NOTE : In this example the low bit is left most ( 1000 ) is stored as
+ // 1, not 8...
+ //
+ // U and V set things on a 16 bit scale.
+ //
+ *above_y |= above_prediction_mask[block_size] << shift_y;
+ *left_y |= left_prediction_mask[block_size] << shift_y;
+
+ if (build_uv) {
+ *above_uv |= above_prediction_mask_uv[block_size] << shift_uv;
+ *left_uv |= left_prediction_mask_uv[block_size] << shift_uv;
+ }
+
+ // If the block has no coefficients and is not intra we skip applying
+ // the loop filter on block edges.
+ if (mbmi->skip && is_inter_block(mbmi))
+ return;
+
+ // Add a mask for the transform size. The transform size mask is set to
+ // be correct for a 64x64 prediction block size. Mask to match the size of
+ // the block we are working on and then shift it into place.
+ *above_y |= (size_mask[block_size] &
+ above_64x64_txform_mask[tx_size_y]) << shift_y;
+ *left_y |= (size_mask[block_size] &
+ left_64x64_txform_mask[tx_size_y]) << shift_y;
+
+ if (build_uv) {
+ *above_uv |= (size_mask_uv[block_size] &
+ above_64x64_txform_mask_uv[tx_size_uv]) << shift_uv;
+
+ *left_uv |= (size_mask_uv[block_size] &
+ left_64x64_txform_mask_uv[tx_size_uv]) << shift_uv;
+ }
+
+ // Try to determine what to do with the internal 4x4 block boundaries. These
+ // differ from the 4x4 boundaries on the outside edge of an 8x8 in that the
+ // internal ones can be skipped and don't depend on the prediction block size.
+ if (tx_size_y == TX_4X4)
+ *int_4x4_y |= size_mask[block_size] << shift_y;
+
+ if (build_uv && tx_size_uv == TX_4X4)
+ *int_4x4_uv |= (size_mask_uv[block_size] & 0xffff) << shift_uv;
}
void vp9_loop_filter_data_reset(
@@ -1609,9 +1733,17 @@
memcpy(lf_data->planes, planes, sizeof(lf_data->planes));
}
+void vp9_reset_lfm(VP9_COMMON *const cm) {
+ if (cm->lf.filter_level) {
+ memset(cm->lf.lfm, 0,
+ ((cm->mi_rows + (MI_BLOCK_SIZE - 1)) >> 3) * cm->lf.lfm_stride *
+ sizeof(*cm->lf.lfm));
+ }
+}
+
int vp9_loop_filter_worker(LFWorkerData *const lf_data, void *unused) {
(void)unused;
- vp9_loop_filter_rows(lf_data->frame_buffer, lf_data->cm, lf_data->planes,
- lf_data->start, lf_data->stop, lf_data->y_only);
+ loop_filter_rows(lf_data->frame_buffer, lf_data->cm, lf_data->planes,
+ lf_data->start, lf_data->stop, lf_data->y_only);
return 1;
}
diff --git a/vp9/common/vp9_loopfilter.h b/vp9/common/vp9_loopfilter.h
index f7cbde6..7f943ea 100644
--- a/vp9/common/vp9_loopfilter.h
+++ b/vp9/common/vp9_loopfilter.h
@@ -35,24 +35,6 @@
LF_PATH_SLOW,
};
-struct loopfilter {
- int filter_level;
-
- int sharpness_level;
- int last_sharpness_level;
-
- uint8_t mode_ref_delta_enabled;
- uint8_t mode_ref_delta_update;
-
- // 0 = Intra, Last, GF, ARF
- signed char ref_deltas[MAX_REF_LF_DELTAS];
- signed char last_ref_deltas[MAX_REF_LF_DELTAS];
-
- // 0 = ZERO_MV, MV
- signed char mode_deltas[MAX_MODE_LF_DELTAS];
- signed char last_mode_deltas[MAX_MODE_LF_DELTAS];
-};
-
// Need to align this structure so when it is declared and
// passed it can be loaded into vector registers.
typedef struct {
@@ -83,9 +65,29 @@
uint16_t above_uv[TX_SIZES];
uint16_t int_4x4_uv;
uint8_t lfl_y[64];
- uint8_t lfl_uv[16];
} LOOP_FILTER_MASK;
+struct loopfilter {
+ int filter_level;
+
+ int sharpness_level;
+ int last_sharpness_level;
+
+ uint8_t mode_ref_delta_enabled;
+ uint8_t mode_ref_delta_update;
+
+ // 0 = Intra, Last, GF, ARF
+ signed char ref_deltas[MAX_REF_LF_DELTAS];
+ signed char last_ref_deltas[MAX_REF_LF_DELTAS];
+
+ // 0 = ZERO_MV, MV
+ signed char mode_deltas[MAX_MODE_LF_DELTAS];
+ signed char last_mode_deltas[MAX_MODE_LF_DELTAS];
+
+ LOOP_FILTER_MASK *lfm;
+ int lfm_stride;
+};
+
/* assorted loopfilter functions which get used elsewhere */
struct VP9Common;
struct macroblockd;
@@ -116,7 +118,7 @@
void vp9_loop_filter_init(struct VP9Common *cm);
// Update the loop filter for the current frame.
-// This should be called before vp9_loop_filter_rows(), vp9_loop_filter_frame()
+// This should be called before vp9_loop_filter_frame(), vp9_build_mask_frame()
// calls this function directly.
void vp9_loop_filter_frame_init(struct VP9Common *cm, int default_filt_lvl);
@@ -126,11 +128,19 @@
int filter_level,
int y_only, int partial_frame);
-// Apply the loop filter to [start, stop) macro block rows in frame_buffer.
-void vp9_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer,
- struct VP9Common *cm,
- struct macroblockd_plane planes[MAX_MB_PLANE],
- int start, int stop, int y_only);
+// Get the superblock lfm for a given mi_row, mi_col.
+static INLINE LOOP_FILTER_MASK *get_lfm(const struct loopfilter *lf,
+ const int mi_row, const int mi_col) {
+ return &lf->lfm[(mi_col >> 3) + ((mi_row >> 3) * lf->lfm_stride)];
+}
+
+void vp9_build_mask(struct VP9Common *cm, const MB_MODE_INFO *mbmi, int mi_row,
+ int mi_col, int bw, int bh);
+void vp9_adjust_mask(struct VP9Common *const cm, const int mi_row,
+ const int mi_col, LOOP_FILTER_MASK *lfm);
+void vp9_build_mask_frame(struct VP9Common *cm, int frame_filter_level,
+ int partial_frame);
+void vp9_reset_lfm(struct VP9Common *const cm);
typedef struct LoopFilterWorkerData {
YV12_BUFFER_CONFIG *frame_buffer;
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index 6fb8dca..90bde55 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -358,7 +358,7 @@
xd->above_context[i] = cm->above_context +
i * sizeof(*cm->above_context) * 2 * mi_cols_aligned_to_sb(cm->mi_cols);
- if (xd->plane[i].plane_type == PLANE_TYPE_Y) {
+ if (get_plane_type(i) == PLANE_TYPE_Y) {
memcpy(xd->plane[i].seg_dequant, cm->y_dequant, sizeof(cm->y_dequant));
} else {
memcpy(xd->plane[i].seg_dequant, cm->uv_dequant, sizeof(cm->uv_dequant));
diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c
index e60eff8..3d84a28 100644
--- a/vp9/common/vp9_reconintra.c
+++ b/vp9/common/vp9_reconintra.c
@@ -133,7 +133,6 @@
int frame_width, frame_height;
int x0, y0;
const struct macroblockd_plane *const pd = &xd->plane[plane];
- // int base=128;
int base = 128 << (bd - 8);
// 127 127 127 .. 127 127 127 127 127 127
// 129 A B .. Y Z
diff --git a/vp9/common/vp9_thread_common.c b/vp9/common/vp9_thread_common.c
index 978e0bf..db78d6b 100644
--- a/vp9/common/vp9_thread_common.c
+++ b/vp9/common/vp9_thread_common.c
@@ -109,29 +109,27 @@
for (mi_row = start; mi_row < stop;
mi_row += lf_sync->num_workers * MI_BLOCK_SIZE) {
MODE_INFO **const mi = cm->mi_grid_visible + mi_row * cm->mi_stride;
+ LOOP_FILTER_MASK *lfm = get_lfm(&cm->lf, mi_row, 0);
- for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) {
+ for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE, ++lfm) {
const int r = mi_row >> MI_BLOCK_SIZE_LOG2;
const int c = mi_col >> MI_BLOCK_SIZE_LOG2;
- LOOP_FILTER_MASK lfm;
int plane;
sync_read(lf_sync, r, c);
vp9_setup_dst_planes(planes, frame_buffer, mi_row, mi_col);
- // TODO(JBB): Make setup_mask work for non 420.
- vp9_setup_mask(cm, mi_row, mi_col, mi + mi_col, cm->mi_stride,
- &lfm);
+ vp9_adjust_mask(cm, mi_row, mi_col, lfm);
- vp9_filter_block_plane_ss00(cm, &planes[0], mi_row, &lfm);
+ vp9_filter_block_plane_ss00(cm, &planes[0], mi_row, lfm);
for (plane = 1; plane < num_planes; ++plane) {
switch (path) {
case LF_PATH_420:
- vp9_filter_block_plane_ss11(cm, &planes[plane], mi_row, &lfm);
+ vp9_filter_block_plane_ss11(cm, &planes[plane], mi_row, lfm);
break;
case LF_PATH_444:
- vp9_filter_block_plane_ss00(cm, &planes[plane], mi_row, &lfm);
+ vp9_filter_block_plane_ss00(cm, &planes[plane], mi_row, lfm);
break;
case LF_PATH_SLOW:
vp9_filter_block_plane_non420(cm, &planes[plane], mi + mi_col,
diff --git a/vp9/common/vp9_thread_common.h b/vp9/common/vp9_thread_common.h
index db6587f..b3b60c2 100644
--- a/vp9/common/vp9_thread_common.h
+++ b/vp9/common/vp9_thread_common.h
@@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#ifndef VP9_COMMON_VP9_LOOPFILTER_THREAD_H_
-#define VP9_COMMON_VP9_LOOPFILTER_THREAD_H_
+#ifndef VP9_COMMON_VP9_THREAD_COMMON_H_
+#define VP9_COMMON_VP9_THREAD_COMMON_H_
#include "./vpx_config.h"
#include "vp9/common/vp9_loopfilter.h"
#include "vpx_util/vpx_thread.h"
@@ -62,4 +62,4 @@
} // extern "C"
#endif
-#endif // VP9_COMMON_VP9_LOOPFILTER_THREAD_H_
+#endif // VP9_COMMON_VP9_THREAD_COMMON_H_
diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c
index fc58a6e..22995bd 100644
--- a/vp9/decoder/vp9_decodeframe.c
+++ b/vp9/decoder/vp9_decodeframe.c
@@ -896,6 +896,10 @@
}
xd->corrupted |= vpx_reader_has_error(r);
+
+ if (cm->lf.filter_level) {
+ vp9_build_mask(cm, mbmi, mi_row, mi_col, bw, bh);
+ }
}
static INLINE int dec_partition_plane_context(const MACROBLOCKD *xd,
@@ -1468,6 +1472,8 @@
memset(cm->above_seg_context, 0,
sizeof(*cm->above_seg_context) * aligned_cols);
+ vp9_reset_lfm(cm);
+
get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers);
if (pbi->tile_data == NULL ||
@@ -1666,6 +1672,8 @@
memset(cm->above_seg_context, 0,
sizeof(*cm->above_seg_context) * aligned_mi_cols);
+ vp9_reset_lfm(cm);
+
// Load tile data into tile_buffers
get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers);
diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c
index e4412dc..5912365 100644
--- a/vp9/decoder/vp9_detokenize.c
+++ b/vp9/decoder/vp9_detokenize.c
@@ -259,7 +259,7 @@
const int16_t *const dequant = pd->seg_dequant[seg_id];
const int ctx = get_entropy_context(tx_size, pd->above_context + x,
pd->left_context + y);
- const int eob = decode_coefs(xd, pd->plane_type,
+ const int eob = decode_coefs(xd, get_plane_type(plane),
pd->dqcoeff, tx_size,
dequant, ctx, sc->scan, sc->neighbors, r);
dec_set_contexts(xd, pd, tx_size, eob > 0, x, y);
diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c
index 00e4c61..3c6a928 100644
--- a/vp9/encoder/vp9_encodemb.c
+++ b/vp9/encoder/vp9_encodemb.c
@@ -99,7 +99,7 @@
tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block);
tran_low_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block);
const int eob = p->eobs[block];
- const PLANE_TYPE type = pd->plane_type;
+ const PLANE_TYPE type = get_plane_type(plane);
const int default_eob = 16 << (tx_size << 1);
const int mul = 1 + (tx_size == TX_32X32);
const int16_t *dequant_ptr = pd->dequant;
@@ -789,7 +789,7 @@
src_diff = &p->src_diff[4 * (j * diff_stride + i)];
if (tx_size == TX_4X4) {
- tx_type = get_tx_type_4x4(pd->plane_type, xd, block);
+ tx_type = get_tx_type_4x4(get_plane_type(plane), xd, block);
scan_order = &vp9_scan_orders[TX_4X4][tx_type];
mode = plane == 0 ? get_y_mode(xd->mi[0], block) : mbmi->uv_mode;
} else {
@@ -797,7 +797,7 @@
if (tx_size == TX_32X32) {
scan_order = &vp9_default_scan_orders[TX_32X32];
} else {
- tx_type = get_tx_type(pd->plane_type, xd);
+ tx_type = get_tx_type(get_plane_type(plane), xd);
scan_order = &vp9_scan_orders[tx_size][tx_type];
}
}
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index 202c112..0615369 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -2764,6 +2764,7 @@
static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
struct loopfilter *lf = &cm->lf;
+
if (xd->lossless) {
lf->filter_level = 0;
} else {
@@ -2780,6 +2781,8 @@
}
if (lf->filter_level > 0) {
+ vp9_build_mask_frame(cm, lf->filter_level, 0);
+
if (cpi->num_workers > 1)
vp9_loop_filter_frame_mt(cm->frame_to_show, cm, xd->plane,
lf->filter_level, 0, 0,
@@ -3127,26 +3130,19 @@
if (oxcf->pass == 0 &&
oxcf->rc_mode == VPX_CBR &&
!cpi->use_svc &&
- oxcf->resize_mode == RESIZE_DYNAMIC) {
- if (cpi->resize_pending == 1) {
- oxcf->scaled_frame_width =
- (cm->width * cpi->resize_scale_num) / cpi->resize_scale_den;
- oxcf->scaled_frame_height =
- (cm->height * cpi->resize_scale_num) /cpi->resize_scale_den;
- } else if (cpi->resize_pending == -1) {
- // Go back up to original size.
- oxcf->scaled_frame_width = oxcf->width;
- oxcf->scaled_frame_height = oxcf->height;
- }
- if (cpi->resize_pending != 0) {
- // There has been a change in frame size.
- vp9_set_size_literal(cpi,
- oxcf->scaled_frame_width,
- oxcf->scaled_frame_height);
+ oxcf->resize_mode == RESIZE_DYNAMIC &&
+ cpi->resize_pending != 0) {
+ oxcf->scaled_frame_width =
+ (oxcf->width * cpi->resize_scale_num) / cpi->resize_scale_den;
+ oxcf->scaled_frame_height =
+ (oxcf->height * cpi->resize_scale_num) /cpi->resize_scale_den;
+ // There has been a change in frame size.
+ vp9_set_size_literal(cpi,
+ oxcf->scaled_frame_width,
+ oxcf->scaled_frame_height);
- // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
- set_mv_search_params(cpi);
- }
+ // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
+ set_mv_search_params(cpi);
}
if ((oxcf->pass == 2) &&
diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c
index 1b1068e..5444bc8 100644
--- a/vp9/encoder/vp9_picklpf.c
+++ b/vp9/encoder/vp9_picklpf.c
@@ -40,6 +40,8 @@
VP9_COMMON *const cm = &cpi->common;
int64_t filt_err;
+ vp9_build_mask_frame(cm, filt_level, partial_frame);
+
if (cpi->num_workers > 1)
vp9_loop_filter_frame_mt(cm->frame_to_show, cm, cpi->td.mb.e_mbd.plane,
filt_level, 1, partial_frame,
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index 973cde8..4fe5561 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -1820,7 +1820,7 @@
int vp9_resize_one_pass_cbr(VP9_COMP *cpi) {
const VP9_COMMON *const cm = &cpi->common;
RATE_CONTROL *const rc = &cpi->rc;
- int resize_now = 0;
+ RESIZE_ACTION resize_action = NO_RESIZE;
cpi->resize_scale_num = 1;
cpi->resize_scale_den = 1;
// Don't resize on key frame; reset the counters on key frame.
@@ -1840,18 +1840,32 @@
// Check for resize action every "window" frames.
if (cpi->resize_count >= window) {
int avg_qp = cpi->resize_avg_qp / cpi->resize_count;
- // Resize down if buffer level has underflowed sufficent amount in past
- // window, and we are at original resolution.
+ // Resize down if buffer level has underflowed sufficient amount in past
+ // window, and we are at original or 3/4 of original resolution.
// Resize back up if average QP is low, and we are currently in a resized
- // down state.
- if (cpi->resize_state == 0 &&
- cpi->resize_buffer_underflow > (cpi->resize_count >> 2)) {
- resize_now = 1;
- cpi->resize_state = 1;
- } else if (cpi->resize_state == 1 &&
- avg_qp < 50 * cpi->rc.worst_quality / 100) {
- resize_now = -1;
- cpi->resize_state = 0;
+ // down state, i.e. 1/2 or 3/4 of original resolution.
+ // Currently, use a flag to turn 3/4 resizing feature on/off.
+ if (cpi->resize_buffer_underflow > (cpi->resize_count >> 1)) {
+ resize_action = DOWN_ONEHALF;
+ cpi->resize_state = ONE_HALF;
+ } else if (cpi->resize_buffer_underflow > (cpi->resize_count >> 2)) {
+ if (cpi->resize_state == THREE_QUARTER || ONEHALFONLY_RESIZE) {
+ resize_action = DOWN_ONEHALF;
+ cpi->resize_state = ONE_HALF;
+ } else if (cpi->resize_state == ORIG) {
+ resize_action = DOWN_THREEFOUR;
+ cpi->resize_state = THREE_QUARTER;
+ }
+ } else if (avg_qp < 60 * cpi->rc.worst_quality / 100) {
+ if (cpi->resize_state == THREE_QUARTER ||
+ avg_qp < 40 * cpi->rc.worst_quality / 100 ||
+ ONEHALFONLY_RESIZE) {
+ resize_action = UP_ORIG;
+ cpi->resize_state = ORIG;
+ } else if (cpi->resize_state == ONE_HALF) {
+ resize_action = UP_THREEFOUR;
+ cpi->resize_state = THREE_QUARTER;
+ }
}
// Reset for next window measurement.
cpi->resize_avg_qp = 0;
@@ -1861,14 +1875,21 @@
}
// If decision is to resize, reset some quantities, and check is we should
// reduce rate correction factor,
- if (resize_now != 0) {
+ if (resize_action != NO_RESIZE) {
int target_bits_per_frame;
int active_worst_quality;
int qindex;
int tot_scale_change;
- // For now, resize is by 1/2 x 1/2.
- cpi->resize_scale_num = 1;
- cpi->resize_scale_den = 2;
+ if (resize_action == DOWN_THREEFOUR || resize_action == UP_THREEFOUR) {
+ cpi->resize_scale_num = 3;
+ cpi->resize_scale_den = 4;
+ } else if (resize_action == DOWN_ONEHALF) {
+ cpi->resize_scale_num = 1;
+ cpi->resize_scale_den = 2;
+ } else { // UP_ORIG or anything else
+ cpi->resize_scale_num = 1;
+ cpi->resize_scale_den = 1;
+ }
tot_scale_change = (cpi->resize_scale_den * cpi->resize_scale_den) /
(cpi->resize_scale_num * cpi->resize_scale_num);
// Reset buffer level to optimal, update target size.
@@ -1880,7 +1901,7 @@
vp9_cyclic_refresh_reset_resize(cpi);
// Get the projected qindex, based on the scaled target frame size (scaled
// so target_bits_per_mb in vp9_rc_regulate_q will be correct target).
- target_bits_per_frame = (resize_now == 1) ?
+ target_bits_per_frame = (resize_action >= 0) ?
rc->this_frame_target * tot_scale_change :
rc->this_frame_target / tot_scale_change;
active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi);
@@ -1891,19 +1912,19 @@
// If resize is down, check if projected q index is close to worst_quality,
// and if so, reduce the rate correction factor (since likely can afford
// lower q for resized frame).
- if (resize_now == 1 &&
+ if (resize_action > 0 &&
qindex > 90 * cpi->rc.worst_quality / 100) {
rc->rate_correction_factors[INTER_NORMAL] *= 0.85;
}
// If resize is back up, check if projected q index is too much above the
// current base_qindex, and if so, reduce the rate correction factor
// (since prefer to keep q for resized frame at least close to previous q).
- if (resize_now == -1 &&
+ if (resize_action < 0 &&
qindex > 130 * cm->base_qindex / 100) {
rc->rate_correction_factors[INTER_NORMAL] *= 0.9;
}
}
- return resize_now;
+ return resize_action;
}
// Compute average source sad (temporal sad: between current source and
diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h
index 11dfa35..eb7c793 100644
--- a/vp9/encoder/vp9_ratectrl.h
+++ b/vp9/encoder/vp9_ratectrl.h
@@ -26,6 +26,7 @@
#define MIN_GF_INTERVAL 4
#define MAX_GF_INTERVAL 16
+#define ONEHALFONLY_RESIZE 1
typedef enum {
INTER_NORMAL = 0,
@@ -43,6 +44,20 @@
FRAME_SCALE_STEPS
} FRAME_SCALE_LEVEL;
+typedef enum {
+ NO_RESIZE = 0,
+ DOWN_THREEFOUR = 1, // From orig to 3/4.
+ DOWN_ONEHALF = 2, // From orig or 3/4 to 1/2.
+ UP_THREEFOUR = -1, // From 1/2 to 3/4.
+ UP_ORIG = -2, // From 1/2 or 3/4 to orig.
+} RESIZE_ACTION;
+
+typedef enum {
+ ORIG = 0,
+ THREE_QUARTER = 1,
+ ONE_HALF = 2
+} RESIZE_STATE;
+
// Frame dimensions multiplier wrt the native frame size, in 1/16ths,
// specified for the scale-up case.
// e.g. 24 => 16/24 = 2/3 of native size. The restriction to 1/16th is
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 0bffcba..1818906 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -341,8 +341,7 @@
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
const struct macroblock_plane *p = &x->plane[plane];
- const struct macroblockd_plane *pd = &xd->plane[plane];
- const PLANE_TYPE type = pd->plane_type;
+ const PLANE_TYPE type = get_plane_type(plane);
const int16_t *band_count = &band_counts[tx_size][1];
const int eob = p->eobs[block];
const tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block);
@@ -358,8 +357,8 @@
#endif
// Check for consistency of tx_size with mode info
- assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size
- : get_uv_tx_size(mbmi, pd) == tx_size);
+ assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size :
+ get_uv_tx_size(mbmi, &xd->plane[plane]) == tx_size);
if (eob == 0) {
// single eob token
@@ -570,7 +569,7 @@
vp9_get_entropy_contexts(bsize, tx_size, pd, args.t_above, args.t_left);
- args.so = get_scan(xd, tx_size, pd->plane_type, 0);
+ args.so = get_scan(xd, tx_size, get_plane_type(plane), 0);
vp9_foreach_transformed_block_in_plane(xd, bsize, plane,
block_rd_txfm, &args);
diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c
index 64a4ebd..25209f4 100644
--- a/vp9/encoder/vp9_svc_layercontext.c
+++ b/vp9/encoder/vp9_svc_layercontext.c
@@ -55,7 +55,6 @@
int layer = LAYER_IDS_TO_IDX(sl, tl, oxcf->ts_number_layers);
LAYER_CONTEXT *const lc = &svc->layer_context[layer];
RATE_CONTROL *const lrc = &lc->rc;
- size_t last_coded_q_map_size;
int i;
lc->current_video_frame_in_layer = 0;
lc->layer_size = 0;
@@ -105,14 +104,18 @@
// Cyclic refresh is only applied on base temporal layer.
if (oxcf->ss_number_layers > 1 &&
tl == 0) {
+ size_t last_coded_q_map_size;
+ size_t consec_zero_mv_size;
lc->sb_index = 0;
lc->map = vpx_malloc(mi_rows * mi_cols * sizeof(signed char));
memset(lc->map, 0, mi_rows * mi_cols);
- last_coded_q_map_size =
- mi_rows * mi_cols * sizeof(uint8_t);
+ last_coded_q_map_size = mi_rows * mi_cols * sizeof(uint8_t);
lc->last_coded_q_map = vpx_malloc(last_coded_q_map_size);
assert(MAXQ <= 255);
memset(lc->last_coded_q_map, MAXQ, last_coded_q_map_size);
+ consec_zero_mv_size = mi_rows * mi_cols * sizeof(uint8_t);
+ lc->consec_zero_mv = vpx_malloc(consec_zero_mv_size);
+ memset(lc->consec_zero_mv, 0, consec_zero_mv_size);
}
}
}
@@ -286,10 +289,13 @@
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
signed char *temp = cr->map;
uint8_t *temp2 = cr->last_coded_q_map;
+ uint8_t *temp3 = cr->consec_zero_mv;
cr->map = lc->map;
lc->map = temp;
cr->last_coded_q_map = lc->last_coded_q_map;
lc->last_coded_q_map = temp2;
+ cr->consec_zero_mv = lc->consec_zero_mv;
+ lc->consec_zero_mv = temp3;
cr->sb_index = lc->sb_index;
}
}
@@ -311,10 +317,13 @@
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
signed char *temp = lc->map;
uint8_t *temp2 = lc->last_coded_q_map;
+ uint8_t *temp3 = lc->consec_zero_mv;
lc->map = cr->map;
cr->map = temp;
lc->last_coded_q_map = cr->last_coded_q_map;
cr->last_coded_q_map = temp2;
+ lc->consec_zero_mv = cr->consec_zero_mv;
+ cr->consec_zero_mv = temp3;
lc->sb_index = cr->sb_index;
}
}
@@ -721,6 +730,8 @@
vpx_free(lc->map);
if (lc->last_coded_q_map)
vpx_free(lc->last_coded_q_map);
+ if (lc->consec_zero_mv)
+ vpx_free(lc->consec_zero_mv);
}
}
}
diff --git a/vp9/encoder/vp9_svc_layercontext.h b/vp9/encoder/vp9_svc_layercontext.h
index ae55c2f..8feab29 100644
--- a/vp9/encoder/vp9_svc_layercontext.h
+++ b/vp9/encoder/vp9_svc_layercontext.h
@@ -45,6 +45,7 @@
int sb_index;
signed char *map;
uint8_t *last_coded_q_map;
+ uint8_t *consec_zero_mv;
} LAYER_CONTEXT;
typedef struct {
diff --git a/vp9/encoder/vp9_tokenize.c b/vp9/encoder/vp9_tokenize.c
index 85cb2fc..d9c2193 100644
--- a/vp9/encoder/vp9_tokenize.c
+++ b/vp9/encoder/vp9_tokenize.c
@@ -503,7 +503,7 @@
int c;
TOKENEXTRA *t = *tp; /* store tokens starting here */
int eob = p->eobs[block];
- const PLANE_TYPE type = pd->plane_type;
+ const PLANE_TYPE type = get_plane_type(plane);
const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
const int segment_id = mbmi->segment_id;
const int16_t *scan, *nb;
diff --git a/vpx_dsp/intrapred.c b/vpx_dsp/intrapred.c
index 9ba0f64..aafd8bf 100644
--- a/vpx_dsp/intrapred.c
+++ b/vpx_dsp/intrapred.c
@@ -247,6 +247,38 @@
}
}
+void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
+ const uint8_t *above, const uint8_t *left) {
+ const int H = above[-1];
+ const int I = left[0];
+ const int J = left[1];
+ const int K = left[2];
+ const int L = left[3];
+
+ memset(dst + stride * 0, AVG3(H, I, J), 4);
+ memset(dst + stride * 1, AVG3(I, J, K), 4);
+ memset(dst + stride * 2, AVG3(J, K, L), 4);
+ memset(dst + stride * 3, AVG3(K, L, L), 4);
+}
+
+void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
+ const uint8_t *above, const uint8_t *left) {
+ const int H = above[-1];
+ const int I = above[0];
+ const int J = above[1];
+ const int K = above[2];
+ const int L = above[3];
+ const int M = above[4];
+
+ dst[0] = AVG3(H, I, J);
+ dst[1] = AVG3(I, J, K);
+ dst[2] = AVG3(J, K, L);
+ dst[3] = AVG3(K, L, M);
+ memcpy(dst + stride * 1, dst, 4);
+ memcpy(dst + stride * 2, dst, 4);
+ memcpy(dst + stride * 3, dst, 4);
+}
+
void vpx_d207_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
const uint8_t *above, const uint8_t *left) {
const int I = left[0];
@@ -287,6 +319,30 @@
DST(3, 3) = AVG3(E, F, G); // differs from vp8
}
+void vpx_d63e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
+ const uint8_t *above, const uint8_t *left) {
+ const int A = above[0];
+ const int B = above[1];
+ const int C = above[2];
+ const int D = above[3];
+ const int E = above[4];
+ const int F = above[5];
+ const int G = above[6];
+ const int H = above[7];
+ (void)left;
+ DST(0, 0) = AVG2(A, B);
+ DST(1, 0) = DST(0, 2) = AVG2(B, C);
+ DST(2, 0) = DST(1, 2) = AVG2(C, D);
+ DST(3, 0) = DST(2, 2) = AVG2(D, E);
+ DST(3, 2) = AVG3(E, F, G);
+
+ DST(0, 1) = AVG3(A, B, C);
+ DST(1, 1) = DST(0, 3) = AVG3(B, C, D);
+ DST(2, 1) = DST(1, 3) = AVG3(C, D, E);
+ DST(3, 1) = DST(2, 3) = AVG3(D, E, F);
+ DST(3, 3) = AVG3(F, G, H);
+}
+
void vpx_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
const uint8_t *above, const uint8_t *left) {
const int A = above[0];
@@ -308,6 +364,27 @@
DST(3, 3) = H; // differs from vp8
}
+void vpx_d45e_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
+ const uint8_t *above, const uint8_t *left) {
+ const int A = above[0];
+ const int B = above[1];
+ const int C = above[2];
+ const int D = above[3];
+ const int E = above[4];
+ const int F = above[5];
+ const int G = above[6];
+ const int H = above[7];
+ (void)stride;
+ (void)left;
+ DST(0, 0) = AVG3(A, B, C);
+ DST(1, 0) = DST(0, 1) = AVG3(B, C, D);
+ DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E);
+ DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F);
+ DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G);
+ DST(3, 2) = DST(2, 3) = AVG3(F, G, H);
+ DST(3, 3) = AVG3(G, H, H);
+}
+
void vpx_d117_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride,
const uint8_t *above, const uint8_t *left) {
const int I = left[0];
diff --git a/vpx_dsp/vpx_dsp.mk b/vpx_dsp/vpx_dsp.mk
index 98a3d34..31d8c75 100644
--- a/vpx_dsp/vpx_dsp.mk
+++ b/vpx_dsp/vpx_dsp.mk
@@ -36,7 +36,6 @@
endif
# intra predictions
-ifneq ($(filter yes,$(CONFIG_VP9) $(CONFIG_VP10)),)
DSP_SRCS-yes += intrapred.c
ifeq ($(CONFIG_USE_X86INC),yes)
@@ -59,7 +58,6 @@
DSP_SRCS-$(HAVE_DSPR2) += mips/intrapred4_dspr2.c
DSP_SRCS-$(HAVE_DSPR2) += mips/intrapred8_dspr2.c
DSP_SRCS-$(HAVE_DSPR2) += mips/intrapred16_dspr2.c
-endif # CONFIG_VP9 || CONFIG_VP10
DSP_SRCS-$(HAVE_DSPR2) += mips/common_dspr2.h
DSP_SRCS-$(HAVE_DSPR2) += mips/common_dspr2.c
diff --git a/vpx_dsp/vpx_dsp_rtcd_defs.pl b/vpx_dsp/vpx_dsp_rtcd_defs.pl
index 507c090..1916f3d 100644
--- a/vpx_dsp/vpx_dsp_rtcd_defs.pl
+++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl
@@ -54,322 +54,332 @@
# Intra prediction
#
-if ((vpx_config("CONFIG_VP9") eq "yes") || (vpx_config("CONFIG_VP10") eq "yes")) {
- add_proto qw/void vpx_d207_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d207_predictor_4x4/, "$ssse3_x86inc";
+add_proto qw/void vpx_d207_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d207_predictor_4x4/, "$ssse3_x86inc";
- add_proto qw/void vpx_d45_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d45_predictor_4x4 neon/, "$ssse3_x86inc";
+add_proto qw/void vpx_d45_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d45_predictor_4x4 neon/, "$ssse3_x86inc";
- add_proto qw/void vpx_d63_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d63_predictor_4x4/, "$ssse3_x86inc";
+add_proto qw/void vpx_d45e_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d45e_predictor_4x4/;
- add_proto qw/void vpx_h_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_h_predictor_4x4 neon dspr2 msa/, "$ssse3_x86inc";
+add_proto qw/void vpx_d63_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d63_predictor_4x4/, "$ssse3_x86inc";
- add_proto qw/void vpx_d117_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d117_predictor_4x4/;
+add_proto qw/void vpx_d63e_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d63e_predictor_4x4/;
- add_proto qw/void vpx_d135_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d135_predictor_4x4 neon/;
+add_proto qw/void vpx_h_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_h_predictor_4x4 neon dspr2 msa/, "$ssse3_x86inc";
- add_proto qw/void vpx_d153_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d153_predictor_4x4/, "$ssse3_x86inc";
+add_proto qw/void vpx_he_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_he_predictor_4x4/;
- add_proto qw/void vpx_v_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_v_predictor_4x4 neon msa/, "$sse_x86inc";
+add_proto qw/void vpx_d117_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d117_predictor_4x4/;
- add_proto qw/void vpx_tm_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_tm_predictor_4x4 neon dspr2 msa/, "$sse_x86inc";
+add_proto qw/void vpx_d135_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d135_predictor_4x4 neon/;
- add_proto qw/void vpx_dc_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_predictor_4x4 dspr2 msa neon/, "$sse_x86inc";
+add_proto qw/void vpx_d153_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d153_predictor_4x4/, "$ssse3_x86inc";
- add_proto qw/void vpx_dc_top_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_top_predictor_4x4 msa neon/, "$sse_x86inc";
+add_proto qw/void vpx_v_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_v_predictor_4x4 neon msa/, "$sse_x86inc";
- add_proto qw/void vpx_dc_left_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_left_predictor_4x4 msa neon/, "$sse_x86inc";
+add_proto qw/void vpx_ve_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_ve_predictor_4x4/;
- add_proto qw/void vpx_dc_128_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_128_predictor_4x4 msa neon/, "$sse_x86inc";
+add_proto qw/void vpx_tm_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_tm_predictor_4x4 neon dspr2 msa/, "$sse_x86inc";
- add_proto qw/void vpx_d207_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d207_predictor_8x8/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_predictor_4x4 dspr2 msa neon/, "$sse_x86inc";
- add_proto qw/void vpx_d45_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d45_predictor_8x8 neon/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_top_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_top_predictor_4x4 msa neon/, "$sse_x86inc";
- add_proto qw/void vpx_d63_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d63_predictor_8x8/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_left_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_left_predictor_4x4 msa neon/, "$sse_x86inc";
- add_proto qw/void vpx_h_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_h_predictor_8x8 neon dspr2 msa/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_128_predictor_4x4/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_128_predictor_4x4 msa neon/, "$sse_x86inc";
- add_proto qw/void vpx_d117_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d117_predictor_8x8/;
+add_proto qw/void vpx_d207_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d207_predictor_8x8/, "$ssse3_x86inc";
- add_proto qw/void vpx_d135_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d135_predictor_8x8/;
+add_proto qw/void vpx_d45_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d45_predictor_8x8 neon/, "$ssse3_x86inc";
- add_proto qw/void vpx_d153_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d153_predictor_8x8/, "$ssse3_x86inc";
+add_proto qw/void vpx_d63_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d63_predictor_8x8/, "$ssse3_x86inc";
- add_proto qw/void vpx_v_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_v_predictor_8x8 neon msa/, "$sse_x86inc";
+add_proto qw/void vpx_h_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_h_predictor_8x8 neon dspr2 msa/, "$ssse3_x86inc";
- add_proto qw/void vpx_tm_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_tm_predictor_8x8 neon dspr2 msa/, "$sse2_x86inc";
+add_proto qw/void vpx_d117_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d117_predictor_8x8/;
- add_proto qw/void vpx_dc_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_predictor_8x8 dspr2 neon msa/, "$sse_x86inc";
+add_proto qw/void vpx_d135_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d135_predictor_8x8/;
- add_proto qw/void vpx_dc_top_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_top_predictor_8x8 neon msa/, "$sse_x86inc";
+add_proto qw/void vpx_d153_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d153_predictor_8x8/, "$ssse3_x86inc";
- add_proto qw/void vpx_dc_left_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_left_predictor_8x8 neon msa/, "$sse_x86inc";
+add_proto qw/void vpx_v_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_v_predictor_8x8 neon msa/, "$sse_x86inc";
- add_proto qw/void vpx_dc_128_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_128_predictor_8x8 neon msa/, "$sse_x86inc";
+add_proto qw/void vpx_tm_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_tm_predictor_8x8 neon dspr2 msa/, "$sse2_x86inc";
- add_proto qw/void vpx_d207_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d207_predictor_16x16/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_predictor_8x8 dspr2 neon msa/, "$sse_x86inc";
- add_proto qw/void vpx_d45_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d45_predictor_16x16 neon/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_top_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_top_predictor_8x8 neon msa/, "$sse_x86inc";
- add_proto qw/void vpx_d63_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d63_predictor_16x16/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_left_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_left_predictor_8x8 neon msa/, "$sse_x86inc";
- add_proto qw/void vpx_h_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_h_predictor_16x16 neon dspr2 msa/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_128_predictor_8x8/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_128_predictor_8x8 neon msa/, "$sse_x86inc";
- add_proto qw/void vpx_d117_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d117_predictor_16x16/;
+add_proto qw/void vpx_d207_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d207_predictor_16x16/, "$ssse3_x86inc";
- add_proto qw/void vpx_d135_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d135_predictor_16x16/;
+add_proto qw/void vpx_d45_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d45_predictor_16x16 neon/, "$ssse3_x86inc";
- add_proto qw/void vpx_d153_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d153_predictor_16x16/, "$ssse3_x86inc";
+add_proto qw/void vpx_d63_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d63_predictor_16x16/, "$ssse3_x86inc";
- add_proto qw/void vpx_v_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_v_predictor_16x16 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_h_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_h_predictor_16x16 neon dspr2 msa/, "$ssse3_x86inc";
- add_proto qw/void vpx_tm_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_tm_predictor_16x16 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_d117_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d117_predictor_16x16/;
- add_proto qw/void vpx_dc_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_predictor_16x16 dspr2 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_d135_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d135_predictor_16x16/;
- add_proto qw/void vpx_dc_top_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_top_predictor_16x16 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_d153_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d153_predictor_16x16/, "$ssse3_x86inc";
- add_proto qw/void vpx_dc_left_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_left_predictor_16x16 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_v_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_v_predictor_16x16 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_dc_128_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_128_predictor_16x16 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_tm_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_tm_predictor_16x16 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_d207_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d207_predictor_32x32/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_predictor_16x16 dspr2 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_d45_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d45_predictor_32x32/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_top_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_top_predictor_16x16 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_d63_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d63_predictor_32x32/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_left_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_left_predictor_16x16 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_h_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_h_predictor_32x32 neon msa/, "$ssse3_x86inc";
+add_proto qw/void vpx_dc_128_predictor_16x16/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_128_predictor_16x16 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_d117_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d117_predictor_32x32/;
+add_proto qw/void vpx_d207_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d207_predictor_32x32/, "$ssse3_x86inc";
- add_proto qw/void vpx_d135_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d135_predictor_32x32/;
+add_proto qw/void vpx_d45_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d45_predictor_32x32/, "$ssse3_x86inc";
- add_proto qw/void vpx_d153_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_d153_predictor_32x32/, "$ssse3_x86inc";
+add_proto qw/void vpx_d63_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d63_predictor_32x32/, "$ssse3_x86inc";
- add_proto qw/void vpx_v_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_v_predictor_32x32 neon msa/, "$sse2_x86inc";
+add_proto qw/void vpx_h_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_h_predictor_32x32 neon msa/, "$ssse3_x86inc";
- add_proto qw/void vpx_tm_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_tm_predictor_32x32 neon msa/, "$sse2_x86_64_x86inc";
+add_proto qw/void vpx_d117_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d117_predictor_32x32/;
- add_proto qw/void vpx_dc_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_predictor_32x32 msa neon/, "$sse2_x86inc";
+add_proto qw/void vpx_d135_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d135_predictor_32x32/;
- add_proto qw/void vpx_dc_top_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_top_predictor_32x32 msa neon/, "$sse2_x86inc";
+add_proto qw/void vpx_d153_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_d153_predictor_32x32/, "$ssse3_x86inc";
- add_proto qw/void vpx_dc_left_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_left_predictor_32x32 msa neon/, "$sse2_x86inc";
+add_proto qw/void vpx_v_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_v_predictor_32x32 neon msa/, "$sse2_x86inc";
- add_proto qw/void vpx_dc_128_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
- specialize qw/vpx_dc_128_predictor_32x32 msa neon/, "$sse2_x86inc";
+add_proto qw/void vpx_tm_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_tm_predictor_32x32 neon msa/, "$sse2_x86_64_x86inc";
+
+add_proto qw/void vpx_dc_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_predictor_32x32 msa neon/, "$sse2_x86inc";
+
+add_proto qw/void vpx_dc_top_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_top_predictor_32x32 msa neon/, "$sse2_x86inc";
+
+add_proto qw/void vpx_dc_left_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_left_predictor_32x32 msa neon/, "$sse2_x86inc";
+
+add_proto qw/void vpx_dc_128_predictor_32x32/, "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left";
+specialize qw/vpx_dc_128_predictor_32x32 msa neon/, "$sse2_x86inc";
# High bitdepth functions
- if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
- add_proto qw/void vpx_highbd_d207_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d207_predictor_4x4/;
+if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
+ add_proto qw/void vpx_highbd_d207_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d207_predictor_4x4/;
- add_proto qw/void vpx_highbd_d45_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d45_predictor_4x4/;
+ add_proto qw/void vpx_highbd_d45_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d45_predictor_4x4/;
- add_proto qw/void vpx_highbd_d63_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d63_predictor_4x4/;
+ add_proto qw/void vpx_highbd_d63_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d63_predictor_4x4/;
- add_proto qw/void vpx_highbd_h_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_h_predictor_4x4/;
+ add_proto qw/void vpx_highbd_h_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_h_predictor_4x4/;
- add_proto qw/void vpx_highbd_d117_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d117_predictor_4x4/;
+ add_proto qw/void vpx_highbd_d117_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d117_predictor_4x4/;
- add_proto qw/void vpx_highbd_d135_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d135_predictor_4x4/;
+ add_proto qw/void vpx_highbd_d135_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d135_predictor_4x4/;
- add_proto qw/void vpx_highbd_d153_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d153_predictor_4x4/;
+ add_proto qw/void vpx_highbd_d153_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d153_predictor_4x4/;
- add_proto qw/void vpx_highbd_v_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_v_predictor_4x4/, "$sse_x86inc";
+ add_proto qw/void vpx_highbd_v_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_v_predictor_4x4/, "$sse_x86inc";
- add_proto qw/void vpx_highbd_tm_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_tm_predictor_4x4/, "$sse_x86inc";
+ add_proto qw/void vpx_highbd_tm_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_tm_predictor_4x4/, "$sse_x86inc";
- add_proto qw/void vpx_highbd_dc_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_predictor_4x4/, "$sse_x86inc";
+ add_proto qw/void vpx_highbd_dc_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_predictor_4x4/, "$sse_x86inc";
- add_proto qw/void vpx_highbd_dc_top_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_top_predictor_4x4/;
+ add_proto qw/void vpx_highbd_dc_top_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_top_predictor_4x4/;
- add_proto qw/void vpx_highbd_dc_left_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_left_predictor_4x4/;
+ add_proto qw/void vpx_highbd_dc_left_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_left_predictor_4x4/;
- add_proto qw/void vpx_highbd_dc_128_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_128_predictor_4x4/;
+ add_proto qw/void vpx_highbd_dc_128_predictor_4x4/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_128_predictor_4x4/;
- add_proto qw/void vpx_highbd_d207_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d207_predictor_8x8/;
+ add_proto qw/void vpx_highbd_d207_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d207_predictor_8x8/;
- add_proto qw/void vpx_highbd_d45_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d45_predictor_8x8/;
+ add_proto qw/void vpx_highbd_d45_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d45_predictor_8x8/;
- add_proto qw/void vpx_highbd_d63_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d63_predictor_8x8/;
+ add_proto qw/void vpx_highbd_d63_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d63_predictor_8x8/;
- add_proto qw/void vpx_highbd_h_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_h_predictor_8x8/;
+ add_proto qw/void vpx_highbd_h_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_h_predictor_8x8/;
- add_proto qw/void vpx_highbd_d117_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d117_predictor_8x8/;
+ add_proto qw/void vpx_highbd_d117_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d117_predictor_8x8/;
- add_proto qw/void vpx_highbd_d135_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d135_predictor_8x8/;
+ add_proto qw/void vpx_highbd_d135_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d135_predictor_8x8/;
- add_proto qw/void vpx_highbd_d153_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d153_predictor_8x8/;
+ add_proto qw/void vpx_highbd_d153_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d153_predictor_8x8/;
- add_proto qw/void vpx_highbd_v_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_v_predictor_8x8/, "$sse2_x86inc";
+ add_proto qw/void vpx_highbd_v_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_v_predictor_8x8/, "$sse2_x86inc";
- add_proto qw/void vpx_highbd_tm_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_tm_predictor_8x8/, "$sse2_x86inc";
+ add_proto qw/void vpx_highbd_tm_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_tm_predictor_8x8/, "$sse2_x86inc";
- add_proto qw/void vpx_highbd_dc_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_predictor_8x8/, "$sse2_x86inc";;
+ add_proto qw/void vpx_highbd_dc_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_predictor_8x8/, "$sse2_x86inc";;
- add_proto qw/void vpx_highbd_dc_top_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_top_predictor_8x8/;
+ add_proto qw/void vpx_highbd_dc_top_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_top_predictor_8x8/;
- add_proto qw/void vpx_highbd_dc_left_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_left_predictor_8x8/;
+ add_proto qw/void vpx_highbd_dc_left_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_left_predictor_8x8/;
- add_proto qw/void vpx_highbd_dc_128_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_128_predictor_8x8/;
+ add_proto qw/void vpx_highbd_dc_128_predictor_8x8/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_128_predictor_8x8/;
- add_proto qw/void vpx_highbd_d207_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d207_predictor_16x16/;
+ add_proto qw/void vpx_highbd_d207_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d207_predictor_16x16/;
- add_proto qw/void vpx_highbd_d45_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d45_predictor_16x16/;
+ add_proto qw/void vpx_highbd_d45_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d45_predictor_16x16/;
- add_proto qw/void vpx_highbd_d63_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d63_predictor_16x16/;
+ add_proto qw/void vpx_highbd_d63_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d63_predictor_16x16/;
- add_proto qw/void vpx_highbd_h_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_h_predictor_16x16/;
+ add_proto qw/void vpx_highbd_h_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_h_predictor_16x16/;
- add_proto qw/void vpx_highbd_d117_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d117_predictor_16x16/;
+ add_proto qw/void vpx_highbd_d117_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d117_predictor_16x16/;
- add_proto qw/void vpx_highbd_d135_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d135_predictor_16x16/;
+ add_proto qw/void vpx_highbd_d135_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d135_predictor_16x16/;
- add_proto qw/void vpx_highbd_d153_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d153_predictor_16x16/;
+ add_proto qw/void vpx_highbd_d153_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d153_predictor_16x16/;
- add_proto qw/void vpx_highbd_v_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_v_predictor_16x16/, "$sse2_x86inc";
+ add_proto qw/void vpx_highbd_v_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_v_predictor_16x16/, "$sse2_x86inc";
- add_proto qw/void vpx_highbd_tm_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_tm_predictor_16x16/, "$sse2_x86_64_x86inc";
+ add_proto qw/void vpx_highbd_tm_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_tm_predictor_16x16/, "$sse2_x86_64_x86inc";
- add_proto qw/void vpx_highbd_dc_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_predictor_16x16/, "$sse2_x86inc";
+ add_proto qw/void vpx_highbd_dc_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_predictor_16x16/, "$sse2_x86inc";
- add_proto qw/void vpx_highbd_dc_top_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_top_predictor_16x16/;
+ add_proto qw/void vpx_highbd_dc_top_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_top_predictor_16x16/;
- add_proto qw/void vpx_highbd_dc_left_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_left_predictor_16x16/;
+ add_proto qw/void vpx_highbd_dc_left_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_left_predictor_16x16/;
- add_proto qw/void vpx_highbd_dc_128_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_128_predictor_16x16/;
+ add_proto qw/void vpx_highbd_dc_128_predictor_16x16/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_128_predictor_16x16/;
- add_proto qw/void vpx_highbd_d207_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d207_predictor_32x32/;
+ add_proto qw/void vpx_highbd_d207_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d207_predictor_32x32/;
- add_proto qw/void vpx_highbd_d45_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d45_predictor_32x32/;
+ add_proto qw/void vpx_highbd_d45_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d45_predictor_32x32/;
- add_proto qw/void vpx_highbd_d63_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d63_predictor_32x32/;
+ add_proto qw/void vpx_highbd_d63_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d63_predictor_32x32/;
- add_proto qw/void vpx_highbd_h_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_h_predictor_32x32/;
+ add_proto qw/void vpx_highbd_h_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_h_predictor_32x32/;
- add_proto qw/void vpx_highbd_d117_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d117_predictor_32x32/;
+ add_proto qw/void vpx_highbd_d117_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d117_predictor_32x32/;
- add_proto qw/void vpx_highbd_d135_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d135_predictor_32x32/;
+ add_proto qw/void vpx_highbd_d135_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d135_predictor_32x32/;
- add_proto qw/void vpx_highbd_d153_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_d153_predictor_32x32/;
+ add_proto qw/void vpx_highbd_d153_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_d153_predictor_32x32/;
- add_proto qw/void vpx_highbd_v_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_v_predictor_32x32/, "$sse2_x86inc";
+ add_proto qw/void vpx_highbd_v_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_v_predictor_32x32/, "$sse2_x86inc";
- add_proto qw/void vpx_highbd_tm_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_tm_predictor_32x32/, "$sse2_x86_64_x86inc";
+ add_proto qw/void vpx_highbd_tm_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_tm_predictor_32x32/, "$sse2_x86_64_x86inc";
- add_proto qw/void vpx_highbd_dc_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_predictor_32x32/, "$sse2_x86_64_x86inc";
+ add_proto qw/void vpx_highbd_dc_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_predictor_32x32/, "$sse2_x86_64_x86inc";
- add_proto qw/void vpx_highbd_dc_top_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_top_predictor_32x32/;
+ add_proto qw/void vpx_highbd_dc_top_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_top_predictor_32x32/;
- add_proto qw/void vpx_highbd_dc_left_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_left_predictor_32x32/;
+ add_proto qw/void vpx_highbd_dc_left_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_left_predictor_32x32/;
- add_proto qw/void vpx_highbd_dc_128_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
- specialize qw/vpx_highbd_dc_128_predictor_32x32/;
- } # CONFIG_VP9_HIGHBITDEPTH
-} # CONFIG_VP9 || CONFIG_VP10
+ add_proto qw/void vpx_highbd_dc_128_predictor_32x32/, "uint16_t *dst, ptrdiff_t y_stride, const uint16_t *above, const uint16_t *left, int bd";
+ specialize qw/vpx_highbd_dc_128_predictor_32x32/;
+} # CONFIG_VP9_HIGHBITDEPTH
#
# Sub Pixel Filters
diff --git a/vpxenc.c b/vpxenc.c
index 06604ea..cb78226 100644
--- a/vpxenc.c
+++ b/vpxenc.c
@@ -1996,7 +1996,7 @@
usage_exit();
/* Decide if other chroma subsamplings than 4:2:0 are supported */
- if (global.codec->fourcc == VP9_FOURCC)
+ if (global.codec->fourcc == VP9_FOURCC || global.codec->fourcc == VP10_FOURCC)
input.only_i420 = 0;
for (pass = global.pass ? global.pass - 1 : 0; pass < global.passes; pass++) {