openal中使用现代C++智能指针管理ffmpeg中裸指针的用法

裸指针包装


/* Define unique_ptrs to auto-cleanup associated ffmpeg objects. */
struct AVIOContextDeleter {void operator()(AVIOContext *ptr) { avio_closep(&ptr); }
};
using AVIOContextPtr = std::unique_ptr<AVIOContext,AVIOContextDeleter>;struct AVFormatCtxDeleter {void operator()(AVFormatContext *ptr) { avformat_close_input(&ptr); }
};
using AVFormatCtxPtr = std::unique_ptr<AVFormatContext,AVFormatCtxDeleter>;struct AVCodecCtxDeleter {void operator()(AVCodecContext *ptr) { avcodec_free_context(&ptr); }
};
using AVCodecCtxPtr = std::unique_ptr<AVCodecContext,AVCodecCtxDeleter>;struct AVPacketDeleter {void operator()(AVPacket *pkt) { av_packet_free(&pkt); }
};
using AVPacketPtr = std::unique_ptr<AVPacket,AVPacketDeleter>;struct AVFrameDeleter {void operator()(AVFrame *ptr) { av_frame_free(&ptr); }
};
using AVFramePtr = std::unique_ptr<AVFrame,AVFrameDeleter>;struct SwrContextDeleter {void operator()(SwrContext *ptr) { swr_free(&ptr); }
};
using SwrContextPtr = std::unique_ptr<SwrContext,SwrContextDeleter>;struct SwsContextDeleter {void operator()(SwsContext *ptr) { sws_freeContext(ptr); }
};
using SwsContextPtr = std::unique_ptr<SwsContext,SwsContextDeleter>;

对象


struct ChannelLayout : public AVChannelLayout {ChannelLayout() : AVChannelLayout{} { }~ChannelLayout() { av_channel_layout_uninit(this); }
};

智能指针使用和轮子—解包队列

