264中 POC的计算方法

作者:jogh.264   参考代码 JM86
一·参数说明
这一节阐述的是encoder.cfg 中的参数对编码过程的影响
要注意的是encoder.cfg 中的参数跟input 结构体中的变量是一一对应的
 
?  StartFrame:从视频流的第几帧开始编码
?  FramesToBeEncoded:指明了除去 B帧后将要被编码的帧数
input->no_frames = FramesToBeEncoded
?  FrameSkip:指明了编码过程中跳过的帧数,中间有 B 帧也算跳过一帧。
?  NumberBFrames:相邻 I、P帧或相邻的 P帧之间的 B 帧个数,必须有
                         NumberBFrames< FrameSkip
input->successive_Bframe = NumberBFrames
?  IntraPeriod:I 帧出现的频率。若 IntraPeriod="3",则每 3 帧(不含 B 帧)中有一 I 帧;
           IntraPeriod="0" 时只有第一帧是 I 帧。
?  IDRIntraEnable:此值为1时每个 I帧都是 IDR,否则只有第一个 I帧是 IDR。
 
举例:在 StartFrame="0"
         FramesToBeEncoded="5"
         FrameSkip="3"
         NumberBFrames="2"
         IntraPeriod="3"
         IDRIntraEnable="1"
       的情况下编码情况如下,其中红色代表 IDR 帧 
表 1
视频流  0  1  2  3  4  5 6 7 8 9 10 11 12 13 14  15  16  17
编码流  I  B  B    P  B B   P B B   I B B    P  
编码顺序  0  2  3    1  5 6   4 8 9   7 11 12    10  
二·pic_order_cnt_type 为 0 的情况
这种情况下显式的计算 POC
(1)  编码端 I 帧或 P 帧 toppoc 的计算
这个过程在 main()函数的组循环
    “for (img->number=0; img->number < input->no_frames; img->number++){ }”
中实现
z  IntraPeriod或 IDRIntraEnable 为零时
这种情况下只有第一个 I 帧是 IDR 帧,比较简单。对于 I帧或 P 帧,其顶场的 POC 为
          (img->number) * (2*(input->successive_Bframe+1)) z  IntraPeriod和 IDRIntraEnable 都不为零时
这种情况下每个 I 帧都是 IDR 帧,其 POC 必须设置为零, I帧出现的频率为 IntraPeriod,
故其 toppoc为
    (img->number % input->intra_period) * (2*(input->successive_Bframe+1))
z  说明:
原程序中使用了宏定义 IMG_NUMBER
    “#define IMG_NUMBER (img->number - start_frame_no_in_this_IGOP)”
通过搜start_frame_no_in_this_IGOP可知这个变量在NumberOfFrameInSecondIGOP为0
(encoder_main.cfg 中就是这样设置的)时恒为 0,故有
           IMG_NUMBER = img->number
(2)  编码端 B帧 POC 的计算
由表一可知,在编完一 I 帧或 P 帧之后才开始对它前面的 B帧进行编码
 
  for (img->number=0; img->number < input->no_frames; img->number++)
  {
  ……I,P 帧编码……
  if ((input->successive_Bframe != 0) && (IMG_NUMBER > 0))  
{
    ……
    for(img->b_frame_to_code=1; img->b_frame_to_code<=input->successive_Bframe;   
                                                  img->b_frame_to_code++)
   {
   }
 
z  IntraPeriod或 IDRIntraEnable 为零时toppoc 等于
     2+(img->number-1) * (2*(input->successive_Bframe+1)) 
       +2* (img->b_frame_to_code-1)
a)  第一个 2 指得是 IDR 的两个场;
b)  img->number要减一是因为要对当前帧(img->number)前面的 B帧进行编码;
 
z  IntraPeriod和 IDRIntraEnable 都不为零时 toppoc等于
    2+(img->number % input->intra_period-1) * (2*(input->successive_Bframe+1))
    +2* (img->b_frame_to_code-1)
IDR 帧前面
(3)  toppoc 到 pic_order_cnt_lsb 的转化
        img->pic_order_cnt_lsb
       =img->toppoc &
        ~((((unsigned int)( –1)) << (log2_max_pic_order_cnt_lsb_minus4+4)))
 
