diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i index 54f1ad492c24ec71bffe03ae8f8f94e0eb314848..dce62da091c7132c13239e3cc63481b1c574bc35 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 7fd72eeabb5a0506382c6f7c42a737e97a008ed9..124c1345cbe3847765f019b937c4518d453be48a 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 bd15e2fd90a3ef341956484386715efcfa6bdfaa..258ad5feaa8459f7d138a48833fd864dfc3d1e8d 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 1bece6d9877136feb2c4c51b624a058408c82368..8dc5ad4e06de08d40bd91f7912acbbbcd8728336 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";