当前位置:首页 >> 能源/化工 >>

H.264解码器流程图


H.264(JM12.2)解码流程理解

版本:

1

时间:2010.2-2010.3 邮件:zjhzchen@126.com

主要包括以下两个方面: 1.解码标准原理 2.JM 代码中的解码流程

1

一、H.264 解码标准
文档还那么多

财富值没意思!
解码器功能框图如下:
帧间 PRED 帧内预测

运动估计

参考图像

帧内

+
NAL 熵解码 重排序 X 反量化 反变换 D uF

+

滤波器

F

重建图像

解码器功能框图

详细的解码流程如下:

检测NAL单元边界,将 码流分割成多个NAL单 元

普通片解码

从码流中读入一个片的 编码数据

A
NAL单元解码

片DPA解码

EBSP->RBSP->SODB

C
片DPB解码
初始化宏块片组映射图

B

初始化参考图像序 号数组

去方块滤波 片DPC解码
根据当前图像类型初始

D 化参考图像列表
进行片解码

初始化当前宏块解 码设置

参考图像列表存储与处 理

E

从NAL中读入当前 宏块的语法元素

重建图像

进行宏块解码

详细的解码流程

2

二、JM12.2 的解码主控流程

取 码 模 读入缓存以及初 块 始化操作

H.264码流文件

视频输出

写入YUV文件

输 出 模 块

帧解码循环

错误检测以及参 考帧处理

解 码 模 块

片解码循环

去块滤波

宏块解码循环

图像解码完成

解码总流程

3

帧解码流程(decode one frame)

read_new_slice

Error_tracking

decode_slice

One frame over yes exit_picture 解码一帧的流程

no

4

读一个片(read_new_slice)

AllocNALU

1

2

3 4

5 6

7

8

T

R

F

GetAnnexbNALU

NAL单元的长度(包括开始前缀码),以及NALU头信息 的解析:NALU类型(T),NAL-REFERENCEIDC(R)和隐藏比特位(F)

NALUtoRBSP

剔除比特流中的仿校验 字节(0X03)

nal_unit_type处理

S P S

P P S

D P A

D P B

D P C

I D R

S L I C E

S E I

A U D

I D R

E O S E Q

E O S T R E A M

F I L L

FreeNALU(nalu)

5

解码 IDR

初始化操作

剔除填充比特和 控制比特

解析片头句法

灵活移动宏块的 初始化操作

检测新图像 包括图像的帧号,计算POC,为存储图像 分配空间,错误恢复的重设置

图像参数的初 始化操作

列表的初始化

列表的重排序

释放NALU内存 空间 解码IDR

6

灵活移动宏块的初始化(FmoInit)
1. mapUnitToSliceGroupMap
Start

num_slice_groups_minus1=0

Y

N

所有宏块属于片组0

slice_group_map_type
0 1
交织片组图类型 散列片组图类型 前景向左切出类型

2

3

4
光栅扫描片组图类 型

5

6

盒状展开片组图类 型

擦除片组图类型

显式片组图类型

计算变量 mapUnitToSGMap, 见Draft8.2.2.1

计算变量 mapUnitToSGMap, 见Draft8.2.2.2

计算变量 mapUnitToSGMap, 见Draft8.2.2.3

计算变量 mapUnitToSGMap, 见Draft8.2.2.4

计算变量 mapUnitToSGMap, 见Draft8.2.2.5

计算变量 mapUnitToSGMap, 见Draft8.2.2.6

计算变量 mapUnitToSGMap, 见Draft8.2.2.6

END

变量 mapUnitToSliceGroupMap 的计算流程 2. MbToSliceGroupMap

Start

i=n

i有效且其所属片组与n不同 Y

i=i+1
N

所有宏块属于片组0

END

函数 NextMbAddress( n )的流程

7

图像序列号的计算(decode_poc)

Start

0

当前序列参数集中变量 pic_order_cnt_type

2

PrevPicOrderCntMsb=0 根据idr_flag 和last_has_mmco_5 两变量情况计算变量帧序号偏 移FrameNumOffset

idr_flag Y N

Y

idr_flag或 last_has_mmco_5 N

计算变量帧序号偏移 FrameNumOffset

PrevPicOrderCntLsb=0

PrevPicOrderCntLsb = toppoc 计算ExpectedPicOrderCnt

帧号偏移和所 有的POC赋值 为0

计算当前图像PicOrderCntMsb 根据当前图像的帧场模式和顶/ 底场属性对ThisPOC、 framepoc、bottompoc进行修正

