diff --git a/services/media_engine/modules/media_codec/media_codec.cpp b/services/media_engine/modules/media_codec/media_codec.cpp index 9641259dc734bb699e993e839e8bae9bd2077f0d..1eaef0c2beff7605d462bd0d41ecd867f4eb1ade 100644 --- a/services/media_engine/modules/media_codec/media_codec.cpp +++ b/services/media_engine/modules/media_codec/media_codec.cpp @@ -39,18 +39,23 @@ namespace OHOS { namespace Media { class InputBufferAvailableListener : public IConsumerListener { public: - explicit InputBufferAvailableListener(MediaCodec *mediaCodec) + explicit InputBufferAvailableListener(std::shared_ptr mediaCodec) { mediaCodec_ = mediaCodec; } void OnBufferAvailable() override { - mediaCodec_->ProcessInputBuffer(); + auto realPtr = mediaCodec_.lock(); + if (realPtr != nullptr) { + realPtr->ProcessInputBuffer(); + } else { + MEDIA_LOG_W("mediacodec was released, can not process input buffer"); + } } private: - MediaCodec *mediaCodec_; + std::weak_ptr mediaCodec_; }; MediaCodec::MediaCodec() @@ -551,7 +556,7 @@ int32_t MediaCodec::PrepareInputBufferQueue() } FALSE_RETURN_V_MSG_E(inputBufferQueue_ != nullptr, (int32_t)Status::ERROR_UNKNOWN, "inputBufferQueue_ is nullptr"); inputBufferQueueConsumer_ = inputBufferQueue_->GetConsumer(); - sptr listener = new InputBufferAvailableListener(this); + sptr listener = new InputBufferAvailableListener(shared_from_this()); FALSE_RETURN_V_MSG_E(inputBufferQueueConsumer_ != nullptr, (int32_t)Status::ERROR_UNKNOWN, "inputBufferQueueConsumer_ is nullptr"); inputBufferQueueConsumer_->SetBufferAvailableListener(listener); diff --git a/services/media_engine/modules/media_codec/media_codec.h b/services/media_engine/modules/media_codec/media_codec.h index c87188c22ec8956c40a2743ef49d55eef0997502..b06487467b334a6fe89d0bcfdae4bcc3a5d5a47f 100644 --- a/services/media_engine/modules/media_codec/media_codec.h +++ b/services/media_engine/modules/media_codec/media_codec.h @@ -78,7 +78,7 @@ public: virtual void OnOutputFormatChanged(const std::shared_ptr &format) = 0; }; -class MediaCodec : public Plugins::DataCallback { +class MediaCodec : public std::enable_shared_from_this, public Plugins::DataCallback { public: MediaCodec();