blob: 7c83e246f686f22ec7bf73316af8a1e79d937c0c [file] [log] [blame]
// Copyright 2019 The libgav1 Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/dsp/constants.h"
#include <cstdint>
namespace libgav1 {
// Each set of 7 taps is padded with a 0 to easily align and pack into the high
// and low 8 bytes. This way, we can load 16 at a time to fit mulhi and mullo.
const int8_t kFilterIntraTaps[kNumFilterIntraPredictors][8][8] = {
{{-6, 10, 0, 0, 0, 12, 0, 0},
{-5, 2, 10, 0, 0, 9, 0, 0},
{-3, 1, 1, 10, 0, 7, 0, 0},
{-3, 1, 1, 2, 10, 5, 0, 0},
{-4, 6, 0, 0, 0, 2, 12, 0},
{-3, 2, 6, 0, 0, 2, 9, 0},
{-3, 2, 2, 6, 0, 2, 7, 0},
{-3, 1, 2, 2, 6, 3, 5, 0}},
{{-10, 16, 0, 0, 0, 10, 0, 0},
{-6, 0, 16, 0, 0, 6, 0, 0},
{-4, 0, 0, 16, 0, 4, 0, 0},
{-2, 0, 0, 0, 16, 2, 0, 0},
{-10, 16, 0, 0, 0, 0, 10, 0},
{-6, 0, 16, 0, 0, 0, 6, 0},
{-4, 0, 0, 16, 0, 0, 4, 0},
{-2, 0, 0, 0, 16, 0, 2, 0}},
{{-8, 8, 0, 0, 0, 16, 0, 0},
{-8, 0, 8, 0, 0, 16, 0, 0},
{-8, 0, 0, 8, 0, 16, 0, 0},
{-8, 0, 0, 0, 8, 16, 0, 0},
{-4, 4, 0, 0, 0, 0, 16, 0},
{-4, 0, 4, 0, 0, 0, 16, 0},
{-4, 0, 0, 4, 0, 0, 16, 0},
{-4, 0, 0, 0, 4, 0, 16, 0}},
{{-2, 8, 0, 0, 0, 10, 0, 0},
{-1, 3, 8, 0, 0, 6, 0, 0},
{-1, 2, 3, 8, 0, 4, 0, 0},
{0, 1, 2, 3, 8, 2, 0, 0},
{-1, 4, 0, 0, 0, 3, 10, 0},
{-1, 3, 4, 0, 0, 4, 6, 0},
{-1, 2, 3, 4, 0, 4, 4, 0},
{-1, 2, 2, 3, 4, 3, 3, 0}},
{{-12, 14, 0, 0, 0, 14, 0, 0},
{-10, 0, 14, 0, 0, 12, 0, 0},
{-9, 0, 0, 14, 0, 11, 0, 0},
{-8, 0, 0, 0, 14, 10, 0, 0},
{-10, 12, 0, 0, 0, 0, 14, 0},
{-9, 1, 12, 0, 0, 0, 12, 0},
{-8, 0, 0, 12, 0, 1, 11, 0},
{-7, 0, 0, 1, 12, 1, 9, 0}}};
// A lookup table replacing the calculation of the variable s in Section 7.17.3
// (Box filter process). The first index is sgr_proj_index (the lr_sgr_set
// syntax element in the Spec, saved in the sgr_proj_info.index field of a
// RestorationUnitInfo struct). The second index is pass (0 or 1).
//
// const uint8_t scale = kSgrProjParams[sgr_proj_index][pass * 2 + 1];
// const uint32_t n2_with_scale = n * n * scale;
// const uint32_t s =
// ((1 << kSgrProjScaleBits) + (n2_with_scale >> 1)) / n2_with_scale;
// 0 is an invalid value, corresponding to radius = 0, where the filter is
// skipped.
const uint16_t kSgrScaleParameter[16][2] = {
{140, 3236}, {112, 2158}, {93, 1618}, {80, 1438}, {70, 1295}, {58, 1177},
{47, 1079}, {37, 996}, {30, 925}, {25, 863}, {0, 2589}, {0, 1618},
{0, 1177}, {0, 925}, {56, 0}, {22, 0},
};
} // namespace libgav1