Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52866 views
1
/*****************************************************************************
2
* macroblock.h: macroblock encoding
3
*****************************************************************************
4
* Copyright (C) 2003-2016 x264 project
5
*
6
* Authors: Loren Merritt <[email protected]>
7
* Laurent Aimar <[email protected]>
8
*
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.
13
*
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.
18
*
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.
22
*
23
* This program is also available under a commercial proprietary license.
24
* For more information, contact us at [email protected].
25
*****************************************************************************/
26
27
#ifndef X264_ENCODER_MACROBLOCK_H
28
#define X264_ENCODER_MACROBLOCK_H
29
30
#include "common/macroblock.h"
31
32
extern const int x264_lambda2_tab[QP_MAX_MAX+1];
33
extern const uint16_t x264_lambda_tab[QP_MAX_MAX+1];
34
35
void x264_rdo_init( void );
36
37
int x264_macroblock_probe_skip( x264_t *h, int b_bidir );
38
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 )
43
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 );
48
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 );
52
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 );
56
57
void x264_cabac_mb_skip( x264_t *h, int b_skip );
58
59
int x264_quant_luma_dc_trellis( x264_t *h, dctcoef *dct, int i_quant_cat, int i_qp,
60
int ctx_block_cat, int b_intra, int idx );
61
int x264_quant_chroma_dc_trellis( x264_t *h, dctcoef *dct, int i_qp, int b_intra, int idx );
62
int x264_quant_4x4_trellis( x264_t *h, dctcoef *dct, int i_quant_cat,
63
int i_qp, int ctx_block_cat, int b_intra, int b_chroma, int idx );
64
int x264_quant_8x8_trellis( x264_t *h, dctcoef *dct, int i_quant_cat,
65
int i_qp, int ctx_block_cat, int b_intra, int b_chroma, int idx );
66
67
void x264_noise_reduction_update( x264_t *h );
68
69
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 )
70
{
71
int i_quant_cat = b_intra ? (p?CQM_4IC:CQM_4IY) : (p?CQM_4PC:CQM_4PY);
72
if( h->mb.b_noise_reduction )
73
h->quantf.denoise_dct( dct, h->nr_residual_sum[0+!!p*2], h->nr_offset[0+!!p*2], 16 );
74
if( h->mb.b_trellis )
75
return x264_quant_4x4_trellis( h, dct, i_quant_cat, i_qp, ctx_block_cat, b_intra, !!p, idx+p*16 );
76
else
77
return h->quantf.quant_4x4( dct, h->quant4_mf[i_quant_cat][i_qp], h->quant4_bias[i_quant_cat][i_qp] );
78
}
79
80
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 )
81
{
82
int i_quant_cat = b_intra ? (p?CQM_8IC:CQM_8IY) : (p?CQM_8PC:CQM_8PY);
83
if( h->mb.b_noise_reduction )
84
h->quantf.denoise_dct( dct, h->nr_residual_sum[1+!!p*2], h->nr_offset[1+!!p*2], 64 );
85
if( h->mb.b_trellis )
86
return x264_quant_8x8_trellis( h, dct, i_quant_cat, i_qp, ctx_block_cat, b_intra, !!p, idx+p*4 );
87
else
88
return h->quantf.quant_8x8( dct, h->quant8_mf[i_quant_cat][i_qp], h->quant8_bias[i_quant_cat][i_qp] );
89
}
90
91
#define STORE_8x8_NNZ( p, idx, nz )\
92
do\
93
{\
94
M16( &h->mb.cache.non_zero_count[x264_scan8[p*16+idx*4]+0] ) = (nz) * 0x0101;\
95
M16( &h->mb.cache.non_zero_count[x264_scan8[p*16+idx*4]+8] ) = (nz) * 0x0101;\
96
} while(0)
97
98
#define CLEAR_16x16_NNZ( p ) \
99
do\
100
{\
101
M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 0*8] ) = 0;\
102
M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 1*8] ) = 0;\
103
M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 2*8] ) = 0;\
104
M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 3*8] ) = 0;\
105
} while(0)
106
107
/* A special for loop that iterates branchlessly over each set
108
* bit in a 4-bit input. */
109
#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++ )
110
111
static ALWAYS_INLINE void x264_mb_encode_i4x4( x264_t *h, int p, int idx, int i_qp, int i_mode, int b_predict )
112
{
113
int nz;
114
pixel *p_src = &h->mb.pic.p_fenc[p][block_idx_xy_fenc[idx]];
115
pixel *p_dst = &h->mb.pic.p_fdec[p][block_idx_xy_fdec[idx]];
116
ALIGNED_ARRAY_N( dctcoef, dct4x4,[16] );
117
118
if( b_predict )
119
{
120
if( h->mb.b_lossless )
121
x264_predict_lossless_4x4( h, p_dst, p, idx, i_mode );
122
else
123
h->predict_4x4[i_mode]( p_dst );
124
}
125
126
if( h->mb.b_lossless )
127
{
128
nz = h->zigzagf.sub_4x4( h->dct.luma4x4[p*16+idx], p_src, p_dst );
129
h->mb.cache.non_zero_count[x264_scan8[p*16+idx]] = nz;
130
h->mb.i_cbp_luma |= nz<<(idx>>2);
131
return;
132
}
133
134
h->dctf.sub4x4_dct( dct4x4, p_src, p_dst );
135
136
nz = x264_quant_4x4( h, dct4x4, i_qp, ctx_cat_plane[DCT_LUMA_4x4][p], 1, p, idx );
137
h->mb.cache.non_zero_count[x264_scan8[p*16+idx]] = nz;
138
if( nz )
139
{
140
h->mb.i_cbp_luma |= 1<<(idx>>2);
141
h->zigzagf.scan_4x4( h->dct.luma4x4[p*16+idx], dct4x4 );
142
h->quantf.dequant_4x4( dct4x4, h->dequant4_mf[p?CQM_4IC:CQM_4IY], i_qp );
143
h->dctf.add4x4_idct( p_dst, dct4x4 );
144
}
145
}
146
147
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 )
148
{
149
int x = idx&1;
150
int y = idx>>1;
151
int nz;
152
pixel *p_src = &h->mb.pic.p_fenc[p][8*x + 8*y*FENC_STRIDE];
153
pixel *p_dst = &h->mb.pic.p_fdec[p][8*x + 8*y*FDEC_STRIDE];
154
ALIGNED_ARRAY_N( dctcoef, dct8x8,[64] );
155
ALIGNED_ARRAY_32( pixel, edge_buf,[36] );
156
157
if( b_predict )
158
{
159
if( !edge )
160
{
161
h->predict_8x8_filter( p_dst, edge_buf, h->mb.i_neighbour8[idx], x264_pred_i4x4_neighbors[i_mode] );
162
edge = edge_buf;
163
}
164
165
if( h->mb.b_lossless )
166
x264_predict_lossless_8x8( h, p_dst, p, idx, i_mode, edge );
167
else
168
h->predict_8x8[i_mode]( p_dst, edge );
169
}
170
171
if( h->mb.b_lossless )
172
{
173
nz = h->zigzagf.sub_8x8( h->dct.luma8x8[p*4+idx], p_src, p_dst );
174
STORE_8x8_NNZ( p, idx, nz );
175
h->mb.i_cbp_luma |= nz<<idx;
176
return;
177
}
178
179
h->dctf.sub8x8_dct8( dct8x8, p_src, p_dst );
180
181
nz = x264_quant_8x8( h, dct8x8, i_qp, ctx_cat_plane[DCT_LUMA_8x8][p], 1, p, idx );
182
if( nz )
183
{
184
h->mb.i_cbp_luma |= 1<<idx;
185
h->zigzagf.scan_8x8( h->dct.luma8x8[p*4+idx], dct8x8 );
186
h->quantf.dequant_8x8( dct8x8, h->dequant8_mf[p?CQM_8IC:CQM_8IY], i_qp );
187
h->dctf.add8x8_idct8( p_dst, dct8x8 );
188
STORE_8x8_NNZ( p, idx, 1 );
189
}
190
else
191
STORE_8x8_NNZ( p, idx, 0 );
192
}
193
194
#endif
195
196
197