根据当前图像的帧场模式和顶/ 底场属性计算ThisPOC、 framepoc、bottompoc

根据当前图像的帧场模式和顶/ 底场属性对ThisPOC、 framepoc、bottompoc进行修正

进行序列号计算环境后处理

进行序列号计算环境后处理

进行序列号计算环境后处理

END

8

参考帧列表的重排序(reorder_lists)
Start

ref_pic_list_reordering_flag_l0=1

Y
refIdxL0=0

0, 1

reordering_of_pic_nums_idc

3

2 N
进行列表0的短期参考帧重排序 进行列表0的长期参考帧重排序 参考图像列表0重排序过程结束

ref_pic_list_reordering_flag_l1=1

Y
refIdxL1=0

0, 1

reordering_of_pic_nums_idc

3

2 N
进行列表1的短期参考帧重排序 进行列表1的长期参考帧重排序 参考图像列表1重排序过程结束

END

9

解码一个片(decode_one_slice)

set_ref_pic_num

compute_collocate d

为直接预测模式做一些准备工作:获取 co_located图像、计算mv_scale

宏块循环 计算宏块,块,像素的坐标;宏块结构语法元素 的初始化;相邻块的可用性;以及滤波参数

start_macroblock

read_one_macrobl ock decode_one_macr oblock ercWriteMBMOD EandMV

熵解码:包括解出宏块类型、预测模式、MVD、CBP、 残差(包括反量化操作)等

反变换及运动补偿:反量化反变换、运动补 偿、像素重构等 写入各个8*8块的预测模式及运动向量到错误隐藏 变量中

计算宏块序号

退出片

保存相关的片参数

解码一个片

10

开始一个宏块(start_macroblock)

更新当前宏块的坐标

定义子块和像素的垂直坐标

定义子块和像素的水平坐标

判断相邻宏块的可用性

初始化QP,CBP等句法信息

为mvd和重建图像分配空间

对滤波参数赋值 开始一个宏块

11

读一个宏块(read_one_macroblock)

计算当前宏块亮度和色度 的QP 读宏块的模式(帧或 场),得到宏块的类型
if ((img->type==P_SLICE )) // inter frame interpret_mb_mode_P(img); else if (img->type==I_SLICE) // intra frame interpret_mb_mode_I(img); else if ((img->type==B_SLICE)) // B frame interpret_mb_mode_B(img); else if ((img->type==SP_SLICE)) // SP frame interpret_mb_mode_P(img); else if (img->type==SI_SLICE) // SI frame interpret_mb_mode_SI(img);

分析当前宏块的分割模式

计算宏块分割不小于8*8 的标志

解析P8*8块的子分割

解析/transform size flag for 帧内 4x4 and 8x8 modes

宏块错误隐藏的处理 将亮度块中的16个4*4块的预测模式设置 为2(直接预测),运动向量置0 COPY宏块(也即P_Skip类型宏块)。无残 差,无MVD。直接利用预测MV得到像素预 测值。像素重构值=像素预测值

宏块的初始化

IS_DIRECT和IS_COPY宏 块的处理

IPCM宏块的处理

其他类型的处理: 1:读取亮度块和色度块的帧内预测模式 2:从比特流中读取运动信息,CBP以及残差信息

处理结束 读一个宏块 读一个宏块

12

从 NAL 中读取运动矢量信息(readMotionInfoFromNAL)

计算B_Direct_8*8类型子块的参考帧: 1:空间直接模式 2:时间直接模式

计算非Direc类型块分割的前向参考 帧(多帧参考) 计算非Direc类型块分割的前向参考 帧(单帧参考,直接赋值) 计算非Direc类型块分割的后向参考 帧(多帧参考) 计算非Direc类型块分割的后向参考 帧(单帧参考,直接赋值)

读前向运动矢量信息

读后向运动矢量信息

读参考图像的索引为去块滤波 从NAL中读运动矢量信息

13

从 NAL 中读取 CBP 以及残差信息 (readCBPandCoeffsFromNAL)
选择反扫描的类型(8*8或4*4)

计算色度QP的偏移量 如果当前宏块不是帧内16*16或 者I_PCM类型宏块则从码流中 读取CBP

获取CBP

亮度残差系数的初始化0

亮度直流残差系数的解析和反量化

亮度交流残差系数的处理和反量化

色度残差系数的初始化0

色度直流残差系数的解析和反量化

