diff --git a/framework/codec/ActiveDecoder.cpp b/framework/codec/ActiveDecoder.cpp index 4153bf3e0..964139e7d 100644 --- a/framework/codec/ActiveDecoder.cpp +++ b/framework/codec/ActiveDecoder.cpp @@ -429,5 +429,11 @@ int ActiveDecoder::holdOn(bool hold) return 0; } +int ActiveDecoder::getRecoverQueueSize() +{ + unique_lock uMutex(mMutex); + return int(mHoldingQueue.size() + get_decoder_recover_size()); +} + #endif diff --git a/framework/codec/ActiveDecoder.h b/framework/codec/ActiveDecoder.h index ef17e361a..4fcaefb69 100644 --- a/framework/codec/ActiveDecoder.h +++ b/framework/codec/ActiveDecoder.h @@ -38,6 +38,8 @@ class ActiveDecoder : public Cicada::IDecoder { int holdOn(bool hold) override; + int getRecoverQueueSize() override; + private: virtual int enqueue_decoder(std::unique_ptr &pPacket) = 0; @@ -50,6 +52,8 @@ class ActiveDecoder : public Cicada::IDecoder { virtual void flush_decoder() = 0; + virtual int get_decoder_recover_size() = 0; + private: bool needDrop(IAFPacket *packet); diff --git a/framework/codec/Android/mediaCodecDecoder.h b/framework/codec/Android/mediaCodecDecoder.h index a24672f3f..59997ab07 100644 --- a/framework/codec/Android/mediaCodecDecoder.h +++ b/framework/codec/Android/mediaCodecDecoder.h @@ -36,6 +36,11 @@ namespace Cicada{ void flush_decoder() override; + int get_decoder_recover_size() override + { + return 0; + }; + private: static bool checkSupport(AFCodecID codec, uint64_t flags, int maxSize); diff --git a/framework/codec/Apple/AppleVideoToolBox.cpp b/framework/codec/Apple/AppleVideoToolBox.cpp index c1db587ec..b30a16884 100644 --- a/framework/codec/Apple/AppleVideoToolBox.cpp +++ b/framework/codec/Apple/AppleVideoToolBox.cpp @@ -797,4 +797,10 @@ namespace Cicada { mActive = true; } + int AFVTBDecoder::get_decoder_recover_size() + { + std::lock_guard lock(mActiveStatusMutex); + return mRecoveryQueue.size(); + } + } // namespace diff --git a/framework/codec/Apple/AppleVideoToolBox.h b/framework/codec/Apple/AppleVideoToolBox.h index 5f82740cb..8d87722a8 100644 --- a/framework/codec/Apple/AppleVideoToolBox.h +++ b/framework/codec/Apple/AppleVideoToolBox.h @@ -38,9 +38,10 @@ namespace Cicada{ void flush_decoder() override; + int get_decoder_recover_size() override; + void flushReorderQueue(); - private: private: explicit AFVTBDecoder(int dummy) { diff --git a/framework/codec/IDecoder.h b/framework/codec/IDecoder.h index 25054ae43..e28a90651 100644 --- a/framework/codec/IDecoder.h +++ b/framework/codec/IDecoder.h @@ -164,6 +164,8 @@ namespace Cicada { virtual int holdOn(bool hold) = 0; + virtual int getRecoverQueueSize() = 0; + protected: std::string mName; int mFlags = 0; // VFLAG_HW,VFLAG_OUT diff --git a/framework/codec/avcodecDecoder.h b/framework/codec/avcodecDecoder.h index 3187b83d4..a10a75199 100644 --- a/framework/codec/avcodecDecoder.h +++ b/framework/codec/avcodecDecoder.h @@ -88,6 +88,11 @@ namespace Cicada{ void flush_decoder() override; + int get_decoder_recover_size() override + { + return 0; + }; + private: decoder_handle_v *mPDecoder = nullptr; };