diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp index 2cd8a06f22a0052f3be9f5a9160cb7c3127da777..cadbb23002e05f3d4fed9737f064568d5f36a216 100644 --- a/src/media/media_decoder.cpp +++ b/src/media/media_decoder.cpp @@ -280,10 +280,11 @@ int MediaDecoder::setupFromVideoData() } MediaDecoder::Status -MediaDecoder::decode(VideoFrame& result, video::VideoPacket& video_packet) +MediaDecoder::decode(VideoFrame& result) { - AVPacket *inpacket = video_packet.get(); - int ret = av_read_frame(inputCtx_, inpacket); + AVPacket inpacket; + av_init_packet(&inpacket); + int ret = av_read_frame(inputCtx_, &inpacket); if (ret == AVERROR(EAGAIN)) { return Status::Success; } else if (ret == AVERROR_EOF) { @@ -296,13 +297,18 @@ MediaDecoder::decode(VideoFrame& result, video::VideoPacket& video_packet) } // is this a packet from the video stream? - if (inpacket->stream_index != streamIndex_) + if (inpacket.stream_index != streamIndex_) { + av_packet_unref(&inpacket); return Status::Success; + } auto frame = result.pointer(); int frameFinished = 0; int len = avcodec_decode_video2(decoderCtx_, frame, - &frameFinished, inpacket); + &frameFinished, &inpacket); + + av_packet_unref(&inpacket); + if (len <= 0) return Status::DecodeError; @@ -333,10 +339,7 @@ MediaDecoder::decode(const AudioFrame& decodedFrame) const auto frame = decodedFrame.pointer(); AVPacket inpacket; - memset(&inpacket, 0, sizeof(inpacket)); av_init_packet(&inpacket); - inpacket.data = NULL; - inpacket.size = 0; int ret = av_read_frame(inputCtx_, &inpacket); if (ret == AVERROR(EAGAIN)) { @@ -351,12 +354,16 @@ MediaDecoder::decode(const AudioFrame& decodedFrame) } // is this a packet from the audio stream? - if (inpacket.stream_index != streamIndex_) + if (inpacket.stream_index != streamIndex_) { + av_packet_unref(&inpacket); return Status::Success; + } int frameFinished = 0; int len = avcodec_decode_audio4(decoderCtx_, frame, &frameFinished, &inpacket); + av_packet_unref(&inpacket); + if (len <= 0) { return Status::DecodeError; } @@ -385,14 +392,14 @@ MediaDecoder::Status MediaDecoder::flush(VideoFrame& result) { AVPacket inpacket; - memset(&inpacket, 0, sizeof(inpacket)); av_init_packet(&inpacket); - inpacket.data = NULL; - inpacket.size = 0; int frameFinished = 0; auto len = avcodec_decode_video2(decoderCtx_, result.pointer(), &frameFinished, &inpacket); + + av_packet_unref(&inpacket); + if (len <= 0) return Status::DecodeError; diff --git a/src/media/media_decoder.h b/src/media/media_decoder.h index d473d1f0d35125f1636c15beda3d7c97d5c06b9d..16dad8250f1e9f0410cd767a86293b5e3b43e0df 100644 --- a/src/media/media_decoder.h +++ b/src/media/media_decoder.h @@ -17,9 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -#ifndef __MEDIA_DECODER_H__ -#define __MEDIA_DECODER_H__ +#pragma once #include "config.h" @@ -79,7 +77,7 @@ class MediaDecoder { void setIOContext(MediaIOHandle *ioctx); #ifdef RING_VIDEO int setupFromVideoData(); - Status decode(VideoFrame&, video::VideoPacket&); + Status decode(VideoFrame&); Status flush(VideoFrame&); #endif // RING_VIDEO @@ -125,5 +123,3 @@ class MediaDecoder { }; } // namespace ring - -#endif // __MEDIA_DECODER_H__ diff --git a/src/media/video/video_base.cpp b/src/media/video/video_base.cpp index 835deb821106f01d8c8774ceef8ecffdb8be2a31..9345bce08d23a2a49eb9995b4c6a9924792c55f2 100644 --- a/src/media/video/video_base.cpp +++ b/src/media/video/video_base.cpp @@ -29,15 +29,6 @@ namespace ring { namespace video { -/*=== VideoPacket ===========================================================*/ - -VideoPacket::VideoPacket() : packet_(static_cast<AVPacket *>(av_mallocz(sizeof(AVPacket)))) -{ - av_init_packet(packet_); -} - -VideoPacket::~VideoPacket() { av_free_packet(packet_); av_free(packet_); } - /*=== VideoGenerator =========================================================*/ VideoFrame& diff --git a/src/media/video/video_base.h b/src/media/video/video_base.h index 8d694d438ff8b70f943fd6529656e48ae002b2c5..71c08132860b3106d797a8e28b455c26c72326c5 100644 --- a/src/media/video/video_base.h +++ b/src/media/video/video_base.h @@ -121,19 +121,6 @@ public: struct VideoFrameActiveWriter: Observable<std::shared_ptr<VideoFrame>> {}; struct VideoFramePassiveReader: Observer<std::shared_ptr<VideoFrame>> {}; -/*=== VideoPacket ===========================================================*/ - -class VideoPacket { - public: - VideoPacket(); - ~VideoPacket(); - AVPacket* get() { return packet_; }; - - private: - NON_COPYABLE(VideoPacket); - AVPacket *packet_; -}; - /*=== VideoGenerator =========================================================*/ class VideoGenerator : public VideoFrameActiveWriter diff --git a/src/media/video/video_input.cpp b/src/media/video/video_input.cpp index 19355e13010c75e077f8ada39cadb6cb825ba912..550cb4a34e0bc0324699d412c1853073af520bde 100644 --- a/src/media/video/video_input.cpp +++ b/src/media/video/video_input.cpp @@ -108,8 +108,7 @@ bool VideoInput::captureFrame() if (not decoder_) return false; - VideoPacket pkt; - const auto ret = decoder_->decode(getNewFrame(), pkt); + const auto ret = decoder_->decode(getNewFrame()); switch (ret) { case MediaDecoder::Status::ReadError: diff --git a/src/media/video/video_receive_thread.cpp b/src/media/video/video_receive_thread.cpp index 10d0d54e59ec8ff6f0e030ca83bf40b02ca66804..6fe210455ef97bac78991284ae68443cc65e1618 100644 --- a/src/media/video/video_receive_thread.cpp +++ b/src/media/video/video_receive_thread.cpp @@ -155,8 +155,7 @@ void VideoReceiveThread::addIOContext(SocketPair &socketPair) bool VideoReceiveThread::decodeFrame() { - VideoPacket pkt; - const auto ret = videoDecoder_->decode(getNewFrame(), pkt); + const auto ret = videoDecoder_->decode(getNewFrame()); switch (ret) { case MediaDecoder::Status::FrameFinished: