H.264中POC类型之探讨

有 B 图像的场合。POC 表示的是图像显示顺序。由于POC对于参考序列的初始化,重排序及标记关系重大,所以做了如下的分析,以下讨论情况是针对帧编码。


pic_order_cnt_type=0的时候:

       poc与frame_num没有直接的关系,是显式地出现在bit流中为pic_order_cnt_lsb(PicOderCntMsb 和 PicOderCntLsb分别代表的是POC的高位和低位。H.264中为了提高压缩效率,只对POC的低位进行编码传输,POC的高位不在码流中直接传输,而是通过别的语法元素推导得来。)
pic_order_cnt_lsb只是一个低位的poc,对应的高位PicOrderCntMsb不出现在bit流中,这个需要编码器或者解码器对pic_order_cnt_lsb的情况来进行PicOrderCntMsb的进位。其中MaxPicOrderCntLsb在SPS中可以得到,用于控制进位的。假定MaxPicOrderCntLsb=64,prevPicOrderCntMsb=0有如下情况:


      I   P   B...未出现mmco==5或IDR.....P B B P B B P B B
poc:    0   6   2                          60   56   58   2   62 0 6 2 4
总计 poc   0   6   2                          60   56   58   66 62 64 70 66   68


       这里变量prevPicOrderCntLsb应该是以前参考帧的pic_order_cnt_lsb,对于pic_order_cnt_lsb=2的P,现在来计算它的poc, 此时prevPicOrderCntLsb=60,很明显满足条件prevPicOrderCntLsb>pic_order_cnt_lsb&&(prevPicOrderCntLsb-pic_order_cnt_lsb)>=64/2,
由于是参考帧所以其prevPicOrderCntMsb=prevPicOrderCntMsb+64=64,此时TopFiledOrderCnt=64+2=66;
      接着计算pic_order_cnt_lsb=62的B此时prevPicOrderCntMsb=64,而prevPicOrderCntLsb=2,很明显满足prevPicOrderCntLsb<pic_order_cnt_lsb&&(pic_order_cnt_lsb-prevPicOrderCntLsb)>=64/2,此时PicOrderCntMsb=prevPicOrderCntMsb-prevPicOrderCntLsb=64-2=62。由于不是参考帧所以prevPicOrderCntMsb还是保持为64,很明显prevPicOrderCntMsb应该是MaxPicOrderCntLsb的倍数。对于pic_order_cnt_lsb=0的B,上述两种情况都不满足,所以其PicOrderCntMsb=64。
      prevPicOrderCntMsb和prevPicOrderCntLsb在IDR或者mmco=5的时候选择性复位。这里如果考虑要场编码,则有如下情况:


      I   P   B...未出现mmco==5或IDR.....Pt   Pb   Bt   Bb   Bt Bb Pt Pb   Bt   Bb Bt Bb
poc:    0   6   2                          60   61   56   57   58 59 2 3 62   63 0     1
总计 poc   0   6   2                          60    56    58        66    62    64


       Pt的poc为60的时候包含了mmco=5,由于他不是一个底场,所以prevPicOrderCntLsb就为60,如果出现在Pt的poc为61的时候包含了mmco=5,则prevPicOrderCntLsb=0;所以在帧编码的时候mmco=5只是复位prevPicOrderCntMsb,而prevPicOrderCntLsb应该不复位。而在场编码的时候mmco=5只有出现在底场的时候复位prevPicOrderCntMsb,prevPicOrderCntLsb为0。保证prevPicOrderCntLsb初始是从顶场开始,且为偶数开始(应该不是简单如此吧,应该还有深入原因,那位想通透的告诉我一声)


pic_order_cnt_type=1的时候:

        考虑如下序列情况
        SPS中设置对于帧编码,offset_for_top_to_bottom_field=0;对于场编码           offset_for_top_to_bottom_field=1


序列1:    I    P    B 循环一
frame_num: 0    1    2   
poc:       0    4    2
                  P    B 循环二
frame_num:           2    3   
poc:                 8    6
                  P    B 循环三
frame_num:           3    4   
poc:             12    10

         此时对于num_ref_frames_in_pic_order_cnt_cycle=1,num_ref_frames_in_pic_order_cnt_cycle表示IDR后一个循环内参考帧的总数.offset_for_ref_frame[0]=4,offset_for_ref_frame表示IDR后参考帧之间的偏移。


         如果要计算poc=12的P帧的POC,如何得到呢?首先已经知道frame_num=3,num_ref_frames_in_pic_order_cnt_cycle=1,offset_for_ref_frame[0]=4,则可以得到