z  (unsigned int)(-1)的十六进制形式是 0xffffffff,即它的每一位都是 1;
z  log2_max_pic_order_cnt_lsb_minus4+4是图象数目(包括 B 帧)最大值的位数 z  当 toppoc >0时,img->pic_order_cnt_lsb=img->toppoc
当 toppoc <0时,img->pic_order_cnt_lsb= max_pic_order_cnt+ img->toppoc
其中 max_pic_order_cnt=1<<( log2_max_pic_order_cnt_lsb_minus4+4)
z  疑问:
不知道 toppoc 到 pic_order_cnt_lsb 这个过程有什么意义;
POC 的值会从 0 变到很大,为什么不对它进行熵编码;
(4)  解码端 toppoc 的恢复
  此过程在函数 decode_poc 中执行。其思想是对于 IDR 前的 B 帧
            Toppoc = pic_order_cnt_lsb - max_pic_order_cnt
否则 
               Toppoc = pic_order_cnt_lsb
是否减去 max_pic_order_cnt 由变量 PicOrderCntMsb 决定,对于 IDR 前的 B 帧
           PicOrderCntMsb = (– max_pic_order_cnt)
否则
           PicOrderCntMsb = 0
到这就不难理解 PicOrderCntMsb 的含义了, PicOrderCntMsb 反映了 toppoc的值是否小于 0。
至于另外两个参数:PrevPicOrderCntMsb 总是为 0;PrevPicOrderCntLsb 在当前图象是 IDR
或 IDR 前(视频流中)的 B 帧时为0,否则等于前一图象(编码序列中)的 PicOrderCntLsb。 
三·pic_order_cnt_type 为 1 的情况
这种情况下通过 frame_num来计算 POC
(1)frame_num 简介
参考《毕厚杰》7.3.4 节中 frame_num 条款的解释,对于表 1 中的图象序列,其 frame_num     
的值参考如下:
 
表 2
视频流  0  1  2  4  5 6 8 9 10 12 13 14  16
编码流  I  B  B  P  B B P B B I B B P
编码顺序  0  2  3  1  5 6 4 8 9  7 11 12  10
frame_num  0  2  2  1  3 3 2 1 1  0 2 2 1
poc  0  2  4  6  8 10 12 -4 -2 0 2 4 6
 
(2)算法思想以及其解码端的实现
z  对于 IDR 帧,poc = 0;
z  对于 I 帧或P 帧
      poc = frame_num*2*(input->successive_Bframe+1)
或  
      poc = 2*(input->successive_Bframe+1)
           + (frame_num – 1)*2*(input->successive_Bframe+1) 解码端实现
      poc = img->ExpectedPicOrderCnt
           + img->delta_pic_order_cnt[0]   (在 I,P 帧下为 0)
z  对于 I 帧或P 帧之前的 B 帧(视频流中)
            poc = (frame_num – 1)*2*(input->successive_Bframe+1)
           – 2*(input->successive_Bframe+1 – img->b_frame_to_code)

      poc = 2*(input->successive_Bframe+1)
           + (frame_num – 1 – 1)*2*(input->successive_Bframe+1)
           + 2*( img->b_frame_to_code – 1)
           – 2*input->successive_Bframe
解码端的实现
      poc = img->ExpectedPicOrderCnt
           + img->delta_pic_order_cnt[0]
           + active_sps->offset_for_non_ref_pic
z  变量说明
a)  其中 img->b_frame_to_code请参见标题一·(2)
b)  img->disposable_flag = (nalu->nal_reference_idc = = 0),而 nal_reference_idc 只在 B 帧时
为0,即img->disposable_flag只在B帧时为1。这也是在B帧情况下img->AbsFrameNum
要比 I 帧或P 帧多减去一个 1 的原因。
c)  其它变量参见下面小题;
(3)编码端参数设置
a)  img->num_ref_frames_in_pic_order_cnt_cycle:
    这个参数在 init_poc( )函数中设置为 1 后就再没改动过;
b)  img->offset_for_ref_frame[0]  :
   在 StoredBPictures为0 时等于 2*(input->successive_Bframe+1);
c)  img->offset_for_ref_frame[1]  :
   没什么用,264 头文件中不会保存此变量;
