2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
12 #include "vpx_ports/config.h"
13 #include "vp8/common/idct.h"
15 #include "vp8/common/reconintra.h"
16 #include "vp8/common/reconintra4x4.h"
18 #include "vp8/common/invtrans.h"
19 #include "vp8/common/recon.h"
21 #include "vp8/common/g_common.h"
22 #include "encodeintra.h"
24 #define intra4x4ibias_rate 128
25 #define intra4x4pbias_rate 256
28 void vp8_update_mode_context(int *abmode
, int *lbmode
, int i
, int best_mode
)
32 abmode
[i
+4] = best_mode
;
37 lbmode
[i
+1] = best_mode
;
41 #if CONFIG_RUNTIME_CPU_DETECT
42 #define IF_RTCD(x) (x)
44 #define IF_RTCD(x) NULL
46 void vp8_encode_intra4x4block(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
, BLOCK
*be
, BLOCKD
*b
, int best_mode
)
48 vp8_predict_intra4x4(b
, best_mode
, b
->predictor
);
50 ENCODEMB_INVOKE(&rtcd
->encodemb
, subb
)(be
, b
, 16);
52 x
->vp8_short_fdct4x4(be
->src_diff
, be
->coeff
, 32);
56 vp8_inverse_transform_b(IF_RTCD(&rtcd
->common
->idct
), b
, 32);
58 RECON_INVOKE(&rtcd
->common
->recon
, recon
)(b
->predictor
, b
->diff
, *(b
->base_dst
) + b
->dst
, b
->dst_stride
);
61 void vp8_encode_intra4x4block_rd(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
, BLOCK
*be
, BLOCKD
*b
, int best_mode
)
63 vp8_predict_intra4x4(b
, best_mode
, b
->predictor
);
65 ENCODEMB_INVOKE(&rtcd
->encodemb
, subb
)(be
, b
, 16);
67 x
->vp8_short_fdct4x4(be
->src_diff
, be
->coeff
, 32);
71 IDCT_INVOKE(&rtcd
->common
->idct
, idct16
)(b
->dqcoeff
, b
->diff
, 32);
73 RECON_INVOKE(&rtcd
->common
->recon
, recon
)(b
->predictor
, b
->diff
, *(b
->base_dst
) + b
->dst
, b
->dst_stride
);
76 void vp8_encode_intra4x4mby(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*mb
)
80 MACROBLOCKD
*x
= &mb
->e_mbd
;
81 vp8_intra_prediction_down_copy(x
);
83 for (i
= 0; i
< 16; i
++)
85 BLOCK
*be
= &mb
->block
[i
];
86 BLOCKD
*b
= &x
->block
[i
];
88 vp8_encode_intra4x4block(rtcd
, mb
, be
, b
, b
->bmi
.mode
);
94 void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
)
98 vp8_build_intra_predictors_mby_ptr(&x
->e_mbd
);
100 ENCODEMB_INVOKE(&rtcd
->encodemb
, submby
)(x
->src_diff
, x
->src
.y_buffer
, x
->e_mbd
.predictor
, x
->src
.y_stride
);
102 vp8_transform_intra_mby(x
);
106 #if !(CONFIG_REALTIME_ONLY)
109 vp8_optimize_mby(x
, rtcd
);
114 vp8_inverse_transform_mby(IF_RTCD(&rtcd
->common
->idct
), &x
->e_mbd
);
116 RECON_INVOKE(&rtcd
->common
->recon
, recon_mby
)
117 (IF_RTCD(&rtcd
->common
->recon
), &x
->e_mbd
);
119 // make sure block modes are set the way we want them for context updates
120 for (b
= 0; b
< 16; b
++)
122 BLOCKD
*d
= &x
->e_mbd
.block
[b
];
124 switch (x
->e_mbd
.mode_info_context
->mbmi
.mode
)
128 d
->bmi
.mode
= B_DC_PRED
;
131 d
->bmi
.mode
= B_VE_PRED
;
134 d
->bmi
.mode
= B_HE_PRED
;
137 d
->bmi
.mode
= B_TM_PRED
;
140 d
->bmi
.mode
= B_DC_PRED
;
147 void vp8_encode_intra16x16mbuv(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
)
149 vp8_build_intra_predictors_mbuv(&x
->e_mbd
);
151 ENCODEMB_INVOKE(&rtcd
->encodemb
, submbuv
)(x
->src_diff
, x
->src
.u_buffer
, x
->src
.v_buffer
, x
->e_mbd
.predictor
, x
->src
.uv_stride
);
153 vp8_transform_mbuv(x
);
155 vp8_quantize_mbuv(x
);
157 #if !(CONFIG_REALTIME_ONLY)
160 if (x
->optimize
==2 ||(x
->optimize
&& x
->rddiv
> 1))
161 vp8_optimize_mbuv(x
, rtcd
);
166 vp8_inverse_transform_mbuv(IF_RTCD(&rtcd
->common
->idct
), &x
->e_mbd
);
168 vp8_recon_intra_mbuv(IF_RTCD(&rtcd
->common
->recon
), &x
->e_mbd
);
171 void vp8_encode_intra16x16mbuvrd(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
)
173 vp8_build_intra_predictors_mbuv(&x
->e_mbd
);
175 ENCODEMB_INVOKE(&rtcd
->encodemb
, submbuv
)(x
->src_diff
, x
->src
.u_buffer
, x
->src
.v_buffer
, x
->e_mbd
.predictor
, x
->src
.uv_stride
);
177 vp8_transform_mbuv(x
);
179 vp8_quantize_mbuv(x
);
181 vp8_inverse_transform_mbuv(IF_RTCD(&rtcd
->common
->idct
), &x
->e_mbd
);
183 vp8_recon_intra_mbuv(IF_RTCD(&rtcd
->common
->recon
), &x
->e_mbd
);