H.264中POC类型之探讨

作者&投稿:贲寒 (若有异议请与网页底部的电邮联系)
~ 转自: https://blog.csdn.net/bsplover/article/details/7480644

由于POC对于参考序列的初始化,重排序及标记关系重大,所以做了如下的分析,以下讨论情况是针对帧编码。

pic_order_cnt_type=0的时候:

poc与frame_num没有直接的关系,是显式地出现在bit流中为pic_order_cnt_lsb,pic_order_cnt_lsb只是一个低位的poc,对应的高位PicOrderCntMsb不出现在bit流中,这个需要编码器或者解码器对pic_order_cnt_lsb的情况来进行PicOrderCntMsb的进位。其中MaxPicOrderCntLsb在SPS(sequence parameter set)中可以得到,用于控制进位的。假定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、prevPicOrderCntMsb的取值见标准200503CNP99-P100。一般情况下,prevPicOrderCntLsb、prevPicOrderCntMsb为解码顺序中前一参考图像的的pic_order_cnt_lsb、PicOrderCntMsb。
对于pic_order_cnt_lsb=2的P,现在来计算它的poc, 此时prevPicOrderCntMsb=0,prevPicOrderCntLsb=60,很明显满足条件prevPicOrderCntLsb>pic_order_cnt_lsb&&(prevPicOrderCntLsb-pic_order_cnt_lsb)>=64/2,
所以其PicOrderCntMsb=prevPicOrderCntMsb+MaxPicOrderCntLsb=64,此时实际的POC=PicOrderCntMsb+pic_order_cnt_lsb=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-MaxPicOrderCntLsb=64-64=0。此时实际的POC=PicOrderCntMsb+pic_order_cnt_lsb=0+62=62;
对于pic_order_cnt_lsb=0的B,此时prevPicOrderCntMsb=64,而prevPicOrderCntLsb=2,上述两种情况都不满足,所以其PicOrderCntMsb=64。此时实际的POC=PicOrderCntMsb+pic_order_cnt_lsb=64+0=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初始是从顶场开始,且为偶数开始。
(应该不是简单如此吧,应该还有深入原因,那位想通透的告诉我一声)
标准200503CNP99-P100---变量 prevPicOrderCntMsb和 prevPicOrderCntLsb的值由以下过程得到:
— 如果当前图像是IDR图像,prevPicOrderCntMsb设为0,prevPicOrderCntLsb也等于0。
— 否则 (当前图像为非 IDR 图像),应用如下规则:
— 如果解码顺序中的前一个已解码图像包含的memory_management_control_operation等于5,应用如下规则:
— 如果在解码顺序上前一个参考图像不是底场,则prevPicOrderCntMsb 设置为0,prevPicOrderCntLsb设置为解码顺序上前一个参考图像的TopFieldOrderCnt值。
— 否则 (按照解码顺序前一个参考图像为底场),prevPicOrderCntMsb 设为 0 并且prevPicOrderCntLsb设为0。
— 否则(解码顺序上前一个参考图像不包含等于5的memory_management_control_operation),prevPicOrderCntMsb的值设置为等于解码顺序中前一个参考图像的PicOrderCntMsb,prevPicOrderCntLsb的值设为解码顺序中前一参考图像的pic_order_cnt_lsb。

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后参考帧之间的偏移,就是相隔的循环间参考帧之间解码顺序差值乘2(自己理解的)。
absFrameNum:从上一个IDR picture到本帧之间的参考帧总数,不包括IDR帧,但包括本帧,由标准200503CNP117该值的计算可知。
picOrderCntCycleCnt:当前图到它之前的一个IDR picture之间经历了多少个参考帧-非参考帧周期。考虑一个IPBBPBB……的序列,则各个图片顺序对应的picOrderCntCycleCnt值为0000111...。
expectedDeltaPerPicOrderCntCycle:每个参考帧-非参考帧周期对于expectedPicOrderCnt的贡献。因此picOrderCntCycleCnt * expectedDeltaPerPicOrderCntCycle可以作为expectedPicOrderCnt的初始值。
frameNumInPicOrderCntCycle:在1个参考帧-非参考帧周期内本帧前的参考帧数。