d)  img->delta_pic_order_cnt[0]  :
   这个变量只对 B 帧有用,等于 2*(img->b_frame_to_code –1);  对于 I 帧或 P 帧,  
         其值为 0;
e)  active_sps->offset_for_non_ref_pic:
   只对 B 帧有用,在 StoredBPictures 为0 时等于–2*input->successive_Bframe, 

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

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

相关文章

c++ 测试串口速率_纳米软件案例之电流控制测试系统

项目背景西安某机电研究所电流控制测试系统软件需要用记录仪设置采样速率对电流数据进行采集&#xff0c;并能够进行数据实时显示、保存。为更好的分析实验现象&#xff0c;需要历史测试数据可查询并显示。目前采用的传统的手动测试&#xff0c;测试操作繁杂。数据保存困难&…

【Sublime】使用 Sublime 工具时运行python文件

使用 Sublime 工具时报Decode error - output not utf-8解决办法 在菜单中tools中第四项编译系统 内最后一项增添新的编译系统 自动新建 Python.sublime-build文件,并添加"encoding":"cp936"这一行,保存即可 使用python2 则注释encoding改为utf-8 {&quo…

智慧城市这份试卷 国外城市怎么答题?

在近五年&#xff0c;国内智慧城市建设的热潮一直增无减。据媒体梳理&#xff0c;透过各地政府工作报告和“十三五”规划发现&#xff0c;我国95%的副省级城市、76%的地级城市&#xff0c;总计超过500个城市&#xff0c;均在政府工作报告或“十三五”规划中明确提出&#xff0c…

HTML段落,换行,字符实体

HTML段落,换行,字符实体 html段落 <p>标签定义一个文本段落&#xff0c;一个段落含有默认的上下间距&#xff0c;段落之间会用这种默认间距隔开&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"&g…

【python】有意思的python小项目GitHub地址汇总

Licence_plate_recognize 车牌识别 Djang-Stu 基于python的Django框架学生信息管理系统 sklearn-machine-learning 数据分析-机器学习-深度学习【个人学习笔记】 movie_analysis 对电影影评分析生成词云 spider_doubanTOP 爬取豆瓣电影top250/爬取豆瓣图书top250 yuyin_re…

CBP详解

cbp一共6bit&#xff0c;高2bit表示cbpc(2&#xff1a;cb、cr中至少一个4x4块的AC系数不全为0&#xff1b;1&#xff1a;cb、cr中至少一个2x2的DC系数不全为0&#xff1b;0&#xff1a;所有色度系数全0&#xff09; 低4bit分别表示4个8x8亮度块&#xff0c;其中从最低一位开始的…

R 包的安装,使用,更新

R包的使用方法 包就是提供了种类繁多的函数&#xff0c;当然还有它的一些数据集&#xff0c;可以使用这些函数来操作这些数据集&#xff0c;来学习使用。 library()&#xff0c;当前的工作环境里&#xff0c;可以使用的包 包的帮助文档&#xff1a;help(package"包名"…

nginx 电子书_13本免费的电子书,拿走,不谢

傻白甜程序员13本电子书的清单01《PyTorch官方教程中文版》傻白甜程序员中&#xff0c;后台回复“pytorch”获取02《Think Python》傻白甜程序员中&#xff0c;后台回复“ThinkPython”获取03《走向分布式》傻白甜程序员中&#xff0c;后台回复“分布式”获取04《Nginx教程&…

Redis数据类型:字符串

2019独角兽企业重金招聘Python工程师标准>>> 概要 字符串类型是Redis最基本的数据类型&#xff0c;能够存储任何形式的字符串&#xff0c;单个健值最大能够存放512兆的数据&#xff0c;据传将来会放开512M的限制。 命令 设置值&#xff1a;set foo bar 获取值&#…

HTML块,含样式的标签

HTML块,含样式的标签 html块 div标签 块元素&#xff0c;表示一块内容&#xff0c;没有具体的语义。span标签 行内元素&#xff0c;表示一行中的一小段内容&#xff0c;没有具体的语义。 含样式和语义的标签 em标签 行内元素&#xff0c;表示语气中的强调词i标签 行内元素…

【docker】docker虚拟容器的使用大全

Docker容器详解 Docker是基于Go语言开发的开源应用容器引擎&#xff0c;遵从Apache Licence 2.0协议&#xff0c;可以让开发者打包应用以及应用的依赖包到一个可移植的容器中&#xff0c;然后发布到各种发行版本的Linux系统上。 Docker简介 软件开发中最为麻烦的事情可能就是…

【树莓派】修改树莓派盒子MAC地址

用树莓派盒子&#xff0c;在某些客户方实施过程中&#xff0c;不同客户的网络环境对树莓派盒子的要求不同&#xff0c;网络管理配置要求MAC地址和IP绑定。 一种情况下&#xff0c;查询盒子的MAC地址&#xff0c;添加到网络管理的路由规则中即可&#xff1b; 另一种情况下&#…

编程随想 关系图_IT什么岗位比较好找工作?一张金字塔图就能明白

IT(Internet Technology)互联网技术是指在计算机技术的基础上开发建立的一种信息技术。IT行业这些年一直很火爆&#xff0c; 对于IT就业岗位的选择一直也都是热门话题。一、IT人才总体供需金字塔型人才需求和市场供应关系图&#xff1a;人才供需图一般IT 行业供需关系可以比喻为…

诺基亚收购了阿朗:那与 TCL 的“阿尔卡特”品牌授权协议到期后咱办?

在被诺基亚收购之后&#xff0c;“阿尔卡特-朗讯”的牌子算是被这家芬兰公司收入囊中。尴尬的是&#xff0c;TCL 很早就获得了“阿尔卡特”这个智能手机品牌的授权。当然&#xff0c;对于因为错抱了微软 Windows Phone 这条大腿、以致于多年后再借着 HMD Global 重返 Android 智…

【Django】django使用原生SQL的方法(附加说说为什么ORM上不了大台面)

执行自定义SQL语言&#xff1a; from django.db import connection ​ cursorconnection.cursor() ​ # 插入操作 cursor.execute("insert into hello_author(name) values(传说中的申小五)") ​ # 更新操作 cursor.execute("update hello_author set nameabc w…

[熵编码] 指数哥伦布编码

规定语法元素的编解码模式的描述符如下&#xff1a;比特串&#xff1a;b(8):任意形式的8比特字节&#xff08;就是为了说明语法元素是为8个比特&#xff0c;没有语法上的含义&#xff09;f(n):n位固定模式比特串&#xff08;其值固定&#xff0c;如forbidden_zero_bit的值恒为0…

python学习笔记 - lambda 与 函数嵌套

# 函数嵌套 #函数内包含函数 def fun1(a):def funa(a):return a **2def funb(a):return a **3return funa(a) funb(a)print(函数嵌套:{}:.format(fun1(3)))# lambda表达式代替嵌套函数 #lambda表达式替代嵌套函数 def fun2(a):f1 lambda a : a ** 2f2 lambda a : a ** 3re…

python编辑器_没有人比它更懂少儿编程,慧编程Python'吮指编辑器'

咳咳&#xff01;大家好&#xff0c;我是偶尔写文章的康康老师。今天跟大家介绍的是慧编程家的&#xff0c;睡在Scratch上铺的兄弟——慧编程Python编辑器。这是一款集才华和颜值为一体的吮指编辑器&#xff01;忘记肯德基&#xff0c;你的手指应该为编程而生&#xff01;话不多…

微软Scott CIO也要代表公司拜访客户

作为全球IT巨头的CIO&#xff0c;微软公司副总裁兼首席信息官Tony Scott的工作与众不同。除了要担任普通CIO需要担任的角色以外&#xff0c;他还要与客户保持沟通&#xff0c;同时还与微软产品和研发团队紧密联系。正因为如此&#xff0c;Tony Scott对CIO的职责有着更深刻的理解…

HTML中的图片

HTML图片 html图片 <img>标签可以在网页上插入一张图片&#xff0c;它是独立使用的标签&#xff0c;通过“src”属性定义图片的地址&#xff0c;通过“alt”属性定义图片加载失败时显示的文字&#xff0c;以及对搜索引擎和盲人读屏软件的支持。 <img src"ima…