macroblock.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*****************************************************************************
  2. * macroblock.h: macroblock encoding
  3. *****************************************************************************
  4. * Copyright (C) 2003-2018 x264 project
  5. *
  6. * Authors: Loren Merritt <lorenm@u.washington.edu>
  7. * Laurent Aimar <fenrir@via.ecp.fr>
  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 licensing@x264.com.
  25. *****************************************************************************/
  26. #ifndef X264_ENCODER_MACROBLOCK_H
  27. #define X264_ENCODER_MACROBLOCK_H
  28. #include "common/macroblock.h"
  29. #define x264_rdo_init x264_template(rdo_init)
  30. void x264_rdo_init( void );
  31. #define x264_macroblock_probe_skip x264_template(macroblock_probe_skip)
  32. int x264_macroblock_probe_skip( x264_t *h, int b_bidir );
  33. #define x264_macroblock_probe_pskip( h )\
  34. x264_macroblock_probe_skip( h, 0 )
  35. #define x264_macroblock_probe_bskip( h )\
  36. x264_macroblock_probe_skip( h, 1 )
  37. #define x264_predict_lossless_4x4 x264_template(predict_lossless_4x4)
  38. void x264_predict_lossless_4x4( x264_t *h, pixel *p_dst, int p, int idx, int i_mode );
  39. #define x264_predict_lossless_8x8 x264_template(predict_lossless_8x8)
  40. void x264_predict_lossless_8x8( x264_t *h, pixel *p_dst, int p, int idx, int i_mode, pixel edge[36] );
  41. #define x264_predict_lossless_16x16 x264_template(predict_lossless_16x16)
  42. void x264_predict_lossless_16x16( x264_t *h, int p, int i_mode );
  43. #define x264_predict_lossless_chroma x264_template(predict_lossless_chroma)
  44. void x264_predict_lossless_chroma( x264_t *h, int i_mode );
  45. #define x264_macroblock_encode x264_template(macroblock_encode)
  46. void x264_macroblock_encode ( x264_t *h );
  47. #define x264_macroblock_write_cabac x264_template(macroblock_write_cabac)
  48. void x264_macroblock_write_cabac ( x264_t *h, x264_cabac_t *cb );
  49. #define x264_macroblock_write_cavlc x264_template(macroblock_write_cavlc)
  50. void x264_macroblock_write_cavlc ( x264_t *h );
  51. #define x264_macroblock_encode_p8x8 x264_template(macroblock_encode_p8x8)
  52. void x264_macroblock_encode_p8x8( x264_t *h, int i8 );
  53. #define x264_macroblock_encode_p4x4 x264_template(macroblock_encode_p4x4)
  54. void x264_macroblock_encode_p4x4( x264_t *h, int i4 );
  55. #define x264_mb_encode_chroma x264_template(mb_encode_chroma)
  56. void x264_mb_encode_chroma( x264_t *h, int b_inter, int i_qp );
  57. #define x264_cabac_mb_skip x264_template(cabac_mb_skip)
  58. void x264_cabac_mb_skip( x264_t *h, int b_skip );
  59. #define x264_cabac_block_residual_c x264_template(cabac_block_residual_c)
  60. void x264_cabac_block_residual_c( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l );
  61. #define x264_cabac_block_residual_8x8_rd_c x264_template(cabac_block_residual_8x8_rd_c)
  62. void x264_cabac_block_residual_8x8_rd_c( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l );
  63. #define x264_cabac_block_residual_rd_c x264_template(cabac_block_residual_rd_c)
  64. void x264_cabac_block_residual_rd_c( x264_t *h, x264_cabac_t *cb, int ctx_block_cat, dctcoef *l );
  65. #define x264_quant_luma_dc_trellis x264_template(quant_luma_dc_trellis)
  66. int x264_quant_luma_dc_trellis( x264_t *h, dctcoef *dct, int i_quant_cat, int i_qp,
  67. int ctx_block_cat, int b_intra, int idx );
  68. #define x264_quant_chroma_dc_trellis x264_template(quant_chroma_dc_trellis)
  69. int x264_quant_chroma_dc_trellis( x264_t *h, dctcoef *dct, int i_qp, int b_intra, int idx );
  70. #define x264_quant_4x4_trellis x264_template(quant_4x4_trellis)
  71. int x264_quant_4x4_trellis( x264_t *h, dctcoef *dct, int i_quant_cat,
  72. int i_qp, int ctx_block_cat, int b_intra, int b_chroma, int idx );
  73. #define x264_quant_8x8_trellis x264_template(quant_8x8_trellis)
  74. int x264_quant_8x8_trellis( x264_t *h, dctcoef *dct, int i_quant_cat,
  75. int i_qp, int ctx_block_cat, int b_intra, int b_chroma, int idx );
  76. #define x264_noise_reduction_update x264_template(noise_reduction_update)
  77. void x264_noise_reduction_update( x264_t *h );
  78. 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 )
  79. {
  80. int i_quant_cat = b_intra ? (p?CQM_4IC:CQM_4IY) : (p?CQM_4PC:CQM_4PY);
  81. if( h->mb.b_noise_reduction )
  82. h->quantf.denoise_dct( dct, h->nr_residual_sum[0+!!p*2], h->nr_offset[0+!!p*2], 16 );
  83. if( h->mb.b_trellis )
  84. return x264_quant_4x4_trellis( h, dct, i_quant_cat, i_qp, ctx_block_cat, b_intra, !!p, idx+p*16 );
  85. else
  86. return h->quantf.quant_4x4( dct, h->quant4_mf[i_quant_cat][i_qp], h->quant4_bias[i_quant_cat][i_qp] );
  87. }
  88. 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 )
  89. {
  90. int i_quant_cat = b_intra ? (p?CQM_8IC:CQM_8IY) : (p?CQM_8PC:CQM_8PY);
  91. if( h->mb.b_noise_reduction )
  92. h->quantf.denoise_dct( dct, h->nr_residual_sum[1+!!p*2], h->nr_offset[1+!!p*2], 64 );
  93. if( h->mb.b_trellis )
  94. return x264_quant_8x8_trellis( h, dct, i_quant_cat, i_qp, ctx_block_cat, b_intra, !!p, idx+p*4 );
  95. else
  96. return h->quantf.quant_8x8( dct, h->quant8_mf[i_quant_cat][i_qp], h->quant8_bias[i_quant_cat][i_qp] );
  97. }
  98. #define STORE_8x8_NNZ( p, idx, nz )\
  99. do\
  100. {\
  101. M16( &h->mb.cache.non_zero_count[x264_scan8[p*16+idx*4]+0] ) = (nz) * 0x0101;\
  102. M16( &h->mb.cache.non_zero_count[x264_scan8[p*16+idx*4]+8] ) = (nz) * 0x0101;\
  103. } while( 0 )
  104. #define CLEAR_16x16_NNZ( p ) \
  105. do\
  106. {\
  107. M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 0*8] ) = 0;\
  108. M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 1*8] ) = 0;\
  109. M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 2*8] ) = 0;\
  110. M32( &h->mb.cache.non_zero_count[x264_scan8[16*p] + 3*8] ) = 0;\
  111. } while( 0 )
  112. /* A special for loop that iterates branchlessly over each set
  113. * bit in a 4-bit input. */
  114. #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++ )
  115. static ALWAYS_INLINE void x264_mb_encode_i4x4( x264_t *h, int p, int idx, int i_qp, int i_mode, int b_predict )
  116. {
  117. int nz;
  118. pixel *p_src = &h->mb.pic.p_fenc[p][block_idx_xy_fenc[idx]];
  119. pixel *p_dst = &h->mb.pic.p_fdec[p][block_idx_xy_fdec[idx]];
  120. ALIGNED_ARRAY_64( dctcoef, dct4x4,[16] );
  121. if( b_predict )
  122. {
  123. if( h->mb.b_lossless )
  124. x264_predict_lossless_4x4( h, p_dst, p, idx, i_mode );
  125. else
  126. h->predict_4x4[i_mode]( p_dst );
  127. }
  128. if( h->mb.b_lossless )
  129. {
  130. nz = h->zigzagf.sub_4x4( h->dct.luma4x4[p*16+idx], p_src, p_dst );
  131. h->mb.cache.non_zero_count[x264_scan8[p*16+idx]] = nz;
  132. h->mb.i_cbp_luma |= nz<<(idx>>2);
  133. return;
  134. }
  135. h->dctf.sub4x4_dct( dct4x4, p_src, p_dst );
  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. 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 )
  147. {
  148. int x = idx&1;
  149. int y = idx>>1;
  150. int nz;
  151. pixel *p_src = &h->mb.pic.p_fenc[p][8*x + 8*y*FENC_STRIDE];
  152. pixel *p_dst = &h->mb.pic.p_fdec[p][8*x + 8*y*FDEC_STRIDE];
  153. ALIGNED_ARRAY_64( dctcoef, dct8x8,[64] );
  154. ALIGNED_ARRAY_32( pixel, edge_buf,[36] );
  155. if( b_predict )
  156. {
  157. if( !edge )
  158. {
  159. h->predict_8x8_filter( p_dst, edge_buf, h->mb.i_neighbour8[idx], x264_pred_i4x4_neighbors[i_mode] );
  160. edge = edge_buf;
  161. }
  162. if( h->mb.b_lossless )
  163. x264_predict_lossless_8x8( h, p_dst, p, idx, i_mode, edge );
  164. else
  165. h->predict_8x8[i_mode]( p_dst, edge );
  166. }
  167. if( h->mb.b_lossless )
  168. {
  169. nz = h->zigzagf.sub_8x8( h->dct.luma8x8[p*4+idx], p_src, p_dst );
  170. STORE_8x8_NNZ( p, idx, nz );
  171. h->mb.i_cbp_luma |= nz<<idx;
  172. return;
  173. }
  174. h->dctf.sub8x8_dct8( dct8x8, p_src, p_dst );
  175. nz = x264_quant_8x8( h, dct8x8, i_qp, ctx_cat_plane[DCT_LUMA_8x8][p], 1, p, idx );
  176. if( nz )
  177. {
  178. h->mb.i_cbp_luma |= 1<<idx;
  179. h->zigzagf.scan_8x8( h->dct.luma8x8[p*4+idx], dct8x8 );
  180. h->quantf.dequant_8x8( dct8x8, h->dequant8_mf[p?CQM_8IC:CQM_8IY], i_qp );
  181. h->dctf.add8x8_idct8( p_dst, dct8x8 );
  182. STORE_8x8_NNZ( p, idx, 1 );
  183. }
  184. else
  185. STORE_8x8_NNZ( p, idx, 0 );
  186. }
  187. #endif