原文:http://blog.csdn.net/yangzhongxuan/article/details/8003547

解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。

nal_unit( NumBytesInNALunit ) {  /* NumBytesInNALunit为统计出来的数据长度 */
       forbidden_zero_bit    // forbidden_zero_bit  等于 0表示网络传输没有出错 
    nal_ref_idc //   指示当前 NAL 的优先级。取值范围为 0-3,  值越高,表示当前 NAL 越重要,需要优先受到保护。H.264 规定如果当前 NAL 是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的数据单位时,本句法元素必须大于 0。    
    nal_unit_type // NAL类型 指明当前 NAL unit 的类型 
    NumBytesInRBSP = 0  
    /* rbsp_byte[i]    RBSP 的第 i 个字节。 RBSP 指原始字节载荷,它是 NAL 单元的数据部分的封装格式,封装的数据来自 SODB(原始数据比特流)。SODB 是编码后的原始数据,SODB 经封装为 RBSP 后放入 NAL 的数据部分。下面介绍一个 RBSP 的生成顺序。 
        从 SODB 到 RBSP 的生成过程: 
        -      如果 SODB 内容是空的,生成的 RBSP 也是空的 
        -      否则,RBSP 由如下的方式生成: 
       1) RBSP 的第一个字节直接取自 SODB 的第 1 到 8 个比特,(RBSP 字节内的比特按照从左到右对应为从高到低的顺序排列,most  significant),以此类推,RBSP 其余的每个字节都直接取自 SODB的相应比特。RBSP  的最后一个字节包含 SODB  的最后几个比特,及如下的 rbsp_trailing_bits() 
       2) rbsp_trailing_bits()的第一个比特是 1,接下来填充 0,直到字节对齐。(填充 0 的目的也是为了字节对齐) 
       3) 最后添加若干个 cabac_zero_word(其值等于 0x0000)            
    */
 
    for( i = 1; i <</span> NumBytesInNALunit; i++ ) {           
        if( i + 2 <</span> NumBytesInNALunit && next_bits( 24 )    = =    0x000003 ) {   
/* 0x000003伪起始码,需要删除0x03这个字节 */       
            rbsp_byte[ NumBytesInRBSP++ ]   
            rbsp_byte[ NumBytesInRBSP++ ]   
            i += 2    /* 取出前两个0x00后,跳过0x03 */          
            //emulation_prevention_three_byte      NAL 内部为防止与起始码竞争而引入的填充字节  ,值为 0x03。 
            emulation_prevention_three_byte    
        } else           
            rbsp_byte[ NumBytesInRBSP++ ] /* 继续读取后面的字节 */

}          
}

序列参数集(SPS)

句法

C

Desc

seq_parameter_set_rbsp(){

profile_idc/*指明所用的Profile */

0

u(8)

constraint_set0_flag

0

u(1)

constraint_set1_flag

0

u(1)

constraint_set1_flag

0

u(1)

reserved_zero_5bits /* equal to 0 */

0

u(5)

level_idc /* 指明所用的Level */

0

u(8)

seq_parameter_set_id /* 指明本序列参数集的id号,0-31,被图像集引用,编码需要产生新的序列集时,使用新的id,而不是改变原来参数集的内容 */

0

ue(v)

log2_max_frame_num_minus4/*为读取元素frame_num服务,frame_num标识图像的解码顺序,frame_num的解码函数是ue(v),其中v=log2_max_frame_num_minus4+4,该元素同时指明frame_num的最大值MaxFrameNum=2( log2_max_frame_num_minus4+4)*/

0

ue(v)

pic_order_cnt_type /* 指明poc的编码方法,poc标识图像的播放顺序,poc可以由frame_num计算,也可以显示传送。poc共三种计算方式 */

0

ue(v)

if(pic_order_cnt_type==0)

log2_max_pic_order_cnt_lsb_minus4 /* 指明变量MaxPicOrderCntLsb的值, MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4) */

0

ue(v)

else if(pic_order_cnt_type==1){

delta_pic_order_always_zero_flag /* 等于1时,元素delta_pic_order_cnt[0]和delta_pic_order_cnt[1]不在片头中出现,并且它们的默认值是0,等于0时,上述两元素出现的片头中 */

0

u(1)

offset_for_non_ref_pic /* 用来计算非参考帧或场的poc,[-231,231-1] */

0

se(v)

offset_for_top_to_bottom_field/*计算帧的底场的poc */

0

se(v)

num_ref_frames_inpic_order_cnt_cycle /* 用来解码poc,[0.255] */

0

ue(v)

for(i=0;i<num_ref_frames_inpic_order_cnt_cycle;i++)

offset_for_ref_frame[i]/*用来解码poc,对于循环中的每个元素指定一个偏移 */

0

se(v)

}

num_ref_frames /* 参考帧队列可达到的最大长度,[0,16] */

0

ue(v)

gaps_in_frame_num_value_allowed_flag /* 为1,允许slice header中的frame_num不连续 */

0

u(1)

pic_width_inmbs_minus1 /*本元素加1,指明以宏块为单位的图像宽度 PicWidthInMbs=pic_width_in_mbs_minus1+1 */

0

ue(v)

pic_height_in_map_units_minus1 /* 本元素加1,指明以宏块为单位的图像高宽度 PicHeightInMapUnitsMbs=pic_height_in_map_units_minus1+1 */

0

ue(v)

frame_mbs_only_flag /* 等于0表示本序列中所有图像均为帧编码;等于1,表示可能是帧,也可能场或帧场自适应,具体编码方式由其它元素决定。结合前一元素:FrameHeightInMbs=(2-frame_mbs_only_flag)*PicHeightInMapUnits */

0

ue(v)

if(frame_mbs_only_flag)

mb_adaptiv_frame_field_flag /* 指明本序列是否是帧场自适应模式:

frame_mbs_only_flag=1,全部是帧

frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=0,帧场共存

frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=1,帧场自适应和场共存*/

0

u(1)

direct_8x8_inference_flag /* 用于指明B片的直接和skip模式下的运动矢量的计算方式 */

0

u(1)

frame_cropping_flag /*解码器是否要将图像裁剪后输出,如果是,后面为裁剪的左右上下的宽度 */

0

u(1)

if(frame_cropping_flag){

frame_crop_left_offset

0

ue(1)

frame_crop_right_offset

0

ue(1)

frame_crop_top_offset

0

ue(1)

frame_crop_bottom_offset

0

ue(1)

}

vui_parameters_present_flag /* 指明vui子结构是否出现在码流中,vui子结构在附录中指明,用于表征视频格式的信息 */

0

u(1)

if(vui_parameters_present_flag)

vui_parameters()

0

rbsp_trailing_bits()

0

}

