音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现

一、引言

由于视频的传输和存贮是十分在乎体积的,对于每一个比特(bit)都要格外珍惜,所以H.264中用到了多种熵编码来对原本的数据进行压缩。

比如Sequence Paramater Set(sps / 序列参数集)中,seq_parameter_set_id这个属性用到了无符号指数哥伦布编码ue(v):

offset_for_non_ref_pic这个属性用到了有符号指数哥伦布编码se(v):

要拿到sps中的上述属性,需要对H.264码流对应的位置进行指数哥伦布编码的解码。

二、指数哥伦布编码简介

哥伦布编码(又译作格伦布编码,英语:Golomb coding)是一种无失真资料压缩方法,由数学家所罗门·格伦布在1960年代提出。其优点为易于编码与解码,目前广泛用于无损影像压缩。它是一种变长编码。

其具体原理可以参考《百度百科:指数哥伦布码》

《维基百科:格伦布编码》

《Golomb Codes》

三、FFmpeg源码中 无符号指数哥伦布编码的解码实现

FFmpeg源码中通过get_ue_golomb、get_ue_golomb_long、get_ue_golomb_31等函数实现 对无符号指数哥伦布编码的解码。下面以get_ue_golomb_31函数为例,进行讲解。

get_ue_golomb_31函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3)的头文件libavcodec/golomb.h中:

/*** read unsigned exp golomb code, constraint to a max of 31.* If the value encountered is not in 0..31, the return value* is outside the range 0..30.*/
static inline int get_ue_golomb_31(GetBitContext *gb)
{unsigned int buf;#if CACHED_BITSTREAM_READERbuf = show_bits_long(gb, 32);buf >>= 32 - 9;skip_bits_long(gb, ff_golomb_vlc_len[buf]);
#elseOPEN_READER(re, gb);UPDATE_CACHE(re, gb);buf = GET_CACHE(re, gb);buf >>= 32 - 9;LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);CLOSE_READER(re, gb);
#endifreturn ff_ue_golomb_vlc_code[buf];
}

形参gb:既是输入型参数也是输出型参数。指向已经被初始化的GetBitContext类型的变量。执行get_ue_golomb_31函数之前必须确保已经使用init_get_bits函数进行初始化。(关于GetBitContext结构体可以参考《FFmpeg中位操作相关的源码:GetBitContext结构体,init_get_bits函数、get_bits1函数和get_bits函数分析》)

如果是使用get_ue_golomb_31函数对某个NALU(比如sps)中的属性进行读取。

执行get_ue_golomb_31函数之前:

gb->buffer需指向存放该NALU的“NALU Header + RBSP 的缓冲区”。

gb->buffer_end需指向上述缓冲区的末尾,也就是RBSP的最后一个字节。

gb->index的值需等于:当前读取到该缓冲区的第几位了(单位为bit)。要对以该位为起始的数据进行无符号指数哥伦布编码的解码。

gb->size_in_bit 的值需等于NALU Header + SODB的位数,单位为bit。

gb->size_in_bits_plus8的值需等于 s->size_in_bit 的值 加 8。

执行get_ue_golomb_31函数后:

gb->index的值会加上 “读取到的无符号指数哥伦布编码后的位数”。gb的其它成员的值不变。

get_ue_golomb_31函数返回值为:对gb->index的位置 进行无符号指数哥伦布解码后得到的数据。

注意:get_ue_golomb_31函数有读取范围的限制!!!只能读取0到31的数据,所以如果get_ue_golomb_31函数的返回值大于31表示出错了。

所以FFmpeg源码中(源文件libavcodec/h264_ps.c)对sps进行解码的函数ff_h264_decode_seq_parameter_set中有这样的一段逻辑:

#define MAX_SPS_COUNT          32int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,H264ParamSets *ps, int ignore_truncation){//...sps_id    = get_ue_golomb_31(gb);if (sps_id >= MAX_SPS_COUNT) {av_log(avctx, AV_LOG_ERROR, "sps_id %u out of range\n", sps_id);goto fail;}//...
}

如果读取到的sps_id值不小于32,表示out of range了。

如果想要更大的读取范围可以用get_ue_golomb函数和get_ue_golomb_long函数。它们的用法跟get_ue_golomb_31函数一样,只是读取范围更大而已。

四、FFmpeg源码中 有符号指数哥伦布编码的解码实现

FFmpeg源码中通过get_se_golomb和get_se_golomb_long等函数实现对 有符号指数哥伦布编码的解码。它们都定义在libavcodec/golomb.h中。

其形参跟get_ue_golomb_31函数相同,不同的地方为返回值是:对gb->index的位置 进行有符号指数哥伦布解码后得到的数据。

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

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

相关文章

python获取快手账号列表数据

快手数据获取相对简单访问地址固定且不需要登录token 列表地址获取的固定接口 https://www.kuaishou.com/graphql 发送post请求注意每个快手账号对应的id import time from datetime import datetime import logging import json import pymysql import requests# 创建一个lo…

python爬虫之12306模拟登陆

python爬虫之12306模拟登陆 登录流程: 1、登录界面输入账号密码,点击立即登录 2、弹出手机验证界面,输入身份证后4位,点击获取验证码等待验证码后手动输入,点击确定登录 实现代码如下: #需求&#xff1…

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单…

联想至像M3070DNA打印机加粉及清零方法

