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

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版