From 5c7fe35edbca4f6eee5b4126727d3a9f95c7697f Mon Sep 17 00:00:00 2001 From: Artem Dyomin Date: Wed, 15 Feb 2023 18:12:07 +0100 Subject: Minor cleanup of duplicated code Remove duplicated deleters; use a template instead Pick-to: 6.5 6.4 Change-Id: I79d4ae2866199583fec0d3dd357274a81f40b7fa Reviewed-by: Qt CI Bot Reviewed-by: Lars Knoll --- src/plugins/multimedia/ffmpeg/qffmpeg_p.h | 38 +++++++++--------------- src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp | 12 ++------ src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h | 8 ++--- 3 files changed, 21 insertions(+), 37 deletions(-) (limited to 'src/plugins/multimedia/ffmpeg') diff --git a/src/plugins/multimedia/ffmpeg/qffmpeg_p.h b/src/plugins/multimedia/ffmpeg/qffmpeg_p.h index e9da8319d..2e01521fc 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpeg_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpeg_p.h @@ -53,43 +53,33 @@ inline QString err2str(int errnum) return QString::fromLocal8Bit(buffer); } -struct AVFrameDeleter +template +struct AVDeleter { - void operator()(AVFrame *frame) const + template + void operator()(T *object) const { - if (frame) - av_frame_free(&frame); + if (object) + F(&object); } }; -using AVFrameUPtr = std::unique_ptr; +using AVFrameUPtr = std::unique_ptr>; inline AVFrameUPtr makeAVFrame() { return AVFrameUPtr(av_frame_alloc()); } -struct AVPacketDeleter -{ - void operator()(AVPacket *packet) const - { - if (packet) - av_packet_free(&packet); - } -}; - -using AVPacketUPtr = std::unique_ptr; +using AVPacketUPtr = + std::unique_ptr>; -struct AVCodecContextDeleter -{ - void operator()(AVCodecContext *context) const - { - if (context) - avcodec_free_context(&context); - } -}; +using AVCodecContextUPtr = + std::unique_ptr>; -using AVCodecContextUPtr = std::unique_ptr; +using AVBufferUPtr = + std::unique_ptr>; QT_END_NAMESPACE diff --git a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp index affe8fd8a..5b3cf7474 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel.cpp @@ -135,13 +135,7 @@ TextureConverter::Data::~Data() delete backend; } -HWAccel::~HWAccel() -{ - if (m_hwDeviceContext) - av_buffer_unref(&m_hwDeviceContext); - if (m_hwFramesContext) - av_buffer_unref(&m_hwFramesContext); -} +HWAccel::~HWAccel() = default; std::unique_ptr HWAccel::create(const AVCodec *codec) { @@ -309,14 +303,14 @@ void HWAccel::createFramesContext(AVPixelFormat swFormat, const QSize &size) if (!m_hwDeviceContext) return; - m_hwFramesContext = av_hwframe_ctx_alloc(m_hwDeviceContext); + m_hwFramesContext.reset(av_hwframe_ctx_alloc(m_hwDeviceContext.get())); auto *c = (AVHWFramesContext *)m_hwFramesContext->data; c->format = hwFormat(); c->sw_format = swFormat; c->width = size.width(); c->height = size.height(); qCDebug(qLHWAccel) << "init frames context"; - int err = av_hwframe_ctx_init(m_hwFramesContext); + int err = av_hwframe_ctx_init(m_hwFramesContext.get()); if (err < 0) qWarning() << "failed to init HW frame context" << err << err2str(err); else diff --git a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h index 81bb163bb..b18883369 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpeghwaccel_p.h @@ -82,8 +82,8 @@ private: class HWAccel { - AVBufferRef *m_hwDeviceContext = nullptr; - AVBufferRef *m_hwFramesContext = nullptr; + AVBufferUPtr m_hwDeviceContext; + AVBufferUPtr m_hwFramesContext; public: ~HWAccel(); @@ -97,12 +97,12 @@ public: AVHWDeviceType deviceType() const; - AVBufferRef *hwDeviceContextAsBuffer() const { return m_hwDeviceContext; } + AVBufferRef *hwDeviceContextAsBuffer() const { return m_hwDeviceContext.get(); } AVHWDeviceContext *hwDeviceContext() const; AVPixelFormat hwFormat() const; void createFramesContext(AVPixelFormat swFormat, const QSize &size); - AVBufferRef *hwFramesContextAsBuffer() const { return m_hwFramesContext; } + AVBufferRef *hwFramesContextAsBuffer() const { return m_hwFramesContext.get(); } AVHWFramesContext *hwFramesContext() const; static AVPixelFormat format(AVFrame *frame); -- cgit v1.2.1