h264编码概述八(哥伦布编码ue(v))

news2025/9/13 22:25:04

一、概述

熵编码是无损编码的一种方法。该编码方法的宗旨是找到一种编码,使得码字的平均码长达到熵极限。具体实施是,对出现概率较大的符号,取较短的码长,对出现概率较小的符号取较大的码长。

H.264中使用的熵编码有:指数哥伦布编码、CAVLC、CABAC。 

本次仅分析指数哥伦布编码方法。H.264中定义的指数哥伦布编码共四类:

类型说明
ue(v)无符号指数哥伦布编码
se(v)有符号指数哥伦布编码
te(v)截断指数哥伦布编码
me(v)映射指数哥伦布编码

其中ue(v)是其他变型算法的基础,其他算法的结果由ue(v)的结果进一步处理得到。

ue(v)的码字分为三个部分:[prefix] + 1+ [surfix]

[prefix]为连续n个0。

[surfix]为表示实际数值的信息位,其长度与[prefix]一样。

[prefix] 和 [surfix]由码元取值确定。

标题无符号指数哥伦布编码:ue(v)编码方法

计算公式:(LeadingZeroBits:前面有多少个零)

二、实现

1、由此总结结,无符号指数哥伦布编码的实现,可以分为以下四步

 2、举例说明

code_num

tmp1:

code_num + 1

tmp2:转换二进制记录比特个数:M

tmp3:[prefix]需插入0个数(M-1)

码字

01101
12101010
23111011
34100200100
45101200101
56110200110
67111200111
78100030001000
89100130001001

X264编码实现流程整理: 

三、示例

以上面一段SPS的码流为例: 

00 00 00 01      67                         4D                                                  00     29                       

start code     nalutype=7 sps     profileidc=0x4D=77=main profile      level idc=0x29=41=4.1

8D  8D  40  3C 

seq_parameter_set_id:ue(v)  (解析8D为10001101)首个1bit是seq_parameter_set_id,根据上面的二.2表格,可知seq_parameter_set_id为0。

log2_max_frame_num_minus4:ue(v) (解析8D为0001101)如下显示,log2_max_frame_num_minus4应该是12

code_num

tmp1:

code_num + 1

tmp2:转换二进制记录比特个数:M

tmp3:[prefix]需插入0个数(M-1)

码字

1213110130001101

pic_order_cnt_type:ue(v)  (解析8D为10001101)首个1bit是pic_order_cnt_type=0

log2_max_pic_order_cnt_lsb_minus4:ue(v)解析8D为0001101)为12

num_ref_frames:ue(v)(解析40为01000000):为1

gaps_in_frame_num_value_allowed_flag:u(1):为0

pic_width_in_mbs_minus1:ue(v)(解析0x03C01:0000 0011 1100 0000 0001)

code_num

tmp1:

code_num + 1

tmp2:转换二进制记录比特个数:M

tmp3:[prefix]需插入0个数(M-1)

码字

119120111 100060000 0011 1100 0

01  13 

pic_height_in_map_units_minus1:ue(v) (解析0x0113: 000 0001 0001 0011  )为67

code_num

tmp1:

code_num + 1

tmp2:转换二进制记录比特个数:M

tmp3:[prefix]需插入0个数(M-1)

码字

6768100 010060000 0001 0001 00

frame_mbs_only_flag:u(1)  bit1为1

direct_8x8_inference_flag:u(1) bit1为1

F2C

frame_cropping_flag:u(1)(解析0xF2:1111 0010) bit1为1

frame_crop_left_offset:ue(v) (解析0xF2:1111 0010) bit1为0

frame_crop_right_offset:ue(v) (解析0xF2:1111 0010) bit1为0

frame_crop_top_offset:ue(v) (解析0xF2:1111 0010) bit1为0

frame_crop_bottom_offset:ue(v) (解析0x2C: 0010 1100)为4

vui_parameters_present_flag:u(1)(解析0x2C:0010 1100)为TRUE

下面需要解VUI信息

aspect_ratio_info_present_flag:u(1) (解析0x2C:0010  1100)为false

overscan_info_present_flag:u(1)(解析0x2C:0010  1100)为false

