音视频入门基础: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,一经查实,立即删除!

相关文章

pyqt的QWidgetList如何多选?如何按下Ctrl多选?

通过设置setSelectionMode(QAbstractItemView.MultiSelection),可以实现QWidgetList的多选。 但是上述结果不太符合我们需求。设置多选模式后,只需鼠标点击就可以选择多个条目。 我希望按下Ctrl键时才进行多选,仅鼠标单击的话,只进…

bat命令 批处理 脚本 windows DOS

常见命令解释 命令示例: 文件1.bat echo offstart notepad.exe timeout /t 5 /nobreak start notepad.exe pause echo 当前时间【%time%】 timeout /t 5 /nobreak echo 延时时间【%time%】 pause echo off 执行bat文件的时候,cmd黑框里不显示批处理…

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…

CTE(公共表表达式)和视图在查询时的性能影响

在SQL查询优化和数据库设计中,CTE(公共表表达式)和视图都是常用的工具。尽管它们在功能和使用场景上有很多相似之处,但在查询性能方面可能存在显著差异。本文将探讨CTE和视图在查询时的性能影响,帮助您在实际项目中做出…

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

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

Flutter有哪些优势,为什么稳定的大公司都向Flutter迁移?

Flutter作为Google开发的跨平台移动应用开发框架,具有一系列显著的优势,以下是对其优势的详细归纳: 跨平台开发能力: Flutter允许开发人员使用单一代码库创建适用于Android和iOS的应用程序,大大减少了开发和维护的工作…

发送HTTP请求并与一个假设的MES系统进行对接案例。

假设我们有一个MES系统,它提供了一个RESTful API用于获取订单信息。API的URL是https://api.mes-system.com/orders/{orderId},其中{orderId}是一个占位符,需要替换为实际的订单ID。 以下是demo: using System; using System.Ne…

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

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

sql-analysis

文章目录 痛点: 1、无法提前发现慢sql,可能恶化为慢sql的语句 2、线上出现慢sql后,无法快速止损 后果:一般是以响应时间来发现慢sql,这时候已经对业务产生了一定影响,这时候就要改代码重新发布上线或者改数…

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

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

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

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

HarmonyOS鸿蒙应用开发基础知识

参考 HarmonyOS鸿蒙应用开发 (二、应用程序包结构理解及Ability的跳转,与Android的对比)_hap(harmonyos ability package)包的开发-CSDN博客 HarmonyOS NEXT下一代编程语言仓颉介绍及入门-CSDN博客 媒体模块: AVCodec Kit(音视频编解码服务…

TextRank 算法

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

Grafana 对接 Zabbix 数据源API错误

介绍 主要报错为 Invalid params. Invalid parameter "/": unexpected parameter "user". 主要原因为Zabbix 6.4.0以上的版本更新了API,导致Grafana的数据源插件不兼容。 解决方案 更新到最新的Grafana 和 grafana-zabbix 插件即可。&#x…

react输入框输入的空格 样式 和输入后页面显示一致

为了确保在 React 输入框中输入的空格样式和输入后页面显示一致,你可以使用 CSS 的 white-space 属性来控制空格的显示。具体来说,可以使用 pre-wrap 值来保留空格和换行符。 import React, { useState, useEffect, useRef } from react; import ./App.…

uniapp生成微信小程序二维码

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

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

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

关于wx.config报错 invalid url domain 及 invalid signature 错误原因及解决方式

wx.config的初始化配置 wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: res.data.data.appId, // 必…

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

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