色度交流残差系数的处理和反量化

从NAL中读取CBP和残差信息

14

解码一个宏块(decode_one_macroblock)

IPCM解码

初始化运动向量和参考信息

INTRA_MB_16x16解码

I4MB解码

I8MB解码

注:此处的解码包括预测信息, 残差的反变换以及图像的重建

P片中的PSKIP解码

P16x16解码

P16x8解码

P8x16解码

其他类型的解码

解码一个宏块的流程

15

将宏块的预测模式以及运动信息写入错误隐藏变量中 (ercWriteMBMODEandMV)

计算当前红块的坐标

非B帧的处理

设置每个8*8块的预测模式

设置每个8*8块的运动向量

B帧的处理 将预测模式和运动信息写到错误隐藏变量中

16

退出图像(exit_picture)

图像的去块滤波

帧场自适应时的图像后处理

当前图像的错误检测

store_picture_in_dpb

打印解码的时间信息

退出图像

17

图像的去块滤波(DeblockPicture)
帧场自适应时的初始化赋值 : GetStrength = GetStrengthMBAff; EdgeLoopLuma = EdgeLoopLumaMBAff; EdgeLoopChroma = EdgeLoopChromaMBAff;

非帧场自适应时的初始化赋值: GetStrength = GetStrengthNormal; EdgeLoopLuma = EdgeLoopLumaNormal; EdgeLoopChroma = EdgeLoopChromaNormal;

计算当前宏块的位置以及采取8*8边界滤波 的标志

一帧图像中宏块的滤波循环

判断宏块的场模式以及宏块的上左边界是否 需要滤波

判断相邻块的可用性信息

水平滤波(以下是循环)

边界信息

滤波强度的计算

8*8或者4*4亮度块的滤波

色度块的滤波

垂直滤波(与水平滤波类似)

一个宏块的滤波结束

图像的去块滤波结束 图像的去块滤波

18

图像的错误检测以及处理
对图像中的宏块进行判断:丢失or OK

发现丢失或者错误:开始错误隐藏处理

帧内错误隐藏处理

帧间错误隐藏处理

帧内的掩盖方式为像素平均权值

根据图像的运动剧烈程度大小,帧间掩盖分为两种方式。 1程度比较小,那么采用比较简单的方法,就直接把前一帧 的相同位置的块拷贝到当前受损块(concealByCopy()); 2否则通过预测运动矢量把预测帧中对应位置的块拷贝到当 前受损块(concealByTrial())

图像的错误检测以及处理

19

store_picture 到解码缓冲区(store_picture_in_dpb)

输入重建图像



是否是IDR图像



adaptive_memory_management :自适应内存管理控制 判断帧场

idr_memory_management :清空现在缓冲区图像 场

sliding_window_memory_management

insert_picture_in_dpb

检查序列中是否有非参考图像,并 清除或输出

更新短期参考帧序列

插入图像在DPB中

更新长期参考帧序列

更新短期参考帧序列

Dump dpb

更新长期参考帧序列

Dump dpb

20

IDR 内存管理(idr_memory_management)
重建后的图像

no_output_of_prior_pics_flag=1?



清空DPB

输出参考图像

Last_picture置空和POC初始化0

更新短期参考列表

更新长期参考列表

该帧是否作为长期参考帧的判断 IDR内存管理

21

adaptive-内存管理控制(adaptive_memory_management)

参考图像的自适应内存控制标记过程
Start

1 2
将短期图像标记为 “不用于参考” 将长期图像标记为 “不用于参考”

memory_management_control_operation参数

6 5
所有参考图像标记 为“不用于参考” 分配一个长期帧索 引给当前图像

3

4
基于 MaxLongTermFrameIdx的 标记过程

分配LongTermFrameIdx 给一个短期参考图像

0

将短期图像标记为“不用于参考”
Start END

picNumX = CurrPicNum – ( difference_of_pic_nums_minus1 + 1 )

将长期图像标记为“不用于参考”
Start

0

field_pic_flag

1

0

field_pic_flag

1

picNumX指定的短期参考帧或 短期参考场对以及它们的两个 场均标记为“不用于参考”

picNumX 指定的短期参考场标记为“不用于参考” 。如此场是帧或场对的一个场 ,则相应参考帧或参考场对也标记为“不 用于参考”,但另一个场的标记不做变化

LongTermPicNum等于 long_term_pic_num的长期参考 帧或场对及其两个场均标记为 “不用于参考”