absFrameNum=3,picOrderCntCycleCnt =(3-1)/1=2;frameNumInPicOrderCntCycle=(3-1)%1=0;
expectedDeltaPerPicOrderCntCycle = 0
for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
expectedDeltaPerPicOrderCntCycle += offset_for_ref_frame[ i ]


则expectedDeltaPerPicOrderCntCycle =4;
expectedPicOrderCnt = picOrderCntCycleCnt * expectedDeltaPerPicOrderCntCycle
for( i = 0; i <= frameNumInPicOrderCntCycle; i++ )
expectedPicOrderCnt = expectedPicOrderCnt + offset_for_ref_frame[ i ]
则expectedPicOrderCnt =12;可以得到
由于是P-slice,此时slice header中
delta_pic_order_cnt[ 0 ]=0;delta_pic_order_cnt[ 1 ]=0;
TopFieldOrderCnt = 12;BottomFieldOrderCnt = 12;


序列2:    I    P    B     B    循环一
frame_num: 0    1    2     2
poc:       0    6    2     4
                  P    B     B    循环二
frame_num:           2    3     3   
poc:                 12    8     10
                  P    B     B    循环三
frame_num:           3    4     4
poc:             18    14 16

此时
对于
num_ref_frames_in_pic_order_cnt_cycle=1,
offset_for_ref_frame[0]=6。
如果要计算poc=16的B帧的POC,如何得到呢?首先已经知道frame_num=4,num_ref_frames_in_pic_order_cnt_cycle=1,offset_for_ref_frame[0]=6,则可以得到
absFrameNum=4-1(因为是B帧不用于参考),picOrderCntCycleCnt =(3-1)/1=2;frameNumInPicOrderCntCycle=(3-1)%1=0;
expectedDeltaPerPicOrderCntCycle =6;
由于offset_for_non_ref_pic=-2*(连续B帧的数量);这里应该是-4
expectedPicOrderCnt =14;可以得到,
此时slice_header中delta_pic_order_cnt[ 0 ]=2,delta_pic_order_cnt[ 1 ]=0;
TopFieldOrderCnt = 16;BottomFieldOrderCnt = 16;


序列2:    I    P    B     P     B B P B B B    循环一
frame_num: 0    1    2     2     3 3 3 4 4 4
poc:       0    4    2     10 6 8 18 12   14   16

                  P    B     P     B B P B B B    循环二
frame_num:           4    5     5     6 6 6 7 7 7   
poc:                 22    20 28 24 26 36 30   32   34
                  P    B     P     B B P B B B    循环三
frame_num:           7    8     8     9 9 9 10 10   10
poc:             40    38 46 42 44 54   48 50   52
此时
对于
num_ref_frames_in_pic_order_cnt_cycle=3,
offset_for_ref_frame[3]={4,6,8}。
如果要计算poc=54的P帧的POC,如何得到呢?首先已经知道frame_num=9,num_ref_frames_in_pic_order_cnt_cycle=3,offset_for_ref_frame[3]={4,6,8},则可以得到
absFrameNum=9,picOrderCntCycleCnt =(9-1)/3=2;frameNumInPicOrderCntCycle=(9-1)%3=2;
expectedDeltaPerPicOrderCntCycle =18;
expectedPicOrderCnt =18*2+4+6+8=54;可以得到,
此时slice_header中delta_pic_order_cnt[ 0 ]=0,delta_pic_order_cnt[ 1 ]=0;
TopFieldOrderCnt = 54;BottomFieldOrderCnt = 54;
如果要计算poc=50的B帧的POC,如何得到呢?由于是B帧
absFrameNum=10-1=9,picOrderCntCycleCnt =(9-1)/3=2;frameNumInPicOrderCntCycle=(9-1)%3=2;
由于连续B帧数目是变化的取平均值为2,此时offset_for_non_ref_pic=-4,
expectedPicOrderCnt =18*2+4+6+8-4=50;此时slice_header中delta_pic_order_cnt[ 0 ]=0,delta_pic_order_cnt[ 1 ]=0;


