当前位置: 首页 > news >正文

FFmpeg源码:av_base64_decode函数分析

一、引言

Base64(基底64)是一种基于64个可打印字符来表示二进制数据的表示方法。由于log2 64=6,所以每6个比特为一个单元,对应某个可打印字符。3个字节相当于24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

Base64编码具有以下特点:1.编码后的数据长度总是比原始数据长约 1/3;2.编码后的数据可以包含 A-Z、a-z、0-9 和两个额外字符的任意组合;3.Base64 编码是一种可逆的编码方式,可以通过解码还原原始数据。

FFmpeg源码中,通过av_base64_decode函数对Base64编码的字符串进行解码。

二、av_base64_decode函数的声明

av_base64_decode函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavutil/base64.h中:

/*** Decode a base64-encoded string.** @param out      buffer for decoded data* @param in       null-terminated input string* @param out_size size in bytes of the out buffer, must be at*                 least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in))* @return         number of bytes written, or a negative value in case of*                 invalid input*/
int av_base64_decode(uint8_t *out, const char *in, int out_size);

该函数的作用是:对Base64编码的字符串进行解码。

形参out:输出型参数,存放以Base64解码后的数据的缓冲区。

形参in:输入型参数,存放以Base64编码后的数据的缓冲区。

形参out_size:输入型参数,形参out指向的缓冲区的大小,单位为字节。

返回值:解码成功,返回写入的字节数,即解码后数据占用空间的大小;解码失败,返回一个负数。

三、av_base64_decode函数的定义

av_base64_decode函数定义在源文件libavutil/base64.c中:

int av_base64_decode(uint8_t *out, const char *in_str, int out_size)
{uint8_t *dst = out;uint8_t *end;// no sign extensionconst uint8_t *in = in_str;unsigned bits = 0xff;unsigned v;if (!out)goto validity_check;end = out + out_size;while (end - dst > 3) {BASE64_DEC_STEP(0);BASE64_DEC_STEP(1);BASE64_DEC_STEP(2);BASE64_DEC_STEP(3);// Using AV_WB32 directly confuses compilerv = av_be2ne32(v << 8);AV_WN32(dst, v);dst += 3;in += 4;}if (end - dst) {BASE64_DEC_STEP(0);BASE64_DEC_STEP(1);BASE64_DEC_STEP(2);BASE64_DEC_STEP(3);*dst++ = v >> 16;if (end - dst)*dst++ = v >> 8;if (end - dst)*dst++ = v;in += 4;}
validity_check:while (1) {BASE64_DEC_STEP(0);in++;BASE64_DEC_STEP(0);in++;BASE64_DEC_STEP(0);in++;BASE64_DEC_STEP(0);in++;}out3:if (end - dst)*dst++ = v >> 10;v <<= 2;
out2:if (end - dst)*dst++ = v >> 4;
out1:
out0:return bits & 1 ? AVERROR_INVALIDDATA : out ? dst - out : 0;
}

四、参考

《维基百科——Base64》

Base64 编码/解码 | 菜鸟工具

相关文章:

FFmpeg源码:av_base64_decode函数分析

一、引言 Base64&#xff08;基底64&#xff09;是一种基于64个可打印字符来表示二进制数据的表示方法。由于log2 646&#xff0c;所以每6个比特为一个单元&#xff0c;对应某个可打印字符。3个字节相当于24个比特&#xff0c;对应于4个Base64单元&#xff0c;即3个字节可由4个…...

【后端面试总结】mysql的group by怎么用

GROUP BY 是 SQL 中的一种用于对结果集进行分组的子句&#xff0c;常与聚合函数&#xff08;如 COUNT()、SUM()、AVG()、MAX() 和 MIN() 等&#xff09;一起使用。GROUP BY 的作用是基于一个或多个列对查询结果进行分组&#xff0c;然后可以对每个分组执行聚合操作。 以下是 G…...

计算机视觉和图像处理

计算机视觉与图像处理的最新进展 随着人工智能技术的飞速发展&#xff0c;计算机视觉和图像处理作为其中的重要分支&#xff0c;正逐步成为推动科技进步和产业升级的关键力量。 一、计算机视觉的最新进展 计算机视觉&#xff0c;作为人工智能的重要分支&#xff0c;主要研究如…...

一文读懂Python之random模块(31)