D  C0  40  40  5

video_signal_type_present_flag:u(1)(解析0XDC:1101 1100)为true。

video_format:u(3) (解析0xdc:1101 1100)为5
video_full_range_flag:u(1) (解析0xdc 1101 1100)为true
colour_description_present_flag:u(1) (解析0xdc 1101 1100)为true

colour_primaries:u(8) (解析0xc040: 1100 0000 0100 0000)为1
transfer_characteristics:u(8) (解析:0x4040:0100 0000 0100 0000)为1
matrix_coefficients:u(8) (解析0x4050:0100 0000 0101 0000)为1

chroma_loc_info_present_flag:u(1) (解析0x4050:0100 0000 0101 0000)为0

timing_info_present_flag:u(1)(解析0x4050:0100 0000 0101 0000)为true

0000 0BB8  0001 5F90   0400  0000 0 

num_units_in_tick:u(32) 0x0000 0BB8
time_scale:u(32) 0x0001 5F90
fixed_frame_rate_flag:u(1):(解析0x0400:0000 0100 0000 0000 )为false。

nal_hrd_parameters_present_flag:u(1) (解析0x0400:0000 0100 0000 0000 )为false。
vcl_hrd_parameters_present_flag:u(1) (解析0x0400:0000 0100 0000 0000 )为false。
pic_struct_present_flag:u(1) (解析0x0400:0000 0100 0000 0000 )为false。
bitstream_restriction_flag:u(1)(解析0x0400:0000 0100 0000 0000 )为false。

后面是trailing_bits()

rbsp_stop_one_bit:f(1)(解析0x0400:0000 0100 0000 0000 )为true。

后面是为了字节对齐补充的pad位。

四、参考

H264编码-哥伦布解析SPS信息 - 简书

h264编码分析-哥伦布编码_h264 哥伦布编码_fantasy_arch的博客-CSDN博客

H.264(三)熵编码和指数哥伦布编码_13257193的技术博客_51CTO博客

H.264(四)指数哥伦布编码(实现编码)_13257193的技术博客_51CTO博客

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

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

相关文章

【面试1v1实景模拟】面试中常见的Java关键字详解

笑小枫专属目录老面👴:Java中有哪些关键字老面👴:简单介绍一下 final 关键字老面👴:简单介绍一下 this、super 关键字老面👴:简单介绍一下 static 关键字老面👴&#xff…

深度解析Spring Boot自动装配原理

废话不多说了,直接来看源码。源码解析SpringBootApplication我们在使用idea创建好Spring Boot项目时,会发现在启动类上添加了SpringBootApplication注解,这个注解就是Spring Boot的核心所在。点击注解可以查看到到它的实现ementType.TYPE) Re…

JavaScript简单记录

简介 JavaScript 诞生于 1995 年。JavaScript 使得现代网页应用程序成为可能,使用 JavaScript 可以直接与用户交互,从而避免每一个动作都需要重新载入页 面。但有许多传统网站也会使用 JavaScript 来提供实时交互以及更加智能的表单功能。 JavaScript 其实和名为Ja…

【PaddlePaddle onnx】PaddlePaddle导出ONNX及模型可视化教程

文章目录1 背景介绍2 实验环境3 paddle.onnx.export函数简介4 代码实操4.1 PaddlePaddle与ONNX模型导出4.2 ONNX正确性验证4.3 PaddlePaddle与ONNX的一致性检查4.4 多输入的情况5 ONNX模型可视化6 ir_version和opset_version修改7 致谢原文来自于地平线开发者社区,未…

HBase高手之路1-Hbase简介

文章目录HBase高手之路1-Hbase简介一、什么是HBase1. HBase简介2. HBase的发展过程二、HBase特点1. 海量存储2. 列式存储3. 极易扩展4. 高并发5. 稀疏6. 强一致性读/写7. 自动分块8. 自动RegionServer故障转移9. Hadoop/HDFS集成10. MapReduce11. Java Client API12. Thrift/RE…

