Line data Source code
1 : /*
2 : * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3 : *
4 : * This source code is subject to the terms of the BSD 2 Clause License and
5 : * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 : * was not distributed with this source code in the LICENSE file, you can
7 : * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 : * Media Patent License 1.0 was not distributed with this source code in the
9 : * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 : */
11 :
12 : #include <assert.h>
13 : #include <immintrin.h>
14 : #include "aom_dsp_rtcd.h"
15 : #include "synonyms.h"
16 :
17 : ////////////////////////////////////////////////////////////////////////////////
18 : // 8 bit
19 : ////////////////////////////////////////////////////////////////////////////////
20 : // 2 tap bilinear filters
21 : #define BIL_SUBPEL_BITS 3
22 : #define BIL_SUBPEL_SHIFTS (1 << BIL_SUBPEL_BITS)
23 : static const uint8_t bilinear_filters_2t[BIL_SUBPEL_SHIFTS][2] = {
24 : { 128, 0 }, { 112, 16 }, { 96, 32 }, { 80, 48 },
25 : { 64, 64 }, { 48, 80 }, { 32, 96 }, { 16, 112 },
26 : };
27 :
28 : void aom_var_filter_block2d_bil_first_pass_ssse3(
29 : const uint8_t *a, uint16_t *b, unsigned int src_pixels_per_line,
30 : unsigned int pixel_step, unsigned int output_height,
31 : unsigned int output_width, const uint8_t *filter);
32 :
33 : void aom_var_filter_block2d_bil_second_pass_ssse3(
34 : const uint16_t *a, uint8_t *b, unsigned int src_pixels_per_line,
35 : unsigned int pixel_step, unsigned int output_height,
36 : unsigned int output_width, const uint8_t *filter);
37 :
38 :
39 : #define OBMC_SUBPIX_VAR(W, H) \
40 : uint32_t aom_obmc_sub_pixel_variance##W##x##H##_sse4_1( \
41 : const uint8_t *pre, int pre_stride, int xoffset, int yoffset, \
42 : const int32_t *wsrc, const int32_t *mask, unsigned int *sse) { \
43 : uint16_t fdata3[(H + 1) * W]; \
44 : uint8_t temp2[H * W]; \
45 : \
46 : aom_var_filter_block2d_bil_first_pass_ssse3( \
47 : pre, fdata3, pre_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
48 : aom_var_filter_block2d_bil_second_pass_ssse3( \
49 : fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
50 : \
51 : return aom_obmc_variance##W##x##H##_avx2(temp2, W, wsrc, mask, sse); \
52 : }
53 :
54 0 : OBMC_SUBPIX_VAR(128, 128)
55 0 : OBMC_SUBPIX_VAR(128, 64)
56 0 : OBMC_SUBPIX_VAR(64, 128)
57 0 : OBMC_SUBPIX_VAR(64, 64)
58 0 : OBMC_SUBPIX_VAR(64, 32)
59 0 : OBMC_SUBPIX_VAR(32, 64)
60 0 : OBMC_SUBPIX_VAR(32, 32)
61 0 : OBMC_SUBPIX_VAR(32, 16)
62 0 : OBMC_SUBPIX_VAR(16, 32)
63 0 : OBMC_SUBPIX_VAR(16, 16)
64 0 : OBMC_SUBPIX_VAR(16, 8)
65 0 : OBMC_SUBPIX_VAR(8, 16)
66 0 : OBMC_SUBPIX_VAR(8, 8)
67 0 : OBMC_SUBPIX_VAR(8, 4)
68 0 : OBMC_SUBPIX_VAR(4, 8)
69 0 : OBMC_SUBPIX_VAR(4, 4)
70 0 : OBMC_SUBPIX_VAR(4, 16)
71 0 : OBMC_SUBPIX_VAR(16, 4)
72 0 : OBMC_SUBPIX_VAR(8, 32)
73 0 : OBMC_SUBPIX_VAR(32, 8)
74 0 : OBMC_SUBPIX_VAR(16, 64)
75 0 : OBMC_SUBPIX_VAR(64, 16)
|