FFmpeg源码:av_malloc_array、av_realloc_array函数分析

=================================================================

FFmpeg内存管理相关的源码分析:

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

FFmpeg源码:av_realloc、av_reallocp、size_mult、av_realloc_f函数分析
FFmpeg引用计数数据缓冲区相关的结构体:AVBuffer、AVBufferRef简介

FFmpeg源码:buffer_create、av_buffer_create、av_buffer_default_free、av_buffer_alloc、av_buffer_allocz函数分析

FFmpeg源码:av_buffer_ref、av_buffer_unref函数分析

FFmpeg源码:av_buffer_is_writable、av_buffer_realloc函数分析

FFmpeg源码:av_malloc_array、av_realloc_array函数分析

=================================================================

一、av_malloc_array函数

(一)av_malloc_array函数的定义

av_malloc_array函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavutil/mem.c中:

cpp 复制代码
void *av_malloc_array(size_t nmemb, size_t size)
{
    size_t result;
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;
    return av_malloc(result);
}

该函数作用是:给数组分配大小为nmemb x size字节的内存。

形参nmemb:数组中元素的个数

形参size:数组中单个元素的大小,单位为字节。

返回值:成功返回一个指针,该指针指向分配的内存块,即指向已被分配内存的数组的开头;失败返回NULL。

(二)av_malloc_array函数的内部实现分析

av_malloc_array函数内部,首先通过size_mult函数检查形参nmemb和形参size相乘是否会溢出,并把它们相乘的结果保存到局部变量result中,如果溢出,返回NULL:

cpp 复制代码
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;

如果没有溢出,通过av_malloc函数分配内存块:

cpp 复制代码
    return av_malloc(result);

二、av_realloc_array函数

(一)av_realloc_array函数的定义

av_realloc_array函数定义在源文件libavutil/mem.c中:

cpp 复制代码
void *av_realloc_array(void *ptr, size_t nmemb, size_t size)
{
    size_t result;
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;
    return av_realloc(ptr, result);
}

该函数作用是:

情况1:如果形参ptr值为NULL,并且形参nmemb x size的值大于0,给数组分配一个新的内存块,该函数返回一个指向新分配的内存块的指针;

情况2:如果形参ptr指向一个已存在的内存块(也就是说数组已经被分配内存了),并且形参nmemb x size的值大于0,根据nmemb x size的值扩展(给数组分配更多内存)或缩小该内存块。新的大小(nmemb x size的值)可大可小,如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失。

形参nmemb:数组中元素的个数

形参size:数组中单个元素的大小,单位为字节。

返回值:成功返回指向被分配内存的指针,否则返回空指针NULL。

(二)av_realloc_array函数的内部实现分析

av_realloc_array函数内部,首先通过size_mult函数检查形参nmemb和形参size相乘是否会溢出,并把它们相乘的结果保存到局部变量result中,如果溢出,返回NULL:

cpp 复制代码
    size_t result;
    if (size_mult(nmemb, size, &result) < 0)
        return NULL;

如果没有溢出,通过av_realloc函数分配或重新分配(更改动态分配的内存大小)一个内存块:

cpp 复制代码
    return av_realloc(ptr, result);
相关推荐
工具派2 天前
口播视频怎么自动剪掉冷场?视频静音删除的阈值实测
ffmpeg·音视频·视频
❀͜͡傀儡师2 天前
移动端 360° 商品展示方案:从 20MB 雪碧图到 800KB 丝滑视频
ffmpeg·webgl·sprite
2501_930472442 天前
深度复盘|数据库迁移实战(上):腾讯云助手解析慢查询日志,定位索引缺失与语法不兼容
数据库·阿里云·ffmpeg·云计算·腾讯云·aws
我就是DaLing呀!2 天前
flutter + ffmpeg_kit_extended_flutter 大视频合并下载
flutter·ffmpeg·音视频
可乐鸡翅yeah_4 天前
多浏览器 HLS 兼容性差异排查,Chrome、Firefox、Safari 表现不一致定位
chrome·ffmpeg·音视频·firefox·safari·m3u8
行者-全栈开发5 天前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
可乐鸡翅yeah_5 天前
M3U8测试流使用指南,流媒体开发自测与环境校验标准化方案
网络·ffmpeg·音视频·m3u8·m3u8在线·音视频在线播放
heqingchun165 天前
Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南
linux·ubuntu·ffmpeg
刘广睿5 天前
音频降噪实战:ffmpeg 滤镜、RNNoise 与人声分离方案对比
ffmpeg·音视频·效率工具·剪辑
IvorySQL6 天前
代价比较的变革——PostgreSQL执行计划干预增强深度解析
数据库·postgresql·ffmpeg