大聪明教你学Java | 带你了解 Redis 的三种集群模式

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言&#x1f4…

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1) 目录STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)前言1 环境搭建2 功能描述3 程序编写3.1 BootLoader部分3.2 APP的制作4 修改工程中的内存配置4.1 Bootloader…

uniapp生命周期

uniapp生命周期 uniapp生命周期不同于vue生命周期,uniapp生命周期分为: 应用生命周期 页面生命周期 组件生命周期 应用生命周期(官网) 注意 应用生命周期仅可在App.vue中监听,在其它页面监听无效。 onlaunch里进行页面跳转,如遇白…

你还在使用if-else写代码吗,今天带你领略下策略模式的魅力!

1、什么是策略模式 策略模式其实也是在解耦,把策略的定义、创建、使用这三个部分解耦开来,因为本身策略模式也是基于接口编程,这样其实可以简单的理解客户端调用使用接口进行编程,可以通过工厂方法创建对应的策略模式&#xff0c…

Docker 常见操作及部署springboot、Shiro、SpringData脚手架(下)

1、查找jdk容器 docker search jdk 2、查看镜像 docker images 3、启动JDK镜像 docker run -di --namejdk1.8 clarinpl/java 4、查看镜像运行情况 docker ps 5、使用命令行进入容器 docker exec -it 48428f21b6ee /bin/bash 6、查看jdk版本 java -version 7、从宿主机复制…

面向对象 - 继承

Hello , 各位同学朋友大家好啊, 今天给大家分享的技术呢, 是面向对象三大特征之一的继承,我们今天主要按照以下几个点, 展开继承的讲解。目录 :* 继承的介绍* 继承的好处和弊端* 继承中成员访问特点 - 成员变量* 继承中成员访问特点 - 成员方法* 方法重写* 继承中成…

一文认知并发安全的几种解决方案与性能对比

Kotlin协程基本套餐:协程的基本使用协程的上下文理解协程的作用域管理协程的常见进阶使用之前的系列文章我们讲的是一些 Kotlin 协程的基本概念和一些实用与常用的技巧与方法。其实明白之后,基本的使用是没有问题了。那么今天我想探讨一下,没…

用gin写简单的crud后端API接口

提要使用gin框架(go的web框架)来创建简单的几个crud接口)使用技术: gin sqlite3 sqlx创建初始工程新建文件夹,创建三个子文件夹分别初始化工程 go mod如果没有.go文件,执行go mod tidy可能报错(warning: "all" matched no packages), 可以先不弄,只初始化模块就行(…

GreenPlum小结

什么是GreenPlum?GreenPlum是业界最快最高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力。GreenPlum作为大数据融合存储…

【UE4 RTS游戏】03-摄像机运动_旋转视角

效果可以通过WASD控制“CameraPawn”的移动;通过鼠标中键旋转视角;通过alt鼠标中键将视角回归默认值;通过shift加速移动。步骤打开“CameraPawnController”,给如下节点添加注释,命名为“MovementX”接下来开始开始编辑…

JDK解压安装及idea开发工具配置

1. 安装JDK 1.1 下载安装包 下载安装包,直接解压,注意,解压的路径不要有中文 1.2 配置环境变量 右键点击我的电脑,选择属性 选择高级系统设置 选择环境变量 选择新建 在变量名中输入JAVA_HOME,变量值就是1.1中压缩包…

Windows环境下实现设计模式——访问者模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现访问者模式(设计模式)。不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff0c…

【C++】类和对象(收尾)

文章目录成员变量初始化问题初始化列表explicit关键字static成员特性:友元友元函数友元类内部类特性匿名对象成员变量初始化问题 在创建对象时,编译器通过调用构造函数,给了对象中各个成员变量一个合适的初始值。但是这并不能够称为对对象中成…

简单了解蓄电池在直流系统中的使用现状!

一般情况下,由市电通过直流配电屏为变电站的直流系统提供工作电源,包括对蓄电池组进行饱和和充电使蓄电池处于备用状态,当交流失电或系统需要进行大电流供电时,蓄电池需要迅速切入,向事故负荷、自动装置、保护装置以及…

本地套接字

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 本地套接字专栏:《Linux从小白到大神》《网络编程》 本地套接字通信需要一个文件&#xff…