pic_order_cnt_type=2的时候:

         poc是由frame_num推导出来的,这个比较简单,但是应该注意,在这种情况下不存在连续的非参考图象(注释),且解码输出的顺序和显示输出顺序一致(注释),意思就是说不出现B帧,但可以出现非参考的P场,这也是为什么当nal_ref_idc=0的时候tempPicOrderCnt = 2 * ( FrameNumOffset + frame_num ) – 1的情况。这里保证了参考场的POC始终为偶数,并且大于同帧的另外一个场。


        综合三种poc的,类型2应该是最省bit的,因为直接从frame_num获得,但是序列方式限制最大
类型1,只需要一定的bit量sps标志出一些信息还在slice header中表示poc的变化,但是比类型0要节省bit,但是其序列并不是随意的,要周期变化;对于类型0因为要对poc的 lsb进行编码所以用到的bit最多,优点是序列可以随意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不再单打独斗?中国移动联合多企业组建医疗数据公司

中国移动 6月20日消息&#xff0c;中国移动通信集团公司与浪潮集团有限公司作为发起方&#xff0c;共同组建中国健康医疗大数据股份有限公司&#xff0c;在中国移动总部举行投资意向签约仪式。 国家卫生和计划生育委员会副主任金小桃,国务院国有资产监督管理委员会副主任徐福顺…

【Python基础入门系列】第03天:Python 变量与数据类型

这篇文章我们学习 Python 变量与数据类型 Python 变量类型 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型&#xff0c;解释器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 因此&#xff0c;变量可以指定不同…

HTML中的表单

HTML表单 表单用于搜集不同类型的用户输入&#xff0c;表单由不同类型的标签组成&#xff0c;实现一个特定功能的表单区域&#xff08;比如&#xff1a;注册&#xff09;&#xff0c; 首先应该用标签来定义表单区域整体&#xff0c;在此标签中再使用不同的表单控件来实现不同…

20169210 2016-2017-2《网络攻防实践》第八周总结

教材 一、Linux操作系统基本矿建概述 1、Linux操作系统发展与现状 跨平台的硬件支持&#xff1b;丰富的软件支持&#xff1b;多用户多任务&#xff1b;可靠的安全性&#xff1b;良好的稳定性&#xff1b;完善的网络功能2、Linux系统结构 1&#xff09;Linux进程与线程管理机制2…

cad卸载_想重新安装CAD提示已经安装?不会卸载?进来教你卸载CAD

大家好&#xff0c;我是【小杰趣分享】&#xff0c;这里每天都会分享一下和电脑软件、电脑硬件相关的文章或视频。这一期小杰教大家怎么彻底卸载CAD&#xff01;CAD这款软件是小杰见过最难卸载的软件了&#xff0c;不知道你们有没有遇到过卸载CAD想重新安装&#xff0c;却怎么都…

直击3.15 安防行业如何维护消费者权益

一年一度的315维权活动让众多行业为之惶恐&#xff0c;安防行业发展至今&#xff0c;和各行各业一样也同样面临着安防市场粗制滥造、假冒伪劣产品盛行的局面。 315今年的消费维权主题是 “网络诚信 消费无忧”&#xff0c;中国消费者协会副秘书长董祝礼表示&#xff0c;网络消费…

RBSP、SODB、EBSP三者的区别和联系 SPS: sequence parameter sets

SODB&#xff1a;最原始的编码数据&#xff0c;没有任何附加数据 RBSP&#xff1a;在 SODB 的基础上加了rbsp_stop_ont_bit&#xff08;bit 值为 1&#xff09;并用 0 按字节补位对齐EBSP&#xff1a;在 RBSP 的基础上增加了防止伪起始码字节&#xff08;0X03&#xff09; SPS:…

【Python基础入门系列】第04天:Python 流程控制

在编程的世界中&#xff0c;流程控制是程序员运行的基础&#xff0c;流程控制决定了程序按照什么样的方式去执行&#xff0c;本节给大家介绍 Python 流程控制相关语法。 if 语句 if 语句表示如何发生什么样的条件&#xff0c;执行什么样的逻辑。 Python程序语言指定任何非0和…

UGLY NUMBERS II

