From e5d08aa0609aa8c7a52eeff1b4d1a5a5d7b84f52 Mon Sep 17 00:00:00 2001 From: Adrien Beraud <adrien.beraud@savoirfairelinux.com> Date: Fri, 10 Mar 2023 18:41:03 -0500 Subject: [PATCH] AVPacket: use common typedef PacketBuffer Change-Id: I8e5d1cf75d1c15b806937dd0ead04e707129b1b9 --- bin/jni/videomanager.i | 4 +--- src/client/videomanager.cpp | 8 +------- src/jami/videomanager_interface.h | 11 +++++++++-- src/media/media_decoder.cpp | 14 +++++--------- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i index 54f1ad492c..dce62da091 100644 --- a/bin/jni/videomanager.i +++ b/bin/jni/videomanager.i @@ -159,9 +159,7 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_captureVideoPacket(JN auto frame = libjami::getNewFrame(input); if (not frame) return; - auto packet = std::unique_ptr<AVPacket, void(*)(AVPacket*)>(av_packet_alloc(), [](AVPacket* pkt){ - av_packet_free(&pkt); - }); + auto packet = libjami::PacketBuffer(av_packet_alloc()); if (keyframe) packet->flags = AV_PKT_FLAG_KEY; setRotation(rotation); diff --git a/src/client/videomanager.cpp b/src/client/videomanager.cpp index 7fd72eeabb..124c1345cb 100644 --- a/src/client/videomanager.cpp +++ b/src/client/videomanager.cpp @@ -59,12 +59,6 @@ namespace libjami { MediaFrame::MediaFrame() : frame_ {av_frame_alloc()} - , packet_(nullptr, [](AVPacket* p) { - if (p) { - av_packet_unref(p); - delete p; - } - }) { if (not frame_) throw std::bad_alloc(); @@ -94,7 +88,7 @@ MediaFrame::reset() noexcept } void -MediaFrame::setPacket(std::unique_ptr<AVPacket, void (*)(AVPacket*)>&& pkt) +MediaFrame::setPacket(PacketBuffer&& pkt) { packet_ = std::move(pkt); } diff --git a/src/jami/videomanager_interface.h b/src/jami/videomanager_interface.h index bd15e2fd90..258ad5feaa 100644 --- a/src/jami/videomanager_interface.h +++ b/src/jami/videomanager_interface.h @@ -30,6 +30,7 @@ extern "C" { struct AVFrame; struct AVPacket; void av_frame_free(AVFrame** frame); +void av_packet_free(AVPacket** frame); } #include "def.h" @@ -62,6 +63,12 @@ struct LIBJAMI_PUBLIC AVFrame_deleter { typedef std::unique_ptr<AVFrame, AVFrame_deleter> FrameBuffer; +struct LIBJAMI_PUBLIC AVPacket_deleter { + void operator()(AVPacket* pkt) const { av_packet_free(&pkt); } +}; + +typedef std::unique_ptr<AVPacket, AVPacket_deleter> PacketBuffer; + class LIBJAMI_PUBLIC MediaFrame { public: @@ -81,7 +88,7 @@ public: // Fill this MediaFrame with data from o void copyFrom(const MediaFrame& o); - void setPacket(std::unique_ptr<AVPacket, void (*)(AVPacket*)>&& pkt); + void setPacket(PacketBuffer&& pkt); // Reset internal buffers (return to an empty MediaFrame) virtual void reset() noexcept; @@ -90,7 +97,7 @@ public: protected: FrameBuffer frame_; - std::unique_ptr<AVPacket, void (*)(AVPacket*)> packet_; + PacketBuffer packet_; }; class LIBJAMI_PUBLIC AudioFrame : public MediaFrame diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp index 1bece6d987..8dc5ad4e06 100644 --- a/src/media/media_decoder.cpp +++ b/src/media/media_decoder.cpp @@ -344,12 +344,6 @@ MediaDemuxer::setIOContext(MediaIOHandle* ioctx) MediaDemuxer::Status MediaDemuxer::decode() { - auto packet = std::unique_ptr<AVPacket, std::function<void(AVPacket*)>>(av_packet_alloc(), - [](AVPacket* p) { - if (p) - av_packet_free( - &p); - }); if (inputParams_.format == "x11grab" || inputParams_.format == "dxgigrab") { auto ret = inputCtx_->iformat->read_header(inputCtx_); if (ret == AVERROR_EXTERNAL) { @@ -366,6 +360,7 @@ MediaDemuxer::decode() } } + libjami::PacketBuffer packet(av_packet_alloc()); int ret = av_read_frame(inputCtx_, packet.get()); if (ret == AVERROR(EAGAIN)) { /*no data available. Calculate time until next frame. @@ -550,9 +545,10 @@ MediaDecoder::setupStream() } #endif - JAMI_DBG() << "Decoding " << av_get_media_type_string(avStream_->codecpar->codec_type) - << " using " << inputDecoder_->long_name << " (" << inputDecoder_->name << ")"; - + JAMI_LOG("Using {} ({}) decoder for {}", + inputDecoder_->long_name, + inputDecoder_->name, + av_get_media_type_string(avStream_->codecpar->codec_type)); decoderCtx_->thread_count = std::max(1u, std::min(8u, std::thread::hardware_concurrency() / 2)); if (emulateRate_) JAMI_DBG() << "Using framerate emulation"; -- GitLab