X264代码阅读笔记2

分析版本20061010-2245


一、预测模式选择 x264_macroblock_analyse  analyse.c
1、如何设置了sub16x16模式,且8x8块的成本(analysis.l0.i_cost8x8)小于16x16(analysis.l0.me16x16.cost)块的成本,
调用x264_mb_analyse_inter_p16x8和x264_mb_analyse_inter_p8x16进行8x16和16x8模式的成本计算。
2、计算特定模式i_partition的子像素预测成本,通过x264_me_refine_qpel完成子像素精度的预测。
3、如果b_chrome_me被置上了,要预测色度的帧内模式,x264_mb_analyse_intra_chroma,然后x264_mb_analyse_intra计算16x16、8x8和4x4的帧内模式。
4、如果不用计算色度帧内模式,直接调用x264_mb_analyse_intra完成帧内模式的预测。
5、由之前的帧间预测得出帧间的最小成本i_satd_inter,由帧内预测得出帧内的最小成本i_satd_intra。
6、如果analysis.b_mbrd被置上,则进行1/4像素精度的预测。
7、比较帧内和帧间预测,得出最小的成本。
8、如果h->mb.i_subpel_refine >= 7进行亚像素搜索。
9、B帧的预测暂时不分析,I帧的预测是用x264_mb_analyse_intra进行的。