H264--5--H264解码[8]的更多相关文章

  1. Android平台对H264视频硬解码

    本文讲述如何使用Android标准的API (MediaCodec)实现H264的硬件解码. 原本我们是用JNI调用平台提供的硬件解码接口得到YUV帧,再放入opengl脚本里处理渲染的.可是换了新平 ...

  2. 嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)

    /* 编译命令:arm-linux-gcc -o show2642 264showyuv2.c -I/usr/local/ffmpeg_arm/include/ -L/usr/local/ffmpeg ...

  3. 多媒体开发之--- rtsp 中的H264 编码+打包+解码相关知识es、pes、ts...

    1)ES流(Elementary Stream): 也叫基本码流,包含视频.音频或数据的连续码流. 2)PES流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的 ...

  4. 多媒体开发之---h264 取流解码实现

    解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码. nal_unit( NumBytesInNALunit ) {  /* NumBytesInNALunit为统计出来的 ...

  5. 多媒体开发之---h264 取流解码分析

    1. nalu_unit_type = *((unsigned char *)pEmptyBuf->bufVirtAddr+4); nalu_unit_type = nalu_unit_type ...

  6. H264的编解码流程?

  7. iOS8系统H264视频硬件编解码说明

    公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...

  8. 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧

    前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...

  9. ps流提取H264并解码播放

    因为需要从海康ps流中提取H264数据并进行解码播放,才有了这篇文章.因为是视频编解码领域的纯入门新手,个别理解或者方法有误,需要自行判断,不过相关方法已经测试通过,对于 像我这样的新手还是有一定的借 ...

  10. H264编码器性能測试

    版本号:0.1.0-beta 作者:石硕 更新:2014-04-13 15:54:08 ======================================================== ...

随机推荐

  1. BZOJ 4695 最假女选手 线段树

    题意: 给定一个长度为 N序列,编号从1 到 N.要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x  2.把一个区间[L,R] 里小于x 的数变成x  3.把一个区间[L,R] 里大于x ...

  2. git命令初级

    git是开源的分布式版本控制系统,分布式主要区别于集中式代表CVS(Concurrent Version System,遵从C/S架构,同步比较笨拙.)和SVN(Subversion),linux开发 ...

  3. 笔试算法题(47):简介 - B树 & B+树 & B*树

    B树(B-Tree) 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量 ...

  4. Wireshark does not show SSL/TLS

    why it doesn't show as "TLS/SSL"? Because it's not on the standard port for SSL/TLS. You c ...

  5. LINUX:Contos7.0 / 7.2 LAMP+R 下载安装Php篇

    文章来源:http://www.cnblogs.com/hello-tl/p/7569071.html 更新时间:2017-09-21 16:03 简介 LAMP+R指Linux+Apache+Mys ...

  6. Django之ORM操作(***)

    Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...

  7. MT6753/MT6755 呼吸灯功能添加

    利用mtk pmic自带的呼吸灯模式: 主要修改代码: kernel-3.10/drivers/misc/mediatek/leds/mt6755/leds.c   int mt_brightness ...

  8. Django开发:(1)django基础 & url控制器

    HTTP请求协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本 ...

  9. Jquery根据JSON生成Table

    先说下背景 本人属于juqery小白中的极品小白.基本对于JS jquery这些不懂.用到时候基本百度下 拿过来改改OK. 上面这东西让我弄了三天.可能对于其他人来说 一天就搞定了 .看来还真得去学一 ...

  10. [ C语言 ] 迷宫 迷宫生成器 [ 递归与搜索 ]

    [原创]转载请注明出处 [浙江大学 程序设计专题] [地图求解器] 本题目要求输入一个迷宫地图,输出从起点到终点的路线. 基本思路是从起点(Sx,Sy)每次枚举该格子上下左右四个方向,直到走到终点(T ...