/src/libvpx/vp8/common/reconintra4x4.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 | | * |
4 | | * Use of this source code is governed by a BSD-style license |
5 | | * that can be found in the LICENSE file in the root of the source |
6 | | * tree. An additional intellectual property rights grant can be found |
7 | | * in the file PATENTS. All contributing project authors may |
8 | | * be found in the AUTHORS file in the root of the source tree. |
9 | | */ |
10 | | |
11 | | #include <string.h> |
12 | | |
13 | | #include "vpx_config.h" |
14 | | #include "./vpx_dsp_rtcd.h" |
15 | | #include "vp8_rtcd.h" |
16 | | #include "blockd.h" |
17 | | #include "reconintra4x4.h" |
18 | | #include "vp8/common/common.h" |
19 | | #include "vpx_ports/compiler_attributes.h" |
20 | | |
21 | | typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride, |
22 | | const uint8_t *above, const uint8_t *left); |
23 | | |
24 | | static intra_pred_fn pred[10]; |
25 | | |
26 | 1 | void vp8_init_intra4x4_predictors_internal(void) { |
27 | 1 | pred[B_DC_PRED] = vpx_dc_predictor_4x4; |
28 | 1 | pred[B_TM_PRED] = vpx_tm_predictor_4x4; |
29 | 1 | pred[B_VE_PRED] = vpx_ve_predictor_4x4; |
30 | 1 | pred[B_HE_PRED] = vpx_he_predictor_4x4; |
31 | 1 | pred[B_LD_PRED] = vpx_d45e_predictor_4x4; |
32 | 1 | pred[B_RD_PRED] = vpx_d135_predictor_4x4; |
33 | 1 | pred[B_VR_PRED] = vpx_d117_predictor_4x4; |
34 | 1 | pred[B_VL_PRED] = vpx_d63e_predictor_4x4; |
35 | 1 | pred[B_HD_PRED] = vpx_d153_predictor_4x4; |
36 | 1 | pred[B_HU_PRED] = vpx_d207_predictor_4x4; |
37 | 1 | } |
38 | | |
39 | | void vp8_intra4x4_predict(unsigned char *above, unsigned char *yleft, |
40 | | int left_stride, B_PREDICTION_MODE b_mode, |
41 | | unsigned char *dst, int dst_stride, |
42 | 154M | unsigned char top_left) { |
43 | | /* Power PC implementation uses "vec_vsx_ld" to read 16 bytes from |
44 | | Above (aka, Aboveb + 4). Play it safe by reserving enough stack |
45 | | space here. Similary for "Left". */ |
46 | | #if HAVE_VSX |
47 | | unsigned char Aboveb[20]; |
48 | | #else |
49 | 154M | unsigned char Aboveb[12]; |
50 | 154M | #endif |
51 | 154M | unsigned char *Above = Aboveb + 4; |
52 | | #if HAVE_NEON |
53 | | // Neon intrinsics are unable to load 32 bits, or 4 8 bit values. Instead, it |
54 | | // over reads but does not use the extra 4 values. |
55 | | unsigned char Left[8]; |
56 | | #if VPX_WITH_ASAN |
57 | | // Silence an 'uninitialized read' warning. Although uninitialized values are |
58 | | // indeed read, they are not used. |
59 | | vp8_zero_array(Left, 8); |
60 | | #endif // VPX_WITH_ASAN |
61 | | #elif HAVE_VSX |
62 | | unsigned char Left[16]; |
63 | | #else |
64 | 154M | unsigned char Left[4]; |
65 | 154M | #endif // HAVE_NEON |
66 | | |
67 | 154M | Left[0] = yleft[0]; |
68 | 154M | Left[1] = yleft[left_stride]; |
69 | 154M | Left[2] = yleft[2 * left_stride]; |
70 | 154M | Left[3] = yleft[3 * left_stride]; |
71 | 154M | memcpy(Above, above, 8); |
72 | 154M | Above[-1] = top_left; |
73 | | |
74 | 154M | pred[b_mode](dst, dst_stride, Above, Left); |
75 | 154M | } |