H263压缩码流如何分解为一个一个单元并查询到其宽高?

H263码流尺寸规格有限,只有以下几种:
在这里插入图片描述
H263码流有四个分层:
1、图像层
2、块组
3、宏块
4、块
下面分别介绍:
在这里插入图片描述
具体介绍如下,5.1.3中红色框选部分就是压缩码流的宽高指示:

图像层

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面就是H263的图像层,块组层在图像层里面。

块组层

在这里插入图片描述
上图红色框中的Group of Blocks为块组层。
在这里插入图片描述

宏块层

在这里插入图片描述

上图中的红框为宏块层。
在这里插入图片描述
因为我们本章主要介绍如何将连续的H263分解为一帧一帧的packet,并且实时求出每个packet中的宽高,所以我们本次只分析图像层即可。

我们继续回顾图像层:
在这里插入图片描述

名称bit说明
图像开始码(PSC)22bitPSC 是一个 22 比特的字。它的值是 0000 0000 0000 0000 1 00000。所有的图象开始码都应该以字节对齐。这应该通过在开始码之前插入 PSTUF 来完成,因此开始码的第一位是一个字节中的第一位(也是最重要的一位)
时域参照 (TR)8bit一个 8 比特的数可以有 256 种可能值。通过将它在前一帧传送的图象头中的值加 1 再加未传送的帧数(以 29.97 Hz 计)来形成这个值。只对 8 个 LSB 进行计算。在可选的 PB 帧模式下,TR 只指定 P 帧地址;对于 B 帧的时域参照请查看 5.17 部分。
类别信息1(PTYPE)位1始终为“1”,为了避免混淆开始码
类别信息2(PTYPE)位2始终为“0”,与 H.261 相区别
类别信息3(PTYPE)位3屏幕分割指示位,“0”关,“1”开
类别信息4(PTYPE)位4文件相机指示器,“0”关,“1”开
类别信息5(PTYPE)位5静止图象释放位,“0”关,“1”开
类别信息6-8(PTYPE)位6-8信源格式,“000”禁止,“001”sub-QCIF,“010”QCIF,“011”CIF, “100” 4CIF, “101” 16CIF, “110” 保留, “111”保留
类别信息9(PTYPE)位9图象编码类型,“0” INTRA (I-picture),“1” INTER (P-picture)
类别信息10(PTYPE)位10可选无限制矢量模式,“0”关,“1”开
类别信息11(PTYPE)位11可选基于句法的编码模式,“0”关,“1”开
类别信息12(PTYPE)位12可选高级预测模式,“0”关,“1”开
类别信息13(PTYPE)位13可选 PB 帧模式,“0”关,“1”开
量化器信息 (PQUANT) (5 bits)5bit这是一个固定长度为 5 比特的码字,它指示了为图象使用量化器 QUANT 直到被更新为 GQUANT 或 DQUANT。这个码字以二进制方式表示了 QUANT 的半步距,即从 1 到 31
连续出现的多点 (CPM)1 bit这是一个只有一个比特位的码字,它通知了是否使用可选的连续出现多点模式(CPM);“0”关,“1”开。关于 CPM 的使用请参见附录 C
图象子比特流指示位 (PSBI)2bit这是个固定长度位 2 比特位的码字。只有在 CPM 指示了连续出现多点模式为有效时,这个码字才出现。这个码字以二进制形式表示图象头和后续直到下一帧图象或 GOB 开始码的信息的子比特流数(参见附录 C)
B帧的时间参照 (TRB)3 bit如果 PTYPE 指示了“PB 帧”(见附录 G)则 TRB 出现,并指示了从上一个 I 帧或 P 帧到现在这个 B 帧所位传送的帧数。这个码字以简单的二进制形式表示了未传送整数加 1。最大的未传送帧数是 6
B帧的量化信息 (DBQUANT)2 bit如果 PTTYPE 指示了“PB 帧”则 DBQUANT 出现。在译码过程中,对每个宏块可以得到一个量化参数。PB 帧中对 P 块使用QUANT,对B块使用另一个量化参数BQUANT。QUANT的范围是1到31。DBQUANT指示了如表3/H.263中定义的QUANT和 BQUANT 之间的关系。BQUANT 的范围是 1 到 31,如果由表 3/H.263计算得出的值大于 31 则被剪切到 31
额外插入信息 (PEI)1 bit这个位如果被设置位“1”,则标志存在着后续的可选数据域
空信息 (PSPARE)(0/8/16 . . . bits)如果 PEI 被设置为"1",则后续的 9 个比特位包含了 8 个数据位(PSPARE)和另一个 PEI 位以指示后续是否还有 9 个位,……。在 ITU 指明之前编码器不要插入 PSPARE。译码器在 PEI 位为“1”时要能够分解 PSPARE。着就允许 ITU 在 PSPARE 中添加向后兼容的信息。如果 PSPARE 后紧跟着 PEI=0,PSPARE=xx000000 是不允许的,以避免和开始码相混淆。(x=不关心, 所以 256 中可能值中由四分之一被禁止)
填塞 (ESTUF)(变长) bit这是一个长度可变的包含由少于 8 个“0”位的码字。编码器可以直接在 EOS 码字前插入这个码字。如果有 ESTUF 则 ESTUF的最后一位应该是该字节的最后一位(最不重要)。所以 EOS 码字的开始处是字节对齐的。译码器应被设计成可抛弃 ESTUF
序列结束 (EOS)22 bit这个码字由 22 个比特位。它的值为 0000 0000 0000 0000 1 11111。由编码器来决定是否插入这个码字。EOS 可以是字节对齐的。在开始码前插入 ESTUF 可使开始码字节对齐
填塞 (PSTUF)(变长) bit这是一个长度可变的包含由少于 8 个“0”位的码字。编码器应将这个码字插入在下一个 PSC 之前以实现字节对齐。PSTUF的最后一位应该是该字节的最后一位(最不重要),因此包含 PSTUF 的视频比特流到 H.263 比特流开始处的偏移比特数是 8的倍数。译码器应该能够抛弃 PSTUF如果由于某些原因编码器停止编码了一段时间后又继续进行编码,编码器停止之前应发送 PSTUF,以防止出现将上一帧图象编码的最后几位(最多可达 7 位)保留到重新编码开始

