diff --git a/interfaces/inner_api/native/audio_decoder_filter.h b/interfaces/inner_api/native/audio_decoder_filter.h index 5153d89b21eea42dc09fca9429e04fe32578449d..b7a246b756081e5673c8edcfe02f8c82617e5ea7 100644 --- a/interfaces/inner_api/native/audio_decoder_filter.h +++ b/interfaces/inner_api/native/audio_decoder_filter.h @@ -79,6 +79,10 @@ public: void OnDumpInfo(int32_t fd); void SetCallerInfo(uint64_t instanceId, const std::string& appName); + + void OnError(CodecErrorType errorType, int32_t errorCode); + + void OnOutputBufferDone(const std::shared_ptr &outputBuffer); protected: Status OnLinked(StreamType inType, const std::shared_ptr &meta, const std::shared_ptr &callback) override; @@ -115,6 +119,20 @@ private: uint64_t instanceId_ = 0; std::string appName_; }; + +class AudioDecoderCallback : public AudioBaseCodecCallback { +public: + explicit AudioDecoderCallback(std::shared_ptr audioDecoderFilter); + virtual ~AudioDecoderCallback(); + + void OnError(CodecErrorType errorType, int32_t errorCode) override; + + void OnOutputBufferDone(const std::shared_ptr &outputBuffer) override; + +private: + std::weak_ptr audioDecoderFilter_; +}; + } // namespace Pipeline } // namespace MEDIA } // namespace OHOS diff --git a/services/media_engine/filters/audio_decoder_filter.cpp b/services/media_engine/filters/audio_decoder_filter.cpp index a8d52560e8c053e5ac6baada13c2077ec4407874..09c04d3c3e1ba2eecf6637d8039e91760fb0986c 100644 --- a/services/media_engine/filters/audio_decoder_filter.cpp +++ b/services/media_engine/filters/audio_decoder_filter.cpp @@ -263,6 +263,11 @@ Status AudioDecoderFilter::OnLinked(StreamType inType, const std::shared_ptrSetData(Tag::AUDIO_SAMPLE_FORMAT, Plugins::SAMPLE_S16LE); SetParameter(meta); mediaCodec_->Init(mime, false); + + std::shared_ptr mediaCodecCallback + = std::make_shared(shared_from_this()); + mediaCodec_->SetCodecCallback(mediaCodecCallback); + auto ret = mediaCodec_->Configure(meta); if (ret != (int32_t)Status::OK && ret != (int32_t)Status::ERROR_INVALID_STATE) { MEDIA_LOG_I_SHORT("AudioDecoderFilter unsupport format"); @@ -370,6 +375,54 @@ void AudioDecoderFilter::SetCallerInfo(uint64_t instanceId, const std::string& a instanceId_ = instanceId; appName_ = appName; } + +void AudioDecoderFilter::OnError(CodecErrorType errorType, int32_t errorCode) +{ + MEDIA_LOG_E("Audio Decoder error happened. ErrorType: %{public}d, errorCode: %{public}d", + static_cast(errorType), errorCode); + if (eventReceiver_ == nullptr) { + MEDIA_LOG_E("Audio Decoder OnError failed due to eventReceiver is nullptr."); + return; + } + switch (errorType) { + case CodecErrorType::CODEC_DRM_DECRYTION_FAILED: + eventReceiver_->OnEvent({"audioDecoder", EventType::EVENT_ERROR, MSERR_DRM_VERIFICATION_FAILED}); + break; + default: + break; + } +} + +void AudioDecoderFilter::OnOutputBufferDone(const std::shared_ptr &outputBuffer) +{ + (void)outputBuffer; +} + +AudioDecoderCallback::AudioDecoderCallback(std::shared_ptr audioDecoderFilter) : + audioDecoderFilter_(audioDecoderFilter) +{ + MEDIA_LOG_I("AudioDecoderCallback"); +} + +AudioDecoderCallback::~AudioDecoderCallback() +{ + MEDIA_LOG_I("~AudioDecoderCallback"); +} + +void AudioDecoderCallback::OnError(CodecErrorType errorType, int32_t errorCode) +{ + MEDIA_LOG_I("AudioDecoderCallback OnError"); + if (auto codecFilter = audioDecoderFilter_.lock()) { + codecFilter->OnError(errorType, errorCode); + } else { + MEDIA_LOG_I("invalid codecFilter"); + } +} + +void AudioDecoderCallback::OnOutputBufferDone(const std::shared_ptr &outputBuffer) +{ + (void)outputBuffer; +} } // namespace Pipeline } // namespace MEDIA } // namespace OHOS diff --git a/services/media_engine/modules/media_codec/media_codec.cpp b/services/media_engine/modules/media_codec/media_codec.cpp index 8b8cf09a9983c09944c97b62c585555d9c2e8f2e..5438aedaf124c826fec1821826d71b9561b716d4 100644 --- a/services/media_engine/modules/media_codec/media_codec.cpp +++ b/services/media_engine/modules/media_codec/media_codec.cpp @@ -602,6 +602,8 @@ void MediaCodec::ProcessInputBuffer() ret = DrmAudioCencDecrypt(filledInputBuffer); if (ret != Status::OK) { MEDIA_LOG_E("MediaCodec DrmAudioCencDecrypt failed."); + mediaCodecCallback_->OnError(CodecErrorType::CODEC_DRM_DECRYTION_FAILED, + static_cast(ret)); break; } } diff --git a/services/media_engine/modules/media_codec/media_codec.h b/services/media_engine/modules/media_codec/media_codec.h index 7f71ac0fe810e7a18b31e7bcf916d3f959977636..22b63b7852b3d72088cf177f8e55819b2bc991a9 100644 --- a/services/media_engine/modules/media_codec/media_codec.h +++ b/services/media_engine/modules/media_codec/media_codec.h @@ -54,6 +54,7 @@ enum class CodecState : int32_t { enum class CodecErrorType : int32_t { CODEC_ERROR_INTERNAL, + CODEC_DRM_DECRYTION_FAILED, CODEC_ERROR_EXTEND_START = 0X10000, };