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 #if CONFIG_RUNTIME_CPU_DETECT
29 #define IF_RTCD(x) (x)
31 #define IF_RTCD(x) NULL
33 void vp8_encode_intra4x4block(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
, BLOCK
*be
, BLOCKD
*b
, int best_mode
)
35 vp8_predict_intra4x4(b
, best_mode
, b
->predictor
);
37 ENCODEMB_INVOKE(&rtcd
->encodemb
, subb
)(be
, b
, 16);
39 x
->vp8_short_fdct4x4(be
->src_diff
, be
->coeff
, 32);
43 vp8_inverse_transform_b(IF_RTCD(&rtcd
->common
->idct
), b
, 32);
45 RECON_INVOKE(&rtcd
->common
->recon
, recon
)(b
->predictor
, b
->diff
, *(b
->base_dst
) + b
->dst
, b
->dst_stride
);
48 void vp8_encode_intra4x4mby(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*mb
)
52 MACROBLOCKD
*x
= &mb
->e_mbd
;
53 vp8_intra_prediction_down_copy(x
);
55 for (i
= 0; i
< 16; i
++)
57 BLOCK
*be
= &mb
->block
[i
];
58 BLOCKD
*b
= &x
->block
[i
];
60 vp8_encode_intra4x4block(rtcd
, mb
, be
, b
, b
->bmi
.mode
);
66 void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
)
70 RECON_INVOKE(&rtcd
->common
->recon
, build_intra_predictors_mby
)(&x
->e_mbd
);
72 ENCODEMB_INVOKE(&rtcd
->encodemb
, submby
)(x
->src_diff
, x
->src
.y_buffer
, x
->e_mbd
.predictor
, x
->src
.y_stride
);
74 vp8_transform_intra_mby(x
);
78 #if !(CONFIG_REALTIME_ONLY)
81 vp8_optimize_mby(x
, rtcd
);
86 vp8_inverse_transform_mby(IF_RTCD(&rtcd
->common
->idct
), &x
->e_mbd
);
88 RECON_INVOKE(&rtcd
->common
->recon
, recon_mby
)
89 (IF_RTCD(&rtcd
->common
->recon
), &x
->e_mbd
);
91 // make sure block modes are set the way we want them for context updates
92 for (b
= 0; b
< 16; b
++)
94 BLOCKD
*d
= &x
->e_mbd
.block
[b
];
96 switch (x
->e_mbd
.mode_info_context
->mbmi
.mode
)
100 d
->bmi
.mode
= B_DC_PRED
;
103 d
->bmi
.mode
= B_VE_PRED
;
106 d
->bmi
.mode
= B_HE_PRED
;
109 d
->bmi
.mode
= B_TM_PRED
;
112 d
->bmi
.mode
= B_DC_PRED
;
119 void vp8_encode_intra16x16mbuv(const VP8_ENCODER_RTCD
*rtcd
, MACROBLOCK
*x
)
121 vp8_build_intra_predictors_mbuv(&x
->e_mbd
);
123 ENCODEMB_INVOKE(&rtcd
->encodemb
, submbuv
)(x
->src_diff
, x
->src
.u_buffer
, x
->src
.v_buffer
, x
->e_mbd
.predictor
, x
->src
.uv_stride
);
125 vp8_transform_mbuv(x
);
127 vp8_quantize_mbuv(x
);
129 #if !(CONFIG_REALTIME_ONLY)
132 if (x
->optimize
==2 ||(x
->optimize
&& x
->rddiv
> 1))
133 vp8_optimize_mbuv(x
, rtcd
);
138 vp8_inverse_transform_mbuv(IF_RTCD(&rtcd
->common
->idct
), &x
->e_mbd
);
140 vp8_recon_intra_mbuv(IF_RTCD(&rtcd
->common
->recon
), &x
->e_mbd
);