Line data Source code
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 "./vpx_config.h"
12 : #include "./vpx_dsp_rtcd.h"
13 : #include "./vp8_rtcd.h"
14 : #include "vpx_mem/vpx_mem.h"
15 : #include "vpx_ports/vpx_once.h"
16 : #include "blockd.h"
17 : #include "vp8/common/reconintra.h"
18 : #include "vp8/common/reconintra4x4.h"
19 :
20 : enum {
21 : SIZE_16,
22 : SIZE_8,
23 : NUM_SIZES,
24 : };
25 :
26 : typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride,
27 : const uint8_t *above, const uint8_t *left);
28 :
29 : static intra_pred_fn pred[4][NUM_SIZES];
30 : static intra_pred_fn dc_pred[2][2][NUM_SIZES];
31 :
32 0 : static void vp8_init_intra_predictors_internal(void) {
33 : #define INIT_SIZE(sz) \
34 : pred[V_PRED][SIZE_##sz] = vpx_v_predictor_##sz##x##sz; \
35 : pred[H_PRED][SIZE_##sz] = vpx_h_predictor_##sz##x##sz; \
36 : pred[TM_PRED][SIZE_##sz] = vpx_tm_predictor_##sz##x##sz; \
37 : \
38 : dc_pred[0][0][SIZE_##sz] = vpx_dc_128_predictor_##sz##x##sz; \
39 : dc_pred[0][1][SIZE_##sz] = vpx_dc_top_predictor_##sz##x##sz; \
40 : dc_pred[1][0][SIZE_##sz] = vpx_dc_left_predictor_##sz##x##sz; \
41 : dc_pred[1][1][SIZE_##sz] = vpx_dc_predictor_##sz##x##sz
42 :
43 0 : INIT_SIZE(16);
44 0 : INIT_SIZE(8);
45 0 : vp8_init_intra4x4_predictors_internal();
46 0 : }
47 :
48 0 : void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x, unsigned char *yabove_row,
49 : unsigned char *yleft, int left_stride,
50 : unsigned char *ypred_ptr, int y_stride) {
51 0 : MB_PREDICTION_MODE mode = x->mode_info_context->mbmi.mode;
52 : DECLARE_ALIGNED(16, uint8_t, yleft_col[16]);
53 : int i;
54 : intra_pred_fn fn;
55 :
56 0 : for (i = 0; i < 16; ++i) {
57 0 : yleft_col[i] = yleft[i * left_stride];
58 : }
59 :
60 0 : if (mode == DC_PRED) {
61 0 : fn = dc_pred[x->left_available][x->up_available][SIZE_16];
62 : } else {
63 0 : fn = pred[mode][SIZE_16];
64 : }
65 :
66 0 : fn(ypred_ptr, y_stride, yabove_row, yleft_col);
67 0 : }
68 :
69 0 : void vp8_build_intra_predictors_mbuv_s(
70 : MACROBLOCKD *x, unsigned char *uabove_row, unsigned char *vabove_row,
71 : unsigned char *uleft, unsigned char *vleft, int left_stride,
72 : unsigned char *upred_ptr, unsigned char *vpred_ptr, int pred_stride) {
73 0 : MB_PREDICTION_MODE uvmode = x->mode_info_context->mbmi.uv_mode;
74 : unsigned char uleft_col[8];
75 : unsigned char vleft_col[8];
76 : int i;
77 : intra_pred_fn fn;
78 :
79 0 : for (i = 0; i < 8; ++i) {
80 0 : uleft_col[i] = uleft[i * left_stride];
81 0 : vleft_col[i] = vleft[i * left_stride];
82 : }
83 :
84 0 : if (uvmode == DC_PRED) {
85 0 : fn = dc_pred[x->left_available][x->up_available][SIZE_8];
86 : } else {
87 0 : fn = pred[uvmode][SIZE_8];
88 : }
89 :
90 0 : fn(upred_ptr, pred_stride, uabove_row, uleft_col);
91 0 : fn(vpred_ptr, pred_stride, vabove_row, vleft_col);
92 0 : }
93 :
94 0 : void vp8_init_intra_predictors(void) {
95 0 : once(vp8_init_intra_predictors_internal);
96 0 : }
|