1 /*****************************************************************************
2 * macroblock.h: macroblock encoding
3 *****************************************************************************
4 * Copyright (C) 2003-2017 x264 project
6 * Authors: Loren Merritt <lorenm@u.washington.edu>
7 * Laurent Aimar <fenrir@via.ecp.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
23 * This program is also available under a commercial proprietary license.
24 * For more information, contact us at licensing@x264.com.
25 *****************************************************************************/
27 #ifndef X264_ENCODER_MACROBLOCK_H
28 #define X264_ENCODER_MACROBLOCK_H
30 #include "common/macroblock.h"
32 extern const int x264_lambda2_tab
[QP_MAX_MAX
+1];
33 extern const uint16_t x264_lambda_tab
[QP_MAX_MAX
+1];
35 void x264_rdo_init( void );
37 int x264_macroblock_probe_skip( x264_t
*h
, int b_bidir
);
39 #define x264_macroblock_probe_pskip( h )\
40 x264_macroblock_probe_skip( h, 0 )
41 #define x264_macroblock_probe_bskip( h )\
42 x264_macroblock_probe_skip( h, 1 )
44 void x264_predict_lossless_4x4( x264_t
*h
, pixel
*p_dst
, int p
, int idx
, int i_mode
);
45 void x264_predict_lossless_8x8( x264_t
*h
, pixel
*p_dst
, int p
, int idx
, int i_mode
, pixel edge
[36] );
46 void x264_predict_lossless_16x16( x264_t
*h
, int p
, int i_mode
);
47 void x264_predict_lossless_chroma( x264_t
*h
, int i_mode
);
49 void x264_macroblock_encode ( x264_t
*h
);
50 void x264_macroblock_write_cabac ( x264_t
*h
, x264_cabac_t
*cb
);
51 void x264_macroblock_write_cavlc ( x264_t
*h
);
53 void x264_macroblock_encode_p8x8( x264_t
*h
, int i8
);
54 void x264_macroblock_encode_p4x4( x264_t
*h
, int i4
);
55 void x264_mb_encode_chroma( x264_t
*h
, int b_inter
, int i_qp
);
57 void x264_cabac_mb_skip( x264_t
*h
, int b_skip
);
58 void x264_cabac_block_residual_c( x264_t
*h
, x264_cabac_t
*cb
, int ctx_block_cat
, dctcoef
*l
);
59 void x264_cabac_block_residual_8x8_rd_c( x264_t
*h
, x264_cabac_t
*cb
, int ctx_block_cat
, dctcoef
*l
);
60 void x264_cabac_block_residual_rd_c( x264_t
*h
, x264_cabac_t
*cb
, int ctx_block_cat
, dctcoef
*l
);
62 int x264_quant_luma_dc_trellis( x264_t
*h
, dctcoef
*dct
, int i_quant_cat
, int i_qp
,
63 int ctx_block_cat
, int b_intra
, int idx
);
64 int x264_quant_chroma_dc_trellis( x264_t
*h
, dctcoef
*dct
, int i_qp
, int b_intra
, int idx
);
65 int x264_quant_4x4_trellis( x264_t
*h
, dctcoef
*dct
, int i_quant_cat
,
66 int i_qp
, int ctx_block_cat
, int b_intra
, int b_chroma
, int idx
);
67 int x264_quant_8x8_trellis( x264_t
*h
, dctcoef
*dct
, int i_quant_cat
,
68 int i_qp
, int ctx_block_cat
, int b_intra
, int b_chroma
, int idx
);
70 void x264_noise_reduction_update( x264_t
*h
);
72 static ALWAYS_INLINE
int x264_quant_4x4( x264_t
*h
, dctcoef dct
[16], int i_qp
, int ctx_block_cat
, int b_intra
, int p
, int idx
)
74 int i_quant_cat
= b_intra
? (p
?CQM_4IC
:CQM_4IY
) : (p
?CQM_4PC
:CQM_4PY
);
75 if( h
->mb
.b_noise_reduction
)
76 h
->quantf
.denoise_dct( dct
, h
->nr_residual_sum
[0+!!p
*2], h
->nr_offset
[0+!!p
*2], 16 );
78 return x264_quant_4x4_trellis( h
, dct
, i_quant_cat
, i_qp
, ctx_block_cat
, b_intra
, !!p
, idx
+p
*16 );
80 return h
->quantf
.quant_4x4( dct
, h
->quant4_mf
[i_quant_cat
][i_qp
], h
->quant4_bias
[i_quant_cat
][i_qp
] );
83 static ALWAYS_INLINE
int x264_quant_8x8( x264_t
*h
, dctcoef dct
[64], int i_qp
, int ctx_block_cat
, int b_intra
, int p
, int idx
)
85 int i_quant_cat
= b_intra
? (p
?CQM_8IC
:CQM_8IY
) : (p
?CQM_8PC
:CQM_8PY
);
86 if( h
->mb
.b_noise_reduction
)
87 h
->quantf
.denoise_dct( dct
, h
->nr_residual_sum
[1+!!p
*2], h
->nr_offset
[1+!!p
*2], 64 );
89 return x264_quant_8x8_trellis( h
, dct
, i_quant_cat
, i_qp
, ctx_block_cat
, b_intra
, !!p
, idx
+p
*4 );
91 return h
->quantf
.quant_8x8( dct
, h
->quant8_mf
[i_quant_cat
][i_qp
], h
->quant8_bias
[i_quant_cat
][i_qp
] );
94 #define STORE_8x8_NNZ( p, idx, nz )\
97 M16( &h->mb.cache.non_zero_count[x264_scan8[p*16+idx*4]+0] ) = (nz) * 0x0101;\
98 M16( &h->mb.cache.non_zero_count[x264_scan8[p*16+idx*4]+8] ) = (nz) * 0x0101;\
101 #define CLEAR_16x16_NNZ( p ) \
104 M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 0*8] ) = 0;\
105 M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 1*8] ) = 0;\
106 M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 2*8] ) = 0;\
107 M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 3*8] ) = 0;\
110 /* A special for loop that iterates branchlessly over each set
111 * bit in a 4-bit input. */
112 #define FOREACH_BIT(idx,start,mask) for( int idx = start, msk = mask, skip; msk && (skip = x264_ctz_4bit(msk), idx += skip, msk >>= skip+1, 1); idx++ )
114 static ALWAYS_INLINE
void x264_mb_encode_i4x4( x264_t
*h
, int p
, int idx
, int i_qp
, int i_mode
, int b_predict
)
117 pixel
*p_src
= &h
->mb
.pic
.p_fenc
[p
][block_idx_xy_fenc
[idx
]];
118 pixel
*p_dst
= &h
->mb
.pic
.p_fdec
[p
][block_idx_xy_fdec
[idx
]];
119 ALIGNED_ARRAY_64( dctcoef
, dct4x4
,[16] );
123 if( h
->mb
.b_lossless
)
124 x264_predict_lossless_4x4( h
, p_dst
, p
, idx
, i_mode
);
126 h
->predict_4x4
[i_mode
]( p_dst
);
129 if( h
->mb
.b_lossless
)
131 nz
= h
->zigzagf
.sub_4x4( h
->dct
.luma4x4
[p
*16+idx
], p_src
, p_dst
);
132 h
->mb
.cache
.non_zero_count
[x264_scan8
[p
*16+idx
]] = nz
;
133 h
->mb
.i_cbp_luma
|= nz
<<(idx
>>2);
137 h
->dctf
.sub4x4_dct( dct4x4
, p_src
, p_dst
);
139 nz
= x264_quant_4x4( h
, dct4x4
, i_qp
, ctx_cat_plane
[DCT_LUMA_4x4
][p
], 1, p
, idx
);
140 h
->mb
.cache
.non_zero_count
[x264_scan8
[p
*16+idx
]] = nz
;
143 h
->mb
.i_cbp_luma
|= 1<<(idx
>>2);
144 h
->zigzagf
.scan_4x4( h
->dct
.luma4x4
[p
*16+idx
], dct4x4
);
145 h
->quantf
.dequant_4x4( dct4x4
, h
->dequant4_mf
[p
?CQM_4IC
:CQM_4IY
], i_qp
);
146 h
->dctf
.add4x4_idct( p_dst
, dct4x4
);
150 static ALWAYS_INLINE
void x264_mb_encode_i8x8( x264_t
*h
, int p
, int idx
, int i_qp
, int i_mode
, pixel
*edge
, int b_predict
)
155 pixel
*p_src
= &h
->mb
.pic
.p_fenc
[p
][8*x
+ 8*y
*FENC_STRIDE
];
156 pixel
*p_dst
= &h
->mb
.pic
.p_fdec
[p
][8*x
+ 8*y
*FDEC_STRIDE
];
157 ALIGNED_ARRAY_64( dctcoef
, dct8x8
,[64] );
158 ALIGNED_ARRAY_32( pixel
, edge_buf
,[36] );
164 h
->predict_8x8_filter( p_dst
, edge_buf
, h
->mb
.i_neighbour8
[idx
], x264_pred_i4x4_neighbors
[i_mode
] );
168 if( h
->mb
.b_lossless
)
169 x264_predict_lossless_8x8( h
, p_dst
, p
, idx
, i_mode
, edge
);
171 h
->predict_8x8
[i_mode
]( p_dst
, edge
);
174 if( h
->mb
.b_lossless
)
176 nz
= h
->zigzagf
.sub_8x8( h
->dct
.luma8x8
[p
*4+idx
], p_src
, p_dst
);
177 STORE_8x8_NNZ( p
, idx
, nz
);
178 h
->mb
.i_cbp_luma
|= nz
<<idx
;
182 h
->dctf
.sub8x8_dct8( dct8x8
, p_src
, p_dst
);
184 nz
= x264_quant_8x8( h
, dct8x8
, i_qp
, ctx_cat_plane
[DCT_LUMA_8x8
][p
], 1, p
, idx
);
187 h
->mb
.i_cbp_luma
|= 1<<idx
;
188 h
->zigzagf
.scan_8x8( h
->dct
.luma8x8
[p
*4+idx
], dct8x8
);
189 h
->quantf
.dequant_8x8( dct8x8
, h
->dequant8_mf
[p
?CQM_8IC
:CQM_8IY
], i_qp
);
190 h
->dctf
.add8x8_idct8( p_dst
, dct8x8
);
191 STORE_8x8_NNZ( p
, idx
, 1 );
194 STORE_8x8_NNZ( p
, idx
, 0 );