灵活宏块顺序--FMO(flexible Order)
发布时间:2020-12-15 01:40:03 所属栏目:百科 来源:网络整理
导读:FMO(flexible Macroblock Order)意即灵活宏块顺序 , 应用在baseline profile和extended profile . FMO是对Slice而言,Slice是一个独立的预测编码单元,假如你愿意,还可以作为一个独立传输单元, 一个Slice的宏块不能采用另一个Slice的宏块预测,当一个Slice出现
FMO(flexible Macroblock Order)意即灵活宏块顺序,应用在baseline profile和extended profile.
FMO是对Slice而言,Slice是一个独立的预测编码单元,假如你愿意,还可以作为一个独立传输单元, 一个Slice的宏块不能采用另一个Slice的宏块预测,当一个Slice出现问题,另一个Slice还可以独立解码, 这样子就不会导致误差扩散,通常情况下,H264对一个PIC编码,采取从上到下,从左到右的自然宏块光栅扫描顺序进行编码. 如果启用FMO功能,那么JM,将打乱宏块自然顺序,采用某种乱序方式,通过宏块映射方式,分配到不同的Slice中间. FMO映射划分图像的模式各种各样,重要的有棋盘模式、矩形模式等。FMO打乱了正常的宏块编号,也就是可能把相邻 的宏块分开,干扰了预测机制,增大了编码延时,但是增强了码流的健壮性,在恶劣的传输信道里,误码率较高的情况下 表现依然良好,下面对JM采用的各种宏块分组模式映射到Slice机制进行说明. 首先打开JM支持FMO的选项,改配置为如下,JM最大支持8个Slice. num_slice_groups_minus1 = 1?
???????????????? ?# Number of Slice Groups Minus 1,? ?0 == no FMO,1 == two slice??groups,etc.
slice_group_map_type?? ?= 0?
???????????????????? # 0:? Interleave,
???????????????????? # 1:?? Dispersed,???
???????????????????? # 2:?? Foreground with left-over,前景,最突出的位置
?????????????????????# 3:? Box-out,???
???????????????????? # 4:? Raster Scan??
???????????????????? #?5:? Wipe
???????????????????? # 6:? Explicit,slice_group_id read from SliceGroupConfigFileName 此时,JM对一个PIC会映射出两个Slice,映射机制按照interleave方式,每个Slice多少MB,请读配置文件sg0conf.cfg. Interleave就是Slice交积方式, |-------------------------| |XX0?Slice 0 ?? | |-------------------------| |XX1?Slice 1 ?? | |-------------------------| |XX2?Slice 0 ?? | |-------------------------| |XX3?Slice 1??? | |-------------------------| 编码顺序Slice0-->Slice1 假如Slice1第一个宏块序号是XX1,那么如果按照光栅扫描序,XX1上面一个宏块位于Slice0. 由于Slice规定预测宏块不可以位于另外一个Slice之中,另外当编码XX2宏块时,由于先对Slice0编码,Slice1还没有编码完成,当然也不能供预测,注意提供预测的必须是重建后的PIC(帧间)或者宏块(帧内),XX1,XX2宏块的B,C,D子块预测都不可用. 至此,FMO问题到此结束. 判断宏块是否可用: nt mb_is_available(int mbAddr,int currMbAddr) { ? if ((mbAddr < 0) || (mbAddr > ((int)img->PicSizeInMbs - 1))) ??? return 0;
? // the following line checks both: slice number and if the mb has been decoded
? if (!img->DeblockCall) ? { ??? if (img->mb_data[mbAddr].slice_nr != img->mb_data[currMbAddr].slice_nr) ?? // 判断Slice编号,如果不属于同一个Slice,那么该宏块不能用来作为自己的预测. ????? return 0; ? } ? ? return 1;
?
?通过当前宏块地址计算出相邻宏块是否可用
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |