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

ffmpeg面向对象-待定

1.常用对象
rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用:

AVFormatContext *fmt_ctx = NULL;
result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL);

其中fmt_ctx 如何分配内存的?如下

int avformat_open_input(AVFormatContext **ps, const char *filename,const AVInputFormat *fmt, AVDictionary **options)
{AVFormatContext *s = *ps;FFFormatContext *si;AVDictionary *tmp = NULL;ID3v2ExtraMeta *id3v2_extra_meta = NULL;int ret = 0;if (!s && !(s = avformat_alloc_context()))
……
}

avformat_alloc_context来给fmt_ctx 分配内存的,看它实质分配的内存有多大:

AVFormatContext *avformat_alloc_context(void)
{FFFormatContext *const si = av_mallocz(sizeof(*si));AVFormatContext *s;if (!si)return NULL;s = &si->pub;s->av_class = &av_format_context_class;s->io_open  = io_open_default;s->io_close = ff_format_io_close_default;s->io_close2= io_close2_default;av_opt_set_defaults(s);si->pkt = av_packet_alloc();si->parse_pkt = av_packet_alloc();if (!si->pkt || !si->parse_pkt) {avformat_free_context(s);return NULL;}si->shortest_end = AV_NOPTS_VALUE;return s;
}

可以看到它实际分配的内存是FFFormatContext这么大的,但是返回的地址是AVFormatContext *类型的,缩小了。这就是典型的oopc的接口继承

FFFormatContext类如下实现:

typedef struct FFFormatContext {/*** The public context.*/AVFormatContext pub;/*** Number of streams relevant for interleaving.* Muxing only.*/int nb_interleaved_streams;……
}

oopc的继承实现是结构体套结构体。如上结构体,FFFormatContext继承自AVFormatContext。

同时可以看到它的特点,一般父类都是作为子类第一个成员,这样方便强转更改访问权限。
FFFormatContext第1个成员就是父类AVFormatContext的成员,把它命名为pub——注释中说是public公共上下文——公共的——这就是面向对象中常用的抽象出的基类的基本方法。

所谓接口继承,就是创建子类返父类的地址,这是多态实现的基础。

oopc中,这种继承是个老套路,也是经典套路,linux中,还有rtthread RTOS的内核实现中常用这种套路,这个应该是oopc的经典。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp
  • AWQ量化(Activation-aware Weight Quantization)
  • 本地运行 Qwen2-VL
  • 函数式编程思想
  • 第十一周:机器学习
  • 基于stm32f407的跟随行驶系统项目报告(利用openmv+超声波模块)
  • 项目实战 ---- 商用落地视频搜索系统(5)---service层核心
  • 自动化抢票 12306
  • Ifream实现微前端效果
  • 无线路由器中的MU-MIMO技术是如何提升网络效率的?
  • pod基础和镜像拉取策略
  • Springboot中基于X509完成SSL检验的原理与实践
  • mysql数据库8.0小版本原地升级
  • vue解决“用户代理样式表“边距问题
  • 前端页面加载由模糊到清晰的实现方案
  • 【译】理解JavaScript:new 关键字
  • CentOS 7 防火墙操作
  • Druid 在有赞的实践
  • Git 使用集
  • iOS编译提示和导航提示
  • JavaScript的使用你知道几种?(上)
  • jquery cookie
  • linux学习笔记
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python_网络编程
  • Rancher如何对接Ceph-RBD块存储
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 测试开发系类之接口自动化测试
  • 从0到1:PostCSS 插件开发最佳实践
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 普通函数和构造函数的区别
  • 前端_面试
  • 嵌入式文件系统
  • 少走弯路,给Java 1~5 年程序员的建议
  • 协程
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个SAP顾问在美国的这些年
  • 移动端唤起键盘时取消position:fixed定位
  • 怎么将电脑中的声音录制成WAV格式
  • 容器镜像
  • ​​​【收录 Hello 算法】9.4 小结
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # C++之functional库用法整理
  • #pragma once
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (+4)2.2UML建模图
  • (007)XHTML文档之标题——h1~h6
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (分布式缓存)Redis哨兵
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十七)Flink 容错机制
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • ./configure,make,make install的作用