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

ffmpeg7.0 AVFrame的分配与释放

一、分配函数

/**
 * Allocate an AVFrame and set its fields to default values.  The resulting
 * struct must be freed using av_frame_free().
 *
 * @return An AVFrame filled with default values or NULL on failure.
 *
 * @note this only allocates the AVFrame itself, not the data buffers. Those
 * must be allocated through other means, e.g. with av_frame_get_buffer() or
 * manually.
 */
AVFrame *av_frame_alloc(void);

根据描述,AVFrame的分配函数是av_frame_alloc,但是仅仅只是分配AVFrame对象,AVFrame的成员变量data是不分配的。

1.1 分配data、buf、extended_data、extended_buf等

/**
 * Allocate new buffer(s) for audio or video data.
 *
 * The following fields must be set on frame before calling this function:
 * - format (pixel format for video, sample format for audio)
 * - width and height for video
 * - nb_samples and ch_layout for audio
 *
 * This function will fill AVFrame.data and AVFrame.buf arrays and, if
 * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.
 * For planar formats, one buffer will be allocated for each plane.
 *
 * @warning: if frame already has been allocated, calling this function will
 *           leak memory. In addition, undefined behavior can occur in certain
 *           cases.
 *
 * @param frame frame in which to store the new buffers.
 * @param align Required buffer size alignment. If equal to 0, alignment will be
 *              chosen automatically for the current CPU. It is highly
 *              recommended to pass 0 here unless you know what you are doing.
 *
 * @return 0 on success, a negative AVERROR on error.
 */
int av_frame_get_buffer(AVFrame *frame, int align);

示例:

分配一个解码器的pix_fmt格式的内存:

AVFrame* picture = av_frame_alloc();
if (!picture) {
	fprintf(stderr, "Could not allocate video frame\n");
	return;
}
picture->format = codec_ctx->pix_fmt;
picture->width = codec_ctx->width;
picture->height = codec_ctx->height;
ret = av_frame_get_buffer(picture, 0);

 分配一个BGR格式的内存:

AVFrame* pRGB = av_frame_alloc();
if (!pRGB) {
	return;
}
pRGB->format = AV_PIX_FMT_BGR24;
pRGB->width = codec_ctx->width;
pRGB->height = codec_ctx->height;
ret = av_frame_get_buffer(pRGB, 0);

二、内存释放

/**
 * Free the frame and any dynamically allocated objects in it,
 * e.g. extended_data. If the frame is reference counted, it will be
 * unreferenced first.
 *
 * @param frame frame to be freed. The pointer will be set to NULL.
 */
void av_frame_free(AVFrame **frame);

根据描述,使用下面代码可以释放分配的内存

av_frame_free(&pRGB);
av_frame_free(&picture);


http://www.kler.cn/a/301646.html

相关文章:

  • 消息队列原理面试题及参考答案
  • 【windows笔记】08-Windows中的各种快捷方式、符号链接、目录联接、硬链接的区别和使用方法
  • ubuntu 安装kafka-eagle
  • 软件测试 —— 自动化基础
  • 微信小程序02-页面制作
  • React Native 全栈开发实战班 - 网络与数据之网络请求基础
  • 使用 DBeaver 创建 MySQL 数据库
  • 第十五届蓝桥杯图形化省赛题目及解析
  • 前端 PDF 预览技巧:标签 vs 插件,如何优雅地展示 PDF 文件
  • 6、多线程
  • 如何使用python运行Flask开发框架并实现无公网IP远程访问
  • 力扣刷题之2555.两个线段获得的最多奖品
  • 装杯 之 Linux 指令1
  • 哈希表及算法
  • xLSTM模型学习笔记
  • 高性能计算机A100会带有BMC功能 ;BMC;SSH
  • Thinkphp5实现一周签到打卡功能
  • 前端算法(持续更新)
  • Linux_kernel移植rootfs10
  • 普发Pfeiffer TCP600TCP5000手侧
  • Python——贪吃蛇
  • JAVA基础:抽象类,接口,instanceof,类关系,克隆
  • 在深度学习计算机视觉的语义分割中,Boundary和Edge的区别是?
  • NX—UI界面生成的文件在VS上的设置
  • 【网络】DNS
  • 备忘录模式memento