为了将连续的h263压缩码流分割为一个个以帧为单位的packet,我们就要找到每一帧的起始位置和结束位置,为了简单考虑,我们抛弃图像层不重要的部分,只关心起始和结束的几个关键位:
在这里插入图片描述
上图是两帧h263,通过观察发现,我们只要找到PSC就可以了。
具体代码如下:

#define END_NOT_FOUND (-100)int ff_h263_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) {int vop_found, i;uint32_t state;vop_found = pc->frame_start_found;state = pc->state;i = 0;if (!vop_found) {for (i = 0; i < buf_size; i++) {state = (state << 8) | buf[i];if (state >> (32 - 22) == 0x20) {i++;vop_found = 1;break;}}}if (vop_found) {for (; i < buf_size; i++) {state = (state << 8) | buf[i];if (state >> (32 - 22) == 0x20) {pc->frame_start_found = 0;pc->state = -1;return i - 3;}}}pc->frame_start_found = vop_found;pc->state = state;return END_NOT_FOUND;
}

至于宽高,则只要解析类信息的第6-8位再查表即可,不再赘述。

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

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

相关文章

使用docker部署一个jar项目

简介: 通过docker镜像, docker可以在服务器上运行包含项目所需运行环境的docker容器, 在线仓库里有很多各个软件公司官方发布的镜像, 或者第三方的镜像. 如果我们需要使用docker把我们的应用程序打包成镜像, 别的机器上只要安装了docker, 就可以直接运行镜像, 而不需要再安装应…

拆分PDBQT文件并将其转换为PDB格式

拆分PDBQT文件转为PDB格式 1. vina_split拆分PDBQT文件 假设你用AutoDock Vina做了对接&#xff0c;那么所有预测的结合构象都被放入一个多构象 PDBQT 文件中&#xff0c;如果需要拆分后进行可视化分析&#xff0c;那么Vina官方自带了vina_split来进行拆分。下面是vina_split…

CentOS 安装 Jenkins

本文目录 1. 安装 JDK2. 获取 Jenkins 安装包3. 将安装包上传到服务器4. 修改 Jenkins 配置5. 启动 Jenkins6. 打开浏览器访问7. 获取并输入 admin 账户密码8. 跳过插件安装9. 添加管理员账户 1. 安装 JDK Jenkins 需要依赖 JDK&#xff0c;所以先安装 JDK1.8。输入以下命令&a…

鸿蒙终于不套壳了?纯血 HarmonyOS NEXT 即将到来

对于移动开发者来说&#xff0c;特别是 Android 开发而言&#xff0c;鸿蒙是不是套壳 Android 一直是一个「热门」话题&#xff0c;类似的问题一直是知乎的「热点流量」之一&#xff0c;特别是每次鸿蒙发布新版本之后&#xff0c;都会有「套娃式」的问题出现。 例如最近 HDC 刚…

9、Kubernetes核心技术 - Volume

目录 一、概述 二、卷的类型 三、emptyDir 四、hostPath 五、NFS 5.1、master服务器上搭建nfs服务器 5.2、各个slave节点上安装nfs客户端 5.3、创建Pod 六、PV和PVC 6.1、PV 6.1.1、PV资源清单文件示例 6.1.2、PV属性说明 6.1.3、PV的状态 6.2、PVC 6.2.1、PVC资…

Java数据类型,你不想不学会都不行~

——每一种数据都定义了明确的数据类型&#xff0c;在内存中分配了不同大小的内存空间&#xff08;字节&#xff09; 思维导图 一.整数类型 1.什么是整数类型 —— 用int、short、byte、long存储的整数值就是整数类型 2.整数的类型 类型 所占的字节数 数值…

【《深入浅出计算机网络》学习笔记】第1章 概述