如果要计算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(在循环内的相对帧号,相对位置);
//为什么减1,个人感觉是因为去除第一个IDR帧还是在一循环中参考帧和非参考帧frame_num差1,还是循环从0开始????
expectedDeltaPerPicOrderCntCycle = 0;
for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
expectedDeltaPerPicOrderCntCycle (每个循环的POC偏移)+= 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(frame_num-1为什么减1看公式),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;
序列3: 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(为什么减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最多,优点是序列可以随意。


诺基亚手机那个比较好用?(200分)
视频播放 播放采用 H.264 (MPEG4)、3gpp、Real 编解码器的影音流媒体 音乐播放 支持 MP3、M4A、...POC功能 Nokia PoC(push to talk)对讲 待机图片 支持 计算器 支持 来电铃声识别 支持 来电图片识别

买手机大家帮帮忙!
索爱K550c 高级性能POC功能 会议电话对讲机 SyncML功能 支持 Edge功能 调制解调器 索爱K550c 附加性能录音功能 支持 免提通话 支持 情景模式 支持 待机图片 ...MP3音乐文件一定要放到Memory Stick PRO Duo卡中的MSSEMC\/Media files\/audio路径下才能够被系统正常识别到 内置游戏 网球、拼图和飞行类射击 索爱K750c 扩展...

请问6110 N82 N78在导航上哪个比较好啊?都有什么不同啊?
支持的视频格式 MPEG-4, H.264\/AVC, H.263\/3GPP, RealVideo 8\/9\/10, Flash 3.0...诺基亚 N82 其他功能POC功能 支持 录音功能 支持 AAC (AMR 可用于彩信) 语音拨号 支持 声控拨号 (

诺基亚6300的一些有关用法
一键通(Nokia PoC 1.1) 声控命令和语音备忘 13. 数字服务 MP3 铃声、原音铃声和 MIDI 铃声,最高支持...6300的标准配置中没有数据线,这是个比较让人不满的配置。当然,也不是不能没有数据线。发现6300下端...6300支持的音频格式基本为支持 MP3、MP4、AAC、AAC+、eAAC+、H.263、H.264 存到卡里某位置之后,不...

请教以下几款手机的详细参数
视频播放:内置RealPlayer播放器, 支持MPEG4、H.264\/AVC、H.263\/3GP、RealVideo等视频格式全屏播放 ...POC功能参数纠错支持 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 朱培胜钞雨 2019-10

请问诺基亚6300的使用技巧以及应用软件
一键通(Nokia PoC 1.1) 声控命令和语音备忘 13. 数字服务 MP3 铃声、原音铃声和 MIDI 铃声,最高...6300的标准配置中没有数据线,这是个比较让人不满的配置。当然,也不是不能没有数据线。发现6300下端...6300支持的音频格式基本为支持 MP3、MP4、AAC、AAC+、eAAC+、H.263、H.264 存到卡里某位置之后,不...

哪个软件有相机视频
录制视频的界面和拍摄照片的界面是同一个地方,手机中打开轻颜相机后,手持手机对准被拍摄对象后,点击...2、《POCO相机》作为功能强大拍摄软件,它非常专业,设定了鱼眼镜头、四格镜头、移轴镜头、双重曝光镜头...屏幕录制app是一款工具类手机软件,该软件的功能比较单一,就是用来录制你得装置的屏幕录像,它有不同的...

一千元左右的手机买什么的性价比高?什么好?
1、华为畅享10 价格:1099元 搭载了麒麟710F处理器,极光蓝、天空之镜、幻夜黑的配色,6.39英寸屏幕,分辨率1560*720,电池的大小是4000毫安时,满足人们对于屏幕、处理器、电池的千元机的需求,而且价格与一千元更接近。2、realme v3 价格:999元 使用联发科的天玑720处理器,是现在5g手机中最便宜的...

宫崎骏作品
《龙猫》是宫崎骏作品中最温馨感人的一部,适合全家人一起观看,也许它能唤起你封尘已久的童心。孩子们与胖胖的龙猫在夏夜里种橡树,站在陀螺上飞过田野,一定会有温柔的凉风随行吧,啊,那是一个美梦吗? 《哈尔的移动城堡》 宫崎骏的《千与千寻》曾经在日本创造了2340万人次的最高上座率,更获得了美国奥斯卡奖和柏林...

宫崎骏所有电影及主题曲 插曲
《魔女宅急便》主题曲:めぐる季节 井上あずみ - 魔女の宅急便 ヴォーカルアルバム 《风之谷》主题曲:风の谷のナウシカ 安田成美 - 宫崎アニメ The BEST 《红猪》主题曲:さくらんぼの実る顷(红の豚)加藤登纪子 - スタジオジブリの歌 増补盤 《天空之城》主题曲:合唱 君をのせて(...

广阳区18512123945: 假如中断类型号为19H ,它对应的中断服务程序的入口地址为2450:5000H , -
充卸优甲: 1)逻辑地址:23120H - 2200H*10H = 1120H 2)中断向量表中的地址:类型号20H*4=80H. 中断向量所占用的存储单元保存的值为段基址和逻辑地址,即从高地址到低地址依次:22H,00H,11H,20H.示意图: 物理地址 逻辑地址 存储单元值 00080H 0080H 20H00081H 0081H 11H 00082H 0082H 00H 00083H 0083H 22H

广阳区18512123945: H.264的编码和解码 -
充卸优甲: 请参见:列表的照相机与板载视频流编码 因为 H.264 编码和解码要求大量的计算能力在特定类型的算术运算,在通用 Cpu 运行的软件实现高效率通常较少力量.不过,最新的四核通用 x 86 Cpu 有足够的计算能力来执行实时标清及高清编码....

广阳区18512123945: 工程项目中的“POC”是什么意思? -
充卸优甲: Poc意思是为观点提供证据,为Proof Of Concept的缩写,它是一套建议的电子模型,它可用于论证团队和客户的设计,允许评估和确认概念设计方案,POC的评价可能引起规格和设计的调整. Poc通常根据用户对采用系统提出的性能要求和扩...

广阳区18512123945: 现假定内存单元3000H中存有一条相对寻址的转移指令,并设其偏移量是6位带符号的补码,值为2DH,试问,执行 -
充卸优甲: 偏移量是6位带符号的补码——应该是8位带符号的补码吧,结果是302FH

广阳区18512123945: 求中断向量物理地址范围 -
充卸优甲: 中断向量号08H=8 向量表中一共有1024个存储单元 每四个存储单元存储一个中断向量地址 为16位段地址和16位偏移地址 所以 第一个中断向量在向量表中的地址为0000H~0003H 由题 终端类型号为08H 地址为00020H~00023H - - 两年前学的 忘了终端类型号应该是从00到255了 我以为从01开始的呢 sorry了 其实就是8*4=32=20H到8*4+3=35=23H

广阳区18512123945: 三氯化氧磷(POCl3)是一种重要的化工原料,常用作半导体掺杂剂,实验室制取POCl3并测定产品含量的实验过程如下:I.制备POCl3采用氧气氧化液态的... -
充卸优甲:[答案] I.A装置中用双氧水与二氧化锰反应生成氧气,通过加入双氧水的量,可以控制产生氧气的速率,氧气中含有水蒸气用浓硫酸除去,所以B装置中装浓硫酸,装置B中有上颈漏斗,可以平衡装置内外的压强,起安全瓶的作用,纯净的氧气与三氯化磷反...

广阳区18512123945: 什么是264文件格式 -
充卸优甲: 就是H.264 H.264 是MPEG-4 标准所定义的最新格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,有的也称(AVC). AVC/H.264 视频编码由ISO 的MPEG 和ITU 的VCEG 两个组织于2003 年最终定稿.AVC/...

广阳区18512123945: 编码器的编码比特率常见的方式有哪两种 -
充卸优甲: MPEG4,H264都支持,帧速720p30Fps,不同视频编码格式下的视频比特率是不同的.视频播放格式:MPEG4/H.264/H.263/Real视频播放质量:720p@30FpsH.263视频录制格式视频录制质量:720p@30Fps--------音频播放格式:MP3/AAC/AAC+/eAAC+/WMA

广阳区18512123945: 手机上支持H.264格式的电影但是H.264包括什么合适? -
充卸优甲: h.264 一种视频编码,不是格式,如mp4,avi,mkv等等视频的格式都有可能是h.264编码,但是你却不一定能播放他们.支持h.264应该是支持

广阳区18512123945: 请教一个关于h.264解码的问题
充卸优甲: H264的话,你可以通过判断NALU类型来确定是不是关键帧,并且你送到ffmpeg解码的时候第一帧必须是关键帧,否则是解不出来的(即使解出来也全是马赛克).

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网