random模块是Python的内置标准库&#xff0c;用于生成各类随机数&#xff0c;可以用作生成网站初始登录密码和随机验证码。 一、random模块简介 random模块可以生成随机数&#xff0c;包括随机整数、浮点数、随机元素等。 二、random模块相关概念 随机数&#xff1a; 是指在…...

p1044 栈

两种递推细节不同 1,将1和n在序列末尾的情况单独放出来处理&#xff0c;因为dp[0]0&#xff1b; 2,将所有情况统一处理&#xff0c;这种情况就要要求dp[1]1; 这里的n在解题中可以看做是元素数量 思路是&#xff0c;根据出栈最后一个元素,统计它前面的元素数量的输出序列数和…...

吴恩达深度学习——超参数调试

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 超参数调试调试选择范围 Batch归一化公式整合 Softmax 超参数调试 调试 目前学习的一些超参数有学习率 α \alpha α&#xff08;最重要&#xff09;、动量梯度下降法 β \bet…...

SQL NOW() 函数详解

SQL NOW() 函数详解 引言 在SQL数据库中&#xff0c;NOW() 函数是一个常用的日期和时间函数&#xff0c;用于获取当前的时间戳。本文将详细介绍 NOW() 函数的用法、参数、返回值以及在实际应用中的注意事项。 函数概述 NOW() 函数返回当前的日期和时间&#xff0c;格式为 Y…...

【JAVA基础】双亲委派

双亲委派可以简单理解为, 当收到加载请求时, 会依次向上加载 ; 只有当父类加载器无法完成加载请求时&#xff0c;子类加载器才会尝试自己去加载。 工作原理 类加载请求传递&#xff1a;当应用程序需要加载一个类时&#xff0c;比如通过ClassLoader.loadClass()方法&#xff0…...

刷题记录 HOT100回溯算法-6:79. 单词搜索

题目&#xff1a;79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻…...

JavaScript系列(52)--编译优化技术详解

JavaScript编译优化技术详解 &#x1f680; 今天&#xff0c;让我们深入探讨JavaScript的编译优化技术。通过理解和应用这些技术&#xff0c;我们可以显著提升JavaScript代码的执行效率。 编译优化基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript引擎通常…...

Ollama+DeepSeek本地大模型部署

1、Ollama 官网&#xff1a;https://ollama.com/ Ollama可以干什么&#xff1f; 可以快速在本地部署和管理各种大语言模型&#xff0c;操作命令和dokcer类似。 mac安装ollama&#xff1a; # 安装ollama brew install ollama# 启动ollama服务&#xff08;默认11434端口&#xf…...

在 WSL2 中重启 Ubuntu 实例

在 WSL2 中重启 Ubuntu 实例&#xff0c;可以按照以下步骤操作&#xff1a; 方法 1: 使用 wsl 命令 关闭 Ubuntu 实例: 打开 PowerShell 或命令提示符&#xff0c;运行以下命令&#xff1a; wsl --shutdown这会关闭所有 WSL2 实例。 重新启动 Ubuntu: 再次打开 Ubuntu&#x…...

【ts + java】古玩系统开发总结

src别名的配置 开发中文件和文件的关系会比较复杂&#xff0c;我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…...

机器学习周报-文献阅读

文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作&#xff08;Masking Operation&#xff09; 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…...

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…...

fpga系列 HDL:XILINX Vivado ILA FPGA 在线逻辑分析

ILA为内置逻辑分析仪&#xff0c;通过JTAG与FPGA连接&#xff0c;程序在真实硬件中运行&#xff0c;功能类似Quaruts的SignalTap II 。 ip创建ila 使用ila ip核 timescale 1ns / 1ps module HLSLED(input wire clk ,input wire rst_n ,output wire led);// reg led_o_i 1…...

刷题记录 贪心算法-2:455. 分发饼干

题目&#xff1a;455. 分发饼干 难度&#xff1a;简单 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&a…...

Android --- CameraX讲解

预备知识 surface surfaceView SurfaceHolder surface 是什么&#xff1f; 一句话来说&#xff1a; surface是一块用于填充图像数据的内存。 surfaceView 是什么&#xff1f; 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中&#xff0c;但在wms 中可以理解为…...

ElasticSearch view

基础知识类 elasticsearch和数据库之间区别&#xff1f; elasticsearch&#xff1a;面向文档&#xff0c;数据以文档的形式存储&#xff0c;即JSON格式的对象。更强调数据的搜索、索引和分析。 数据库&#xff1a;更侧重于事务处理、数据的严格结构化和完整性&#xff0c;适用于…...