LongTermPicNum等于long_term_pic_num的长期参考 场标记为“不用于参考”。如此 场是帧或场对的一部分,则相应的参考帧或参考场 对也标记为“不用于参考”,但另一个场的标记不 做变化

END

END

分配LongTermFrameIdx给一个短期参考图像
Start

变量MaxLongTermFrameIdx的计算
Start

根据语法元素 difference_of_pic_nums_minus1计算 picNumX

Y

LongTermFrameIdx已分配

N

=0

max_long_term_frame_idx_plus1

>0
MaxLongTermFrameIdx= max_long_term_frame_idx_plus1 – 1

相应的参考帧或场对及其两个 场均先要标记为“不用于参考 ”

MaxLongTermFrameIdx设置为“ 无长期帧索引”

field_pic_flag 0
picNumX 指定的短期参考帧或场对及其两个场从" 用于短期参考"变化到"用于长期参考",且 LongTermFrameIdx=long_term_frame_idx

1

LongTermFrameIdx已被分配给 一非成对参考场,且这个场不 是picNumX指定图像的互补场 ,需被标记为“不用于参考”

picNumX 指定的短期参考场的标记从"用于短期参 考"变化到"用于长期参考",且 LongTermFrameIdx=long_term_frame_idx

END

END

22

插入图像到 DPB(insert_picture_in_dpb)
新图像

底场 图像编码结构 帧

顶场

构造帧

构造顶场和底场

构造帧

计算PSNR 插入图像到DPB

23

flush-DPB(flush_dpb)
将丢失的非参考帧放入错误隐藏 buffer 去参考帧标记 unmark_for_reference

将DPBB.fs的参考标记置 为0

将无用帧从DPB中移出

将缓冲区的图像输出到YUV文 件:output_one_frame_from_dpb

Flush-DPB

24


相关文章:
H.264解码器流程图
H.264(JM12.2)解码流程理解 版本: 1 时间:2010.2-2010.3 邮件:zjhzchen@126.com 主要包括以下两个方面: 1.解码标准原理 2.JM 代码中的解码流程 1 一、...
H.264(解码器)
H.264 解码器原理 图 1 H.264 解码器原理框图 解码器从 NAL 接收压缩后的比特流,然后经过嫡解码和重排序,得到量化后宏块系数 ' ' X,再经过逆量化、逆变换...
基于H.264的视频图像编解码技术研究
n Q-1 图 3.3 H.264 视频编码器结构流程图 Fig3.3 H.264video encoder...H.264 video decoder flowchart H.264 解码器从 NAL 中获得一个压缩比特流。...
在PotPlayer下分别使用5种解码器硬解的方法(入门级图文版)
将 PD10 解码器注册为系统解码器,然后点击“添加系统 解码器”按钮进行添加) 5.在“滤镜”-“视频解码”设置页里,将 H.264/AVC1 的解码器改成“CyberLink ...
H.264HD编码器说明书
H.264编解码器9130 - 使用... 65页 免费 网络视频解码器说明书 30页 1财富...H.264 HD 编码器构成如上图所示,它由信号(HDMI,YPbPr,SDI,CVBS)输入 A/D ...
各种音视频编解码学习详解 h264
各种音视频编解码学习详解 h264_计算机软件及应用_IT/计算机_专业资料。各种音视频编解码学习详解 h264 , mpeg4 ,aac 等所有音视频格式 编解码学习笔记(一) :...
H.264可扩展视频编解码器(SVC)应用详解
图 5 显示了利用 H.264 AVC 可能实现的一个系统。 图 5:H.264 AVC 的视频监控应用。 利用 H.264 SVC 编解码器,就可以放宽对摄像机伺服多个视频流的要求...
PotPlayer解码器硬解的方法(入门级图文版)
PotPlayer解码器硬解的方法(入门级图文版)_计算机软件及应用_IT/计算机_专业资料...在 “滤镜” 视频解码” “ 设置页里, H264/AVC1 的解码器改成 将“...
H.264 解码器 IP-D-373-L 推广书
H.264 解码器 IP-D-373-L 推广书_计算机软件及应用_IT/计算机_专业资料。原始...HDMI1.3 根据显示器的 EDID 显示 100ohms 100 米 原始技术文档 系统图: Ce...
更多相关标签:
h264解码器 | h264解码器下载 | h264编解码器 | 暴风影音h264解码器 | h.264 avc1 解码器 | h264格式解码器 | h264解码器 js | h264编解码器下载 |