template<size_t SizeLimit>
class DataQueue {std::mutex mPacketMutex, mFrameMutex;std::condition_variable mPacketCond;std::condition_variable mInFrameCond, mOutFrameCond;std::deque<AVPacketPtr> mPackets;size_t mTotalSize{0};bool mFinished{false};AVPacketPtr getPacket(){std::unique_lock<std::mutex> plock{mPacketMutex};while(mPackets.empty() && !mFinished)mPacketCond.wait(plock);if(mPackets.empty())return nullptr;auto ret = std::move(mPackets.front());mPackets.pop_front();mTotalSize -= static_cast<unsigned int>(ret->size);return ret;}public:int sendPacket(AVCodecContext *codecctx){AVPacketPtr packet{getPacket()};int ret{};{std::unique_lock<std::mutex> flock{mFrameMutex};while((ret=avcodec_send_packet(codecctx, packet.get())) == AVERROR(EAGAIN))mInFrameCond.wait_for(flock, milliseconds{50});}mOutFrameCond.notify_one();if(!packet){if(!ret) return AVErrorEOF;std::cerr<< "Failed to send flush packet: "<<ret <<std::endl;return ret;}if(ret < 0)std::cerr<< "Failed to send packet: "<<ret <<std::endl;return ret;}int receiveFrame(AVCodecContext *codecctx, AVFrame *frame){int ret{};{std::unique_lock<std::mutex> flock{mFrameMutex};while((ret=avcodec_receive_frame(codecctx, frame)) == AVERROR(EAGAIN))mOutFrameCond.wait_for(flock, milliseconds{50});}mInFrameCond.notify_one();return ret;}void setFinished(){{std::lock_guard<std::mutex> _{mPacketMutex};mFinished = true;}mPacketCond.notify_one();}void flush(){{std::lock_guard<std::mutex> _{mPacketMutex};mFinished = true;mPackets.clear();mTotalSize = 0;}mPacketCond.notify_one();}bool put(const AVPacket *pkt){{std::unique_lock<std::mutex> lock{mPacketMutex};if(mTotalSize >= SizeLimit || mFinished)return false;mPackets.push_back(AVPacketPtr{av_packet_alloc()});if(av_packet_ref(mPackets.back().get(), pkt) != 0){mPackets.pop_back();return true;}mTotalSize += static_cast<unsigned int>(mPackets.back()->size);}mPacketCond.notify_one();return true;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清晰讲解Cookie、Session、Token、JWT之间的区别

文章目录 什么是认证(Authentication)什么是授权(Authorization)什么是凭证(Credentials)什么是Cookie什么是SessionSession的痛点 Cookie 和 Session 的区别什么是Token(令牌)Acesss TokenRefresh Token Token 和 Session 的区别Token 与 Cookie什么是 JWT生成JWTJWT 的原理JW…

利用PowerShell和Mkvtoolnix批量去除视频封面

利用PowerShell v5和Mkvtoolnix批量去除视频封面 PowerShell Version : 5.1.22621.2506 foreach ($file in Get-ChildItem "*.mp4") { Start-Process -FilePath "C:\Program Files\MKVToolNix\mkvmerge.exe" -ArgumentList "--ui-language en --pr…

Memcache简介与运维

开源、高性能、高并发的分布式内存缓存系统。 作用 缓存关系型数据库的结果&#xff0c;减少数据库自身访问的次数。 常见内存缓存服务软件对比 memcache 纯内存 redis、memcachedb 可持久化存储&#xff0c;同时会使用磁盘存 …

idea使用docker-compose发布应用程序

非常重要的话说在前头 idea要想使用docker-compose&#xff0c;不能使用ssh创建idea Docker&#xff0c;而需要使用socket创建idea Docker。 socket docker是不安全的&#xff0c;任何人都可以访问你的docker&#xff0c;所以只能测试环境使用&#xff0c;请勿在正式环境使用s…

问题解决记录-pypcd

项目场景&#xff1a; python3 环境下使用 pypcd 读取点云 pcd 文件 pip install pypcd 安装 pypcd 库 问题描述 读取pcd 文件时候报错 问题 1、 import cStringIO as sio ModuleNotFoundError: No module named cStringIOpython3.X已经取消了cStringIO模块 网上建议&…

UniApp 面试题

UniApp 面试题 1. 什么是 UniApp&#xff1f;它有什么特点&#xff1f; 答案&#xff1a;UniApp 是一个基于 Vue.js 的跨平台应用开发框架&#xff0c;可以使用 Vue.js 的开发语法编写一次代码&#xff0c;然后通过编译生成可以在多个平台&#xff08;包括iOS、Android、H5 等…

每日一题 2182. 构造限制重复的字符串(中等,贪心)

贪心&#xff0c;每次都尽量取大的&#xff0c;除非连续取的次数超出限制&#xff0c;此时取一个下一个字符 class Solution:def repeatLimitedString(self, s: str, repeatLimit: int) -> str:N 26count [0] * Nfor c in s:count[ord(c) - ord(a)] 1ret []i, j, m N …

go-carbon v2.3.5 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库&#xff0c;支持链式调用。 目前已被 awesome-go 收录&#xff0c;如果您觉得不错&#xff0c;请给个 star 吧 github.com/golang-module/carbon gitee.com/golang-module/carbon 安装使用 Golang 版本大于…

98. 验证二叉搜索树(LeetCode)

文章目录 前言一、题目分析二、算法原理三、代码实现剪枝总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode中第98题验证二叉搜索树&#xff0c; 在本内容中我们将会学到递归解决二叉树&#xff0c;全局变量&#xff0c;剪枝等等相关内容。 一、题目分析 分析&a…

python 可变与不可变类型

不可变变量 不可变量包括&#xff1a;数值类型、字符串和元组。一旦被重新赋值&#xff0c;变量对应的内存地址就会发生改变。 可变变量 不可变量包括&#xff1a;列表、字典、集合。添加或者修改数据时&#xff0c;变量对应的内存地址不会改变。也就是可变类型&#xff0c;一…

单片机原理及应用:定时器/计数器综合应用

本文是《单片机原理及应用》专栏中的最后一篇文章&#xff0c;笔者以编译器的安装配置——51单片机简介——LED和数码管外设——开关和按键控制功能切换——外部中断系统——定时器与计数器为知识大纲&#xff0c;介绍了C语言编程控制51单片机的入门教程。作为收尾&#xff0c;…

关于java方法调用的回顾

关于java方法调用的回顾 上篇文章中我们回顾了一下java方法的定义&#xff0c;本篇文章中我们来回顾一下方法的调用&#xff0c;这样更利于咱们后续的面向对象的学习&#x1f600;。 方法的调用 静态方法。 非静态方法。 形参和实参。 值传递和引用传递。 this关键字。 …

基于JavaWeb+BS架构+SpringBoot+Vue+Spark的共享单车数据存储系统的设计和实现

基于JavaWebBS架构SpringBootVueSpark的共享单车数据存储系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 第一章 概述 2 1.1课题研究背景 2 1.2 课题研究意义 2 1.3国内…

ASP.NET作业批改系统源码

ASP.NET作业批改系统源码 源码描述&#xff1a; 该系统主要完成学生注册&#xff0c;登陆&#xff0c;作业的上传&#xff0c;教师对作业进行发布&#xff0c;批改等功能。 包括登陆子系统&#xff0c;学生子系统&#xff0c;教师子系统和管理员子系统。 管理员功能 资料管理:修…

【Maven】004-基于 IDEA 构建 Maven 工程

【Maven】004-基于 IDEA 构建 Maven 工程 文章目录 【Maven】004-基于 IDEA 构建 Maven 工程一、概述1、项目构建2、命令方式项目构建命令war 包打包插件和 jdk 版本不匹配 二、项目构建1、命令方式2、IDEA 可视化方式3、构建产物 一、概述 1、项目构建 项目构建是将软件开发…

XTdrone运行ego需打开多个终端 麻烦 一键启动脚本

VINS-Fusion仿真部分 建立plan.sh文件 #!/bin/bash gnome-terminal -x bash -c "cd ~/PX4_Firmware; roslaunch px4 indoor1.launch" sleep 5 gnome-terminal -x bash -c "cd ~/xtdrone_ws; bash scripts/xtdrone_run_vio.sh" sleep 5 gnome-terminal …

推荐3个wordpress模板网站

WP模板牛 http://www.wpniu.com 上面有很多免费wordpress模板资源的网站&#xff0c;除了免费模板&#xff0c;还有付费模板。 My模板&#xff08;我的模板&#xff09; http://www.mymoban.com 老牌网站模板资源站&#xff0c;上面有wordpress模板、帝国CMS模板、WooComm…

获得利润和成长,应采取什么步骤, 澳福认为只需坚持一点

大多数交易者通常会考虑在外汇交易中获取利润&#xff0c;但只有少数人会思考这样一个问题:为了获得利润和专业成长&#xff0c;应该采取什么步骤。像“外汇交易怎么赢利”这样的文章很受市场欢迎&#xff0c;但是很少有人在交易中使用这些文章中给出的建议&#xff0c;因为在生…

图像监视:在 Visual Studio 调试器中查看内存中图像

先决条件 本教程假定您具有以下可用项&#xff1a; 安装了 Update 1 的 Visual Studio 2012 Professional&#xff08;或更高版本&#xff09;。更新 1 可在此处下载。在 Windows 计算机上安装 OpenCV&#xff08;教程&#xff1a;在 Windows 中安装&#xff09;。能够在 Visua…

unity C#深拷贝、浅拷贝、直接赋值区别与经典实例

文章目录 浅拷贝深拷贝浅拷贝和直接赋值有啥区别 在C#中&#xff0c;浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是两种不同级别的对象复制方式。它们的区别主要体现在处理引用类型字段时的行为。 浅拷贝 浅拷贝是指复制对象时&…