list的使用,及部分功能的模拟实现(C++)

目录&#xff08;文章中"节点"和"结点"是同一个意思&#xff09; 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…...

双目视觉实战:从标定参数到深度图的完整OpenCV实现指南

双目视觉实战&#xff1a;从标定参数到深度图的完整OpenCV实现指南 在计算机视觉领域&#xff0c;双目立体视觉一直是获取三维环境信息的重要技术手段。与激光雷达等主动传感器相比&#xff0c;基于双相机的立体视觉系统具有成本低、数据丰富、易于部署等优势。本文将深入探讨如…...

自动驾驶仿真测试避坑手册:从Pattern参数选择到Comfort问题定位

自动驾驶仿真测试避坑手册&#xff1a;从Pattern参数选择到Comfort问题定位 在自动驾驶系统的开发流程中&#xff0c;仿真测试环节往往决定了算法迭代的效率和质量。不同于传统软件测试&#xff0c;自动驾驶仿真需要构建高度复杂的虚拟环境&#xff0c;模拟真实世界中的各种边缘…...

s2-pro音色定制实战:为品牌IP打造专属语音形象的全流程方案

s2-pro音色定制实战&#xff1a;为品牌IP打造专属语音形象的全流程方案 1. 为什么品牌需要专属语音形象 在当今数字营销时代&#xff0c;品牌IP的语音形象已经成为品牌识别的重要组成部分。一个独特、一致的语音形象能够&#xff1a; 增强品牌辨识度&#xff1a;让用户一听到…...

银河麒麟V10 SP1下使用rsync实现多客户端定时数据备份(避坑指南)

银河麒麟V10 SP1多客户端数据同步全链路配置与优化实战 在IT运维工作中&#xff0c;数据备份如同氧气般不可或缺。想象一下&#xff0c;当数十台客户端设备同时运行时&#xff0c;如何确保关键业务数据能够安全、高效地集中备份&#xff1f;银河麒麟V10 SP1作为国产操作系统的…...

Logisim-Evolution完全指南:从入门到精通数字电路仿真

Logisim-Evolution完全指南&#xff1a;从入门到精通数字电路仿真 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 开源电路仿真软件Logisim-Evolution是一款功能强大的数…...

GLM-OCR镜像免配置优势:无需HuggingFace Token,离线环境安全可用

GLM-OCR镜像免配置优势&#xff1a;无需HuggingFace Token&#xff0c;离线环境安全可用 1. 什么是GLM-OCR及其核心价值 GLM-OCR是一个基于先进GLM-V编码器-解码器架构构建的多模态OCR识别模型&#xff0c;专门为复杂文档理解场景而设计。与传统的OCR工具不同&#xff0c;它不…...

基于StructBERT的代码相似性检测在编程教育中的应用

基于StructBERT的代码相似性检测在编程教育中的应用 1. 引言 如果你是编程课的老师&#xff0c;面对几十份甚至上百份学生提交的作业&#xff0c;最头疼的是什么&#xff1f;是逐行检查代码逻辑&#xff0c;还是判断学生之间是否存在抄袭&#xff1f;传统的代码相似性检查工具…...

如何快速完成亚马逊SP-API注册:AWS IAM策略与角色配置详解

亚马逊SP-API高效注册指南&#xff1a;从AWS IAM配置到应用上线的全流程解析 当你的电商业务需要与亚马逊平台深度集成时&#xff0c;SP-API&#xff08;Selling Partner API&#xff09;将成为不可或缺的工具。作为亚马逊新一代的开发者接口&#xff0c;它比传统的MWS提供了更…...

ViVe完整贡献指南:从入门到精通的开源参与秘籍

ViVe完整贡献指南&#xff1a;从入门到精通的开源参与秘籍 【免费下载链接】ViVe C# library and console app for using new feature control APIs available in Windows 10 version 2004 and newer 项目地址: https://gitcode.com/gh_mirrors/vi/ViVe ViVe是一个C#库&…...

Qwen3-ASR-1.7B效果实测:识别普通话、英语、方言,准确率惊人

Qwen3-ASR-1.7B效果实测&#xff1a;识别普通话、英语、方言&#xff0c;准确率惊人 1. 多语言语音识别新标杆 当我第一次听到Qwen3-ASR-1.7B能够识别30种语言和22种中文方言时&#xff0c;说实话我是持怀疑态度的。毕竟在语音识别领域&#xff0c;支持的语言越多&#xff0c…...