16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
11ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include <assert.h>
12ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/common/vp9_filter.h"
146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
15411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgconst InterpKernel vp9_bilinear_filters[SUBPEL_SHIFTS] = {
1606d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0, 128,   0, 0, 0, 0 },
1706d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0, 120,   8, 0, 0, 0 },
1806d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0, 112,  16, 0, 0, 0 },
1906d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0, 104,  24, 0, 0, 0 },
2006d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  96,  32, 0, 0, 0 },
2106d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  88,  40, 0, 0, 0 },
2206d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  80,  48, 0, 0, 0 },
2306d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  72,  56, 0, 0, 0 },
2406d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  64,  64, 0, 0, 0 },
2506d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  56,  72, 0, 0, 0 },
2606d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  48,  80, 0, 0, 0 },
2706d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  40,  88, 0, 0, 0 },
2806d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  32,  96, 0, 0, 0 },
2906d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  24, 104, 0, 0, 0 },
3006d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,  16, 112, 0, 0, 0 },
3106d88a191f52640d533e6204ba067d1fd6fc0accjohannkoenig@chromium.org  { 0, 0, 0,   8, 120, 0, 0, 0 }
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org};
336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
3453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org// Lagrangian interpolation filter
3588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgDECLARE_ALIGNED(256, const InterpKernel,
3688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                vp9_sub_pel_filters_8[SUBPEL_SHIFTS]) = {
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { 0,   0,   0, 128,   0,   0,   0,  0},
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { 0,   1,  -5, 126,   8,  -3,   1,  0},
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   3, -10, 122,  18,  -6,   2,  0},
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   4, -13, 118,  27,  -9,   3, -1},
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   4, -16, 112,  37, -11,   4, -1},
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   5, -18, 105,  48, -14,   4, -1},
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   5, -19,  97,  58, -16,   5, -1},
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   6, -19,  88,  68, -18,   5, -1},
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   6, -19,  78,  78, -19,   6, -1},
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   5, -18,  68,  88, -19,   6, -1},
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   5, -16,  58,  97, -19,   5, -1},
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   4, -14,  48, 105, -18,   5, -1},
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   4, -11,  37, 112, -16,   4, -1},
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { -1,   3,  -9,  27, 118, -13,   4, -1},
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { 0,   2,  -6,  18, 122, -10,   3, -1},
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  { 0,   1,  -3,   8, 126,  -5,   1,  0}
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org};
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
5553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org// DCT based filter
5688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgDECLARE_ALIGNED(256, const InterpKernel,
5788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                vp9_sub_pel_filters_8s[SUBPEL_SHIFTS]) = {
586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {0,   0,   0, 128,   0,   0,   0, 0},
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-1,   3,  -7, 127,   8,  -3,   1, 0},
606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-2,   5, -13, 125,  17,  -6,   3, -1},
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-3,   7, -17, 121,  27, -10,   5, -2},
626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-4,   9, -20, 115,  37, -13,   6, -2},
636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-4,  10, -23, 108,  48, -16,   8, -3},
646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-4,  10, -24, 100,  59, -19,   9, -3},
656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-4,  11, -24,  90,  70, -21,  10, -4},
666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-4,  11, -23,  80,  80, -23,  11, -4},
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-4,  10, -21,  70,  90, -24,  11, -4},
686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-3,   9, -19,  59, 100, -24,  10, -4},
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-3,   8, -16,  48, 108, -23,  10, -4},
706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-2,   6, -13,  37, 115, -20,   9, -4},
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-2,   5, -10,  27, 121, -17,   7, -3},
726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {-1,   3,  -6,  17, 125, -13,   5, -2},
736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {0,   1,  -3,   8, 127,  -7,   3, -1}
746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org};
756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
7653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org// freqmultiplier = 0.5
7788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgDECLARE_ALIGNED(256, const InterpKernel,
7888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                vp9_sub_pel_filters_8lp[SUBPEL_SHIFTS]) = {
7910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0,  0,  0, 128,  0,  0,  0,  0},
8010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-3, -1, 32,  64, 38,  1, -3,  0},
8110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-2, -2, 29,  63, 41,  2, -3,  0},
8210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-2, -2, 26,  63, 43,  4, -4,  0},
8310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-2, -3, 24,  62, 46,  5, -4,  0},
8410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-2, -3, 21,  60, 49,  7, -4,  0},
8510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-1, -4, 18,  59, 51,  9, -4,  0},
8610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-1, -4, 16,  57, 53, 12, -4, -1},
8710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-1, -4, 14,  55, 55, 14, -4, -1},
8810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  {-1, -4, 12,  53, 57, 16, -4, -1},
8910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0, -4,  9,  51, 59, 18, -4, -1},
9010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0, -4,  7,  49, 60, 21, -3, -2},
9110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0, -4,  5,  46, 62, 24, -3, -2},
9210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0, -4,  4,  43, 63, 26, -2, -2},
9310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0, -3,  2,  41, 63, 29, -2, -2},
9410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  { 0, -3,  1,  38, 64, 32, -1, -3}
956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org};
96ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
97d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
9876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic const InterpKernel* vp9_filter_kernels[4] = {
99d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  vp9_sub_pel_filters_8,
100d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  vp9_sub_pel_filters_8lp,
101d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  vp9_sub_pel_filters_8s,
102d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  vp9_bilinear_filters
103d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org};
104d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
10576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst InterpKernel *vp9_get_interp_kernel(INTERP_FILTER filter) {
10676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  assert(filter != SWITCHABLE);
107dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org  return vp9_filter_kernels[filter];
108ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
109ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
110