H264---帧/场编码模式选择---PAFF MBAFF frame_mbs_only_flag mb_adaptive_frame_field_flag field_pic_flag

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 := 上下紧挨着的两个宏块组成的单元

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42024067/article/details/107180034
今日推荐