内容来自b站湖科大教书匠《深入浅出计算机网络》视频和《深入浅出计算机网络》书籍 目录 1.1 信息时代的计算机网络 1.1.1 计算机网络的各类应用 1.1.2 计算机网络带来的负面问题 1.2 因特网概述 1.2.1 网络、互联网与因特网的区别与关系 1.2.1.1 网络 1.2.1.2 互联网 …

探讨|使用或不使用机器学习

动动发财的小手&#xff0c;点个赞吧&#xff01; 机器学习擅长解决某些复杂问题&#xff0c;通常涉及特征和结果之间的困难关系&#xff0c;这些关系不能轻易地硬编码为启发式或 if-else 语句。然而&#xff0c;在决定 ML 是否是当前给定问题的良好解决方案时&#xff0c;有一…

24届近5年同济大学自动化考研院校分析

今天给大家带来的是同济大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、同济大学 学校简介 同济大学历史悠久、声誉卓著&#xff0c;是中国最早的国立大学之一&#xff0c;是教育部直属并与上海市共建的全国重点大学。经过115年的发展&#xff0c;同济大学已经…

什么是场景营销,小红书场景营销方式和方法有哪些

现在小红书上最流行的就是场景营销&#xff0c;那什么是场景营销&#xff0c;应该怎么做呢&#xff1f;今天来和大家分享下大家都在说得场景营销是什么&#xff0c;在小红书投放怎么做好场景营销&#xff1f; 一、什么是场景化营销 说白来&#xff0c;场景营销(Scene Marketing…

触控笔和pencil笔一样吗?性价比平板手写笔推荐

其实&#xff0c;目前市面上的很多产品&#xff0c;有的侧重于外观&#xff0c;有的侧重于功能&#xff0c;有的侧重于性能。就像是ipad里的电容笔一样。因此&#xff0c;在选购电容笔时&#xff0c;一定要对电容笔有所了解。在购买之前&#xff0c;一定要对不同种类的电容笔有…

【VSCode】报错:出现段错误解决办法 (Segmentation fault)

VScode报错&#xff1a;Segmentation fault (core dumped)的解决办法 解决Program received signal SIGSEGV, Segmentation fault.的辛酸 Linux环境下段错误的产生原因及调试方法小结 Linux下的段错误Segmentationfault产生的原因及调试方法经典.pdf 解决办法&#xff1a;

第四次作业

1. 简述静态网页和动态网页的区别。 静态页面&#xff1a;请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示的页面。在网站设计中&#xff0c;纯粹HTML格式的网页&#xff08;可以包含图片、视频JS (前端功能实现&#xff09;、CSS (…

【论文阅读】基于深度学习的时序异常检测——Anomaly Transformer

系列文章链接 论文一&#xff1a;2022 Anomaly Transformer 文章目录 理论概述代码实战 论文链接&#xff1a; Anomaly Transformer.pdf 代码链接&#xff1a; https://github.com/thuml/Anomaly-Transformer 视频讲解&#xff08;原作者禁止转载&#xff0c;联系的话侵删&am…

九、ESP32控制1602LCD屏幕显示内容

1. 运行效果 2. 1602简介 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字) 市面上字符液晶大多数是基于HD44780液晶芯片的 需要8根数据线来传输要显示的数据,当然还

nvm下载安装配置

一、作用 nvm是node版本管理的工具&#xff0c;具有管理、下载、切换node版本等能力。经常不同项目需要依赖不同版本的node&#xff0c;此时nvm就能有效的解决node版本切换的问题。 二、nvm下载安装配置 &#xff08;1&#xff09;安装包地址 https://github.com/coreybutl…

帕累托森林:IEEE Fellow唐远炎院士出任「儒特科技」首席架构官

导语 「儒特科技」作为一家拥有全球独创性极致化微内核Web引擎架构的前沿科技企业&#xff0c;从成立即受到中科院软件所和工信部的重点孵化及扶持&#xff0c;成长异常迅速。前不久刚正式官方融入中国五大根操作系统体系&#xff0c;加速为其下游上千家相关衍生OS和应用软件企…

css position: sticky;实现上下粘性布局,中间区域滚动

sticky主要解决的问题 1、使用absolute和fixed中间区域需要定义高度2、使用absolute和fixed底部需要写padding-bottom 避免列表被遮挡住一部分&#xff08;底部是浮窗的时候&#xff0c;需要动态的现实隐藏&#xff09; <!DOCTYPE html> <html lang"en"&…

如何创建51单片机KEIL工程

如何创建51单片机KEIL工程步骤&#xff1a; &#xff08;1&#xff09;打开keil软件&#xff0c;点击工具栏-Project&#xff0c;选择创建新的工程&#xff1b; &#xff08;2&#xff09;然后给工程命名&#xff0c;文章以project为例&#xff0c;然后点击保存 &#xff08…

Jtti:Ubuntu静态IP地址怎么配置

在 Ubuntu 中配置静态 IP 地址需要编辑网络配置文件。以下是在 Ubuntu 20.04 版本中配置静态 IP 地址的步骤&#xff1a; 打开终端&#xff0c;以管理员身份登录或使用 sudo 权限。 使用以下命令打开网络配置文件进行编辑&#xff1a; sudo nano /etc/netplan/00-installer-…