作者: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,
分享到:
相关推荐
介绍了h264中poc的计算方式.帮助理解解码中图像显示的序号的计算。 非常不好意思,这个是我第一次上传资料,资源分是随手写的。没想到10分太多了,现在改为1分,请大家见谅。
H.264的POC计算方法
8.3.4 POC类型为2的POC计算 221 8.4 宏块片组映射图的产生 221 8.5 片数据分割的解码 223 8.6 参考图像列表的初始化 224 8.6.1 图像序号的计算 224 8.6.2 参考图像列表的初始化 225 8.6.3 参考帧列表的重排序 228 ...
适用于CVE-2020-1350,SigRed的PoC远程代码执行漏洞利用。 创建人: 仅用于研究目的。 使用风险自负。利用写作有关使用的方法的详细信息在这里:实验室环境设置攻击者将建立一个邪恶域,其NS记录指向恶意服务器...
百视无头 一个简单的POC,它显示了如何使用计算机远程流服务Parsec和经过修改的方法来执行键盘动手攻击或跨多个独立网络的旋转 使用Parsec SDK,该SDK是在运行时从资源中提取的。 用途:
ASCLAB .NET Core PoC-LAB保险销售门户 这是在微服务架构中使用以下方法非常简化的保险销售系统的示例: .NET Core 3.1 实体框架核心中介貂尤里卡豹猫JWT代币轻松自在RawRabbit NHibernate 波莉NEST(ElasticSearch...
相关代码实际上在外部任务上执行MapReduce方法以实现功能映射,最终将被适配到Matrix的每个处理器网络中。 现在定义如何进行适应。 我们计划使用自定义AI功能优化内部功能模块。 这些代码的Python版本已经完成,...
身份验证方法:令牌,K8 引擎:KV,数据库 MongoDB插件 保险柜代理注入器 动态秘密:租借/吊销 前提条件 在您的本地计算机上。 已针对OCP群集安装并登录配置。 -CLI Vault客户端 注意:此部署可以简单地适应于...
flatbuffers-java-poc 替代 Java Api 的 FlatBuffers 实现的概念证明 链接 行为差异 缓冲区是自上而下构建的,以实现更简单的语法。 向量表指针在设置时被初始化。 如有必要,可以使用 initXXX() 方法将它们初始...
拥有一个能够做出这种区分的解释器有几个好处: 系统中的任何计算都可以向 JIT 暗示为纯计算,因此如果计算的参数是常量,则可以移除。 可以通过这种方法添加对生成器、异常和轻量级线程(除其他外)的支持。 有了...
计算流程应该是明确的 问题 我们真的需要通用包装器吗? jQ、promise、chains、array flow 各自解决任务 我如何描述“解包”过程? 应用程序接口 unit(value); value - 你想要的一切 返回可以绑定到流的包装值。 ...
HTTP / S异步反向Shell 目录为什么呢如今,有许多方法可以创建反向外壳,以便能够通过... 此POC的特殊之处在于通信是完全异步的,并且仅使用GET请求。这个怎么运作 ? 客户端应用程序在目标计算机上执行。 客户端启动
计算机组织与结构课程设计 Computer Organization and Architecture Course Design 包括POC,CPU等功能要求与方法
图灵测试扩展架构(TEXA):一种在多上下文环境中进行交互,评估和评估AI的方法 TEXA是一种基于简单的新颖的测试和基准测试框架。 它可用于交互,评估和评估在多上下文环境中工作的AI。 简而言之,TEXA通过允许...
Poincare 映射恢复单细胞数据中的连续层次结构。 POC: Anna ( ) 依赖 python3.7 anaconda(sklearn、numpy、pandas、scipy)seaborn pytorch(pytorch 1.7.1): ://pytorch.org/get-started/locally/ 复制我们的...
将数字文书工作和项目状态管理集中到一个系统中,但将数据存储在不变的安全分散式分类帐中。 始终提供有关项目信息,库存,货物状态,所有者,路线,所有数字文档和证书,GPS位置,参考温度的可见性。 所有信息均可...
都是全局最优值中的一种近似解,而本文提出的基于模拟退火的相位优化组合法(SimulatedAnnealing Phase Optimization Calculating,SA_POC)却是用全局寻优的思想来求得整个解空间中的最优相位值。仿真结果表明,SA_...
该代理利用Microsoft-Windows-Threat-Intelligence事件跟踪提供程序,作为Userland-hooking的一种更现代,更稳定的替代方法,它具有内核模式可见性的优点。 该项目依赖于库进行ETS设置和使用。 可以在此处找到随附...