基本参数: 产品类型:黑白激光多功能商用一体机(打印/复印/扫描) 网络功能:支持有线网络打印 最大处理幅面:A4 双面功能:自动 打印速度:30页/分钟(高速激光打印&…

HarmonyOS NEXT:华为开启全新操作系统时代

在全球科技浪潮的汹涌澎湃中,华为再次以创新者的姿态,引领了一场关于操作系统的革命。HarmonyOS NEXT,这一由华为倾力打造的分布式操作系统,不仅是对现有技术的一次大胆突破,更是对未来智能生活的一次深邃展望。 Harmo…

【耐水好】强耐水UV胶水是怎样的?

【耐水好】强耐水UV胶水是怎样的? 强耐水UV胶水是一种特殊的胶水,其设计重点在于其出色的耐水性能。以下是关于强耐水UV胶水的特点: 优异的耐水性能:这种胶水能在水环境下保持稳定的粘接强度,不易被水分解或削弱。因…

TextRank 算法

第1关:Jieba 在关键词提取中的应用 任务描述 本关任务:根据本关所学有关使用 Jieba 库进行关键词提取的知识,编写使用 Jieba 模块进行关键词提取的程序,并通过所有测试用例。 相关知识 为了完成本关任务,你需要掌握…

uniapp生成微信小程序二维码

文章目录 一、获取不限制的小程序码1、第一步:需要先获取ACCESS_TOKEN2、第二步:获取微信小程序二维码 二、获取小程序码1、第一步:需要先获取ACCESS_TOKEN2、第二步:获取微信小程序二维码 三、扫普通链接二维码打开小程序1、协议…

反向代购是怎么火起来的?今后的发展趋势如何?

反向代购和反向海淘的兴起可以归因于多个因素,这些因素共同推动了海外消费者对中国商品的需求和购买热潮。以下是对其火起来的原因的详细分析: 海外华人华侨的需求增加: 随着中国国际移民群体的扩大,海外华人华侨数量不断增多。这…

第三届仿真模拟、电子信息科学与技术国际学术会议(SMEI 2024,8月02-04)

随着仿真模拟技术的成熟和进步,仿真模拟技术越来越广泛地应用于工业工程、管理科学、社会经济、交通运输、生态环境、军事装备等各个科学领域,并深刻影响着信息技术和信息产业的发展。围绕仿真模拟、电子信息科学与技术等方面内容,为更好地促…

Gartner发布2024年企业高管增长议程:使网络安全投资与业务增长保持一致

网络安全投资和准备被视为推动企业发展的关键因素。除了避免损失之外,高管还应利用有效的以业务为中心的安全方法,通过大规模实现敏捷性和创新来推动收入增长。 主要发现 高增长公司通过扩大商业足迹来推动业绩,这需要大规模的创新、敏捷性和…

002 使用kibana操作ElasticSearch7.x

文章目录 4.使用kibana操作es4.1.文档操作1.put方式发送数据2.post方式发送数据3.查看索引文档 GET4.更新文档 POST5.删除文档&索引 DELETE6.批量添加数据_bulk 4.2.Query DLS(查询领域对象语言)1.url 检索数据语法2.查询所有数据3.查询全部数据并排序4.查询全部数据排序并…

时序分析基本概念介绍——min period 最小时钟周期

文章目录 前言一、什么是 min period?二、为什么检查 min period?三、如何设置 min period?四、如何检查 min period?五、如何修复 min period?总结 前言 我们在实际设计中可能会碰到这种情况,如果我们的m…

介绍ES6中的class类:(一) 类的基本语法

一、类的由来与简介 1. 简介 很早很早之前,在JavaScript的世界里,生成实例对象的传统方法是通过构造函数。 嗯哼? function Point(x, y) {this.x x;this.y y; }Point.prototype.toString function () {return ( this.x , this.y )…

计算机图形学入门18:阴影映射

1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照,但是着色并不会进行阴影的计算,阴影需要单独进行处理,目前最常用的阴影计算技术之一就是Shadow Mapping技术,也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…

提升用户转化率秘诀!Xinstall的H5拉起应用技术让您领先一步!

在移动互联网时代,App的推广和运营面临着诸多挑战。其中,H5页面如何高效、便捷地拉起应用,成为了一个亟待解决的问题。今天,我们就来谈谈如何利用Xinstall品牌,轻松解决这一痛点,提升用户体验,助…

boss直聘招聘数据爬取及可视化分析2.0

boss直聘招聘数据爬取及可视化分析2.0 一、需求介绍二、完整代码2.1 爬虫代码2.2 数据可视化模块一、需求介绍 笔者在前两篇介绍boss直聘招聘数据爬取和可视化分析的博客的基础上,对代码和功能进行了完善。在数据爬取的模块,代码更加简洁易懂,且性能更加稳定;在数据可视化…

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌,其实就是一段字符串,那为什么要那么麻烦去用jwt令牌?其实对于登录这个业务,在平常我们实现这个功能时,可能大部分都是通过比对用户名和密码,只要正确,就登录成功&#xff…

关于 AD21导入电子元器件放置“3D体”STEP模型失去3D纹理贴图 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139969415 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

https网站安全证书的作用与申请办法

HTTPS网站安全证书,正式名称为超文本传输安全协议证书,是通过SSL/TLS加密协议,保障互联网用户与网站间数据交换的安全性的关键技术。 一:HTTPS网站安全证书的作用 1 消除不安全提示:未使用https协议的网站&#xff0c…