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

news2024/11/24 16:51:22

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.coloradmin.cn/o/841568.html

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

相关文章

QT开发学习相关笔记

QT中配置文件读取 QT中使用的config文件为&#xff1a;xxx.ini文件,基本格式如下&#xff1a; 使用 QSetting&#xff08;QT自带类&#xff09;中的相关接口实现设置配置文件数据&#xff0c;或者读取数据。 读取配置文件路径设置如下&#xff0c;其中 iniPath为设置路径 ne…

word2003脚注问题

问题分析&#xff1a; 在题目上插入脚注的时候&#xff0c;脚注放在文件结尾&#xff0c;然后正文拆开了&#xff0c;不能续前节 解决办法&#xff1a; word2003中&#xff0c;工具->选项->兼容性

进程间通讯(IPC机制) 管道 信号量 共性内存 消息队列 详细图解

进程间通讯-IPC机制 常用命令管道有名管道读写编程有名管道示意图 无名管道 信号量信号量的概念信号量接口函数进程 a 和进程 b 模拟访问打印机 用信号量互斥画图分析代码实现测试结果显示和操作 共享内存 信号量 消息队列 的命令 共享内存共享内存定义共享内存函数接口实例编程…

docker镜像push到仓库

镜像可以很方便直接 push 到 docker 的公共仓库或阿里云仓库 一、Dockerpush指定仓库是什么&#xff1f; Dockerpush是Docker的一个命令&#xff0c;用于将本地的Docker镜像推送到Docker官方公共仓库或用户私人仓库。而指定仓库则是将这个Docker镜像推送到指定的仓库中。 通过D…

【独立后台】快递小程序便宜寄快递系统小程序 对接易达

快递代发项目简介&#xff1a; 顾名思义就是帮发快递。原本产业链是客户-快递之间的联系&#xff0c;现在变成了客户-我们-快递&#xff0c;简单来说就是我们把客户聚集到一起团购到了更优惠的价格。很简单就是赚一个差价&#xff0c; 单子多就能和各个快递合作的平台&#x…

C++ 类型兼容规则

类型兼容规则是指在需要基类对象的任何地方&#xff0c;都可以使用公有派生类的对象来替代。 通过公有继承&#xff0c;派生类得到了基类中除构造函数和析构函数之外的所有成员。这样&#xff0c;公有派生类实际就具备了基类的所有功能&#xff0c;凡是基类能解决的问题&#x…

QA | 关于手持式频谱仪,您想了解的那些技术问题(二)

Q1&#xff1a;手持式频谱仪的灵敏度多高&#xff1f;底噪多少&#xff1f; 0.01-3GHz手持频谱仪的底噪/灵敏度为-128dBm RBW10kHz&#xff08;即归一化到Hz为-168dBm/Hz&#xff09;&#xff1b;2-8GHz手持频谱仪的底噪/灵敏度为-119dBm RBW30kHz&#xff08;即归一化到Hz为…

Javascript 数据结构[入门]

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

JVM之类加载与字节码(一)

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

最小二乘问题和非线性优化

最小二乘问题和非线性优化 0.引言1.最小二乘问题2.迭代下降法3.最速下降法4.牛顿法5.阻尼法6.高斯牛顿(GN)法7.莱文贝格马夸特(LM)法8.鲁棒核函数 0.引言 转载自此处&#xff0c;修正了一点小错误。 1.最小二乘问题 在求解 SLAM 中的最优状态估计问题时&#xff0c;我们一般…

ModaHub魔搭社区:大模型落地需要“记忆力”,这家公司想为向量数据库Milvus Cloud正名

现实生活中若两人进行对话,大致需要三步流程:一方首先抛出话题作引子;另一方会先调动记忆判断自己是否了解这个话题,然后再分析给出应该做出何种回答。如此循环往复直到互动结束,而此次对话又会作为一种新的“记忆”被双方吸收。 为让计算机完成这样的互动过程,并持续…

【云原生】Docker-Compose全方面学习

目录 1.compose简介 Compose V2 2.compose安装与下载 二进制包 PIP 安装 bash 补全命令 卸载 3.docker compose管理命令 命令对象与格式 命令选项 命令使用说明 1.compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可…

设计模式之策略模式(Strategy)

一、概述 定义一系列的算法&#xff0c;把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的类而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 2.需要使用一个算法的不同变体。…

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

面试测试开发被问到数据库索引不知道怎么办?

提出的问题 什么情况下创建索引&#xff0c;什么时候不需要索引&#xff1f; 索引的种类有哪些&#xff1f; 什么是索引 索引就是帮助数据库管理系统高效获取数据的数据结构&#xff0c;就好比一本书的目录&#xff0c;它可以帮我们快速进行特定值的定位与查找&#xff0c;…

软件架构师高级——3、数据库系统

• 数据库概述&#xff08;★★★&#xff09; 集中式数据库系统 •数据管理是集中的 •数据库系统的素有功能 &#xff08;从形式的用户接口到DBMS核心&#xff09; 者口集中在DBMS所在的计算机。 B/S结构 •客户端负责数据表示服务 •服务器主要负责数据库服务 •数据 和后端…

IC人才“疯狂”抢购:月薪开到7.5万的背后是什么?

随着人工智能和电动汽车等技术的快速发展&#xff0c;集成电路&#xff08;IC&#xff09;人才成为汽车行业的抢手货。近年来&#xff0c;车企对于IC人才的需求越来越大&#xff0c;导致月薪飙升到了7.5万的惊人高薪水。这个话题引起了广泛关注&#xff0c;下面我们将从供需关系…

卤味行业市场分析,绝味、周黑鸭、嘴尚绝谁能脱颖而出

随着人们生活水平的提高&#xff0c;卤味市场不断发展壮大&#xff0c;成为我国食品行业中一个重要的组成部分。根据国家统计局数据&#xff0c;截至2020年底&#xff0c;我国卤味店数量已经达到了8.4万家&#xff0c;总产值超过1600亿元。 卤味行业的特点 产品口味丰富&#…

布基纳法索ECTN(BESC)申请流程

根据BURKINA FASO布基纳法索签发于 11/07/2006法令编号 00557的规定: 自2006年11月07 日起所有出口至布基纳法索&#xff08;Burkina Faso&#xff09;的货物&#xff0c;必须申请ECTN/BESC。ECTN是ELECTRONIC CARGO TRACKING NOTE的英文缩写&#xff0c;BESC是BORDEREAU DE SU…

《大型网站技术架构设计》第二篇 架构-性能

不同视角下的网站性能 1、用户 从用户角度&#xff0c;网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢。用户感受到的时间。 2、开发人员 开发人员关注的主要是应用程序本身及其相关子系统的性能&#xff0c;包括响应延迟、系统吞吐量、并发处理能力、系统稳定…