大连自助建站软件,wordpress 用户身份判断,网站主页设计要点,房山建站公司有 B 图像的场合。POC 表示的是图像显示顺序。由于POC对于参考序列的初始化,重排序及标记关系重大,所以做了如下的分析#xff0c;以下讨论情况是针对帧编码。
pic_order_cnt_type0的时候#xff1a; poc与frame_num没有直接的关系#xff0c;是显式地出现在bit流中为pic_o…有 B 图像的场合。POC 表示的是图像显示顺序。由于POC对于参考序列的初始化,重排序及标记关系重大,所以做了如下的分析以下讨论情况是针对帧编码。
pic_order_cnt_type0的时候 poc与frame_num没有直接的关系是显式地出现在bit流中为pic_order_cnt_lsbPicOderCntMsb 和 PicOderCntLsb分别代表的是POC的高位和低位。H.264中为了提高压缩效率只对POC的低位进行编码传输POC的高位不在码流中直接传输而是通过别的语法元素推导得来。pic_order_cnt_lsb只是一个低位的poc对应的高位PicOrderCntMsb不出现在bit流中这个需要编码器或者解码器对pic_order_cnt_lsb的情况来进行PicOrderCntMsb的进位。其中MaxPicOrderCntLsb在SPS中可以得到用于控制进位的。假定MaxPicOrderCntLsb64,prevPicOrderCntMsb0有如下情况 I P B...未出现mmco5或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_lsb2的P现在来计算它的poc, 此时prevPicOrderCntLsb60很明显满足条件prevPicOrderCntLsbpic_order_cnt_lsb(prevPicOrderCntLsb-pic_order_cnt_lsb)64/2,由于是参考帧所以其prevPicOrderCntMsbprevPicOrderCntMsb6464此时TopFiledOrderCnt64266; 接着计算pic_order_cnt_lsb62的B此时prevPicOrderCntMsb64而prevPicOrderCntLsb2很明显满足prevPicOrderCntLsbpic_order_cnt_lsb(pic_order_cnt_lsb-prevPicOrderCntLsb)64/2,此时PicOrderCntMsbprevPicOrderCntMsb-prevPicOrderCntLsb64-262。由于不是参考帧所以prevPicOrderCntMsb还是保持为64很明显prevPicOrderCntMsb应该是MaxPicOrderCntLsb的倍数。对于pic_order_cnt_lsb0的B上述两种情况都不满足所以其PicOrderCntMsb64。 prevPicOrderCntMsb和prevPicOrderCntLsb在IDR或者mmco5的时候选择性复位。这里如果考虑要场编码则有如下情况 I P B...未出现mmco5或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的时候包含了mmco5由于他不是一个底场所以prevPicOrderCntLsb就为60如果出现在Pt的poc为61的时候包含了mmco5则prevPicOrderCntLsb0所以在帧编码的时候mmco5只是复位prevPicOrderCntMsb而prevPicOrderCntLsb应该不复位。而在场编码的时候mmco5只有出现在底场的时候复位prevPicOrderCntMsbprevPicOrderCntLsb为0。保证prevPicOrderCntLsb初始是从顶场开始且为偶数开始应该不是简单如此吧应该还有深入原因那位想通透的告诉我一声
pic_order_cnt_type1的时候 考虑如下序列情况 SPS中设置对于帧编码offset_for_top_to_bottom_field0对于场编码 offset_for_top_to_bottom_field1
序列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_cycle1,num_ref_frames_in_pic_order_cnt_cycle表示IDR后一个循环内参考帧的总数.offset_for_ref_frame[0]4,offset_for_ref_frame表示IDR后参考帧之间的偏移。 如果要计算poc12的P帧的POC如何得到呢首先已经知道frame_num3,num_ref_frames_in_pic_order_cnt_cycle1,offset_for_ref_frame[0]4,则可以得到absFrameNum3picOrderCntCycleCnt (3-1)/12;frameNumInPicOrderCntCycle(3-1)%10;expectedDeltaPerPicOrderCntCycle 0for( i 0; i num_ref_frames_in_pic_order_cnt_cycle; i )expectedDeltaPerPicOrderCntCycle offset_for_ref_frame[ i ]
则expectedDeltaPerPicOrderCntCycle 4expectedPicOrderCnt picOrderCntCycleCnt * expectedDeltaPerPicOrderCntCyclefor( i 0; i frameNumInPicOrderCntCycle; i )expectedPicOrderCnt expectedPicOrderCnt offset_for_ref_frame[ i ]则expectedPicOrderCnt 12可以得到由于是P-slice此时slice header中delta_pic_order_cnt[ 0 ]0delta_pic_order_cnt[ 1 ]0TopFieldOrderCnt 12BottomFieldOrderCnt 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_cycle1,offset_for_ref_frame[0]6。如果要计算poc16的B帧的POC如何得到呢首先已经知道frame_num4,num_ref_frames_in_pic_order_cnt_cycle1,offset_for_ref_frame[0]6,则可以得到absFrameNum4-1因为是B帧不用于参考picOrderCntCycleCnt (3-1)/12;frameNumInPicOrderCntCycle(3-1)%10;expectedDeltaPerPicOrderCntCycle 6由于offset_for_non_ref_pic-2*(连续B帧的数量);这里应该是-4expectedPicOrderCnt 14可以得到此时slice_header中delta_pic_order_cnt[ 0 ]2delta_pic_order_cnt[ 1 ]0TopFieldOrderCnt 16BottomFieldOrderCnt 16
序列2 I P B P B B P B B B 循环一frame_num: 0 1 2 2 3 3 3 4 4 4poc: 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 10poc: 40 38 46 42 44 54 48 50 52此时对于num_ref_frames_in_pic_order_cnt_cycle3,offset_for_ref_frame[3]{4,6,8}。如果要计算poc54的P帧的POC如何得到呢首先已经知道frame_num9,num_ref_frames_in_pic_order_cnt_cycle3,offset_for_ref_frame[3]{4,6,8},则可以得到absFrameNum9picOrderCntCycleCnt (9-1)/32;frameNumInPicOrderCntCycle(9-1)%32;expectedDeltaPerPicOrderCntCycle 18expectedPicOrderCnt 18*246854可以得到此时slice_header中delta_pic_order_cnt[ 0 ]0delta_pic_order_cnt[ 1 ]0TopFieldOrderCnt 54BottomFieldOrderCnt 54如果要计算poc50的B帧的POC如何得到呢由于是B帧absFrameNum10-19picOrderCntCycleCnt (9-1)/32;frameNumInPicOrderCntCycle(9-1)%32;由于连续B帧数目是变化的取平均值为2此时offset_for_non_ref_pic-4expectedPicOrderCnt 18*2468-450此时slice_header中delta_pic_order_cnt[ 0 ]0delta_pic_order_cnt[ 1 ]0
pic_order_cnt_type2的时候 poc是由frame_num推导出来的这个比较简单但是应该注意在这种情况下不存在连续的非参考图象注释且解码输出的顺序和显示输出顺序一致注释意思就是说不出现B帧但可以出现非参考的P场这也是为什么当nal_ref_idc0的时候tempPicOrderCnt 2 * ( FrameNumOffset frame_num ) – 1的情况。这里保证了参考场的POC始终为偶数并且大于同帧的另外一个场。 综合三种poc的类型2应该是最省bit的因为直接从frame_num获得但是序列方式限制最大类型1只需要一定的bit量在sps标志出一些信息还在slice header中表示poc的变化但是比类型0要节省bit,但是其序列并不是随意的要周期变化对于类型0因为要对poc的 lsb进行编码所以用到的bit最多优点是序列可以随意。