https://www.cnblogs.com/oldmanlv/p/6001933.html
1、frame_mbs_only_flag (位于sps) = 0(隔行扫描,多用于电视机) 表示编码图像可能是编码场或编码帧。
= 1(逐行扫描,多用于互联网) 表示编码图像都是一个仅包含帧宏块的编码帧
//将顶场和底场合为一帧进行编码
2、mb_adaptive_frame_field_flag (位于sps) = 0 场模式or帧模式 等于0表明在一个图像内不能切换使用帧和场宏块。
= 1 场模式or帧场自适应 等于1表示在一帧中有可能使用场和帧的切换
//帧和帧内的场宏块之间可能会有交换
//缺省=0
3、field_pic_flag (位于slice_header) = 1 表示该条带是一个编码场的条带
= 0 表示该条带是一个编码帧的条带
※※※※※
H264官方文档中MBAFF模式标识变量:
MbaffFrameFlag = ( mb_adaptive_frame_field_flag && !field_pic_flag )
※※※※※
|- SPS -|- slice -|
frame_mbs_o mb_adaptive_f field_pic_flag 模式 条带组映射单元(编码单元)
nly_flag rame_field_flag
1 不存在于码流中 不存在于码流中 (非场拼接的)帧编码 宏块单元
0 1 0(编码帧条带) MBAFF帧编码(MbaffFrameFlag) 锯齿扫描的宏块对单元(分场宏块对与帧宏块对)
0 1 1(编码场条带) 场编码 宏块单元
0 0 0(编码帧条带) (场拼接的)帧编码 光栅扫描的宏块对单元
0 0 1(编码场条带) 场编码 宏块单元
序列层面:
0 1 帧场自适应MBAFF和场共存
0 0 帧场和共存
帧和帧场自适应不能共存在一个序列中
slice_data{
if( moreDataFlag ) {
if( MbaffFrameFlag && ( CurrMbAddr%2 == 0 || (CurrMbAddr%2 == 1 && prevMbSkipped ) ) )
mb_field_decoding_flag = 1 表示该宏块对是一个场宏块对 //该变量是以MBAFF为前提而存在的
= 0 表示该宏块对是一个帧宏块对
macroblock_layer( )
}
}
伪代码表述:
if(非场拼接的帧图像编码 或 场图像编码)
MapUnits := 宏块单元
else //上下两场拼成的帧图像编码
if(MBAFF)
MapUnits := 宏块对单元(锯齿扫描)
else
MapUnits := 上下紧挨着的两个宏块组成的单元(光栅扫描)
在新一代视频压缩编码标准(第二版)的p165:
图像的4种编码方式:
1、将两个场合为一帧进行帧编码
2、两个场分别进行场编码
3、图像集帧场自适应PAFF(Picture adaptive field-frame)
4、宏块级帧场自适应(Macro-block adaptive field-frame):
MBAFF将两个场合为一帧
1、在宏块级别上,使用宏块对(MBAFF)为基本编码单元
2、在图像的运动区域,采用场编码
3、对于非运动区域,采用帧编码,比较两种方式产生的码流大小,就能在宏块级别选择更节省码流的编码方式。
slice只有3种编码方式:帧编码、场编码或MBAFF。
取决于:SPS中的frame_mbs_only_flag和mb_adaptive_frame_field_flag,Slice_Header中的field_pic_flag和bottom_field_flag
条带组映射单元以下面的方式确定:
- 如果frame_mbs_only_flag==0 并且 mb_adptive_frame_filed_flag ==1 并且编码图像是一个帧图像,这时条带组映射单元是宏块对单元(分场宏块对与帧宏块对)
- 否则,如果frame_mbs_only_flag == 1 或者 编码图像是场图像时,这时条带组映射单元是宏块单元
-- 否则(frame_mbs_only_flag==0 并且 mb_adptive_frame_filed_flag ==0 并且编码图像是一个帧图像),条带组单元是就像一个MBAFF帧图像的帧宏块对一样的
//上下紧挨着的两个宏块组成的单元(与宏块对并不完全一样,宏块对编码时以锯齿方式扫描,而前述两个宏块组成的单元编码时依然采用光栅扫描方式)。
对标准整理后的伪代码
if(非场拼接的帧图像编码 或 场图像编码)
MapUnits := 宏块单元
else //上下两场拼成的帧图像编码
if(MBAFF)
MapUnits := 宏块对单元
else
MapUnits := 上下紧挨着的两个宏块组成的单元