灵活宏块顺序--FMO(flexible Order)
来源:互联网 发布:mysql没有配置向导 编辑:程序博客网 时间:2024/05/29 17:19
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
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
slice_group_map_type = 0
# 0: Interleave,
# 1: Dispersed,
# 2: Foreground with left-over,前景,最突出的位置
# 3: Box-out,
# 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;
# 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;
if (!img->DeblockCall)
{
if (img->mb_data[mbAddr].slice_nr != img->mb_data[currMbAddr].slice_nr)
//判断Slice编号,如果不属于同一个Slice,那么该宏块不能用来作为自己的预测.
return 0;
}
return 1;
通过当前宏块地址计算出相邻宏块是否可用
- 灵活宏块顺序--FMO(flexible Order)
- 灵活宏块顺序--FMO(flexible Order)
- 灵活顶点格式--Flexible Vertex Format, FVF
- 灵活顶点格式--Flexible Vertex Format, FVF
- FMO特性
- Order by 的数值型灵活使用
- 字节顺序(byte order)
- spring AspectJ order(顺序)
- ORDER BY 自定义顺序
- 字节顺序(byte order)
- ARM 汇编中灵活的第二操作数(Flexible second operand)
- 代码块执行顺序
- 静态块执行顺序
- 代码块执行顺序
- 代码块执行顺序
- 字节顺序(Byte Order)
- 帧内16*16模式的宏块数据传输顺序
- static 块以及代码块执行顺序
- 业务建模之涉众
- mac os WebView 更改UserAgent
- 漫谈.NET开发中的字符串编码
- vmware下安装KVM虚拟机手记
- (转)神马是UTF-8
- 灵活宏块顺序--FMO(flexible Order)
- IE8的css hack /9
- TortoiseCVS 使用手册(V1.12.3)
- 状态机
- 为海量数据仓库定制多重备份策略
- BlackBerry App World应用提交和其他商业服务(二)
- displaytag 的 javadoc 链接
- c/c++字节对齐
- ubuntu用不了root用户:~$ su - root Password: su: Authentication failure怎么办?