最近在处理H264流的时候发现计算的宽高并不正确。
基本计算方法
大家都知道SPS解析之后,宽高就可以通过下面的计算公式计算出来:
- 宽
(pic_width_in_mbs_minus1 + 1) * 16
- 高
(pic_height_in_map_units_minus1 + 1) * 16
然而仔细思考一下就发现,这种方式计算的宽高都是16的倍数,但好像和平时的认知不符啊。
其实针对不是16整数倍的值,frame_cropping_flag
值为1,frame_mbs_only_flag
为1,如下
width = ((sps->pic_width_in_mbs_minus1 +1)*16) - sps->frame_crop_left_offset*2 - sps->frame_crop_right_offset*2; height = ((2 - sps->frame_mbs_only_flag)* (sps->pic_height_in_map_units_minus1 +1)*16) - (sps->frame_crop_top_offset*2) - (sps->frame_crop_bottom_offset*2);
|
这样计算出来的才是正确的。
终极计算方法
然后上述的计算方法还是有一些局限性,具体参见标准文档,比较靠谱的方法如下
width = (sps->pic_width_in_mbs_minus1+1) * 16; height = (2 - sps->frame_mbs_only_flag)* (sps->pic_height_in_map_units_minus1 +1) * 16); if(sps->frame_cropping_flag){ unsigned int crop_unit_x; unsigned int crop_unit_y; if (0 == sps->chroma_format_idc){ crop_unit_x = 1; crop_unit_y = 2 - sps->frame_mbs_only_flag; } else if (1 == sps->chroma_format_idc){ crop_unit_x = 2; crop_unit_y = 2 * (2 - sps->frame_mbs_only_flag); } else if (2 == sps->chroma_format_idc){ crop_unit_x = 2; crop_unit_y = 2 - sps->frame_mbs_only_flag; } else { crop_unit_x = 1; crop_unit_y = 2 - sps->frame_mbs_only_flag; } width -= crop_unit_x * (sps->frame_crop_left_offset + sps->frame_crop_right_offset); height -= crop_unit_y * (sps->frame_crop_top_offset + sps->frame_crop_bottom_offset); }
|