代码走读: FFMPEG-ffplayer02
AVFrame
int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
选取一个音频解码器 和 一个视频解码器分别介绍该解码器功能
音频G722
g722dec.c -> g722_decode_frame
通过 ff_get_buffer 给 传入的 frame 指针分配内存
g722_decode_frame 函数 对应 avcodec_receive_frame
static int g722_decode_frame(AVCodecContext *avctx, void *data,int *got_frame_ptr, AVPacket *avpkt)
{G722Context *c = avctx->priv_data;AVFrame *frame = data;int16_t *out_buf;int j, ret;const int skip = 8 - c->bits_per_codeword;const int16_t *quantizer_table = low_inv_quants[skip];GetBitContext gb;/* get output buffer */frame->nb_samples = avpkt->size * 2;// 给frame 指针中的数据缓存指针,分配内存if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)return ret;out_buf = (int16_t *)frame->data[0];init_get_bits(&gb, avpkt->data, avpkt->size * 8);.........}
ff_get_buffer 函数
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
{int ret = get_buffer_internal(avctx, frame, flags);if (ret < 0) {av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");frame->width = frame->height = 0;}return ret;
}
get_buffer_internal
====>1
static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
{.....ret = ff_attach_decode_data(frame);.....
}===>2
int ff_attach_decode_data(AVFrame *frame)
{。。。。fdd_buf = av_buffer_create((uint8_t*)fdd, sizeof(*fdd), decode_data_free,NULL, AV_BUFFER_FLAG_READONLY);.....return 0;
}===>3AVBufferRef *av_buffer_create(uint8_t *data, int size,void (*free)(void *opaque, uint8_t *data),void *opaque, int flags)
{AVBufferRef *ref = NULL;AVBuffer *buf = NULL;buf = av_mallocz(sizeof(*buf));if (!buf)return NULL;buf->data = data;buf->size = size;buf->free = free ? free : av_buffer_default_free;buf->opaque = opaque;atomic_init(&buf->refcount, 1);if (flags & AV_BUFFER_FLAG_READONLY)buf->flags |= BUFFER_FLAG_READONLY;ref = av_mallocz(sizeof(*ref));if (!ref) {av_freep(&buf);return NULL;}ref->buffer = buf;ref->data = data;ref->size = size;return ref;
}
视频hevcdecSstar,星辰硬件H265解码
ss_hevc_receive_frame 对应 avcodec_receive_frame
===》1static int ss_hevc_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{got_frame = 0;if (MI_SUCCESS == (ret2 = ss_hevc_get_frame(s, frame))) {got_frame = 1;frame->best_effort_timestamp = frame->pts;}}====>2
static int ss_hevc_get_frame(SsHevcContext *ssctx, AVFrame *frame)
{ret = av_frame_get_buffer(frame, 32);if (MI_SUCCESS == (ret = MI_SYS_ChnOutputPortGetBuf(&stVdecChnPort, &frame_buf->stVdecBufInfo, &frame_buf->stVdecHandle))){if (frame_buf->stVdecBufInfo.eBufType == E_MI_SYS_BUFDATA_FRAME) {frame_buf->bType = FALSE;frame->width = frame_buf->stVdecBufInfo.stFrameData.u16Width;frame->height = frame_buf->stVdecBufInfo.stFrameData.u16Height;} else if (frame_buf->stVdecBufInfo.eBufType == E_MI_SYS_BUFDATA_META) {pstVdecInfo = (mi_vdec_DispFrame_t *)frame_buf->stVdecBufInfo.stMetaData.pVirAddr;frame_buf->bType = TRUE;frame_buf->s32Index = pstVdecInfo->s32Idx;frame->width = pstVdecInfo->stFrmInfo.u16Width;frame->height = pstVdecInfo->stFrmInfo.u16Height;}frame->opaque = (SS_Vdec_BufInfo *)frame_buf;frame->pts = frame_buf->stVdecBufInfo.u64Pts;frame->format = ssctx->format;}
}
frame 释放函数
av_frame_unref
void av_frame_unref(AVFrame *frame)
{int i;if (!frame)return;wipe_side_data(frame);for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)av_buffer_unref(&frame->buf[i]);for (i = 0; i < frame->nb_extended_buf; i++)av_buffer_unref(&frame->extended_buf[i]);av_freep(&frame->extended_buf);av_dict_free(&frame->metadata);
#if FF_API_FRAME_QP
FF_DISABLE_DEPRECATION_WARNINGSav_buffer_unref(&frame->qp_table_buf);
FF_ENABLE_DEPRECATION_WARNINGS
#endifav_buffer_unref(&frame->hw_frames_ctx);av_buffer_unref(&frame->opaque_ref);av_buffer_unref(&frame->private_ref);get_frame_defaults(frame);
}
相关文章:
代码走读: FFMPEG-ffplayer02
AVFrame int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame) 选取一个音频解码器 和 一个视频解码器分别介绍该解码器功能 音频G722 g722dec.c -> g722_decode_frame 通过 ff_get_buffer 给 传入的 frame 指针分配内存 g722_decode_…...
【数据结构】——排序算法的相关习题
目录 一、选择题题型一 (插入排序)1、直接插入排序2、折半插入排序3、希尔排序 题型二(交换排序)1、冒泡排序2、快速排序 题型三(选择排序)1、简单选择排序~2、堆排序 ~题型四(归并排序…...
C高级day5(Makefile)
一、Xmind整理: 二、上课笔记整理: 1.#----->把带参宏的参数替换成字符串 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX(a,b) a>b?a:b #define STR(n) #n int main(int argc, const char *argv…...
Android 系统中适配OAID获取
一、OAID概念 OAID(Open Anonymous Identification)是一种匿名身份识别标识符, 用于在移动设备上进行广告追踪和个性化广告投放。它是由中国移动通信集 团、中国电信集团和中国联通集团共同推出的一项行业标准 OAID值为一个64位的数字 二、…...
差分数组leetcode 2770 数组的最大美丽值
什么是差分数组 差分数组是一种数据结构,它存储的是一个数组每个相邻元素的差值。换句话说,给定一个数组arr[],其对应的差分数组diff[]将满足: diff[i] arr[i1] - arr[i] 对于所有 0 < i < n-1 差分数组的作用 用于高效…...
请求响应状态码
请求与响应&状态码 Requests部分 请求行、消息报头、请求正文。 Header解释示例Accept指定客户端能够接收的内容类型Accept: text/plain, text/htmlAccept-Chars et浏览器可以接受的字符编码集。Accept-Charset: iso-8859-5Accept-Encodi ng指定浏览器可以支持的web服务…...
安卓机型系统美化 Color.xml文件必备常识 自定义颜色资源
color.xml文件是Android工程中用来进行颜色资源管理的文件.可以在color.xml文件中通过<color>标签来定义颜色资源.我们在布局文件中、代码中、style定义中或者其他资源文件中,都可以引用之前在color.xml文件中定义的颜色资源。 将color.xml文件拷到res/value…...
YOLO物体检测-系列教程1:YOLOV1整体解读(预选框/置信度/分类任/回归任务/损失函数/公式解析/置信度/非极大值抑制)
🎈🎈🎈YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV1提出论文:You Only Look Once: Unified, Real-Time Object Detection 1、物体检测经典方法 two-stage(两阶段):Faster-rc…...
2023/9/12 -- C++/QT
作业 实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性…...
【Purple Pi OH RK3566鸿蒙开发板】OpenHarmony音频播放应用,真实体验感爆棚!
本文转载于Purple Pi OH开发爱好者,作者ITMING 。 原文链接:https://bbs.elecfans.com/jishu_2376383_1_1.html 01注意事项 DevEco Studio 4.0 Beta2(Build Version: 4.0.0.400) OpenHarmony SDK API 9 创建工程类型选择Appli…...
Android rom开发:9.0系统上实现4G wifi 以太网共存
framework层修改网络优先级,4G > wifi > eth 修改patch如下: diff --git a/frameworks/base/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/frameworks/base/services/core/java/com/android/server/connectivit…...
高速自动驾驶HMI人机交互
概述 目的 本文档的目的是描述高速自动驾驶功能涉及的HMI显示需求技术规范和设计说明。 范围 术语及缩写 设计与实验标准 设计标准 设计标准-非法规类设计标准-法规类 HMI交互需求 CL4功能界面 HMI显示器[伊1] 中应包含CL4功能设置界面,提供给用户进行设置操作或显…...
【自然语言处理】关系抽取 —— SOLS 讲解
SOLS 论文信息 标题:Speaker-Oriented Latent Structures for Dialogue-Based Relation Extraction 作者:Guoshun Nan, Guoqing Luo, Sicong Leng, Yao Xiao, Wei Lu 发布时间与更新时间:2021.09.11 主题:自然语言处理、关系抽取、对话场景、跨语句、DialogRE、GCN arXiv:…...
周易算卦流程c++实现
代码 #include<iostream> using namespace std; #include<vector> #include<cstdlib> #include<ctime> #include<Windows.h>int huaYiXiangLiang(int all, int& left) {Sleep(3000);srand(time(0));left rand() % all 1;while (true) {if…...
软件架构设计(十三) 构件与中间件技术
中间件的定义 其实中间件是属于构件的一种。是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同技术之间共享资源。 我们把它定性为一类系统软件,比如我们常说的消息中间件,数据库中间件等等都是中间件的一种体现。一般情况都是给应用系统提供服务,而不是直接…...
PyTorch深度学习实战——基于ResNet模型实现猫狗分类
PyTorch深度学习实战——基于ResNet模型实现猫狗分类 0. 前言1. ResNet 架构2. 基于预训练 ResNet 模型实现猫狗分类相关链接 0. 前言 从 VGG11 到 VGG19,不同之处仅在于网络层数,一般来说,神经网络越深,它的准确率就越高。但并非…...
机器学习第六课--朴素贝叶斯
朴素贝叶斯广泛地应用在文本分类任务中,其中最为经典的场景为垃圾文本分类(如垃圾邮件分类:给定一个邮件,把它自动分类为垃圾或者正常邮件)。这个任务本身是属于文本分析任务,因为对应的数据均为文本类型,所以对于此类任务我们首先…...
基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)
图书借还管理小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 小…...
【校招VIP】前端计算机网络之UDP相关
考点介绍 UDP是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP有时被称为不可…...
前缀和实例4(和可被k整除的子数组)
题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k 5 输出:7 …...
WeChatFerry:基于RPC与DLL注入的微信PC端自动化框架深度解析
1. 项目概述与核心价值 最近在折腾微信自动化相关的东西,发现了一个挺有意思的项目——WeChatFerry。这名字起得挺形象,“Ferry”是渡轮的意思,感觉就像是在你的程序和微信客户端之间搭了一座桥,让数据可以安全、稳定地“摆渡”过…...
ComfyUI-FramePackWrapper:8GB显存也能流畅生成高质量AI视频的终极方案
ComfyUI-FramePackWrapper:8GB显存也能流畅生成高质量AI视频的终极方案 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper 你是否曾因显存不足而无法体验AI视频生成的魅力?现在…...
基于Python的自动化数据简报生成:从模板驱动到部署实践
1. 项目概述:数据简报的自动化生成利器如果你也和我一样,每天需要从一堆数据库、日志文件和API接口里捞出数据,然后吭哧吭哧地整理成PPT或者Word报告,那你一定懂这种重复劳动的痛苦。数据本身就在那里,但把它们变成老板…...
AI 驱动多态钓鱼攻击机理与行为防御体系研究
摘要 生成式 AI 技术推动网络钓鱼从规模化群发转向实时动态变异的多态化攻击模式,以每 15–20 秒生成唯一邮件、链接与附件,彻底颠覆基于重复特征与静态规则的传统防御逻辑。Cofense 2025 年威胁数据显示,76% 的恶意 URL 具备唯一性、82% 的恶…...
ESP32开发踩坑记:从HID库缺失到PlatformIO环境搭建的全流程复盘
ESP32开发踩坑记:从HID库缺失到PlatformIO环境搭建的全流程复盘 那天深夜,我盯着屏幕上"hid.h: No such file or directory"的报错信息,意识到自己掉进了嵌入式开发的第一个坑。原本想用Arduino做个体感鼠标来提升游戏体验…...
大语言模型越狱攻击:真实世界提示词生态与防御策略分析
1. 项目概述:一次对“越狱”提示词的田野调查如果你在过去一年里深度使用过ChatGPT、Claude或者国内的文心一言、通义千问这类大语言模型,大概率遇到过这样的情况:你问了一个稍微敏感点的问题,比如“如何制作一个恶作剧软件”&…...
实战指南:VRM-Addon-for-Blender 终极VRM格式导入导出解决方案
实战指南:VRM-Addon-for-Blender 终极VRM格式导入导出解决方案 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.1 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM(…...
[STM32U3] 【每周分享】【STM32U385RG 测评】+调试串口通讯,字符串打印
接着上一回,这会进行串口打印实验 一、查询原理图,找到我们需要配置的串口 如上图:PA9、PA10、USART1 二、按流程打开IDE软件,建立新的工程文件。 配置如下:debug、RCC、USART1 配置完成后就可以生成代码了 三、代…...
使用Taotoken后API调用延迟稳定在可接受范围且账单清晰可见
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后API调用延迟稳定在可接受范围且账单清晰可见 1. 引言 对于需要集成大模型能力的开发者而言,除了模型效…...
Go语言构建高效命令行工具集:claworc项目架构解析与实战应用
1. 项目概述:一个为开发者赋能的命令行工具集 最近在GitHub上闲逛,发现了一个名为 gluk-w/claworc 的项目。乍一看这个标题,有点摸不着头脑, claworc 听起来像是个自造词,结合 gluk-w 这个用户名,感觉…...
