diff --git a/framework/codec/ActiveDecoder.cpp b/framework/codec/ActiveDecoder.cpp index 0f3da2074..8c9ee2d46 100644 --- a/framework/codec/ActiveDecoder.cpp +++ b/framework/codec/ActiveDecoder.cpp @@ -69,26 +69,25 @@ int ActiveDecoder::decode_func() int needWait = 0; int ret; int64_t pts = INT64_MIN; - bool empty; - { - std::unique_lock uMutex(mMutex); - empty = mInputQueue.empty(); - } - if (!empty) { + if (!mPacket) { std::unique_lock uMutex(mMutex); - if (mInputQueue.front().get()) { - pts = mInputQueue.front().get()->getInfo().pts; - ret = enqueue_decoder(mInputQueue.front()); - } else { - ret = 0; + if (!mInputQueue.empty()) { + mPacket = move(mInputQueue.front()); + mInputQueue.pop(); } + } + + if (mPacket) { + pts = mPacket->getInfo().pts; + ret = enqueue_decoder(mPacket); if (ret == -EAGAIN) { needWait++; } else { - mInputQueue.pop(); + // assert(mPacket == nullptr); + mPacket = nullptr; if (ret == STATUS_EOS) { bDecoderEOS = true; @@ -318,6 +317,7 @@ void ActiveDecoder::flush() mHoldingQueue.pop(); } + mPacket = nullptr; #endif clean_error(); flush_decoder(); @@ -355,7 +355,7 @@ int ActiveDecoder::extract_decoder() int count = 0; int size; { - std::unique_lock uMutex(mMutex); + std::unique_lock uMutex(mMutex); size = mOutputQueue.size(); } @@ -363,7 +363,7 @@ int ActiveDecoder::extract_decoder() int ret = 0; do { - unique_ptr pFrame{}; + unique_ptr pFrame{}; ret = dequeue_decoder(pFrame); if (ret < 0 || ret == STATUS_EOS) { @@ -379,7 +379,7 @@ int ActiveDecoder::extract_decoder() } if (pFrame) { - std::unique_lock uMutex(mMutex); + std::unique_lock uMutex(mMutex); mOutputQueue.push(move(pFrame)); count++; } diff --git a/framework/codec/ActiveDecoder.h b/framework/codec/ActiveDecoder.h index a48f87796..ef17e361a 100644 --- a/framework/codec/ActiveDecoder.h +++ b/framework/codec/ActiveDecoder.h @@ -72,7 +72,7 @@ class ActiveDecoder : public Cicada::IDecoder { protected: #if AF_HAVE_PTHREAD afThread *mDecodeThread = nullptr; - std::atomic_bool mRunning{false}; + std::atomic_bool mRunning{false}; #endif private: @@ -86,6 +86,7 @@ class ActiveDecoder : public Cicada::IDecoder { int maxOutQueueSize = 2; std::mutex mMutex{}; std::mutex mSleepMutex{}; + std::unique_ptr mPacket{nullptr}; #endif bool bHolding = false; std::queue> mHoldingQueue{}; diff --git a/framework/codec/avcodecDecoder.cpp b/framework/codec/avcodecDecoder.cpp index 9e5437579..0ef450990 100644 --- a/framework/codec/avcodecDecoder.cpp +++ b/framework/codec/avcodecDecoder.cpp @@ -274,6 +274,7 @@ namespace Cicada { ret = avcodec_send_packet(mPDecoder->codecCont, pkt); if (0 == ret) { + pPacket = nullptr; } else if (ret == AVERROR(EAGAIN)) { } else if (ret == AVERROR_EOF) { AF_LOGD("Decode EOF\n");