diff --git a/src/Lib/Audio.hh b/src/Lib/Audio.hh index 3a7ad817e1a6c65d76b36c7084b8098d1e6f63eb..ee0efab5dcd5714d34d100f531a48eb673397b6b 100644 --- a/src/Lib/Audio.hh +++ b/src/Lib/Audio.hh @@ -37,24 +37,17 @@ public: class Stream final { VIVY_UNMOVABLE_OBJECT(Stream) - // All the needed deleters - static inline constexpr auto codecContexteleter = [](AVCodecContext *ptr) noexcept -> void { - if (ptr) - avcodec_free_context(&ptr); - }; - static constexpr inline auto dataDeleter = [](double *ptr) noexcept -> void { - if (ptr) - av_free(ptr); - }; - static constexpr inline auto avFrameDeleter = [](AVFrame *ptr) noexcept -> void { - if (ptr) - av_frame_free(&ptr); - }; - - static constexpr inline auto swrContenxtDeleter = [](SwrContext *swr) noexcept -> void { - if (swr) - swr_free(&swr); - }; + static inline Utils::DeleterFunctionType<double> dataDeleter = + std::bind_front(Utils::freePtrIfNotNull<double>, av_free); + + static inline Utils::DeleterFunctionType<AVCodecContext> codecContexteleter = + std::bind_front(Utils::freePPtrIfNotNull<AVCodecContext>, avcodec_free_context); + + static inline Utils::DeleterFunctionType<AVFrame> avFrameDeleter = + std::bind_front(Utils::freePPtrIfNotNull<AVFrame>, av_frame_free); + + static inline Utils::DeleterFunctionType<SwrContext> swrContenxtDeleter = + std::bind_front(Utils::freePPtrIfNotNull<SwrContext>, swr_free); // All the used types using AVCodecContextPtr = std::unique_ptr<AVCodecContext, decltype(codecContexteleter)>; @@ -135,11 +128,9 @@ public: private: // Regarding the format - static inline constexpr auto avFormatContextDeleter = - [](AVFormatContext *ptr) noexcept -> void { - if (ptr) - avformat_free_context(ptr); - }; + static inline Utils::DeleterFunctionType<AVFormatContext> avFormatContextDeleter = + std::bind_front(Utils::freePtrIfNotNull<AVFormatContext>, avformat_free_context); + using AVFormatContextPtr = std::unique_ptr<AVFormatContext, decltype(avFormatContextDeleter)>; AVFormatContextPtr format{ avformat_alloc_context(), avFormatContextDeleter }; diff --git a/src/Lib/Utils.hh b/src/Lib/Utils.hh index 3f065353973a7ef196098ec3c898e47aad0f7539..bf4d0025163a55cbc68b0b32a032784064c7e0da 100644 --- a/src/Lib/Utils.hh +++ b/src/Lib/Utils.hh @@ -172,6 +172,22 @@ QString getBaseName(const QString &) noexcept; void writeAssertLocation(const char *msg); +template <typename T> using DeleterFunctionType = const std::function<void(T *)>; + +template <typename Type> static inline void +freePtrIfNotNull(DeleterFunctionType<Type> callback, Type *ptr) noexcept +{ + if (ptr != nullptr) + callback(ptr); +} + +template <typename Type> static inline void +freePPtrIfNotNull(DeleterFunctionType<Type *> callback, Type *ptr) noexcept +{ + if (ptr != nullptr) + callback(&ptr); +} + struct OsSpecificAspects final { private: OsSpecificAspects() {}