二、宏块编码 x264_macroblock_encode  macroblock.c
1、特殊处理MBAFF模式的宏块
2、宏块类型是P_SKIP,调用x264_macroblock_encode_pskip进行处理。
3、宏块类型是B_SKIP,调用x264_macroblock_encode_skip进行处理。
4、之后是帧内模块的编码,分为I_16x16、I_8x8和I_4x4模式,在做每个模式的编码之前都要先计算预测帧。
5、x264_mb_encode_i16x16,如果时无损编码h->mb.b_lossless被置上,之后是无损压缩的量化和扫描。h->zigzagf.sub_4x4ac交流系数扫描,h->zigzagf.scan_4x4直流系数扫描。然后返回。
6、非无损编码模式。h->dctf.sub16x16_dct先算p_src-p_dst宏块残差,再对每个4x4模块进行dct变换。对16个4x4块进行处理。
先拿出每个4x4块的DC系数,然后对每个4x4块进行量化、扫描和反量化。分别由函数:x264_quant_4x4_trellis或quant_4x4、h->zigzagf.scan_4x4ac和h->quantf.dequant_4x4完成。
7、接着对4x4大小的DC系数进行:DCT变换、量化和扫描。分别由函数: h->dctf.dct4x4dc、quant_4x4_dc和h->zigzagf.scan_4x4完成。
8、对DC进行反DCT变换、反量化(为什么不是先反量化后反变换,待解决)。分别由函数:h->dctf.idct4x4dc、 x264_mb_dequant_4x4_dc。
9、拷贝直流系数。对每个4x4子块进行反DCT、反量化并加到预测宏块上得到重建的帧。由函数: h->dctf.add16x16_idct。
10、I8x8模式编码。对4个8x8块,分别进行。先调用x264_predict_8x8_filter进行滤波,再调用h->predict_8x8[i_mode]帧内预测得到预测帧,x264_mb_encode_i8x8编码。
11、x264_mb_encode_i8x8,之后是DCT变换——h->dctf.sub8x8_dct8函数,量化——x264_quant_8x8_trellis或quant_8x8函数、扫描——h->zigzagf.scan_8x8函数、反量化——h->quantf.dequant_8x8函数和反DCT变换并加到预测宏块上——h->dctf.add8x8_idct8函数。
12、I4x4模式。对16个4x4块分别进行。先h->predict_4x4[i_mode]进行帧内预测,得到预测帧。然后x264_mb_encode_i4x4编码。
13、x264_mb_encode_i4x4,如果是无损压缩h->mb.b_lossless置位。调用h->zigzagf.sub_4x4计算残差,并扫描,返回。
14、非无损编码。进行DCT、量化、Z字扫描、反量化、反IDCT并加到预测帧上。分别由函数:h->dctf.sub4x4_dct、x264_quant_4x4_trellis或quant_4x4、h->zigzagf.scan_4x4、h->quantf.dequant_4x4和h->dctf.add4x4_idct完成。
15、帧间模式。先进行运动补偿x264_mb_mc。根据宏块类型进行相应的运动补偿。
16、使用列表0(h->mb.i_type == P_L0)的16x16预测模式,根据h->mb.i_partition的类型(D_16x16、D_16x8、D_8x16),分别调用x264_mb_mc_0xywh函数进行前向宏块运动补偿。x264_mb_mc_0xywh分别对亮度和色度进行运动补偿。h->mc.mc_luma和h->mc.mc_chroma函数。
17、如果宏块类型(h->mb.i_type)为P_8x8或B_8x8。对4个8x8块,分别调用x264_mb_mc_8x8进行运动补偿。其根据字块类型(h->mb.i_sub_partition[i8])分别进行运动补偿。D_L0_8x8、D_L0_8x4、D_L0_4x8和D_L0_4x4类型,调用x264_mb_mc_0xywh进行前向宏块运动补偿。D_L1_8x8、D_L1_8x4、D_L1_4x8和D_L1_4x4类型,调用x264_mb_mc_1xywh进行后向宏块运动补偿。D_BI_8x8、D_BI_8x4、D_BI_4x8和D_BI_4x4类型,分别调用x264_mb_mc_01xywh进行宏块双向运动补偿。D_DIRECT_8x8类型,调用
x264_mb_mc_direct8x8进行直接模式8*8块运动补偿。x264_mb_mc_direct8x8函数根据不同的条件调用x264_mb_mc_0xywh、x264_mb_mc_1xywh和x264_mb_mc_01xywh函数。
18、如果宏块类型(h->mb.i_type)为B_SKIP或B_DIRECT。调用直接模式8*8块运动补偿函数x264_mb_mc_direct8x8。
19、如果宏块类型(h->mb.i_type)为其它B帧模式。先初始化参考列表。根据子块类型(h->mb.i_partition)为,D_16x16、D_16x8、D_8x16和前向、后项、双向参考类型,分别调用x264_mb_mc_0xywh、x264_mb_mc_1xywh和x264_mb_mc_01xywh函数。
20、运动补偿之后,进行编码。如果是无损编码(h->mb.b_lossless ==1),对16个4x4块,分别进行残差计算和z字扫描,由函数h->zigzagf.sub_4x4完成。
21、如果要进行8x8子块编码( h->mb.b_transform_8x8),调用h->dctf.sub16x16_dct8对每个8x8块先计算残差,再DCT变换。
然后对4个8x8块,分别调用x264_denoise_dct去噪、x264_quant_8x8_trellis或quant_8x8量化、h->zigzagf.scan_8x8Z字扫描。
然后是反量化、将残差加到参考宏块上。由h->quantf.dequant_8x8和h->dctf.add8x8_idct8完成。
22、如果不进行8x8子块编码。先用h->dctf.sub16x16_dct先算p_src-p_dst宏块残差,再对每个4x4模块进行dct变换。然后对16个4x4块进行去噪——x264_denoise_dct、量化x264_quant_4x4_trellis或quant_4x4、Z字扫描——h->zigzagf.scan_4x4。然后是反量化——h->quantf.dequant_4x4和反DCT并加到参考帧上——h->dctf.add8x8_idct。
23、亮度编码完成后,进行色度编码。x264_mb_encode_8x8_chroma函数。对Cb和Cr分量分别进行。如果时无损编码,对4个4x4块进行残差计算、Z字扫描和DC系数计算。
24、非无损编码,用h->dctf.sub8x8_dct对每个4x4块进行残差计算和DCT转换。之后对每个4x4块,先取2x2DC系数,量化——quant_4x4_chroma、Z字扫描——h->zigzagf.scan_4x4ac。对2x2DC系数进行DCT变换、量化和Z字扫描,分别由函数h->dctf.dct2x2dc、quant_2x2_dc和zigzag_scan_2x2_dc。接着是反DCT变换和反量化,h->dctf.idct2x2dc与x264_mb_dequant_2x2_dc函数。h->quantf.dequant_4x4对4x4块反量化,h->dctf.add8x8_idct对每个4x4块反DCT变换并且加到色度预测帧上。
25、亮度和色度编码完成后。计算亮度和色度模式和非零的个数,确定h->mb.i_cbp_chroma和h->mb.cbp的值。

你可能感兴趣的:(chrome,filter,BI,DST)