当前位置: 首页 > 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的经典。

http://www.lryc.cn/news/433322.html

相关文章:

  • 大厂嵌入式数字信号处理器(DSP)面试题及参考答案
  • GC-分代收集器
  • C++从入门到起飞之——priority_queue(优先级队列) 全方位剖析!
  • [数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别
  • 【小沐学OpenGL】Ubuntu环境下glut的安装和使用
  • ROS 发行版 jazzy 加载urdf 渲染到 RVIZ2
  • SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能
  • 排序链表(归并排序)
  • Adobe After Effects的插件--------CC Particle World
  • 电脑硬盘数据丢失了怎么恢复?简单实用的硬盘数据找回的方法
  • k8s调度(pod亲和、反亲和、污点、容忍度)
  • 智能制造核心领域:自动化、物联网、大数据分析、人工智能在现代制造业中的应用与融合
  • Android Studio 2024最新版Hello World
  • 请解释Java中的CountDownLatch和CyclicBarrier的区别和使用场景。什么是Java中的Semaphore?它如何控制并发访问?
  • Django+Vue3前后端分离学习(五)(前端登录页面搭建)
  • 虚拟机安装macos系统
  • AI基础 L9 Local Search II 局部搜索
  • 828华为云征文|使用sysbench对Mysql应用加速测评
  • 2024 年高教社杯全国大学生数学建模竞赛题目——D 题 反潜航空深弹命中概率问题的求解
  • 【Kubernetes】常见面试题汇总(一)
  • 简单实用的php全新实物商城系统
  • Leetcode面试经典150题-128.最长连续序列-递归版本另解
  • spring security 中的授权使用
  • python安装以及访问openAI API
  • 【Unity小技巧】URP管线遮挡高亮效果
  • C#中的GDI和GDI+(Graphics Device Interface Plus)图形设备接口
  • 谷粒商城のNginx
  • Debug-027-el-tooltip组件的使用及注意事项
  • 猫眼电影字体破解(图片转码方法)
  • flink wordcount