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

2024-01-13 09:36

本文主要是介绍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;}
};

这篇关于openal中使用现代C++智能指针管理ffmpeg中裸指针的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600998

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min