不去重错误版 17.4.23 long isMin (long a, long b) { if (a > b) a b; return a;}long nthUglyNumber(long n) { long *l (long*)malloc(n*sizeof(long)); for (long i 0; i < n; i) l[i] 0; l[0] 1; long p2, p3, p5 0; for(long i 0; i < n - 1; i) { l[i …

excel合并两列内容_还在为合并WPS表格(Excel)中两列内容而犯愁?此方法简单高效...

我们在处理WPS表格(Excel)数据时&#xff0c;时常需要将两列甚至更多列的内容合并显示在同一列中&#xff0c;就像这样&#xff1a;这个时候大家是怎么解决的呢&#xff1f;路人&#xff1a;复制粘贴So easy&#xff01;小杜&#xff1a;不止两三行啊……路人&#xff1a;复制粘…

Css基本语法及页面引用

Css基本语法及页面引用 CSS代码出现在三个地方 </head><body><b style....>兄弟连</b> <!-- 1. 行内样式,内联样式, 作为 style属性值 --></body>css基本语法 css的定义方法是&#xff1a; 选择器 { 属性:值; 属性:值; 属性:值;} 选…

【Python基础入门系列】第05天:Python函数

前面我们写过九九乘法表&#xff0c;但如果我要七七乘法表或五五乘法表的话&#xff0c;你会看到三者代码极其类似&#xff0c;只是循环变量不同&#xff0c;那么如何做到代码重用&#xff0c;而不是简单拷贝黏贴修改呢&#xff0c;其实可是使用函数完成这一功能! 先来试着看一…

【Java基础】 JQuery的常用操作

jQuery的常用操作一、隐藏显示对象id为test的元素的display修改成了“none”&#xff0c;即隐藏了id为test的元素&#xff1a;$(#test).css(display,none)或$(#test).style.display"none"我们经常用到的是切换一个元素的隐藏与现实&#xff0c;下面给出代码&#xff…

store_coding_state (cs_cm)的作用

// 以下是对当前宏块进行编码&#xff08;这里的编码主要目的是为了计算按当前组合方式编码// 生成码流的大小&#xff0c;因此编码前要保存当前编码状态&#xff0c;编码完成后必须恢复现场&#xff09;// S T O R E C O D I N G S T A T E //-----------------------…

第十五届北京师范大学程序设计竞赛决赛(网络同步赛) B lca水 D 思维,找规律...

第十五届北京师范大学程序设计竞赛决赛&#xff08;网络同步赛&#xff09; B. Borrow Classroom 题意&#xff1a;一棵树&#xff0c;点 1为根&#xff0c;一个人从点 b到 点 c再到点 1&#xff0c;第二个人从点 a出发&#xff0c;问第二个人能否截住第一个人。 tags&#xff…

macbook所有型号大全_苹果笔记本型号大全

很多朋友在选购苹果笔记本也就是MacBook的时候都会考虑究竟买哪一个系列会比较好&#xff0c;下面就为大家介绍一下苹果笔记本型号大全都有什么&#xff0c;希望以下的介绍能够帮助到您。苹果笔记本型号大全目前苹果笔记本有以下的几个主要的型号&#xff1a;1、MacBook Air是目…

【Python基础入门系列】第06天:Python 模块和包

在计算机程序的开发过程中&#xff0c;随着程序代码越写越多&#xff0c;在一个文件里代码就会越来越长&#xff0c;越来越不容易维护。 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件里&#xff0c;这样&#xff0c;每个文件包含的代码…

Css中的选择器

Css选择器 CSS代码用来修饰 HTML元素. 要用CSS代码设置样式, 首先要选中HTML元素. 用来选中 元素的 代码称为 选择器, 或 选择符. html元素是指, 标签与标签包裹内容的整体. 常用的选择器有如下几种&#xff1a; 1、标签选择器 标签选择器&#xff0c;此种选择器影响范围大…

福州联通与市政府携手 共筑新型智慧城市

“福州联通今年将投入专项资金&#xff0c;在福州市区建设NB-IoT网络&#xff0c;包括2000个载扇部署&#xff0c;建设一张覆盖完备、性能领先的窄带物联网。”据介绍&#xff0c;去年9月&#xff0c;福州联通与福州市政府正式签署《共同推进窄带物联网&#xff08;NB-IoT&…

流媒体技术的国内外动态

1、大规模流媒体应用中关键技术的研究 支持大规模用户在线使用的流媒体应用是Internet中极富潜力的一项“重磅级用”,但由于Internet缺乏服务质量(QoS)与相应的安全保障,并且网络和终端系统又存在着较大的异构性,这使得在Internet上构建支持大规模用户的在线流媒体应用面临很多…